From 120faab71a552d092ce0a872ee3abaa32b4a96b5 Mon Sep 17 00:00:00 2001 From: n-a-c-h <> Date: Mon, 3 May 2004 08:09:47 +0000 Subject: [PATCH] NSRT Header support part 1. --- zsnes/src/gui/guiload.inc | 2 +- zsnes/src/initc.c | 92 +++++++++++++++++++++++++++++---------- 2 files changed, 71 insertions(+), 23 deletions(-) diff --git a/zsnes/src/gui/guiload.inc b/zsnes/src/gui/guiload.inc index 6f7875e6..286d8e06 100644 --- a/zsnes/src/gui/guiload.inc +++ b/zsnes/src/gui/guiload.inc @@ -294,7 +294,7 @@ GUIloadfilename: call SetupROM call showinfogui call initsnes - mov byte[snesmouse],0 + ;mov byte[snesmouse],0 mov byte[sramsavedis],0 mov eax,regsbackup mov ebx,sndrot diff --git a/zsnes/src/initc.c b/zsnes/src/initc.c index c7fb5185..1e2f88f5 100755 --- a/zsnes/src/initc.c +++ b/zsnes/src/initc.c @@ -704,8 +704,28 @@ void SplitSupport() } } +bool NSRTHead(unsigned char *ROM) +{ + unsigned char *NSRTHead = ROM + 0x1D0; //NSRT Header Location + + if (!strncmp("NSRT", (char*)&NSRTHead[24],4) && NSRTHead[28] == 22) + { + if (sum(NSRTHead, 32) & 0xFF != NSRTHead[30] || + NSRTHead[30] + NSRTHead[31] != 255 || + (NSRTHead[0] & 0x0F) > 13 || + ((NSRTHead[0] & 0xF0) >> 4) > 3 || + ((NSRTHead[0] & 0xF0) >> 4) == 0) + { + return(false); //Corrupt + } + return(true); //NSRT header + } + return(false); //None +} + extern bool Sup48mbit; extern bool Sup16mbit; +extern unsigned char snesmouse; void findZipIPS(char *); void loadROM() { @@ -752,39 +772,67 @@ void loadROM() else { int HeadRemain = (curromspace & 0x7FFF); - switch(HeadRemain) + switch(HeadRemain) { case 0: - break; + break; - case 512: - Header512 = true; - break; + case 512: + Header512 = true; + break; default: - //SMC/SWC header - if (romdata[8] == 0xAA && romdata[9]==0xBB && romdata[10]== 4) { - Header512 = true; + unsigned char *ROM = (unsigned char *)romdata; + + //SMC/SWC header + if (ROM[8] == 0xAA && ROM[9]==0xBB && ROM[10]== 4) + { + Header512 = true; + } + //FIG header + else if ((ROM[4] == 0x77 && ROM[5] == 0x83) || + (ROM[4] == 0xDD && ROM[5] == 0x82) || + (ROM[4] == 0xDD && ROM[5] == 2) || + (ROM[4] == 0xF7 && ROM[5] == 0x83) || + (ROM[4] == 0xFD && ROM[5] == 0x82) || + (ROM[4] == 0x00 && ROM[5] == 0x80) || + (ROM[4] == 0x47 && ROM[5] == 0x83) || + (ROM[4] == 0x11 && ROM[5] == 2)) + { + Header512 = true; + } + break; } - //FIG header - else if ((romdata[4] == 0x77 && romdata[5] == 0x83) || - (romdata[4] == 0xDD && romdata[5] == 0x82) || - (romdata[4] == 0xDD && romdata[5] == 2) || - (romdata[4] == 0xF7 && romdata[5] == 0x83) || - (romdata[4] == 0xFD && romdata[5] == 0x82) || - (romdata[4] == 0x00 && romdata[5] == 0x80) || - (romdata[4] == 0x47 && romdata[5] == 0x83) || - (romdata[4] == 0x11 && romdata[5] == 2)) - { - Header512 = true; - } - break; } } - + + snesmouse = 0; + if (Header512) { + unsigned char *ROM = (unsigned char *)romdata; + if (NSRTHead(ROM)) + { + switch (ROM[0x1ED]) + { + case 0: default: break; + + case 0x01: snesmouse = 2; break; //Mouse port 2 + case 0x03: snesmouse = 3; break; //Super Scope port 2 + case 0x04: break; //Super Scope or Gamepad port 2 + case 0x05: snesmouse = 4; break; //Justifier (Lethal Enforcer gun) port 2 + case 0x06: break; //Multitap port 2 + case 0x08: break; //Mouse or Multitap port 2 + case 0x10: snesmouse = 1; break; //Mouse port 1 + case 0x20: break; //Mouse or Gamepad port 1 + case 0x22: break; //Mouse or Gamepad port 1 and port 2 + case 0x27: break; //Mouse or Gamepad port 1, Mouse, Super Scope, or Gamepad port 2 + + case 0x99: break; //Lasabirdie + case 0x0A: break; //Barcode Battler + } + } curromspace -= 512; memmove((unsigned char *)romdata, ((unsigned char *)romdata)+512, curromspace); }