GB Checksum

Hardware, Software, Webdesign & Coding.

Moderator: Katana

Benutzeravatar
Katana
Beiträge: 5337
Registriert: So Jan 02, 2000 1:01 am

GB Checksum

Beitrag von Katana »

Hmm, hab' jetzt 'n bisschen gegoogelt und Infos über den GB Header zusammengesammelt, weiß also, wo die Checksumme ist.
Allerdings habe ich keine Infos finden können, wie man jene denn berechnet ...

Hat da jemand Infos?
SyMbiOnT
Beiträge: 609
Registriert: Mi Mai 02, 2001 12:01 am

Beitrag von SyMbiOnT »

Ist das nicht die Summe aller Bytes (ohne Header glaube ich)
Deswgen vieleicht auch CheckSUMME :lol:
Weiss aber nicht ganz ob das stimmt
Der Anfänger freut sich, wenn nach dem Start des Programms Ziffern auf dem
Bildschirm erscheinen, der Eingeweihte prüft die Größenordnungen der ausgege-
benen Resultate, der Profi traut nicht einmal dem Vorzeichen.

http://www.bi.2fbi.de
Gast

Re: GB Checksum

Beitrag von Gast »

014D Complement check
(PROGRAM WON'T RUN ON GB IF NOT CORRECT!!!)
(It will run on Super GB, however, if incorrect.)

014E-014F Checksum (higher byte first) produced by
adding all bytes of a cartridge except for two
checksum bytes and taking two lower bytes of
the result. (GameBoy ignores this value.)

aber es gibt dafür auch ein tool mit demnamen rgbfix.exe:

wird so aufgerufen: rgbfix -v -pff test.gb
und findest du hier: http://www.blastar.de/download/gb/

blastar...
SyMbiOnT
Beiträge: 609
Registriert: Mi Mai 02, 2001 12:01 am

Beitrag von SyMbiOnT »

Sag ich doch :lol: 8) :lol:
Der Anfänger freut sich, wenn nach dem Start des Programms Ziffern auf dem
Bildschirm erscheinen, der Eingeweihte prüft die Größenordnungen der ausgege-
benen Resultate, der Profi traut nicht einmal dem Vorzeichen.

http://www.bi.2fbi.de
Benutzeravatar
Katana
Beiträge: 5337
Registriert: So Jan 02, 2000 1:01 am

Beitrag von Katana »

Dieses RGBFix Tool hab' ich auch gefunden, aber ich will nicht wissen, wie ich die Patche, sondern wissen, wie ich die Checksumme herausfinde (ohne weitere Programme, außer Taschenrechner und Hex-Editor ;)).
adding all bytes of a cartridge except for two
checksum bytes and taking two lower bytes of
the result
Hab' ich auch gefunden, aber welches sind die ""checksum bytes"" ?
Sind das die beiden 0x014E und 0x014F, oder sind damit andere gemeint?
SyMbiOnT
Beiträge: 609
Registriert: Mi Mai 02, 2001 12:01 am

Beitrag von SyMbiOnT »

Probiern geht über studieren!
Ich bin zu dem Ergebnis gekommen, dass die Checksumme bei dem Offset 014Ch beginnt und (max.) 4 Byte gross ist (weil es ja auch 8MB Roms gibt!). Dass heist du musst bei der Brechnung der Checksumme die Bytes von 014Ch - 014F auslassen.
Nur nebenbei: Die Checksumme ohne Proggy (bisauf Taschrechner und Hex-Editor) zu errechnen ist doch ein ganzen Stückchen Arbyte! Code lieber n kleines Proggy, ist einfacher als das per Hand zu machen!
Der Anfänger freut sich, wenn nach dem Start des Programms Ziffern auf dem
Bildschirm erscheinen, der Eingeweihte prüft die Größenordnungen der ausgege-
benen Resultate, der Profi traut nicht einmal dem Vorzeichen.

http://www.bi.2fbi.de
Benutzeravatar
Katana
Beiträge: 5337
Registriert: So Jan 02, 2000 1:01 am

Beitrag von Katana »

Code lieber n kleines Proggy
Genau das habe ich ja vor ;)
Deswegen muß ich wissen, wie sich die berechnen lässt :D

Ich werd's mal versuchen, allerdings erst heute Abend, wenn ich vonner Arbeit komme.
SyMbiOnT
Beiträge: 609
Registriert: Mi Mai 02, 2001 12:01 am

Beitrag von SyMbiOnT »

Katana hat geschrieben:Deswegen muß ich wissen, wie sich die berechnen lässt
Naja wie gesagt, du addierst alle Bytes bis auf die 4 in denen die Checksumme steht.
Der Anfänger freut sich, wenn nach dem Start des Programms Ziffern auf dem
Bildschirm erscheinen, der Eingeweihte prüft die Größenordnungen der ausgege-
benen Resultate, der Profi traut nicht einmal dem Vorzeichen.

http://www.bi.2fbi.de
Benutzeravatar
Katana
Beiträge: 5337
Registriert: So Jan 02, 2000 1:01 am

Beitrag von Katana »

