/* OSS_16, OSS2_16 */ static void set_bank_A0AF(int b, int main) { if (b != bank) { if (b < 0) CartA0BF_Disable(); else { CartA0BF_Enable(); CopyROM(0xa000, 0xafff, cart_image + b * 0x1000); if (bank < 0) CopyROM(0xb000, 0xbfff, cart_image + main); } bank = b; } }
/* special support of Bounty Bob on Atari5200 */ void CART_BountyBob1(UWORD addr) { if (machine_type == MACHINE_5200) { if (addr >= 0x4ff6 && addr <= 0x4ff9) { addr -= 0x4ff6; CopyROM(0x4000, 0x4fff, cart_image + addr * 0x1000); } } else { if (addr >= 0x8ff6 && addr <= 0x8ff9) { addr -= 0x8ff6; CopyROM(0x8000, 0x8fff, cart_image + addr * 0x1000); } } }
/* SWXEGS_32, SWXEGS_64, SWXEGS_128, SWXEGS_256, SWXEGS_512, SWXEGS_1024 */ static void set_bank_809F(int b, int main) { if (b != bank) { if (b & 0x80) { Cart809F_Disable(); CartA0BF_Disable(); } else { Cart809F_Enable(); CartA0BF_Enable(); CopyROM(0x8000, 0x9fff, cart_image + b * 0x2000); if (bank & 0x80) CopyROM(0xa000, 0xbfff, cart_image + main); } bank = b; } }
static void set_bank_A0BF_ATMAX1024(int b) { if (b != bank) { if (b >= 0x80) CartA0BF_Disable(); else { CartA0BF_Enable(); CopyROM(0xa000, 0xbfff, cart_image + b * 0x2000); } bank = b; } }
static void set_bank_A0BF_WILL32(int b) { if (b != bank) { if (b & 0x0008) CartA0BF_Disable(); else { CartA0BF_Enable(); CopyROM(0xa000, 0xbfff, cart_image + (b & 3) * 0x2000); } bank = b; } }
static void set_bank_80BF(int b) { if (b != bank) { if (b & 0x80) { Cart809F_Disable(); CartA0BF_Disable(); } else { Cart809F_Enable(); CartA0BF_Enable(); CopyROM(0x8000, 0xbfff, cart_image + b * 0x4000); } bank = b; } }
/* the back ups of the originals. */ BOOL MakeBackups(void) { char BackupPath[100]; char FromPath[100]; FILE * fp; int i; MakeBackupPath(BackupDir, BackupPath, GfxRoms[0].ROMName, 1); /* are the roms already backed up? (can we open one for read) */ if ((fp = fopen(BackupPath, "rb")) != NULL) { fclose(fp); return TRUE; } /* at this point we need to make backups */ /* first create directory */ MakeBackupPath(BackupDir, BackupPath, GfxRoms[0].ROMName, 0); mkdir(BackupPath, S_IRUSR | S_IWUSR); /* back up the roms */ for (i = 0; i < NumGfxRoms; i ++) { strcpy(FromPath, ROMPathFound); put_backslash(FromPath); strcat(FromPath, ROMDirName); put_backslash(FromPath); strcat(FromPath, GfxRoms[i].ROMName); MakeBackupPath(BackupDir, BackupPath, GfxRoms[i].ROMName, 1); if (CopyROM(FromPath, BackupPath, GfxRoms[i].Size, 0) == FALSE) return FALSE; } return TRUE; }
/* a write to D500-D5FF area */ void CART_PutByte(UWORD addr, UBYTE byte) { if (rtime_enabled && (addr == 0xd5b8 || addr == 0xd5b9)) { RTIME_PutByte(byte); return; } switch (cart_type) { case CART_XEGS_32: set_bank_809F(byte & 0x03, 0x6000); break; case CART_XEGS_64: set_bank_809F(byte & 0x07, 0xe000); break; case CART_XEGS_128: set_bank_809F(byte & 0x0f, 0x1e000); break; case CART_XEGS_256: set_bank_809F(byte & 0x1f, 0x3e000); break; case CART_XEGS_512: set_bank_809F(byte & 0x3f, 0x7e000); break; case CART_XEGS_1024: set_bank_809F(byte & 0x7f, 0xfe000); break; case CART_ATRAX_128: if (byte & 0x80) { if (bank >= 0) { CartA0BF_Disable(); bank = -1; } } else { int b = byte & 0xf; if (b != bank) { CartA0BF_Enable(); CopyROM(0xa000, 0xbfff, cart_image + b * 0x2000); bank = b; } } break; case CART_MEGA_16: set_bank_80BF(byte & 0x80); break; case CART_MEGA_32: set_bank_80BF(byte & 0x81); break; case CART_MEGA_64: set_bank_80BF(byte & 0x83); break; case CART_MEGA_128: set_bank_80BF(byte & 0x87); break; case CART_MEGA_256: set_bank_80BF(byte & 0x8f); break; case CART_MEGA_512: set_bank_80BF(byte & 0x9f); break; case CART_MEGA_1024: set_bank_80BF(byte & 0xbf); break; case CART_SWXEGS_32: set_bank_809F(byte & 0x83, 0x6000); break; case CART_SWXEGS_64: set_bank_809F(byte & 0x87, 0xe000); break; case CART_SWXEGS_128: set_bank_809F(byte & 0x8f, 0x1e000); break; case CART_SWXEGS_256: set_bank_809F(byte & 0x9f, 0x3e000); break; case CART_SWXEGS_512: set_bank_809F(byte & 0xbf, 0x7e000); break; case CART_SWXEGS_1024: set_bank_809F(byte, 0xfe000); break; default: CART_Access(addr); break; } }
void MergeFiles(char * ROMName, long size) { char BackupPath[100] = {0}; char PatchPath[100] = {0}; FILE * fpNewRom = NULL; FILE * fpBackupRom = NULL; FILE * fpPatchRom = NULL; char Header[] = "PATCH"; long Offset = 0; long NumBytes = 0; long i; long BackupPos = 0; BYTE ch; /* check for rom name in backup directory */ MakeBackupPath(BackupDir, BackupPath,ROMName, 1); /* if not there then put it there */ if ((fpBackupRom = fopen(BackupPath, "rb")) == NULL) { CopyROM(ROMName, BackupPath, size, 1); if ((fpBackupRom = fopen(BackupPath, "rb")) == NULL) { /* something has gone wrong with the backup abort this */ /* rom merge. */ return; } } /* at this point we should have a valid fpBackupRom */ MakeBackupPath(PatchDir, PatchPath,ROMName, 1); if ((fpPatchRom = fopen(PatchPath, "rb")) == NULL) { /* Oh no! there is no patch file for this rom, just copy */ /* backup file over original */ fclose(fpBackupRom); CopyROM(BackupPath, ROMName, size, 1); return; } /* open the new rom file */ if ((fpNewRom = fopen(ROMName, "wb")) == NULL) { /* abort */ fclose(fpBackupRom); fclose(fpPatchRom); return; } /* check header */ for (i = 0; i < 5; i ++) { BYTE ch = fgetc(fpPatchRom); if (ch != Header[i]) { printf("Invalid Patch file \"%s\"", PatchPath); return; } } /* right thats all of the tinkering about done now for the merge */ for(;;) { Offset = 0; /* get the next 3 bytes for the offset */ for (i = 0; i < 3; i ++) { ch = fgetc(fpPatchRom); Offset *= 256; Offset += ch; } /* end of file? */ if (Offset == ('E' * 65536) + ('O' * 256) + 'F') break; /* now copy all of the bytes from the Backup to the new roms */ /* up until the offset */ fseek(fpBackupRom, BackupPos, SEEK_SET); for (i = BackupPos; i < Offset; i ++) { ch = fgetc(fpBackupRom); fputc(ch, fpNewRom); } /* how many bytes to merge? */ ch = fgetc(fpPatchRom); NumBytes = (256 * ch) + fgetc(fpPatchRom); for (i = 0; i < NumBytes; i ++) { ch = fgetc(fpPatchRom); fputc(ch, fpNewRom); } BackupPos = Offset + NumBytes; } /* now copy any remaining bytes from the backup file */ fseek(fpBackupRom, BackupPos, SEEK_SET); for (i = BackupPos; i < size; i ++) { ch = fgetc(fpBackupRom); fputc(ch, fpNewRom); } fclose(fpNewRom); fclose(fpBackupRom); fclose(fpPatchRom); }