REM This program calculates the checksum for a Sunplus ROM. REM It uses the same algorithm as checksum8200.exe and REM checksum.exe REM It sums 16bit words, low byte first, starting from byte REM offset 0x50 (checksum8200.exe) or 0x20 (checksum.exe) CLS OPEN "manta.bin" FOR RANDOM AS #1 LEN = 2 FIELD #1, 1 AS lo$, 1 AS hi$ PRINT "Stored checksum at 0x20 = "; GET #1, &H11 lobyt = ASC(lo$) hibyt = ASC(hi$) xl = lobyt + hibyt * 256 GET #1 lobyt = ASC(lo$) hibyt = ASC(hi$) xh = lobyt + hibyt * 256 l$ = HEX$(xl) h$ = HEX$(xh) PRINT STRING$(4 - LEN(h$), "0"); h$; STRING$(4 - LEN(l$), "0"); l$ PRINT "Stored checksum at 0x14 = "; GET #1, &HB lobyt = ASC(lo$) hibyt = ASC(hi$) xl = lobyt + hibyt * 256 GET #1 lobyt = ASC(lo$) hibyt = ASC(hi$) xh = lobyt + hibyt * 256 l$ = HEX$(xl) h$ = HEX$(xh) PRINT STRING$(4 - LEN(h$), "0"); h$; STRING$(4 - LEN(l$), "0"); l$ PRINT PRINT "Start summing ..." PRINT suml& = 0: sumh& = 0 GET #1, &H10 FOR i = &H20 TO &H4E STEP 2 GET #1 lobyt = ASC(lo$) hibyt = ASC(hi$) suml& = suml& + lobyt sumh& = sumh& + hibyt NEXT i sumlo& = 0: sumhi& = 0 WHILE NOT EOF(1) GET #1 IF EOF(1) THEN GOTO 100 lobyt = ASC(lo$) hibyt = ASC(hi$) sumlo& = sumlo& + lobyt sumhi& = sumhi& + hibyt 100 WEND CLOSE hisum& = sumhi& + INT(sumlo& / 256) x$ = HEX$(sumlo& MOD 256) PRINT "Computed checksum (offset 0x50) = "; HEX$(hisum&); STRING$(2 - LEN(x$), "0"); x$ sumhi& = sumhi& + sumh& sumlo& = sumlo& + suml& hisum& = sumhi& + INT(sumlo& / 256) x$ = HEX$(sumlo& MOD 256) PRINT "Computed checksum (offset 0x20) = "; HEX$(hisum&); STRING$(2 - LEN(x$), "0"); x$ END