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
12 #include "m68kdasmAG.h"
\r
15 //#define LOG_UNMAPPED_MEMORY_ACCESSES
\r
16 //#define SOUND_OUTPUT
\r
18 // Some handy macros to help converting native endian to big endian (jaguar native)
\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
24 // Function Prototypes
\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
34 int dsp_enabled = 1;
\r
36 int dsp_enabled = 0;
\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
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
52 uint32 jaguar_mainRom_crc32;
\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
59 static uint8 * jaguar_mainRam = NULL;
\r
60 static uint8 * jaguar_bootRom = NULL;
\r
61 static uint8 * jaguar_mainRom = NULL;
\r
65 // Musashi 68000 read/write/IRQ functions
\r
68 int irq_ack_handler(int level)
\r
70 int vector = M68K_INT_ACK_AUTOVECTOR;
\r
74 m68k_set_irq(0); // Clear the IRQ...
\r
75 vector = 64; // Set user interrupt #0
\r
81 //Do this in makefile??? Yes!
\r
82 //#define LOG_UNMAPPED_MEMORY_ACCESSES 1
\r
84 unsigned int m68k_read_memory_8(unsigned int address)
\r
86 //fprintf(log_get(), "[RM8] Addr: %08X\n", address);
\r
87 unsigned int retVal = 0;
\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
102 retVal = jaguar_unknown_readbyte(address);
\r
107 unsigned int m68k_read_memory_16(unsigned int address)
\r
109 //fprintf(log_get(), "[RM16] Addr: %08X\n", address);
\r
110 unsigned int retVal = 0;
\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
126 //fprintf(log_get(), "[RM16] Unknown address: %08X\n", address);
\r
127 retVal = jaguar_unknown_readword(address);
\r
133 unsigned int m68k_read_memory_32(unsigned int address)
\r
135 //fprintf(log_get(), "--> [RM32]\n");
\r
136 return (m68k_read_memory_16(address) << 16) | m68k_read_memory_16(address + 2);
\r
139 void m68k_write_memory_8(unsigned int address, unsigned int value)
\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
151 jaguar_unknown_writebyte(address, value);
\r
154 void m68k_write_memory_16(unsigned int address, unsigned int value)
\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
159 jaguar_mainRam[address] = value >> 8;
\r
160 jaguar_mainRam[address + 1] = value & 0xFF;
\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
169 jaguar_unknown_writeword(address, value);
\r
172 void m68k_write_memory_32(unsigned int address, unsigned int value)
\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
180 //////////////////////////////////////////////////////////////////////////////
\r
182 //////////////////////////////////////////////////////////////////////////////
\r
186 //////////////////////////////////////////////////////////////////////////////
\r
187 uint32 jaguar_get_handler(uint32 i)
\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
194 //////////////////////////////////////////////////////////////////////////////
\r
196 //////////////////////////////////////////////////////////////////////////////
\r
202 //////////////////////////////////////////////////////////////////////////////
\r
203 static char romLoadDialog_filePath[1024];
\r
205 static char romLoadDialog_initialDirectory[1024];
\r
207 int jaguar_open_rom(HWND hWnd, char * title, char * filterString)
\r
210 romLoadDialog_initialDirectory[0] = 0;
\r
211 romLoadDialog_filePath[0] = 0;
\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
226 if(GetOpenFileName(&ofn) == FALSE)
\r
228 DWORD res = CommDlgExtendedError();
\r
229 SendMessage(hWnd, WM_MOVE, 0,0);
\r
234 SendMessage(hWnd, WM_MOVE, 0,0);
\r
238 //////////////////////////////////////////////////////////////////////////////
\r
240 //////////////////////////////////////////////////////////////////////////////
\r
244 //////////////////////////////////////////////////////////////////////////////
\r
245 uint32 jaguar_interrupt_handler_is_valid(uint32 i)
\r
247 uint32 handler = jaguar_get_handler(i);
\r
248 if (handler && (handler != 0xFFFFFFFF))
\r
253 //////////////////////////////////////////////////////////////////////////////
\r
255 //////////////////////////////////////////////////////////////////////////////
\r
259 //////////////////////////////////////////////////////////////////////////////
\r
260 void s68000show_context(void)
\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
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
281 if (tom_irq_enabled(IRQ_VBLANK))
\r
283 fprintf(log_get(), "vblank int: enabled\n");
\r
284 jaguar_dasm(jaguar_get_handler(64), 0x200);
\r
287 fprintf(log_get(), "vblank int: disabled\n");
\r
288 fprintf(log_get(), "..................\n");
\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
294 // Starscream crap ripped out...
\r
297 // Unknown read/write byte/word routines
\r
300 void jaguar_unknown_writebyte(unsigned address, unsigned data)
\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
307 void jaguar_unknown_writeword(unsigned address, unsigned data)
\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
314 unsigned jaguar_unknown_readbyte(unsigned address)
\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
322 unsigned jaguar_unknown_readword(unsigned address)
\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
331 // Jaguar ROM loading
\r
334 uint8 * jaguar_rom_load(char * path, uint32 * romSize)
\r
338 fprintf(log_get(), "jaguar: loading %s...", path);
\r
339 FILE * fp = fopen(path, "rb");
\r
342 fprintf(log_get(), "failed\n");
\r
347 fseek(fp, 0, SEEK_END);
\r
349 /* Added by SDLEMU (http://sdlemu.ngemu.com) */
\r
350 /* Added for GCC UNIX compatibility */
\r
352 fgetpos(fp, (fpos_t *)&filepos);
\r
354 fgetpos(fp, &filepos);
\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
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
369 // Load a ROM at a specific address
\r
372 void jaguar_rom_load_to(uint8 * rom, char * path, uint32 * romSize)
\r
376 fprintf(log_get(), "jaguar: loading %s...", path);
\r
377 FILE * fp = fopen(path, "rb");
\r
380 fprintf(log_get(), "failed\n");
\r
385 fseek(fp, 0, SEEK_END);
\r
387 /* Added by SDLEMU (http://sdlemu.ngemu.com) */
\r
388 /* Added for GCC UNIX compatibility */
\r
390 fgetpos(fp, (fpos_t *)&filepos);
\r
392 fgetpos(fp, &filepos);
\r
395 *romSize = (int)filepos;
\r
396 fseek(fp, 0, SEEK_SET);
\r
397 fread(rom, 1, *romSize, fp);
\r
399 fprintf(log_get(), "ok (%i bytes)\n", *romSize);
\r
403 // Byte swap a region of memory
\r
406 /*void jaguar_byte_swap(uint8 * rom, uint32 size)
\r
410 uint8 tmp = rom[0];
\r
419 // Disassemble instructions at the given offset
\r
422 void jaguar_dasm(uint32 offset, uint32 qt)
\r
425 static char buffer[2048], mem[64];
\r
426 int pc = offset, oldpc;
\r
428 for(int i=0; i<qt; i++)
\r
431 for(int j=0; j<64; j++)
\r
432 mem[j^0x01] = jaguar_byte_read(pc + j);
\r
434 pc += Dasm68000((char *)mem, buffer, 0);
\r
435 fprintf(log_get(), "%08X: %s\n", oldpc, buffer);
\r
441 // Jaguar cartridge ROM loading
\r
444 void jaguar_load_cart(char * path, uint8 * mem, uint32 offs, uint32 boot, uint32 header)
\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
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
464 // Jaguar initialization
\r
468 void jaguar_init(const char * filename)
\r
470 void jaguar_init(void)
\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
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
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
493 #ifdef JAGUAR_WIP_RELEASE
\r
495 strcpy(romLoadDialog_filePath, filename);
\r
497 jaguar_open_rom(GetForegroundWindow(), "Load", "Jaguar roms (*.JAG)\0*.JAG\0\0");
\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
503 /* if (jaguar_mainRom_crc32 == 0xA9F8A00E)
\r
506 fprintf(log_get(), "--> Rayman detected, DSP enabled...\n");
\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
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
520 if (jaguar_mainRom_crc32 == 0x7ae20823)
\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
526 if (jaguar_mainRom_crc32 == 0xe21d0e2f)
\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
532 if (jaguar_mainRom_crc32 == 0x66f8914c)
\r
534 gpu_cycles_per_scanline = (26591000 / 1) /(jaguar_screen_scanlines * 60);
\r
536 if (jaguar_mainRom_crc32 == 0x5a5b9c68)
\r
538 gpu_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);
\r
540 if (jaguar_mainRom_crc32 == 0xdcb0197a)
\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
546 if ((jaguar_mainRom_crc32 == 0x3966698f) || (jaguar_mainRom_crc32 == 0xe21d0e2f))
\r
548 if (jaguar_mainRom_crc32 == 0x5e705756)
\r
550 gpu_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);
\r
553 if (jaguar_mainRom_crc32 == 0x2630cbc4)
\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
560 if ((jaguar_mainRom_crc32 == 0xd46437e8) || (jaguar_mainRom_crc32 == 0xba74c3ed))
\r
562 gpu_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);
\r
565 if (jaguar_mainRom_crc32 == 0x6e90989f)
\r
566 gpu_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);
\r
568 if (jaguar_mainRom_crc32 == 0x41307601)
\r
570 gpu_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);
\r
573 if (jaguar_mainRom_crc32 == 0x8483392b)
\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
609 if (jaguar_mainRom_crc32==0xe21d0e2f)
\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
615 if (jaguar_mainRom_crc32==0x66f8914c)
\r
617 gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);
\r
619 if (jaguar_mainRom_crc32==0x5a5b9c68)
\r
621 gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);
\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
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
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
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
637 gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);
\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
644 gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);
\r
645 dsp_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);
\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
652 gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);
\r
653 // dsp_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);
\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
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
664 gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);
\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
673 // cpu/dsp/gpu synchronization problems
\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
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
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
686 // jaguar_load_cart("C:/ftp/jaguar/roms/roms/Iron Soldier.jag",jaguar_mainRom,0x0000, 0x20000080,0);
\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
693 gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);
\r
694 dsp_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);
\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
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
708 gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);
\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
714 gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);
\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
725 if (jaguar_mainRom_crc32==0x2f032271)
\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
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
735 // jaguar_load_cart("cart.jag",jaguar_mainRom,0x0000, 0x20000080,0);
\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
745 // jaguar_load_cart("C:/ftp/jaguar/roms/roms/raw.jag",jaguar_mainRam,0x4000, 0x40000000,0x00);
\r
746 #endif // #ifdef JAGUAR_WIP_RELEASE
\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
752 #ifdef SOUND_OUTPUT
\r
755 if (jaguar_use_bios)
\r
757 memcpy(jaguar_mainRam, jaguar_bootRom, 8);
\r
758 // *((uint32 *)&jaguar_mainRam[0]) = 0x00000020;
\r
759 // SET32(jaguar_mainRam, 0, 0x00200000);
\r
763 m68k_set_cpu_type(M68K_CPU_TYPE_68000);
\r
771 unsigned jaguar_byte_read(unsigned int offset)
\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
793 data = jaguar_unknown_readbyte(offset);
\r
798 unsigned jaguar_word_read(unsigned int offset)
\r
800 offset &= 0xFFFFFF;
\r
801 if (offset <= 0x3FFFFE)
\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
806 else if ((offset >= 0x800000) && (offset <= 0xBFFFFE))
\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
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
823 return jaguar_unknown_readword(offset);
\r
826 void jaguar_byte_write(unsigned offset, unsigned data)
\r
828 offset &= 0xFFFFFF;
\r
829 if (offset < 0x400000)
\r
831 // jaguar_mainRam[(offset^0x01) & 0x3FFFFF] = data;
\r
832 jaguar_mainRam[offset & 0x3FFFFF] = data;
\r
835 // else if ((offset >= 0xDFFF00) && (offset < 0xDFFF00))
\r
836 else if ((offset >= 0xDFFF00) && (offset <= 0xDFFFFF))
\r
838 cdrom_byte_write(offset, data);
\r
841 else if ((offset >= 0xF00000) && (offset <= 0xF0FFFF))
\r
843 tom_byte_write(offset, data);
\r
846 else if ((offset >= 0xF10000) && (offset <= 0xF1FFFF))
\r
848 jerry_byte_write(offset, data);
\r
852 jaguar_unknown_writebyte(offset, data);
\r
855 void jaguar_word_write(unsigned offset, unsigned data)
\r
857 offset &= 0xFFFFFF;
\r
859 if (offset <= 0x3FFFFE)
\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
867 else if ((offset >= 0xDFFF00) && (offset <= 0xDFFFFE))
\r
869 cdrom_word_write(offset, data);
\r
872 else if ((offset >= 0xF00000) && (offset <= 0xF0FFFE))
\r
874 tom_word_write(offset, data);
\r
877 else if ((offset >= 0xF10000) && (offset <= 0xF1FFFE))
\r
879 jerry_word_write(offset, data);
\r
883 jaguar_unknown_writeword(offset, data);
\r
886 unsigned jaguar_long_read(unsigned int offset)
\r
888 /* uint32 data = jaguar_word_read(offset);
\r
889 data = (data<<16) | jaguar_word_read(offset+2);
\r
891 return (jaguar_word_read(offset) << 16) | jaguar_word_read(offset+2);
\r
894 void jaguar_long_write(unsigned offset, unsigned data)
\r
896 jaguar_word_write(offset, data >> 16);
\r
897 jaguar_word_write(offset+2, data & 0xFFFF);
\r
900 void jaguar_done(void)
\r
902 fprintf(log_get(), "jaguar_done() ...START\n");
\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
909 #ifdef SOUND_OUTPUT
\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
923 void jaguar_reset(void)
\r
925 // fprintf(log_get(),"jaguar_reset():\n");
\r
926 #ifdef SOUND_OUTPUT
\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
940 void jaguar_reset_handler(void)
\r
944 void jaguar_exec(int16 * backbuffer, uint8 render)
\r
946 uint32 i, vblank_duration = tom_get_vdb();
\r
949 if ((tom_irq_enabled(IRQ_VBLANK)) && (jaguar_interrupt_handler_is_valid(64)))
\r
951 if (jaguar_word_read(0xF0004E) != 0xFFFF)
\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
962 for(i=0; i<vblank_duration; i++)
\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
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
977 dsp_exec(dsp_cycles_per_scanline);
\r
980 for (; i<jaguar_screen_scanlines; i++)
\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
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
994 dsp_exec(dsp_cycles_per_scanline);
\r
995 backbuffer += tom_width;
\r
997 #ifdef SOUND_OUTPUT
\r
998 system_sound_update();
\r
1002 // Temp debugging stuff
\r
1006 FILE * fp = fopen("./memdump.bin", "wb");
\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
1019 uint8 * GetRamPtr(void)
\r
1021 return jaguar_mainRam;
\r