Ich hab's so gemacht und bisher passt's:

Code: Alles auswählen

   int iCheck = 0;
   for (int i = 0; i < rom.length; i++) {
     if (rom[i] < 0) {
       iCheck += (rom[i] + 256);
     }
     else {
       iCheck += rom[i];
     }
   }

   if (rom[0x14E] < 0) {
     iCheck = iCheck - (rom[0x14E] + 256);
   }
   else {
     iCheck = iCheck - rom[0x14E];
   }

   if (rom[0x14F] < 0) {
     iCheck = iCheck - (rom[0x14F] + 256);
   }
   else {
     iCheck = iCheck - rom[0x14F];
   }

   final String[] hex = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
   int iRest = iCheck % 16;
   int iWert = (int)(iCheck / 16);
   String sHex = "";
   while (iRest > 0) {
     sHex += hex[iRest];
     iRest = iWert % 16;
     iWert = (int)(iWert / 16);
   }
   String sTest = sHex;
   sHex = "";
   for (int i = (sTest.length() - 1); i >= 0; i--) {
     sHex += sTest.charAt(i);
   }
   String sCheck = sHex.substring(3);  // <-- Checksumme
Sind allerdings nur die 2 Bytes (0x14E und 0x14F).
Jimmy
Chrono Trigger Guru
Beiträge: 1128
Registriert: Mo Jul 02, 2001 12:01 am

Beitrag von Jimmy »

GB ==> Game Boy ?

Gabs da bei Zophar nicht n Tool dafür ?

Ich glaube das INSNEST das auch macht oder ?
Bild
Benutzeravatar
Katana
Beiträge: 5337
Registriert: So Jan 02, 2000 1:01 am

Beitrag von Katana »

Katana hat geschrieben:[...], sondern wissen, wie ich die Checksumme herausfinde (ohne weitere Programme, außer Taschenrechner und Hex-Editor ;)).
Deswegen das ;)
Ich brauchte das intern in 'nem Programm und kein Externes Programm, was das kann ;)
SyMbiOnT
Beiträge: 609
Registriert: Mi Mai 02, 2001 12:01 am

Beitrag von SyMbiOnT »

Katana hat geschrieben:Sind allerdings nur die 2 Bytes (0x14E und 0x14F).
Das mit den 2 Byte kann nicht stimmen, weil es Roms gibt die 8 MB gross sind. *rechne* Also (hehe):
Wir haben ein 8 MB Rom, macht also insgesammt:
8388608 Byte
- 4 Byte (für die Checksumme)
= 8388604
So gehen wir jetzt davon aus dass in jedem dieser 8388604 Byte eine 255 stünde, dann wäre die Checksumme also: 2139094020 (alles dezimal)
Das in Hex: 7F 7F FC 04
Du siehst schon an meiner Formatierung dass es 4 Byte sein müssen!
In kleineren Roms kann es natürlich vorkommen, dass einige dieser 4 Byte (die hohen) unbenutzt sind. Diese müssen dennoch ignoriert werden!
Nochmal zur Rechnung, sie stimmt nicht ganz da ich den Header nicht abgezogen habe, aber so viel verändert sich dann ja nicht.

:wink:

EDIT: Die 8 MB Roms sind glaube ich nur GBC Roms. Aber der Header bei GB & GBC ist doch gleich (oder?). Wenn ja sind auch bei GB Roms 4 Byte für die Checksumme reserviert. Fals doch nicht kann es durchaus angehn dass es nur 2 Byte sind.
Der Anfänger freut sich, wenn nach dem Start des Programms Ziffern auf dem
Bildschirm erscheinen, der Eingeweihte prüft die Größenordnungen der ausgege-
benen Resultate, der Profi traut nicht einmal dem Vorzeichen.

http://www.bi.2fbi.de
Benutzeravatar
Katana
Beiträge: 5337
Registriert: So Jan 02, 2000 1:01 am

Beitrag von Katana »

Du brauchst eh nur die 2 unteren Bytes der Checksumme, die oberen 2 interessieren nicht, soweit ich das bisher sehe.
Gast

Beitrag von Gast »

014E-014F Checksum (higher byte first) produced by
adding all bytes of a cartridge except for two
checksum bytes and taking two lower bytes of
the result.
(GameBoy ignores this value.)

würde sinn machen!

blastar...
SyMbiOnT
Beiträge: 609
Registriert: Mi Mai 02, 2001 12:01 am

Beitrag von SyMbiOnT »

blastar hat geschrieben:014E-014F Checksum (higher byte first) produced by
adding all bytes of a cartridge except for two
checksum bytes and taking two lower bytes of
the result.
(GameBoy ignores this value.)

würde sinn machen!

blastar...
AXO! Also nur die beiden niederwertigen Byte. Wusste ich nicht.
Der Anfänger freut sich, wenn nach dem Start des Programms Ziffern auf dem
Bildschirm erscheinen, der Eingeweihte prüft die Größenordnungen der ausgege-
benen Resultate, der Profi traut nicht einmal dem Vorzeichen.

http://www.bi.2fbi.de
Antworten