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