]> Shamusworld >> Repos - virtualjaguar/blob - src/jaguar.cpp
Adding 1.0.1/2 uncompressed tarballs to tags for historical purposes.
[virtualjaguar] / src / jaguar.cpp
1 //\r
2 // JAGUAR.CPP\r
3 //\r
4 // by cal16\r
5 // GCC/SDL port by Niels Wagenaar (Linux/WIN32) and Caz (BeOS)\r
6 // Cleanups and endian wrongness amelioration by James L. Hammons\r
7 // Note: Endian wrongness probably stems from the MAME origins of this emu and\r
8 //       the braindead way in which MAME handles memory. :-)\r
9 // \r
10 \r
11 #include "jaguar.h"\r
12 #include "m68kdasmAG.h"\r
13 #include "crc32.h"\r
14 \r
15 //#define LOG_UNMAPPED_MEMORY_ACCESSES\r
16 //#define SOUND_OUTPUT\r
17 \r
18 // Some handy macros to help converting native endian to big endian (jaguar native)\r
19 \r
20 #define SET32(r, a, v)  r[a] = ((v) & 0xFF000000) >> 24, r[a+1] = ((v) & 0x00FF0000) >> 16, \\r
21                                                 r[a+2] = ((v) & 0x0000FF00) >> 8, r[a+3] = (v) & 0x000000FF\r
22 \r
23 //\r
24 // Function Prototypes\r
25 //\r
26 \r
27 unsigned jaguar_unknown_readbyte(unsigned address);\r
28 unsigned jaguar_unknown_readword(unsigned address);\r
29 void jaguar_unknown_writebyte(unsigned address, unsigned data);\r
30 void jaguar_unknown_writeword(unsigned address, unsigned data);\r
31 \r
32 \r
33 #ifdef SOUND_OUTPUT\r
34 int dsp_enabled = 1;\r
35 #else\r
36 int dsp_enabled = 0;\r
37 #endif\r
38 uint32 jaguar_active_memory_dumps = 0;\r
39 uint32 jaguar_use_bios = 0;\r
40 #define JAGUAR_WIP_RELEASE\r
41 #define JAGUAR_REAL_SPEED\r
42 \r
43 \r
44 //////////////////////////////////////////////////////////////////////////////\r
45 // Bios path\r
46 //////////////////////////////////////////////////////////////////////////////\r
47 //\r
48 //\r
49 //\r
50 //////////////////////////////////////////////////////////////////////////////\r
51 //static char  *jaguar_bootRom_path="c:/jaguarEmu/newload.img";\r
52 static char * jaguar_bootRom_path = "./bios/jagboot.rom";\r
53 //static char  *jaguar_bootRom_path="./bios/JagOS.bin";\r
54 char * jaguar_eeproms_path = "./eeproms/";\r
55 \r
56 //////////////////////////////////////////////////////////////////////////////\r
57 //\r
58 //////////////////////////////////////////////////////////////////////////////\r
59 //\r
60 //\r
61 //\r
62 //////////////////////////////////////////////////////////////////////////////\r
63 uint32 jaguar_mainRom_crc32;\r
64 \r
65 static uint32 m68k_cycles_per_scanline;\r
66 static uint32 gpu_cycles_per_scanline;\r
67 static uint32 dsp_cycles_per_scanline;\r
68 static uint32 jaguar_screen_scanlines;\r
69 \r
70 static uint8 * jaguar_mainRam = NULL;\r
71 static uint8 * jaguar_bootRom = NULL;\r
72 static uint8 * jaguar_mainRom = NULL;\r
73 //////////////////////////////////////////////////////////////////////////////\r
74 \r
75 \r
76 //\r
77 // Musashi 68000 read/write/IRQ functions\r
78 //\r
79 \r
80 int irq_ack_handler(int level)\r
81 {\r
82         int vector = M68K_INT_ACK_AUTOVECTOR;\r
83 \r
84         if (level = 7)\r
85         {\r
86                 m68k_set_irq(0);                                                // Clear the IRQ...\r
87                 vector = 64;                                                    // Set user interrupt #0\r
88         }\r
89 \r
90         return vector;\r
91 }\r
92 \r
93 //Do this in makefile???\r
94 //#define LOG_UNMAPPED_MEMORY_ACCESSES 1\r
95 \r
96 unsigned int m68k_read_memory_8(unsigned int address)\r
97 {\r
98 //fprintf(log_get(), "[RM8] Addr: %08X\n", address);\r
99         unsigned int retVal = 0;\r
100 \r
101         if ((address >= 0x000000) && (address <= 0x3FFFFF))\r
102                 retVal = jaguar_mainRam[address];\r
103         else if ((address >= 0x800000) && (address <= 0xDFFFFF))\r
104                 retVal = jaguar_mainRom[address - 0x800000];\r
105         else if ((address >= 0xE00000) && (address <= 0xE3FFFF))\r
106                 retVal = jaguar_bootRom[address - 0xE00000];\r
107         else if ((address >= 0xDFFF00) && (address <= 0xDFFFFF))\r
108                 retVal = cdrom_byte_read(address);\r
109         else if ((address >= 0xF00000) && (address <= 0xF0FFFF))\r
110                 retVal = tom_byte_read(address);\r
111         else if ((address >= 0xF10000) && (address <= 0xF1FFFF))\r
112                 retVal = jerry_byte_read(address);\r
113         else\r
114                 retVal = jaguar_unknown_readbyte(address);\r
115 \r
116     return retVal;\r
117 }\r
118 \r
119 unsigned int m68k_read_memory_16(unsigned int address)\r
120 {\r
121 //fprintf(log_get(), "[RM16] Addr: %08X\n", address);\r
122     unsigned int retVal = 0;\r
123 \r
124         if ((address >= 0x000000) && (address <= 0x3FFFFE))\r
125                 retVal = (jaguar_mainRam[address] << 8) | jaguar_mainRam[address+1];\r
126         else if ((address >= 0x800000) && (address <= 0xDFFFFE))\r
127                 retVal = (jaguar_mainRom[address - 0x800000] << 8) | jaguar_mainRom[address - 0x800000 + 1];\r
128         else if ((address >= 0xE00000) && (address <= 0xE3FFFE))\r
129                 retVal = (jaguar_bootRom[address - 0xE00000] << 8) | jaguar_bootRom[address - 0xE00000 + 1];\r
130         else if ((address >= 0xDFFF00) && (address <= 0xDFFFFE))\r
131                 retVal = cdrom_word_read(address);\r
132         else if ((address >= 0xF00000) && (address <= 0xF0FFFE))\r
133                 retVal = tom_word_read(address);\r
134         else if ((address >= 0xF10000) && (address <= 0xF1FFFE))\r
135                 retVal = jerry_word_read(address);\r
136         else\r
137 //{\r
138 //fprintf(log_get(), "[RM16] Unknown address: %08X\n", address);\r
139                 retVal = jaguar_unknown_readword(address);\r
140 //}\r
141 \r
142     return retVal;\r
143 }\r
144 \r
145 unsigned int m68k_read_memory_32(unsigned int address)\r
146 {\r
147 //fprintf(log_get(), "--> [RM32]\n");\r
148     return (m68k_read_memory_16(address) << 16) | m68k_read_memory_16(address + 2);\r
149 }\r
150 \r
151 void m68k_write_memory_8(unsigned int address, unsigned int value)\r
152 {\r
153 //fprintf(log_get(), "[WM8  PC=%08X] Addr: %08X, val: %02X\n", m68k_get_reg(NULL, M68K_REG_PC), address, value);\r
154         if ((address >= 0x000000) && (address <= 0x3FFFFF))\r
155                 jaguar_mainRam[address] = value;\r
156         else if ((address >= 0xDFFF00) && (address <= 0xDFFFFF))\r
157                 cdrom_byte_write(address, value);\r
158         else if ((address >= 0xF00000) && (address <= 0xF0FFFF))\r
159                 tom_byte_write(address, value);\r
160         else if ((address >= 0xF10000) && (address <= 0xF1FFFF))\r
161                 jerry_byte_write(address, value);\r
162         else\r
163                 jaguar_unknown_writebyte(address, value);\r
164 }\r
165 \r
166 void m68k_write_memory_16(unsigned int address, unsigned int value)\r
167 {\r
168 //fprintf(log_get(), "[WM16 PC=%08X] Addr: %08X, val: %04X\n", m68k_get_reg(NULL, M68K_REG_PC), address, value);\r
169         if ((address >= 0x000000) && (address <= 0x3FFFFE))\r
170         {\r
171                 jaguar_mainRam[address] = value >> 8;\r
172                 jaguar_mainRam[address + 1] = value & 0xFF;\r
173         }\r
174         else if ((address >= 0xDFFF00) && (address <= 0xDFFFFE))\r
175                 cdrom_word_write(address, value);\r
176         else if ((address >= 0xF00000) && (address <= 0xF0FFFE))\r
177                 tom_word_write(address, value);\r
178         else if ((address >= 0xF10000) && (address <= 0xF1FFFE))\r
179                 jerry_word_write(address, value);\r
180         else\r
181                 jaguar_unknown_writeword(address, value);\r
182 }\r
183 \r
184 void m68k_write_memory_32(unsigned int address, unsigned int value)\r
185 {\r
186 //fprintf(log_get(), "--> [WM32]\n");\r
187         m68k_write_memory_16(address, value >> 16);\r
188         m68k_write_memory_16(address + 2, value & 0xFFFF);\r
189 }\r
190 \r
191 //////////////////////////////////////////////////////////////////////////////\r
192 //\r
193 //\r
194 //\r
195 //////////////////////////////////////////////////////////////////////////////\r
196 /*struct STARSCREAM_PROGRAMREGION *jaguar_programfetch;\r
197 struct STARSCREAM_DATAREGION    *jaguar_readbyte;\r
198 struct STARSCREAM_DATAREGION    *jaguar_readword;\r
199 struct STARSCREAM_DATAREGION    *jaguar_writebyte;\r
200 struct STARSCREAM_DATAREGION    *jaguar_writeword;\r
201 UINT16 jaguar_regionsCount[6];*/\r
202 \r
203 //////////////////////////////////////////////////////////////////////////////\r
204 //\r
205 //////////////////////////////////////////////////////////////////////////////\r
206 //\r
207 //\r
208 //\r
209 //////////////////////////////////////////////////////////////////////////////\r
210 uint32 jaguar_get_handler(uint32 i)\r
211 {\r
212 //      return (jaguar_word_read(i<<2) << 16) | jaguar_word_read((i<<2) + 2);\r
213         return (jaguar_word_read(i*4) << 16) | jaguar_word_read((i*4) + 2);\r
214 }\r
215 \r
216 //////////////////////////////////////////////////////////////////////////////\r
217 //\r
218 //////////////////////////////////////////////////////////////////////////////\r
219 //\r
220 //\r
221 //\r
222 //\r
223 //\r
224 //////////////////////////////////////////////////////////////////////////////\r
225 static char romLoadDialog_filePath[1024];\r
226 #ifndef __PORT__\r
227 static char romLoadDialog_initialDirectory[1024];\r
228 \r
229 int jaguar_open_rom(HWND hWnd,char *title,char *filterString)\r
230 {\r
231         OPENFILENAME ofn;\r
232 \r
233 \r
234         romLoadDialog_initialDirectory[0] = 0;\r
235 \r
236 \r
237         romLoadDialog_filePath[0] = 0;\r
238 \r
239         ZeroMemory(&ofn, sizeof(OPENFILENAME));\r
240         ofn.lStructSize = sizeof(OPENFILENAME);\r
241         ofn.hwndOwner = hWnd;\r
242         ofn.lpstrFile = romLoadDialog_filePath;\r
243         ofn.nMaxFile = sizeof(romLoadDialog_filePath);\r
244         ofn.lpstrFilter =  filterString;\r
245         ofn.nFilterIndex = 0;\r
246         ofn.lpstrFileTitle = NULL;\r
247         ofn.nMaxFileTitle = 0;\r
248         ofn.lpstrInitialDir = (const char *)romLoadDialog_initialDirectory;\r
249         ofn.lpstrTitle = title; \r
250         ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;\r
251 \r
252         if(GetOpenFileName(&ofn) == FALSE) \r
253         {\r
254                 DWORD res = CommDlgExtendedError();\r
255                 SendMessage(hWnd, WM_MOVE, 0,0);\r
256                 return 0;\r
257         }\r
258 \r
259 \r
260         SendMessage(hWnd, WM_MOVE, 0,0);\r
261         return 1;\r
262 }\r
263 #endif\r
264 //////////////////////////////////////////////////////////////////////////////\r
265 //\r
266 //////////////////////////////////////////////////////////////////////////////\r
267 //\r
268 //\r
269 //\r
270 //////////////////////////////////////////////////////////////////////////////\r
271 uint32 jaguar_interrupt_handler_is_valid(uint32 i)\r
272 {\r
273         uint32 handler = jaguar_get_handler(i);\r
274         if (handler && (handler != 0xFFFFFFFF))\r
275                 return 1;\r
276         else\r
277                 return 0;\r
278 }\r
279 //////////////////////////////////////////////////////////////////////////////\r
280 //\r
281 //////////////////////////////////////////////////////////////////////////////\r
282 //\r
283 //\r
284 //\r
285 //////////////////////////////////////////////////////////////////////////////\r
286 void s68000show_context(void)\r
287 {\r
288 //      fprintf(log_get(),"\t68k PC=0x%.6x\n",s68000readPC());\r
289         fprintf(log_get(),"\t68k PC=0x%.6x\n", m68k_get_reg(NULL, M68K_REG_PC));\r
290 //      for (int i=0;i<8;i++)\r
291 //              fprintf(log_get(),"\tD%i = 0x%.8x\n",i,s68000context.dreg[i]);\r
292         for(int i=M68K_REG_D0; i<=M68K_REG_D7; i++)\r
293                 fprintf(log_get(), "\tD%i = 0x%.8x\n", i-M68K_REG_D0, m68k_get_reg(NULL, (m68k_register_t)i));\r
294         fprintf(log_get(), "\n");\r
295 //      for (i=0;i<8;i++)\r
296 //              fprintf(log_get(),"\tA%i = 0x%.8x\n",i,s68000context.areg[i]);\r
297         for(int i=M68K_REG_A0; i<=M68K_REG_A7; i++)\r
298                 fprintf(log_get(), "\tA%i = 0x%.8x\n", i-M68K_REG_A0, m68k_get_reg(NULL, (m68k_register_t)i));\r
299 \r
300         fprintf(log_get(), "68k dasm\n");\r
301 //      jaguar_dasm(s68000readPC()-0x1000,0x20000);\r
302 //      jaguar_dasm(m68k_get_reg(NULL, M68K_REG_PC) - 0x1000, 0x20000);\r
303         jaguar_dasm(m68k_get_reg(NULL, M68K_REG_PC) - 0x80, 0x200);\r
304         fprintf(log_get(), "..................\n");\r
305 \r
306 \r
307         if (tom_irq_enabled(IRQ_VBLANK))\r
308         {\r
309                 fprintf(log_get(), "vblank int: enabled\n");\r
310                 jaguar_dasm(jaguar_get_handler(64), 0x200);\r
311         }\r
312         else\r
313                 fprintf(log_get(), "vblank int: disabled\n");\r
314         fprintf(log_get(), "..................\n");\r
315 \r
316         for(int i=0; i<256; i++)\r
317                 fprintf(log_get(), "handler %03i at $%08X\n", i, jaguar_get_handler(i));\r
318 }\r
319 \r
320 // Starscream crap ripped out...\r
321 \r
322 //\r
323 // Unknown read/write byte/word routines\r
324 //\r
325 \r
326 void jaguar_unknown_writebyte(unsigned address, unsigned data)\r
327 {\r
328 #ifdef LOG_UNMAPPED_MEMORY_ACCESSES\r
329         fprintf(log_get(), "jaguar: unknown byte %02X write at %08X (PC=%06X)\n", data, address, m68k_get_reg(NULL, M68K_REG_PC));\r
330 #endif\r
331 }\r
332 \r
333 void jaguar_unknown_writeword(unsigned address, unsigned data)\r
334 {\r
335 #ifdef LOG_UNMAPPED_MEMORY_ACCESSES\r
336         fprintf(log_get(), "jaguar: unknown word %04X write at %08X (PC=%06X)\n", data, address, m68k_get_reg(NULL, M68K_REG_PC));\r
337 #endif\r
338 }\r
339 \r
340 unsigned jaguar_unknown_readbyte(unsigned address)\r
341 {\r
342 #ifdef LOG_UNMAPPED_MEMORY_ACCESSES\r
343         fprintf(log_get(), "jaguar: unknown byte read at %08X (PC=%06X)\n", address, m68k_get_reg(NULL, M68K_REG_PC));\r
344 #endif\r
345     return 0xFF;\r
346 }\r
347 \r
348 unsigned jaguar_unknown_readword(unsigned address)\r
349 {\r
350 #ifdef LOG_UNMAPPED_MEMORY_ACCESSES\r
351         fprintf(log_get(), "jaguar: unknown word read at %08X (PC=%06X)\n", address, m68k_get_reg(NULL, M68K_REG_PC));\r
352 #endif\r
353     return 0xFFFF;\r
354 }\r
355 \r
356 //\r
357 // Jaguar ROM loading\r
358 //\r
359 \r
360 uint8 * jaguar_rom_load(char * path, uint32 * romSize)\r
361 {\r
362         uint8 * rom = NULL;\r
363         fpos_t pos;\r
364         int     x;\r
365         __int64 filepos;\r
366 \r
367         fprintf(log_get(), "jaguar: loading %s...", path);\r
368         FILE * fp = fopen(path, "rb");\r
369         if (fp == NULL)\r
370         {\r
371                 fprintf(log_get(), "failed\n");\r
372                 log_done();\r
373                 exit(0);\r
374                 return NULL;\r
375         }\r
376         fseek(fp, 0, SEEK_END);\r
377 \r
378         /* Added by SDLEMU (http://sdlemu.ngemu.com) */\r
379         /* Added for GCC UNIX compatibility          */\r
380         #ifdef __GCCUNIX__\r
381         fgetpos(fp, (fpos_t *)&filepos);\r
382         #else\r
383         fgetpos(fp, &filepos);\r
384         #endif\r
385         \r
386         *romSize = (int)filepos;\r
387         fseek(fp, 0, SEEK_SET);\r
388         rom = (uint8 *)malloc(*romSize);\r
389         fread(rom, 1, *romSize, fp);\r
390         fclose(fp);\r
391         fprintf(log_get(), "ok (%i bytes)\n", *romSize);\r
392 //      jaguar_mainRom_crc32=crc32_calcCheckSum(jaguar_mainRom,*romSize);\r
393 //      fprintf(log_get(),"crc: 0x%.8x\n",jaguar_mainRom_crc32);\r
394         return rom;\r
395 }\r
396 \r
397 //\r
398 // Load a ROM at a specific address\r
399 //\r
400 \r
401 void jaguar_rom_load_to(uint8 * rom, char * path, uint32 * romSize)\r
402 {\r
403         __int64 filepos;\r
404 \r
405         fprintf(log_get(), "jaguar: loading %s...", path);\r
406         FILE * fp = fopen(path, "rb");\r
407         if (fp == NULL)\r
408         {\r
409                 fprintf(log_get(), "failed\n");\r
410                 log_done();\r
411                 exit(0);\r
412                 return;\r
413         }\r
414         fseek(fp, 0, SEEK_END);\r
415 \r
416         /* Added by SDLEMU (http://sdlemu.ngemu.com) */\r
417         /* Added for GCC UNIX compatibility          */\r
418         #ifdef __GCCUNIX__\r
419         fgetpos(fp, (fpos_t *)&filepos);\r
420         #else\r
421         fgetpos(fp, &filepos);\r
422         #endif\r
423 \r
424         *romSize = (int)filepos;\r
425         fseek(fp, 0, SEEK_SET);\r
426         fread(rom, 1, *romSize, fp);\r
427         fclose(fp);\r
428         fprintf(log_get(), "ok (%i bytes)\n", *romSize);\r
429 }\r
430 \r
431 //\r
432 // Byte swap a region of memory\r
433 //\r
434 \r
435 void jaguar_byte_swap(uint8 * rom, uint32 size)\r
436 {\r
437         while (size > 0)\r
438         {\r
439                 uint8 tmp = rom[0];\r
440                 rom[0] = rom[1];\r
441                 rom[1] = tmp;\r
442                 rom += 2;\r
443                 size -= 2;\r
444         }\r
445 }\r
446 \r
447 //\r
448 // Disassemble instructions at the given offset\r
449 //\r
450 \r
451 void jaguar_dasm(uint32 offset, uint32 qt)\r
452 {\r
453         static char buffer[2048], mem[64];\r
454         int pc = offset, oldpc;\r
455 \r
456         for(int i=0; i<qt; i++)\r
457         {\r
458                 oldpc = pc;\r
459                 for(int j=0; j<64; j++)\r
460 //                      mem[j^0x01] = jaguar_byte_read(pc + j);\r
461                         mem[j^0x01] = jaguar_byte_read(pc + j);\r
462 \r
463                 pc += Dasm68000((char *)mem, buffer, 0);\r
464 #ifdef CPU_DEBUG\r
465                 fprintf(log_get(), "%08X: %s\n", oldpc, buffer);\r
466 #endif\r
467         }\r
468 }\r
469 \r
470 //\r
471 // Jaguar cartridge ROM loading\r
472 //\r
473 \r
474 void jaguar_load_cart(char * path, uint8 * mem, uint32 offs, uint32 boot, uint32 header)\r
475 {\r
476         uint32 romsize;\r
477 \r
478         jaguar_rom_load_to(mem+offs-header, path, &romsize);\r
479 // Is there a need for this? The answer is !!! NO !!!\r
480 //      jaguar_byte_swap(mem+offs, romsize);\r
481         jaguar_mainRom_crc32 = crc32_calcCheckSum(jaguar_mainRom, romsize);\r
482         fprintf(log_get(), "crc: %08X\n", jaguar_mainRom_crc32);\r
483 \r
484 // Brain dead endian dependent crap\r
485 //      *((uint32 *)&jaguar_mainRam[4]) = boot;\r
486 // This is how it *should* have been done...\r
487         SET32(jaguar_mainRam, 4, boot);\r
488 // Same as above...\r
489 //      jaguar_dasm((boot>>16) | (boot<<16), 32*4);\r
490         jaguar_dasm(boot, 32*4);\r
491 }\r
492 \r
493 //\r
494 // Jaguar initialization\r
495 //\r
496 \r
497 #ifdef __PORT__\r
498 void jaguar_init(const char * filename)\r
499 #else\r
500 void jaguar_init(void)\r
501 #endif\r
502 {\r
503         uint32 romsize;\r
504 \r
505         jaguar_screen_scanlines = 525;                  // PAL screen size\r
506         m68k_cycles_per_scanline = 13300000 / (jaguar_screen_scanlines * 60);\r
507         gpu_cycles_per_scanline = (26591000 / 4) / (jaguar_screen_scanlines * 60);\r
508         dsp_cycles_per_scanline = (26591000 / 4) / (jaguar_screen_scanlines * 60);\r
509 \r
510         memory_malloc_secure((void**)&jaguar_mainRam, 0x400000, "Jaguar 68k cpu ram");\r
511         memory_malloc_secure((void**)&jaguar_bootRom, 0x040000, "Jaguar 68k cpu boot rom");\r
512         memory_malloc_secure((void**)&jaguar_mainRom, 0x600000, "Jaguar 68k cpu rom");\r
513         memset(jaguar_mainRam, 0x00, 0x400000);\r
514 \r
515         jaguar_rom_load_to(jaguar_bootRom, jaguar_bootRom_path, &romsize);\r
516 // No need to do this anymore, since Starcrap is gone!\r
517 //      jaguar_byte_swap(jaguar_bootRom, romsize);\r
518         memcpy(jaguar_mainRam, jaguar_bootRom, 8);\r
519 // More braindead endian dependent crap\r
520 //WAS:  *((uint32 *)&jaguar_mainRam[0]) = 0x00000020;\r
521         SET32(jaguar_mainRam, 0, 0x00200000);\r
522 \r
523 #ifdef JAGUAR_WIP_RELEASE\r
524 #ifdef __PORT__\r
525         strcpy(romLoadDialog_filePath, filename);\r
526 #else\r
527         jaguar_open_rom(GetForegroundWindow(), "Load", "Jaguar roms (*.JAG)\0*.JAG\0\0");\r
528 #endif\r
529 //WAS:  jaguar_load_cart(romLoadDialog_filePath, jaguar_mainRom, 0x0000, 0x20000080, 0);\r
530         jaguar_load_cart(romLoadDialog_filePath, jaguar_mainRom, 0x0000, 0x00802000, 0);\r
531         if ((jaguar_mainRom_crc32 == 0x3966698f) || (jaguar_mainRom_crc32 == 0x5e705756)\r
532                 || (jaguar_mainRom_crc32 == 0x2630cbc4) || (jaguar_mainRom_crc32 == 0xd46437e8)\r
533                 || (jaguar_mainRom_crc32 == 0x2630cbc4))\r
534                 dsp_enabled = 1;\r
535 \r
536         if ((jaguar_mainRom_crc32 == 0x6e90989f) || (jaguar_mainRom_crc32 == 0xfc8f0dcd)\r
537                 || (jaguar_mainRom_crc32 == 0x2a512a83) || (jaguar_mainRom_crc32 == 0x41307601)\r
538                 || (jaguar_mainRom_crc32 == 0x3c7bfda8) || (jaguar_mainRom_crc32 == 0x5e705756))\r
539                 gpu_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);\r
540 \r
541         if (jaguar_mainRom_crc32 == 0x7ae20823)\r
542         {\r
543                 dsp_enabled = 1;\r
544                 gpu_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);\r
545                 dsp_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);\r
546         }\r
547         if (jaguar_mainRom_crc32 == 0xe21d0e2f)\r
548         {\r
549                 dsp_enabled = 1;\r
550                 gpu_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);\r
551                 dsp_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);\r
552         }\r
553         if (jaguar_mainRom_crc32 == 0x66f8914c)\r
554         {\r
555                 gpu_cycles_per_scanline = (26591000 / 1) /(jaguar_screen_scanlines * 60);\r
556         }\r
557         if (jaguar_mainRom_crc32 == 0x5a5b9c68)\r
558         {\r
559                 gpu_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);\r
560         }\r
561         if (jaguar_mainRom_crc32 == 0xdcb0197a)\r
562         {\r
563                 dsp_enabled = 0; // dsp not needed\r
564                 gpu_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);\r
565                 //dsp_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
566         }\r
567         if ((jaguar_mainRom_crc32 == 0x3966698f) || (jaguar_mainRom_crc32 == 0xe21d0e2f))\r
568                 dsp_enabled = 1;\r
569         if (jaguar_mainRom_crc32 == 0x5e705756)\r
570         {\r
571                 gpu_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);\r
572                 dsp_enabled = 1;\r
573         }\r
574         if (jaguar_mainRom_crc32 == 0x2630cbc4)\r
575         {\r
576                 // ultra vortek\r
577                 gpu_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);\r
578                 dsp_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);\r
579                 dsp_enabled = 1;\r
580         }\r
581         if ((jaguar_mainRom_crc32 == 0xd46437e8) || (jaguar_mainRom_crc32 == 0xba74c3ed))\r
582         {\r
583                 gpu_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);\r
584                 dsp_enabled = 1;\r
585         }\r
586         if (jaguar_mainRom_crc32 == 0x6e90989f)\r
587                 gpu_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);\r
588 \r
589         if (jaguar_mainRom_crc32 == 0x41307601)\r
590         {\r
591                 gpu_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);\r
592         }\r
593 \r
594         if (jaguar_mainRom_crc32 == 0x8483392b)\r
595         {\r
596                 dsp_enabled = 1;\r
597         }\r
598 \r
599 #else   // #ifdef JAGUAR_WIP_RELEASE\r
600 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/flashback.jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
601 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/Pinball Fantasies.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
602 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/alien vs predator (1994).jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
603 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/cannon fodder (1995) (computer west).jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
604 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/double dragon v (1995) (williams).jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
605 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/Dragon - The Bruce Lee Story.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
606 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/Syndicate.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
607 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/Theme Park.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
608 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/Brutal Sports Football.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
609 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/International Sensible Soccer.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
610 //  jaguar_load_cart("C:/ftp/jaguar/roms/roms/Defender 2000.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
611 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/Fever Pitch Soccer.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
612 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/Rayman.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
613 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/Tempest 2000.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
614 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/zool 2 (1994).jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
615 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/Bubsy - Fractured Furry Tails.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
616 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/Raiden.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
617 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/Dino Olympics.jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
618 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/I-War.jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
619 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/Attack of the Mutant Penguins.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
620 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/Cybermorph.jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
621 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/Troy Aikman NFL Football (1995) (Williams).jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
622 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/Power Drive Rally (1995) (TWI).jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
623 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/Zoop! (1996).jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
624 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/Missile Command 3D.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
625 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/Hover Strike.jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
626 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/worms.bin",jaguar_mainRom,0x0000, 0x20000080,0);\r
627 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/Atari Kart.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
628 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/native.bin",jaguar_mainRam,0x5000, 0x50000000,0x00);\r
629 \r
630         if (jaguar_mainRom_crc32==0xe21d0e2f)\r
631         {\r
632                 dsp_enabled=1;\r
633                 gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
634                 dsp_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
635         }\r
636         if (jaguar_mainRom_crc32==0x66f8914c)\r
637         {\r
638                 gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
639         }\r
640         if (jaguar_mainRom_crc32==0x5a5b9c68)\r
641         {\r
642                 gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
643         }\r
644 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/Super Cross 3D.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
645         if (jaguar_mainRom_crc32==0xdcb0197a)\r
646         {\r
647                 dsp_enabled=0; // dsp not needed\r
648                 gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
649                 //dsp_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
650         }\r
651 //  jaguar_load_cart("C:/ftp/jaguar/roms/roms/wolfenstein 3d (1994).jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
652         if ((jaguar_mainRom_crc32==0x3966698f)||(jaguar_mainRom_crc32==0xe21d0e2f))\r
653                 dsp_enabled=1;\r
654 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/NBA JAM.jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
655 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/Doom - Evil Unleashed.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
656         if (jaguar_mainRom_crc32==0x5e705756)\r
657         {\r
658                 gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
659                 dsp_enabled=1;\r
660         }\r
661 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/Ultra Vortek.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
662         if (jaguar_mainRom_crc32==0x2630cbc4)\r
663         {\r
664                 // ultra vortek\r
665                 gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
666                 dsp_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
667                 dsp_enabled=1; \r
668         }\r
669 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/fflbeta.rom",jaguar_mainRom,0x0000, 0x20000080,0);\r
670 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/Fight for Your Life.jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
671         if ((jaguar_mainRom_crc32==0xd46437e8)||(jaguar_mainRom_crc32==0xba74c3ed))\r
672         {\r
673                 gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
674 //              dsp_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
675                 dsp_enabled=1;\r
676         }\r
677 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/Pitfall - The Mayan Adventure.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
678         if (jaguar_mainRom_crc32==0x6e90989f)\r
679                 gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
680 \r
681 // missing some sprites\r
682 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/Crescent Galaxy.jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
683         if (jaguar_mainRom_crc32==0x41307601)\r
684         {\r
685                 gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
686         }\r
687 \r
688 // missing vertical bar shades  \r
689 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/Phase Zero (2000) (PD).rom",jaguar_mainRom,0x0000, 0x20000080,0);\r
690         if (jaguar_mainRom_crc32==0x8483392b)\r
691         {\r
692                 dsp_enabled=1;\r
693         }\r
694 // cpu/dsp/gpu synchronization problems\r
695 \r
696 \r
697 // locks up during the game\r
698 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/Club Drive.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
699 \r
700 // no parallax floor, locks up at the start of the game \r
701 // jaguar_load_cart("C:/ftp/jaguar/roms/roms/Kasumi Ninja.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
702 \r
703 // displaying the sound control dialog. no way to exit from it  \r
704 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/Checkered Flag.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
705 \r
706 // no 3d        \r
707 //  jaguar_load_cart("C:/ftp/jaguar/roms/roms/Iron Soldier.jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
708 \r
709 // locks up at the start of the game\r
710 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/Super Burnout.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
711         if (jaguar_mainRom_crc32==0x20ae75f4)\r
712         {\r
713                 dsp_enabled=1;\r
714                 gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
715                 dsp_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
716         }\r
717 // locks up at the start of the game    \r
718 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/Val D'Isere Skiing & Snowboarding (1994).jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
719         if (jaguar_mainRom_crc32==0x4664ebd1)\r
720         {\r
721                 dsp_enabled=1;\r
722         }\r
723 \r
724 // fonctionne avec le gpu et le dsp activés et gpu Ã  frequence nominale, et dsp Ã  1/4 de la frequence nominale\r
725 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/white men can't jump (1995).jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
726         if (jaguar_mainRom_crc32==0x7ae20823)\r
727         {\r
728                 dsp_enabled=1;\r
729                 gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
730         }\r
731 // not working at all\r
732 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/Flip Out.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
733         if (jaguar_mainRom_crc32==0x6f57dcd2)\r
734         {\r
735                 gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
736                 dsp_enabled=0;\r
737 \r
738         }\r
739 \r
740         jaguar_load_cart("C:/ftp/jaguar/roms/roms/Ruiner.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
741         if (jaguar_mainRom_crc32==0x6a7c7430)\r
742         {\r
743                 dsp_enabled=1;\r
744         }\r
745 \r
746         if (jaguar_mainRom_crc32==0x2f032271)\r
747         {\r
748                 dsp_enabled=1;\r
749                 dsp_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
750                 gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
751         }\r
752 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/tetris.bin",jaguar_mainRam,0x4fe4, 0x50000000,0x00);\r
753 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/painter.bin",jaguar_mainRam,0xffe4, 0x00000001,0x00);\r
754 //      jaguar_load_cart("./roms/jagcd.rom",jaguar_mainRom,0x0000, 0x20000080,0);\r
755 \r
756 //      jaguar_load_cart("cart.jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
757 \r
758         \r
759 //      cd_bios_boot("C:\\ftp\\jaguar\\cd\\Brain Dead 13.cdi");\r
760 //      cd_bios_boot("C:\\ftp\\jaguar\\cd\\baldies.cdi");\r
761 //      cd_bios_boot("C:\\ftp\\jaguar\\cd\\mystdemo.cdi");\r
762 //      cd_bios_boot("C:\\ftp\\jaguar\\cd\\battlemorph.cdi");\r
763 //      cd_bios_boot("C:\\ftp\\jaguar\\cd\\primalrage.cdi");\r
764 //      cd_bios_boot("C:\\ftp\\jaguar\\cd\\Dragons Lair.cdi");\r
765 \r
766 //      jaguar_load_cart("C:/ftp/jaguar/roms/roms/raw.jag",jaguar_mainRam,0x4000, 0x40000000,0x00);\r
767 #endif  // #ifdef JAGUAR_WIP_RELEASE\r
768 \r
769 #ifdef JAGUAR_REAL_SPEED\r
770         gpu_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);\r
771         dsp_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);\r
772 #endif\r
773 #ifdef SOUND_OUTPUT\r
774         ws_audio_init();\r
775 #endif\r
776         if (jaguar_use_bios)\r
777         {\r
778                 memcpy(jaguar_mainRam, jaguar_bootRom, 8);\r
779                 *((uint32 *)&jaguar_mainRam[0]) = 0x00000020;\r
780         }\r
781 \r
782 //      s68000init();\r
783         m68k_set_cpu_type(M68K_CPU_TYPE_68000);\r
784         gpu_init();\r
785         dsp_init();\r
786         tom_init();\r
787         jerry_init();\r
788         cdrom_init();\r
789 }\r
790 //////////////////////////////////////////////////////////////////////////////\r
791 //\r
792 //////////////////////////////////////////////////////////////////////////////\r
793 //\r
794 //\r
795 //\r
796 //\r
797 //\r
798 //\r
799 //////////////////////////////////////////////////////////////////////////////\r
800 unsigned jaguar_byte_read(unsigned int offset)\r
801 {\r
802         uint8 data = 0x00;\r
803 \r
804         offset &= 0xFFFFFF;\r
805         if (offset < 0x400000)\r
806 //              data = (jaguar_mainRam[(offset^0x01) & 0x3FFFFF]);\r
807                 data = (jaguar_mainRam[offset & 0x3FFFFF]);\r
808         else if ((offset >= 0x800000) && (offset < 0xC00000))\r
809 //              data = (jaguar_mainRom[(offset^0x01)-0x800000]);\r
810                 data = (jaguar_mainRom[offset - 0x800000]);\r
811         else if ((offset >= 0xDFFF00) && (offset < 0xDFFF00))\r
812                 data = cdrom_byte_read(offset);\r
813         else if ((offset >= 0xE00000) && (offset < 0xE40000))\r
814 //              data = (jaguar_bootRom[(offset^0x01) & 0x3FFFF]);\r
815                 data = (jaguar_bootRom[offset & 0x3FFFF]);\r
816         else if ((offset >= 0xF00000) && (offset < 0xF10000))\r
817                 data = (tom_byte_read(offset));\r
818         else if ((offset >= 0xF10000) && (offset < 0xF20000))\r
819                 data = (jerry_byte_read(offset));\r
820         else\r
821                 data = jaguar_unknown_readbyte(offset);\r
822 \r
823         return data;\r
824 }\r
825 //////////////////////////////////////////////////////////////////////////////\r
826 //\r
827 //////////////////////////////////////////////////////////////////////////////\r
828 //\r
829 //\r
830 //\r
831 //\r
832 //\r
833 //\r
834 //////////////////////////////////////////////////////////////////////////////\r
835 unsigned jaguar_word_read(unsigned int offset)\r
836 {\r
837         offset &= 0xFFFFFF;\r
838         if (offset < 0x400000)\r
839         {\r
840 //              return (jaguar_mainRam[(offset+1) & 0x3FFFFF] << 8) | jaguar_mainRam[(offset+0) & 0x3FFFFF];\r
841                 return (jaguar_mainRam[(offset+0) & 0x3FFFFF] << 8) | jaguar_mainRam[(offset+1) & 0x3FFFFF];\r
842         }\r
843         else if ((offset >= 0x800000) && (offset < 0xC00000))\r
844         {\r
845                 offset -= 0x800000;\r
846 //              return (jaguar_mainRom[offset+1] << 8) | jaguar_mainRom[offset+0];\r
847                 return (jaguar_mainRom[offset+0] << 8) | jaguar_mainRom[offset+1];\r
848         }\r
849         else if ((offset >= 0xDFFF00) && (offset < 0xDFFF00))\r
850                 return cdrom_word_read(offset);\r
851         else if ((offset >= 0xE00000) && (offset < 0xE40000))\r
852                 return *((uint16 *)&jaguar_bootRom[offset & 0x3FFFF]);\r
853         else if ((offset >= 0xF00000) && (offset < 0xF10000))\r
854                 return tom_word_read(offset);\r
855         else if ((offset >= 0xF10000) && (offset < 0xF20000))\r
856                 return jerry_word_read(offset);\r
857 \r
858         return jaguar_unknown_readword(offset);\r
859 }\r
860 //////////////////////////////////////////////////////////////////////////////\r
861 //\r
862 //////////////////////////////////////////////////////////////////////////////\r
863 //\r
864 //\r
865 //\r
866 //\r
867 //\r
868 //\r
869 //////////////////////////////////////////////////////////////////////////////\r
870 void jaguar_byte_write(unsigned  offset, unsigned  data)\r
871 {\r
872         offset &= 0xFFFFFF;\r
873         if (offset < 0x400000)\r
874         {\r
875 //              jaguar_mainRam[(offset^0x01) & 0x3FFFFF] = data;\r
876                 jaguar_mainRam[offset & 0x3FFFFF] = data;\r
877                 return;\r
878         }\r
879         else if ((offset >= 0xDFFF00) && (offset < 0xDFFF00))\r
880         {\r
881                 cdrom_byte_write(offset, data);\r
882                 return;\r
883         }\r
884         else if ((offset >= 0xF00000) && (offset < 0xF10000))\r
885         {\r
886                 tom_byte_write(offset, data);\r
887                 return;\r
888         }\r
889         else if ((offset >= 0xF10000) && (offset < 0xF20000))\r
890         {\r
891                 jerry_byte_write(offset, data);\r
892                 return;\r
893         }\r
894     \r
895         jaguar_unknown_writebyte(offset, data);\r
896 }\r
897 //////////////////////////////////////////////////////////////////////////////\r
898 //\r
899 //////////////////////////////////////////////////////////////////////////////\r
900 //\r
901 //\r
902 //\r
903 //\r
904 //\r
905 //\r
906 //////////////////////////////////////////////////////////////////////////////\r
907 void jaguar_word_write(unsigned offset, unsigned data)\r
908 {\r
909         offset &= 0xFFFFFF;\r
910         \r
911         if (offset < 0x400000)\r
912         {\r
913 //              jaguar_mainRam[(offset+0) & 0x3FFFFF] = data & 0xFF;\r
914 //              jaguar_mainRam[(offset+1) & 0x3FFFFF] = (data>>8) & 0xFF;\r
915                 jaguar_mainRam[(offset+0) & 0x3FFFFF] = (data>>8) & 0xFF;\r
916                 jaguar_mainRam[(offset+1) & 0x3FFFFF] = data & 0xFF;\r
917                 return;\r
918         }\r
919         else if ((offset >= 0xDFFF00) && (offset < 0xDFFFFF))\r
920         {\r
921                 cdrom_word_write(offset, data);\r
922                 return;\r
923         }\r
924         else if ((offset >= 0xF00000) && (offset < 0xF10000))\r
925         {\r
926                 tom_word_write(offset, data);\r
927                 return;\r
928         }\r
929         else if ((offset >= 0xF10000) && (offset < 0xF20000))\r
930         {\r
931                 jerry_word_write(offset, data);\r
932                 return;\r
933         }\r
934     \r
935         jaguar_unknown_writeword(offset, data);\r
936 }\r
937 //////////////////////////////////////////////////////////////////////////////\r
938 //\r
939 //////////////////////////////////////////////////////////////////////////////\r
940 //\r
941 //\r
942 //\r
943 //\r
944 //\r
945 //\r
946 //////////////////////////////////////////////////////////////////////////////\r
947 unsigned jaguar_long_read(unsigned int offset)\r
948 {\r
949 /*      uint32 data = jaguar_word_read(offset);\r
950         data = (data<<16) | jaguar_word_read(offset+2);\r
951         return data;*/\r
952         return (jaguar_word_read(offset) << 16) | jaguar_word_read(offset+2);\r
953 }\r
954 //////////////////////////////////////////////////////////////////////////////\r
955 //\r
956 //////////////////////////////////////////////////////////////////////////////\r
957 //\r
958 //\r
959 //\r
960 //\r
961 //\r
962 //\r
963 //////////////////////////////////////////////////////////////////////////////\r
964 void jaguar_long_write(unsigned offset, unsigned data)\r
965 {\r
966         jaguar_word_write(offset, data >> 16);\r
967         jaguar_word_write(offset+2, data & 0xFFFF);\r
968 }\r
969 //////////////////////////////////////////////////////////////////////////////\r
970 //\r
971 //////////////////////////////////////////////////////////////////////////////\r
972 //\r
973 //\r
974 //\r
975 //\r
976 //\r
977 //\r
978 //////////////////////////////////////////////////////////////////////////////\r
979 void jaguar_done(void)\r
980 {\r
981         fprintf(log_get(), "jaguar: top of stack: %08X\n", jaguar_long_read(0x001FFFF8));\r
982 //      fprintf(log_get(),"jaguar: cd bios version 0x%.4x\n",jaguar_word_read(0x3004));\r
983 //      fprintf(log_get(),"jaguar: vbl interrupt is %s\n",((tom_irq_enabled(IRQ_VBLANK))&&(jaguar_interrupt_handler_is_valid(64)))?"enabled":"disabled");\r
984         s68000show_context();\r
985 #ifdef SOUND_OUTPUT\r
986         ws_audio_done();\r
987 #endif\r
988         cd_bios_done();\r
989         cdrom_done();\r
990         tom_done();\r
991         jerry_done();\r
992 //      jaguar_regionsDone();\r
993         memory_free(jaguar_mainRom);\r
994         memory_free(jaguar_bootRom);\r
995         memory_free(jaguar_mainRam);\r
996 //      fprintf(log_get(),"jaguar_done()\n");\r
997 }\r
998 //////////////////////////////////////////////////////////////////////////////\r
999 //\r
1000 //////////////////////////////////////////////////////////////////////////////\r
1001 //\r
1002 //\r
1003 //\r
1004 //\r
1005 //\r
1006 //\r
1007 //////////////////////////////////////////////////////////////////////////////\r
1008 void jaguar_reset(void)\r
1009 {\r
1010 //      fprintf(log_get(),"jaguar_reset():\n");\r
1011 #ifdef SOUND_OUTPUT\r
1012         ws_audio_reset();\r
1013 #endif\r
1014         cd_bios_reset();\r
1015         tom_reset();\r
1016         jerry_reset();\r
1017         gpu_reset();\r
1018         dsp_reset();\r
1019         cdrom_reset();\r
1020 //      s68000reset();\r
1021     m68k_pulse_reset();                         // Reset the 68000\r
1022         fprintf(log_get(), "\t68K PC=%06X SP=%08X\n", m68k_get_reg(NULL, M68K_REG_PC), m68k_get_reg(NULL, M68K_REG_A7));\r
1023 }\r
1024 //////////////////////////////////////////////////////////////////////////////\r
1025 //\r
1026 //////////////////////////////////////////////////////////////////////////////\r
1027 //\r
1028 //\r
1029 //\r
1030 //////////////////////////////////////////////////////////////////////////////\r
1031 void jaguar_reset_handler(void)\r
1032 {\r
1033 }\r
1034 //////////////////////////////////////////////////////////////////////////////\r
1035 //\r
1036 //////////////////////////////////////////////////////////////////////////////\r
1037 //\r
1038 //\r
1039 //\r
1040 //////////////////////////////////////////////////////////////////////////////\r
1041 void jaguar_exec(int16 * backbuffer, uint8 render)\r
1042\r
1043         int i;\r
1044         uint32 vblank_duration = tom_get_vdb();\r
1045 \r
1046         // vblank\r
1047         if ((tom_irq_enabled(IRQ_VBLANK)) && (jaguar_interrupt_handler_is_valid(64)))\r
1048         {\r
1049                 if (jaguar_word_read(0xF0004E) != 0xFFFF)\r
1050                 {\r
1051                         tom_set_pending_video_int();\r
1052 //                      s68000interrupt(7, IRQ_VBLANK+64);\r
1053 //                      s68000flushInterrupts();\r
1054                         m68k_set_irq(7);                                        // IRQ_VBLANK+64??? Not autovectored??? No.\r
1055 // Could set a global variable here, to signal that this is a VBLANK interrupt...\r
1056 // Then again, since IRQ_VBLANK is set to zero, this would not be necessary in this case.\r
1057                 }\r
1058         }\r
1059         for(i=0; i<vblank_duration; i++)\r
1060         {\r
1061 /*              uint32 invalid_instruction_address = s68000exec(m68k_cycles_per_scanline);\r
1062                 if (invalid_instruction_address != 0x80000000)\r
1063                         cd_bios_process(invalid_instruction_address);*/\r
1064                 m68k_execute(m68k_cycles_per_scanline);\r
1065                 // No CD handling... Hmm...\r
1066 \r
1067                 cd_bios_exec(i);\r
1068                 tom_pit_exec(m68k_cycles_per_scanline);\r
1069                 tom_exec_scanline(backbuffer, i, 0);\r
1070                 jerry_pit_exec(m68k_cycles_per_scanline);\r
1071                 jerry_i2s_exec(m68k_cycles_per_scanline);\r
1072                 gpu_exec(gpu_cycles_per_scanline);\r
1073                 if (dsp_enabled)\r
1074                         dsp_exec(dsp_cycles_per_scanline);\r
1075         }\r
1076         \r
1077         for (; i<jaguar_screen_scanlines; i++)\r
1078         {\r
1079 /*              uint32 invalid_instruction_address = s68000exec(m68k_cycles_per_scanline);\r
1080                 if (invalid_instruction_address != 0x80000000)\r
1081                         cd_bios_process(invalid_instruction_address);*/\r
1082                 m68k_execute(m68k_cycles_per_scanline);\r
1083                 // No CD handling... Hmm...\r
1084                 cd_bios_exec(i);\r
1085                 tom_pit_exec(m68k_cycles_per_scanline);\r
1086                 jerry_pit_exec(m68k_cycles_per_scanline);\r
1087                 jerry_i2s_exec(m68k_cycles_per_scanline);\r
1088                 tom_exec_scanline(backbuffer, i, render);\r
1089                 gpu_exec(gpu_cycles_per_scanline);\r
1090                 if (dsp_enabled)\r
1091                         dsp_exec(dsp_cycles_per_scanline);\r
1092                 backbuffer += tom_width;\r
1093         }\r
1094 #ifdef SOUND_OUTPUT\r
1095         system_sound_update();\r
1096 #endif\r
1097 }\r