Major updates!
This commit is contained in:
@@ -55,7 +55,7 @@ WINDOSOBJ=${DOSDIR}/debug.o ${DOSDIR}/joy.o ${DOSDIR}/modemrtn.o ${DOSDIR}/vesa2
|
|||||||
|
|
||||||
ZIPOBJ=${ZIPDIR}/zzip.o ${ZIPDIR}/unzip.o ${ZIPDIR}/zpng.o
|
ZIPOBJ=${ZIPDIR}/zzip.o ${ZIPDIR}/unzip.o ${ZIPDIR}/zpng.o
|
||||||
|
|
||||||
MAINOBJ=cfgload.o endmem.o fixsin.o init.o ui.o vcache.o water.o smoke.o burn.o
|
MAINOBJ=cfgload.o endmem.o fixsin.o init.o initc.o ui.o vcache.o water.o smoke.o burn.o
|
||||||
|
|
||||||
OBJS=${CHIPSOBJ} ${CPUOBJ} ${WINOBJ} ${WINDOSOBJ} ${GUIOBJ} ${VIDEOBJ} ${ZIPOBJ} ${MAINOBJ}
|
OBJS=${CHIPSOBJ} ${CPUOBJ} ${WINOBJ} ${WINDOSOBJ} ${GUIOBJ} ${VIDEOBJ} ${ZIPOBJ} ${MAINOBJ}
|
||||||
|
|
||||||
@@ -90,6 +90,7 @@ ${CHIPDIR}/dsp1emu.o: ${CHIPDIR}/dsp1emu.c
|
|||||||
ui.o: ui.asm macros.mac
|
ui.o: ui.asm macros.mac
|
||||||
cfgload.o:cfgload.asm macros.mac
|
cfgload.o:cfgload.asm macros.mac
|
||||||
init.o:init.asm macros.mac
|
init.o:init.asm macros.mac
|
||||||
|
initc.o:init.c
|
||||||
${DOSDIR}/debug.o: ${DOSDIR}/debug.asm macros.mac
|
${DOSDIR}/debug.o: ${DOSDIR}/debug.asm macros.mac
|
||||||
${CPUDIR}/execute.o: ${CPUDIR}/execute.asm macros.mac
|
${CPUDIR}/execute.o: ${CPUDIR}/execute.asm macros.mac
|
||||||
${CPUDIR}/table.o: ${CPUDIR}/table.asm ${CPUDIR}/65816d.inc\
|
${CPUDIR}/table.o: ${CPUDIR}/table.asm ${CPUDIR}/65816d.inc\
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ EXTSYM soundon, StereoSound, SoundCompD, SoundQuality, MusicRelVol
|
|||||||
EXTSYM endprog, continueprog, spcBuffera, spcRamcmp, cbitmode, makepal
|
EXTSYM endprog, continueprog, spcBuffera, spcRamcmp, cbitmode, makepal
|
||||||
EXTSYM t1cc, LoadDir, SRAMDir, LoadDrive,SRAMDrive, initsnes, romloadskip
|
EXTSYM t1cc, LoadDir, SRAMDir, LoadDrive,SRAMDrive, initsnes, romloadskip
|
||||||
EXTSYM fname, makeextension, sram, clearmem2, loadfileGUI, GUIloadfailed
|
EXTSYM fname, makeextension, sram, clearmem2, loadfileGUI, GUIloadfailed
|
||||||
EXTSYM CheckROMType, romdata, ForcePal, ramsize, ramsizeand, curromsize
|
EXTSYM SetupROM, CheckROMType, romdata, ForcePal, ramsize, ramsizeand, curromsize
|
||||||
EXTSYM romispal, totlines, cfgloadsdir, init65816, procexecloop
|
EXTSYM romispal, totlines, cfgloadsdir, init65816, procexecloop
|
||||||
EXTSYM spcRam, spcPCRam, spcS, spcRamDP, spcA, spcX, spcY, spcP, spcNZ
|
EXTSYM spcRam, spcPCRam, spcS, spcRamDP, spcA, spcX, spcY, spcP, spcNZ
|
||||||
EXTSYM Voice0Status, Voice1Status, Voice2Status, Voice3Status, Voice4Status
|
EXTSYM Voice0Status, Voice1Status, Voice2Status, Voice3Status, Voice4Status
|
||||||
|
|||||||
@@ -289,69 +289,7 @@ GUIloadfilename:
|
|||||||
mov byte[CheatWinMode],0
|
mov byte[CheatWinMode],0
|
||||||
mov byte[CheatSearchStatus],0
|
mov byte[CheatSearchStatus],0
|
||||||
|
|
||||||
call CheckROMType
|
call SetupROM
|
||||||
cmp byte[ROMTypeNOTFound],0
|
|
||||||
je .foundromtype
|
|
||||||
mov byte[romtype],1
|
|
||||||
.foundromtype
|
|
||||||
call SetIRQVectors
|
|
||||||
call ClearScreen
|
|
||||||
cmp byte[cbitmode],0
|
|
||||||
jne .nomakepal
|
|
||||||
call makepal
|
|
||||||
.nomakepal
|
|
||||||
; get sram size
|
|
||||||
mov esi,[romdata]
|
|
||||||
add esi,7FD8h
|
|
||||||
cmp byte[romtype],2
|
|
||||||
jne .nohirom2
|
|
||||||
add esi,8000h
|
|
||||||
.nohirom2
|
|
||||||
mov cl,[esi-1]
|
|
||||||
mov [curromsize],cl
|
|
||||||
|
|
||||||
mov cl,[esi]
|
|
||||||
inc esi
|
|
||||||
xor eax,eax
|
|
||||||
mov al,1
|
|
||||||
shl al,cl
|
|
||||||
cmp al,1
|
|
||||||
jne .yessram
|
|
||||||
mov al,0
|
|
||||||
.yessram
|
|
||||||
shl eax,10
|
|
||||||
cmp eax,65536
|
|
||||||
jbe .nosramc
|
|
||||||
mov eax,65536
|
|
||||||
.nosramc
|
|
||||||
mov [ramsize],eax
|
|
||||||
dec eax
|
|
||||||
mov [ramsizeand],eax
|
|
||||||
|
|
||||||
; get pal/ntsc
|
|
||||||
mov al,[ForceROMTiming]
|
|
||||||
mov byte[ForcePal],al
|
|
||||||
xor al,al
|
|
||||||
mov al,[esi]
|
|
||||||
cmp byte[ForcePal],1
|
|
||||||
jne .nontsc
|
|
||||||
mov al,0
|
|
||||||
.nontsc
|
|
||||||
cmp byte[ForcePal],2
|
|
||||||
jne .nopal2
|
|
||||||
mov al,2
|
|
||||||
.nopal2
|
|
||||||
mov byte[romispal],0
|
|
||||||
mov word[totlines],263
|
|
||||||
mov dword[MsgCount],120
|
|
||||||
cmp al,1
|
|
||||||
jbe .nopal
|
|
||||||
cmp al,0Dh
|
|
||||||
je .nopal
|
|
||||||
mov byte[romispal],1
|
|
||||||
mov word[totlines],314
|
|
||||||
mov dword[MsgCount],100
|
|
||||||
.nopal
|
|
||||||
call showinfogui
|
call showinfogui
|
||||||
call initsnes
|
call initsnes
|
||||||
mov byte[snesmouse],0
|
mov byte[snesmouse],0
|
||||||
|
|||||||
@@ -95,6 +95,7 @@ EXTSYM GUIfindUSA,GUIfindEUR,GUIfindJAP,GUIfindZIP,GUIfind1,DTALoc,GUIfindall
|
|||||||
EXTSYM spc7110romptr,allocspc7110
|
EXTSYM spc7110romptr,allocspc7110
|
||||||
EXTSYM SRAMDir,SRAMDrive,cfgloadsdir,fnamest,statefileloc
|
EXTSYM SRAMDir,SRAMDrive,cfgloadsdir,fnamest,statefileloc
|
||||||
EXTSYM ForcePal,ForceROMTiming,ForceHiLoROM,InitDir,InitDrive,enterpress,frameskip
|
EXTSYM ForcePal,ForceROMTiming,ForceHiLoROM,InitDir,InitDrive,enterpress,frameskip
|
||||||
|
EXTSYM infoloc
|
||||||
EXTSYM gotoroot,headdata,printnum,romispal
|
EXTSYM gotoroot,headdata,printnum,romispal
|
||||||
EXTSYM InitFxTables,SFXSRAM,SfxR1,SfxR2,SfxSCMR,SfxSFR,finterleave
|
EXTSYM InitFxTables,SFXSRAM,SfxR1,SfxR2,SfxSCMR,SfxSFR,finterleave
|
||||||
EXTSYM initregr,initregw,memtabler16,DSP1Read16b3F,memaccessbankr16
|
EXTSYM initregr,initregw,memtabler16,DSP1Read16b3F,memaccessbankr16
|
||||||
@@ -2527,11 +2528,8 @@ NEWSYM initsnes
|
|||||||
je near .bslorom
|
je near .bslorom
|
||||||
.notbsx3
|
.notbsx3
|
||||||
mov esi,[romdata]
|
mov esi,[romdata]
|
||||||
add esi,32704+22
|
add esi,[infoloc]
|
||||||
cmp byte[romtype],2
|
add esi,22
|
||||||
jne .nohirom2b
|
|
||||||
add esi,8000h
|
|
||||||
.nohirom2b
|
|
||||||
mov byte[MultiTap],1
|
mov byte[MultiTap],1
|
||||||
cmp byte[pl12s34],1
|
cmp byte[pl12s34],1
|
||||||
je .nomtap
|
je .nomtap
|
||||||
@@ -3247,6 +3245,7 @@ NEWSYM SFXCounter, dd 0
|
|||||||
SECTION .text
|
SECTION .text
|
||||||
|
|
||||||
NEWSYM prepare48mbit
|
NEWSYM prepare48mbit
|
||||||
|
mov dword[NumofBanks],192
|
||||||
; make table 2 (64,0,65,1,...)
|
; make table 2 (64,0,65,1,...)
|
||||||
mov edi,mode7tab+128
|
mov edi,mode7tab+128
|
||||||
mov ecx,64
|
mov ecx,64
|
||||||
@@ -3469,41 +3468,6 @@ NEWSYM preparesfx
|
|||||||
jnz .n
|
jnz .n
|
||||||
ret
|
ret
|
||||||
|
|
||||||
NEWSYM UnInterleave
|
|
||||||
pushad
|
|
||||||
|
|
||||||
; NumofBanks contains # of 32k banks
|
|
||||||
|
|
||||||
; make table 2 (0 .. 255)
|
|
||||||
mov edi,mode7tab+256
|
|
||||||
mov ecx,256
|
|
||||||
xor al,al
|
|
||||||
.nextlb2
|
|
||||||
mov [edi],al
|
|
||||||
inc al
|
|
||||||
inc edi
|
|
||||||
dec ecx
|
|
||||||
jnz .nextlb2
|
|
||||||
|
|
||||||
mov eax,[NumofBanks]
|
|
||||||
shr eax,1
|
|
||||||
mov edi,mode7tab+256
|
|
||||||
mov ecx,eax
|
|
||||||
mov bl,al
|
|
||||||
xor bh,bh
|
|
||||||
.nextl
|
|
||||||
mov [edi],bl
|
|
||||||
mov [edi+1],bh
|
|
||||||
inc bl
|
|
||||||
inc bh
|
|
||||||
add edi,2
|
|
||||||
dec ecx
|
|
||||||
jnz .nextl
|
|
||||||
|
|
||||||
call SwapTable256
|
|
||||||
popad
|
|
||||||
ret
|
|
||||||
|
|
||||||
SwapTable256:
|
SwapTable256:
|
||||||
; make table 1 (0 .. 255)
|
; make table 1 (0 .. 255)
|
||||||
mov edi,mode7tab
|
mov edi,mode7tab
|
||||||
@@ -4077,7 +4041,7 @@ SECTION .bss
|
|||||||
|
|
||||||
|
|
||||||
NEWSYM Checksumvalue, resw 1
|
NEWSYM Checksumvalue, resw 1
|
||||||
NEWSYM Checksumvalue2, resw 1
|
NEWSYM Checksumvalue2, resw 1 ;This is outdated, but needed for the command line loader
|
||||||
NEWSYM CRC32, resd 1
|
NEWSYM CRC32, resd 1
|
||||||
NEWSYM SramExists, resb 1
|
NEWSYM SramExists, resb 1
|
||||||
NEWSYM NumofBanks, resd 1
|
NEWSYM NumofBanks, resd 1
|
||||||
@@ -5021,64 +4985,6 @@ NEWSYM loadfileGUI
|
|||||||
jnz .loopcheck
|
jnz .loopcheck
|
||||||
.skipall
|
.skipall
|
||||||
|
|
||||||
; mirror image
|
|
||||||
mov eax,[.curromspace]
|
|
||||||
cmp dword[.maxromspace],eax
|
|
||||||
jbe .nomir
|
|
||||||
mov edx,[romdata]
|
|
||||||
mov ebx,[romdata]
|
|
||||||
add edx,[.curromspace]
|
|
||||||
mov ecx,[.curromspace]
|
|
||||||
.nextmir
|
|
||||||
mov al,[ebx]
|
|
||||||
mov [edx],al
|
|
||||||
inc ebx
|
|
||||||
inc edx
|
|
||||||
inc ecx
|
|
||||||
cmp ecx,[.maxromspace]
|
|
||||||
jne .nextmir
|
|
||||||
.nomir
|
|
||||||
|
|
||||||
; calculate checksum
|
|
||||||
mov eax,1
|
|
||||||
.nextcr
|
|
||||||
add eax,eax
|
|
||||||
cmp eax,[.curromspace]
|
|
||||||
jb .nextcr
|
|
||||||
|
|
||||||
mov ecx,eax
|
|
||||||
mov esi,[romdata]
|
|
||||||
xor eax,eax
|
|
||||||
xor ebx,ebx
|
|
||||||
xor edi,edi
|
|
||||||
mov edx,ecx
|
|
||||||
shr edx,1
|
|
||||||
.nextcs
|
|
||||||
mov al,[esi+edi]
|
|
||||||
inc edi
|
|
||||||
add ebx,eax
|
|
||||||
cmp edi,[.curromspace]
|
|
||||||
jne .notcrs
|
|
||||||
mov edi,edx
|
|
||||||
.notcrs
|
|
||||||
dec ecx
|
|
||||||
jnz .nextcs
|
|
||||||
mov [Checksumvalue],bx
|
|
||||||
|
|
||||||
mov esi,[romdata]
|
|
||||||
mov ecx,[.curfileofs]
|
|
||||||
xor eax,eax
|
|
||||||
xor ebx,ebx
|
|
||||||
xor edi,edi
|
|
||||||
.nextcs3
|
|
||||||
mov al,[esi+edi]
|
|
||||||
inc edi
|
|
||||||
add ebx,eax
|
|
||||||
cmp edi,ecx
|
|
||||||
jne .nextcs3
|
|
||||||
mov [Checksumvalue2],bx
|
|
||||||
|
|
||||||
|
|
||||||
cmp byte[ZipSupport],1
|
cmp byte[ZipSupport],1
|
||||||
jne .nottempdirdel
|
jne .nottempdirdel
|
||||||
call PatchIPS
|
call PatchIPS
|
||||||
@@ -5314,23 +5220,19 @@ SECTION .text
|
|||||||
|
|
||||||
NEWSYM showinfogui
|
NEWSYM showinfogui
|
||||||
mov esi,[romdata]
|
mov esi,[romdata]
|
||||||
cmp byte[NumofBanks],128
|
add esi,[infoloc]
|
||||||
jbe .notEHi1
|
|
||||||
mov ax,word[esi + 040FFDEh]
|
cmp dword[infoloc],40FFC0h
|
||||||
xor ax,word[esi + 040FFDCh]
|
|
||||||
cmp ax,0FFFFh
|
|
||||||
jne .notEHi1
|
jne .notEHi1
|
||||||
add esi,040FFC0h
|
|
||||||
mov dword[CSStatus2+23], 'EHi '
|
mov dword[CSStatus2+23], 'EHi '
|
||||||
jmp .nohiromrn
|
jmp .nohiromrn
|
||||||
.notEHi1
|
.notEHi1
|
||||||
add esi,7FC0h
|
|
||||||
mov dword[CSStatus2+23], 'Lo '
|
mov dword[CSStatus2+23], 'Lo '
|
||||||
cmp byte[romtype],2
|
cmp byte[romtype],2
|
||||||
jne .nohiromrn
|
jne .nohiromrn
|
||||||
mov dword[CSStatus2+23], 'Hi '
|
mov dword[CSStatus2+23], 'Hi '
|
||||||
add esi,8000h
|
|
||||||
.nohiromrn
|
.nohiromrn
|
||||||
|
|
||||||
mov edi,CSStatus
|
mov edi,CSStatus
|
||||||
mov ecx,20
|
mov ecx,20
|
||||||
.looprn
|
.looprn
|
||||||
@@ -5432,21 +5334,8 @@ NEWSYM showinfogui
|
|||||||
je .nobs
|
je .nobs
|
||||||
mov dword[CSStatus+29],'BROA'
|
mov dword[CSStatus+29],'BROA'
|
||||||
mov dword[CSStatus+33],'DCST'
|
mov dword[CSStatus+33],'DCST'
|
||||||
;Get checksum of header alone for subtraction
|
|
||||||
sub esi,41
|
|
||||||
xor eax,eax
|
|
||||||
mov ecx,48
|
|
||||||
.bssubloop
|
|
||||||
movzx ebx,byte[esi]
|
|
||||||
add ax,bx
|
|
||||||
inc esi
|
|
||||||
dec ecx
|
|
||||||
jnz .bssubloop
|
|
||||||
mov bx,[Checksumvalue]
|
|
||||||
sub bx,ax
|
|
||||||
mov [Checksumvalue],bx
|
|
||||||
;dummy out date so CRC32 matches
|
;dummy out date so CRC32 matches
|
||||||
sub esi,10
|
sub esi,3
|
||||||
mov word[esi],042h ;42 is the answer, and the uCONSRT standard
|
mov word[esi],042h ;42 is the answer, and the uCONSRT standard
|
||||||
.nobs
|
.nobs
|
||||||
|
|
||||||
@@ -5497,21 +5386,14 @@ NEWSYM showinfogui
|
|||||||
shr ecx,2
|
shr ecx,2
|
||||||
jnz .crcprintloop
|
jnz .crcprintloop
|
||||||
|
|
||||||
|
EXTSYM CalcChecksum
|
||||||
|
pushad
|
||||||
|
call CalcChecksum
|
||||||
|
popad
|
||||||
|
|
||||||
mov esi,[romdata]
|
mov esi,[romdata]
|
||||||
cmp byte[NumofBanks],128
|
add esi,[infoloc]
|
||||||
jbe .notEHi2
|
add esi,1Eh
|
||||||
mov ax,word[esi + 040FFDEh]
|
|
||||||
xor ax,word[esi + 040FFDCh]
|
|
||||||
cmp ax,0FFFFh
|
|
||||||
jne .notEHi2
|
|
||||||
add esi,040FFDEh
|
|
||||||
jmp .nohirom3
|
|
||||||
.notEHi2
|
|
||||||
add esi,7FDEh
|
|
||||||
cmp byte[romtype],2
|
|
||||||
jne .nohirom3
|
|
||||||
add esi,8000h
|
|
||||||
.nohirom3
|
|
||||||
mov ax,[Checksumvalue]
|
mov ax,[Checksumvalue]
|
||||||
cmp ax,[esi]
|
cmp ax,[esi]
|
||||||
jne .failed
|
jne .failed
|
||||||
@@ -5519,32 +5401,8 @@ NEWSYM showinfogui
|
|||||||
mov dword[CSStatus2+36],'OK '
|
mov dword[CSStatus2+36],'OK '
|
||||||
jmp .passed
|
jmp .passed
|
||||||
.failed
|
.failed
|
||||||
mov ax,[Checksumvalue2]
|
|
||||||
cmp byte[SPC7110Enable],1
|
|
||||||
jne .nospc7110en
|
|
||||||
cmp byte[NumofBanks],96
|
|
||||||
jne .nospc7110en
|
|
||||||
shl ax,1
|
|
||||||
.nospc7110en
|
|
||||||
cmp ax,[esi]
|
|
||||||
je .passed2
|
|
||||||
mov dword[CSStatus2+36],'FAIL'
|
mov dword[CSStatus2+36],'FAIL'
|
||||||
.passed
|
.passed
|
||||||
cmp byte[NumofBanks],128
|
|
||||||
jbe .notopint
|
|
||||||
mov esi,[romdata]
|
|
||||||
mov ax,word[esi + 0207FDEh]
|
|
||||||
xor ax,word[esi + 0207FDCh]
|
|
||||||
cmp ax,0FFFFh
|
|
||||||
jne .notopint
|
|
||||||
mov dword[CSStatus2+12],'Yes '
|
|
||||||
mov dword[CSStatus3+32],'????'
|
|
||||||
mov dword[CSStatus3+36],'????'
|
|
||||||
mov dword[CSStatus2+23], 'EHi '
|
|
||||||
cmp word[Checksumvalue2],047C9h
|
|
||||||
jne .notopint
|
|
||||||
mov dword[CSStatus2+36],'OK '
|
|
||||||
.notopint
|
|
||||||
mov dword[MessageOn],300
|
mov dword[MessageOn],300
|
||||||
mov dword[Msgptr],CSStatus
|
mov dword[Msgptr],CSStatus
|
||||||
mov eax,[MsgCount]
|
mov eax,[MsgCount]
|
||||||
@@ -5566,6 +5424,9 @@ NEWSYM showinfogui
|
|||||||
; Convert to interleaved - If LoROM and offset 7FD5 contains 21h, then
|
; Convert to interleaved - If LoROM and offset 7FD5 contains 21h, then
|
||||||
; uninterleave
|
; uninterleave
|
||||||
|
|
||||||
|
;This looks like the info it displays if loaded via the command line
|
||||||
|
;Very outdated
|
||||||
|
|
||||||
NEWSYM showinfo
|
NEWSYM showinfo
|
||||||
mov edx,.romsizea
|
mov edx,.romsizea
|
||||||
cmp byte[Sup48mbit],0
|
cmp byte[Sup48mbit],0
|
||||||
@@ -5677,11 +5538,8 @@ NEWSYM showinfo
|
|||||||
|
|
||||||
; Output Name
|
; Output Name
|
||||||
mov esi,[romdata]
|
mov esi,[romdata]
|
||||||
add esi,7FC0h
|
add esi,[infoloc]
|
||||||
cmp byte[romtype],2
|
|
||||||
jne .nohirom2
|
|
||||||
add esi,8000h
|
|
||||||
.nohirom2
|
|
||||||
mov ecx,21
|
mov ecx,21
|
||||||
.loopb
|
.loopb
|
||||||
lodsb
|
lodsb
|
||||||
@@ -6023,248 +5881,74 @@ NEWSYM DSP1Type, resb 1
|
|||||||
NEWSYM intldone, resb 1
|
NEWSYM intldone, resb 1
|
||||||
SECTION .text
|
SECTION .text
|
||||||
|
|
||||||
|
EXTSYM ClearScreen, cbitmode, makepal
|
||||||
|
|
||||||
|
NEWSYM SetupROM
|
||||||
|
call CheckROMType
|
||||||
|
call SetIRQVectors
|
||||||
|
call ClearScreen
|
||||||
|
cmp byte[cbitmode],0
|
||||||
|
jne .nomakepal
|
||||||
|
call makepal
|
||||||
|
.nomakepal
|
||||||
|
; get ROM and SRAM size
|
||||||
|
mov esi,[romdata]
|
||||||
|
add esi,[infoloc]
|
||||||
|
add esi,18h
|
||||||
|
mov cl,[esi-1]
|
||||||
|
mov [curromsize],cl
|
||||||
|
mov cl,[esi]
|
||||||
|
inc esi
|
||||||
|
xor eax,eax
|
||||||
|
mov al,1
|
||||||
|
shl al,cl
|
||||||
|
cmp al,1
|
||||||
|
jne .yessram
|
||||||
|
mov al,0
|
||||||
|
.yessram
|
||||||
|
shl eax,10
|
||||||
|
cmp eax,65536
|
||||||
|
jbe .nosramc
|
||||||
|
mov eax,65536
|
||||||
|
.nosramc
|
||||||
|
mov [ramsize],eax
|
||||||
|
dec eax
|
||||||
|
mov [ramsizeand],eax
|
||||||
|
|
||||||
|
; get pal/ntsc
|
||||||
|
mov al,[ForceROMTiming]
|
||||||
|
mov byte[ForcePal],al
|
||||||
|
xor al,al
|
||||||
|
mov al,[esi]
|
||||||
|
cmp byte[ForcePal],1
|
||||||
|
jne .nontsc
|
||||||
|
mov al,0
|
||||||
|
.nontsc
|
||||||
|
cmp byte[ForcePal],2
|
||||||
|
jne .nopal2
|
||||||
|
mov al,2
|
||||||
|
.nopal2
|
||||||
|
mov byte[romispal],0
|
||||||
|
mov word[totlines],263
|
||||||
|
mov dword[MsgCount],120
|
||||||
|
cmp byte[BSEnable],1
|
||||||
|
je .nopal
|
||||||
|
cmp al,1
|
||||||
|
jbe .nopal
|
||||||
|
cmp al,0Dh
|
||||||
|
jae .nopal
|
||||||
|
mov byte[romispal],1
|
||||||
|
mov word[totlines],314
|
||||||
|
mov dword[MsgCount],100
|
||||||
|
.nopal
|
||||||
|
ret
|
||||||
|
|
||||||
NEWSYM CheckROMType
|
NEWSYM CheckROMType
|
||||||
call SetAddressingModes
|
call SetAddressingModes
|
||||||
call GenerateBank0Table
|
call GenerateBank0Table
|
||||||
|
|
||||||
mov byte[intldone],0
|
EXTSYM BankCheck
|
||||||
mov byte[ROMTypeNOTFound],0
|
call BankCheck
|
||||||
; check reset vectors
|
|
||||||
; RES Hardware 00FFFC.D 00FFFC,D 1
|
|
||||||
mov esi,[romdata]
|
|
||||||
mov ax,[esi+0FFFCh]
|
|
||||||
mov bx,[esi+07FFCh]
|
|
||||||
cmp bx,8000h
|
|
||||||
jne .notrv1
|
|
||||||
cmp ax,8011h
|
|
||||||
je .yeslorom
|
|
||||||
.notrv1
|
|
||||||
test ax,8000h
|
|
||||||
jnz .checkloarea
|
|
||||||
test bx,8000h
|
|
||||||
jz .notfound2
|
|
||||||
.yeslorom
|
|
||||||
mov byte[romtype],1
|
|
||||||
jmp .donecheck
|
|
||||||
.checkloarea
|
|
||||||
test bx,8000h
|
|
||||||
jnz .notfound2
|
|
||||||
mov byte[romtype],2
|
|
||||||
jmp .donecheck
|
|
||||||
.notfound2
|
|
||||||
|
|
||||||
mov esi,[romdata]
|
|
||||||
add esi,7FECh
|
|
||||||
; cmp word[esi],8000h
|
|
||||||
; jb .checkhirom
|
|
||||||
mov esi,[romdata]
|
|
||||||
add esi,32704+23
|
|
||||||
cmp byte[esi],32
|
|
||||||
ja .checkhirom
|
|
||||||
mov esi,[romdata]
|
|
||||||
add esi,7FDCh
|
|
||||||
lodsw
|
|
||||||
mov bx,ax
|
|
||||||
lodsw
|
|
||||||
xor bx,ax
|
|
||||||
cmp bx,0FFFFh
|
|
||||||
jne .checkhirom
|
|
||||||
cmp ax,0
|
|
||||||
je .checkhirom
|
|
||||||
cmp ax,0FFFFh
|
|
||||||
je .checkhirom
|
|
||||||
mov byte[romtype],1
|
|
||||||
jmp .donecheck
|
|
||||||
.checkhirom
|
|
||||||
mov esi,[romdata]
|
|
||||||
add esi,32704+23+32768
|
|
||||||
cmp byte[esi],32
|
|
||||||
ja .cantcheck
|
|
||||||
mov esi,[romdata]
|
|
||||||
add esi,0FFDCh
|
|
||||||
lodsw
|
|
||||||
mov bx,ax
|
|
||||||
lodsw
|
|
||||||
xor bx,ax
|
|
||||||
cmp bx,0FFFFh
|
|
||||||
jne .cantcheck
|
|
||||||
mov byte[romtype],2
|
|
||||||
jmp .donecheck
|
|
||||||
.cantcheck
|
|
||||||
; check for a header with mostly letters or spaces
|
|
||||||
mov esi,[romdata]
|
|
||||||
add esi,32704
|
|
||||||
mov ecx,21
|
|
||||||
mov al,0
|
|
||||||
.nextletter
|
|
||||||
cmp byte[esi],32
|
|
||||||
je .yesletter
|
|
||||||
cmp byte[esi],'0'
|
|
||||||
jb .noletter
|
|
||||||
cmp byte[esi],'9'
|
|
||||||
jbe .yesletter
|
|
||||||
cmp byte[esi],'A'
|
|
||||||
jb .noletter
|
|
||||||
cmp byte[esi],'Z'
|
|
||||||
jbe .yesletter
|
|
||||||
cmp byte[esi],'a'
|
|
||||||
jb .noletter
|
|
||||||
cmp byte[esi],'z'
|
|
||||||
ja .noletter
|
|
||||||
.yesletter
|
|
||||||
inc al
|
|
||||||
.noletter
|
|
||||||
inc esi
|
|
||||||
dec ecx
|
|
||||||
jnz .nextletter
|
|
||||||
cmp al,12
|
|
||||||
jna .checkhiromletter
|
|
||||||
mov byte[romtype],1
|
|
||||||
jmp .donecheck
|
|
||||||
.checkhiromletter
|
|
||||||
mov esi,[romdata]
|
|
||||||
add esi,65472
|
|
||||||
mov ecx,21
|
|
||||||
mov al,0
|
|
||||||
.nextletterb
|
|
||||||
cmp byte[esi],32
|
|
||||||
je .yesletterb
|
|
||||||
cmp byte[esi],'0'
|
|
||||||
jb .noletterb
|
|
||||||
cmp byte[esi],'9'
|
|
||||||
jbe .yesletterb
|
|
||||||
cmp byte[esi],'A'
|
|
||||||
jb .noletterb
|
|
||||||
cmp byte[esi],'Z'
|
|
||||||
jbe .yesletterb
|
|
||||||
cmp byte[esi],'a'
|
|
||||||
jb .noletterb
|
|
||||||
cmp byte[esi],'z'
|
|
||||||
ja .noletterb
|
|
||||||
.yesletterb
|
|
||||||
inc al
|
|
||||||
.noletterb
|
|
||||||
inc esi
|
|
||||||
dec ecx
|
|
||||||
jnz .nextletterb
|
|
||||||
cmp al,12
|
|
||||||
jna .notfound
|
|
||||||
mov byte[romtype],2
|
|
||||||
jmp .donecheck
|
|
||||||
.notfound
|
|
||||||
|
|
||||||
mov esi,[romdata]
|
|
||||||
mov ax,[esi+0FFFCh]
|
|
||||||
mov bx,[esi+07FFCh]
|
|
||||||
cmp ax,8000h
|
|
||||||
jne .checkloarea8000
|
|
||||||
cmp bx,8000h
|
|
||||||
je .notfound28000
|
|
||||||
mov byte[romtype],2
|
|
||||||
jmp .donecheck
|
|
||||||
.checkloarea8000
|
|
||||||
cmp bx,8000h
|
|
||||||
jne .notfound28000
|
|
||||||
mov byte[romtype],1
|
|
||||||
jmp .donecheck
|
|
||||||
.notfound28000
|
|
||||||
|
|
||||||
mov byte[ROMTypeNOTFound],1
|
|
||||||
.donecheck
|
|
||||||
|
|
||||||
cmp byte[ForceHiLoROM],0
|
|
||||||
je .noguiforce
|
|
||||||
mov al,[ForceHiLoROM]
|
|
||||||
mov byte[forceromtype],al
|
|
||||||
xor al,al
|
|
||||||
.noguiforce
|
|
||||||
|
|
||||||
cmp byte[forceromtype],0
|
|
||||||
je .noforce
|
|
||||||
mov al,[forceromtype]
|
|
||||||
mov [romtype],al
|
|
||||||
mov byte[forceromtype],0
|
|
||||||
mov byte[ROMTypeNOTFound],0
|
|
||||||
.noforce
|
|
||||||
|
|
||||||
|
|
||||||
; Interleave Detection
|
|
||||||
mov byte[Interleaved],0
|
|
||||||
cmp byte[NumofBanks],128
|
|
||||||
ja near .nointerlcheck
|
|
||||||
|
|
||||||
;LoROM interleaved check
|
|
||||||
mov esi,[romdata]
|
|
||||||
add esi,07FDCh ;Checksum area
|
|
||||||
mov bx,[esi]
|
|
||||||
xor bx,[esi + 2]
|
|
||||||
cmp bx,0FFFFh ;Good LoROM?
|
|
||||||
je .interlcheck2 ;Forget it then
|
|
||||||
mov eax,[NumofBanks]
|
|
||||||
imul eax,32768
|
|
||||||
shr eax,1
|
|
||||||
add esi,eax ;Add midpoint
|
|
||||||
mov bx,[esi]
|
|
||||||
xor bx,[esi + 2]
|
|
||||||
cmp bx,0FFFFh
|
|
||||||
jne .interlcheck2
|
|
||||||
sub esi,3 ;Country code
|
|
||||||
cmp byte[esi],14
|
|
||||||
jae .interlcheck2
|
|
||||||
jmp .interleaved
|
|
||||||
|
|
||||||
;HiROM interleaved check
|
|
||||||
.interlcheck2
|
|
||||||
mov esi,[romdata]
|
|
||||||
add esi,07FDCh ;Checksum area
|
|
||||||
mov bx,[esi]
|
|
||||||
xor bx,[esi + 2]
|
|
||||||
cmp bx,0FFFFh
|
|
||||||
jne near .nointerlcheck
|
|
||||||
sub esi,3 ;Country code
|
|
||||||
cmp byte[esi],14
|
|
||||||
jae .nointerlcheck
|
|
||||||
sub esi,4 ;ROM makeup
|
|
||||||
cmp byte[esi],33
|
|
||||||
je .overflowcheck
|
|
||||||
cmp byte[esi],49
|
|
||||||
je .overflowcheck
|
|
||||||
cmp byte[esi],53
|
|
||||||
je .overflowcheck
|
|
||||||
cmp byte[esi],58
|
|
||||||
je .overflowcheck
|
|
||||||
jmp .nointerlcheck
|
|
||||||
|
|
||||||
.overflowcheck
|
|
||||||
mov edx,[esi]
|
|
||||||
dec esi
|
|
||||||
cmp byte[esi],32
|
|
||||||
je .interleaved
|
|
||||||
cmp byte[esi],dl
|
|
||||||
je .nointerlcheck
|
|
||||||
dec esi
|
|
||||||
cmp byte[esi],dl
|
|
||||||
je .nointerlcheck
|
|
||||||
dec esi
|
|
||||||
cmp byte[esi],dl
|
|
||||||
je .nointerlcheck
|
|
||||||
dec esi
|
|
||||||
cmp byte[esi],dl
|
|
||||||
je .nointerlcheck
|
|
||||||
|
|
||||||
.interleaved
|
|
||||||
cmp byte[finterleave],1
|
|
||||||
je .doneinterl
|
|
||||||
.interleaved2
|
|
||||||
mov byte[intldone],1
|
|
||||||
call UnInterleave
|
|
||||||
mov byte[Interleaved],1
|
|
||||||
mov byte[romtype],2
|
|
||||||
jmp .doneinterl
|
|
||||||
.nointerlcheck
|
|
||||||
cmp byte[finterleave],1
|
|
||||||
je .interleaved2
|
|
||||||
.doneinterl
|
|
||||||
|
|
||||||
mov esi,[romdata]
|
mov esi,[romdata]
|
||||||
add esi,0FFC0h
|
add esi,0FFC0h
|
||||||
@@ -6328,24 +6012,10 @@ NEWSYM CheckROMType
|
|||||||
mov byte[DSP4Enable],0
|
mov byte[DSP4Enable],0
|
||||||
mov byte[BSEnable],0
|
mov byte[BSEnable],0
|
||||||
|
|
||||||
|
|
||||||
mov esi,[romdata]
|
mov esi,[romdata]
|
||||||
cmp byte[NumofBanks],128
|
add esi,[infoloc]
|
||||||
jbe .notEHi
|
add esi,21
|
||||||
mov ax,word[esi + 040FFDEh]
|
|
||||||
xor ax,word[esi + 040FFDCh]
|
|
||||||
cmp ax,0FFFFh
|
|
||||||
jne .notEHi
|
|
||||||
add esi,040FFD5h
|
|
||||||
jmp .cntnchpdtct
|
|
||||||
.notEHi
|
|
||||||
cmp byte[romtype],2 ;HiROM?
|
|
||||||
jne .nohirom2b
|
|
||||||
add esi,0FFD5h
|
|
||||||
jmp .cntnchpdtct
|
|
||||||
.nohirom2b
|
|
||||||
add esi,07FD5h
|
|
||||||
.cntnchpdtct
|
|
||||||
mov ax,[esi]
|
mov ax,[esi]
|
||||||
cmp ax,02530h
|
cmp ax,02530h
|
||||||
jne .notOBC1
|
jne .notOBC1
|
||||||
@@ -6643,11 +6313,8 @@ SECTION .text
|
|||||||
NEWSYM SetIRQVectors
|
NEWSYM SetIRQVectors
|
||||||
; Get Vectors (NMI & Reset)
|
; Get Vectors (NMI & Reset)
|
||||||
mov esi,[romdata]
|
mov esi,[romdata]
|
||||||
add esi,32704+21
|
add esi,[infoloc]
|
||||||
cmp byte[romtype],2
|
add esi,21
|
||||||
jne .nohirom9
|
|
||||||
add esi,8000h
|
|
||||||
.nohirom9
|
|
||||||
mov al,[esi]
|
mov al,[esi]
|
||||||
test al,0F0h
|
test al,0F0h
|
||||||
jnz .yesfastrom
|
jnz .yesfastrom
|
||||||
@@ -6658,12 +6325,7 @@ NEWSYM SetIRQVectors
|
|||||||
mov al,[cycpb268]
|
mov al,[cycpb268]
|
||||||
mov [cycpb358],al
|
mov [cycpb358],al
|
||||||
.yesfastrom
|
.yesfastrom
|
||||||
mov esi,[romdata]
|
add esi,0Fh
|
||||||
add esi,7FE4h
|
|
||||||
cmp byte[romtype],2
|
|
||||||
jne .nohirom
|
|
||||||
add esi,8000h
|
|
||||||
.nohirom
|
|
||||||
cmp word[esi+24],0FFFFh
|
cmp word[esi+24],0FFFFh
|
||||||
jne .notreseterror
|
jne .notreseterror
|
||||||
mov word[esi+6],0FF9Ch
|
mov word[esi+6],0FF9Ch
|
||||||
@@ -6709,7 +6371,9 @@ NEWSYM SetIRQVectors
|
|||||||
NEWSYM outofmemfix
|
NEWSYM outofmemfix
|
||||||
mov esi,[romdata]
|
mov esi,[romdata]
|
||||||
cmp byte[romtype],2
|
cmp byte[romtype],2
|
||||||
je .hirom
|
jne .nhirom
|
||||||
|
add esi,8000h
|
||||||
|
.nhirom
|
||||||
mov word[resetv],8000h
|
mov word[resetv],8000h
|
||||||
mov word[xpc],8000h
|
mov word[xpc],8000h
|
||||||
mov byte[esi],58h
|
mov byte[esi],58h
|
||||||
@@ -6722,20 +6386,6 @@ NEWSYM outofmemfix
|
|||||||
.notso
|
.notso
|
||||||
mov dword[MessageOn],0FFFFFFFFh
|
mov dword[MessageOn],0FFFFFFFFh
|
||||||
ret
|
ret
|
||||||
.hirom
|
|
||||||
add esi,8000h
|
|
||||||
mov word[resetv],8000h
|
|
||||||
mov word[xpc],8000h
|
|
||||||
mov byte[esi],58h
|
|
||||||
mov byte[esi+1],80h
|
|
||||||
mov byte[esi+2],0FEh
|
|
||||||
mov dword[Msgptr],outofmemoryerror
|
|
||||||
cmp byte[newgfx16b],1
|
|
||||||
jne .notso2
|
|
||||||
mov dword[Msgptr],outofmemoryerror2
|
|
||||||
.notso2
|
|
||||||
mov dword[MessageOn],0FFFFFFFFh
|
|
||||||
ret
|
|
||||||
|
|
||||||
SECTION .bss
|
SECTION .bss
|
||||||
NEWSYM yesoutofmemory, resb 1
|
NEWSYM yesoutofmemory, resb 1
|
||||||
|
|||||||
318
zsnes/src/initc.c
Executable file
318
zsnes/src/initc.c
Executable file
@@ -0,0 +1,318 @@
|
|||||||
|
/*
|
||||||
|
Copyright (C) 2003 ZSNES Team ( zsknight@zsnes.com / _demo_@zsnes.com )
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later
|
||||||
|
version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
//C++ style code in C
|
||||||
|
#define bool unsigned char
|
||||||
|
#define true 1
|
||||||
|
#define false 0
|
||||||
|
|
||||||
|
#define Lo 0x7FC0
|
||||||
|
#define Hi 0xFFC0
|
||||||
|
#define EHi 0x40FFC0
|
||||||
|
|
||||||
|
|
||||||
|
//I want to port over the more complicated
|
||||||
|
//functions from init.asm, or replace with
|
||||||
|
//better versions from NSRT. -Nach
|
||||||
|
|
||||||
|
|
||||||
|
//init.asm goodnes
|
||||||
|
extern unsigned int NumofBanks;
|
||||||
|
extern unsigned int NumofBytes;
|
||||||
|
extern unsigned int *romdata;
|
||||||
|
extern unsigned char romtype;
|
||||||
|
extern unsigned char Interleaved;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
unsigned int infoloc;
|
||||||
|
|
||||||
|
//Deinterleave functions
|
||||||
|
bool validChecksum(unsigned char *ROM, int BankLoc)
|
||||||
|
{
|
||||||
|
if (ROM[BankLoc + 28] + (ROM[BankLoc + 29] << 8) +
|
||||||
|
ROM[BankLoc + 30] + (ROM[BankLoc + 31] << 8) == 0xFFFF)
|
||||||
|
{
|
||||||
|
return(true);
|
||||||
|
}
|
||||||
|
return(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void swapBlocks(char *blocks)
|
||||||
|
{
|
||||||
|
int i,j,k;
|
||||||
|
for (i = 0; i < NumofBanks; i++)
|
||||||
|
{
|
||||||
|
for (j = 0; j < NumofBanks; j++)
|
||||||
|
{
|
||||||
|
if (blocks[j] == i)
|
||||||
|
{
|
||||||
|
char b;
|
||||||
|
unsigned int temp,
|
||||||
|
*loc1 = romdata + blocks[i]*0x2000,
|
||||||
|
*loc2 = romdata + blocks[j]*0x2000;
|
||||||
|
for (k = 0; k < 0x2000; k++)
|
||||||
|
{
|
||||||
|
temp = loc1[k];
|
||||||
|
loc1[k] = loc2[k];
|
||||||
|
loc2[k] = temp;
|
||||||
|
}
|
||||||
|
b = blocks[j];
|
||||||
|
blocks[j] = blocks[i];
|
||||||
|
blocks[i] = b;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void deintlv1()
|
||||||
|
{
|
||||||
|
int i, numblocks = NumofBanks/2;
|
||||||
|
char blocks[256];
|
||||||
|
for (i = 0; i < numblocks; i++)
|
||||||
|
{
|
||||||
|
blocks[i * 2] = i + numblocks;
|
||||||
|
blocks[i * 2 + 1] = i;
|
||||||
|
}
|
||||||
|
swapBlocks(blocks);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CheckIntl1(unsigned char *ROM)
|
||||||
|
{
|
||||||
|
unsigned int ROMmidPoint = NumofBytes / 2;
|
||||||
|
if (validChecksum(ROM, ROMmidPoint + Lo) &&
|
||||||
|
!validChecksum(ROM, Lo) &&
|
||||||
|
ROM[ROMmidPoint+Lo+25] < 14) //Country Code
|
||||||
|
{
|
||||||
|
deintlv1();
|
||||||
|
Interleaved = true;
|
||||||
|
}
|
||||||
|
else if (validChecksum(ROM, Lo) && !validChecksum(ROM, Hi) &&
|
||||||
|
ROM[Lo+25] < 14 && //Country code
|
||||||
|
//Rom make up
|
||||||
|
(ROM[Lo+21] == 33 || ROM[Lo+21] == 49 || ROM[Lo+21] == 53))
|
||||||
|
{
|
||||||
|
if (ROM[Lo+20] == 32 ||//Check that Header name did not overflow
|
||||||
|
!(ROM[Lo+21] == ROM[Lo+20] || ROM[Lo+21] == ROM[Lo+19] ||
|
||||||
|
ROM[Lo+21] == ROM[Lo+18] || ROM[Lo+21] == ROM[Lo+17]))
|
||||||
|
{
|
||||||
|
deintlv1();
|
||||||
|
Interleaved = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//It would be nice to find a way to eliminate the 2MB here
|
||||||
|
//Then we can also drop the includes of these two
|
||||||
|
#include <string.h>
|
||||||
|
#include <malloc.h>
|
||||||
|
void deintToP()
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
char blocks[256];
|
||||||
|
char *ROM = (char *)romdata;
|
||||||
|
char *ROMSwap = (char *)malloc(0x200000);
|
||||||
|
if (ROMSwap)
|
||||||
|
{
|
||||||
|
memmove(ROMSwap, ROM, 0x200000); //Copy Small ROM to RAM
|
||||||
|
memmove(ROM, &ROM[0x200000], 0x400000); //Move Large ROM to front
|
||||||
|
memmove(&ROM[0x400000], ROMSwap, 0x200000); //Place Small ROM after
|
||||||
|
free(ROMSwap);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Deinterleave the 4MB ROM first
|
||||||
|
NumofBanks = 128;
|
||||||
|
deintlv1();
|
||||||
|
|
||||||
|
//Now the 2MB one
|
||||||
|
NumofBanks = 64;
|
||||||
|
romdata += 0x100000; //Ofset pointer
|
||||||
|
deintlv1();
|
||||||
|
|
||||||
|
//Now fix the data and we're done
|
||||||
|
NumofBanks = 192;
|
||||||
|
romdata -= 0x100000;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//ROM loading functions, which some strangly enough were in guiload.inc
|
||||||
|
bool AllASCII(char *b, int size)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
if (b[i] < 32 || b[i] > 126)
|
||||||
|
{
|
||||||
|
return(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
int InfoScore(char *Buffer)
|
||||||
|
{
|
||||||
|
int score = 0;
|
||||||
|
if (Buffer[26] == 0x33) { score += 2; }
|
||||||
|
if ((Buffer[21] & 0xf) < 4) { score += 2; }
|
||||||
|
if (!(Buffer[61] & 0x80)) { score -= 4; }
|
||||||
|
if ((1 << (Buffer[23] - 7)) > 48) { score -= 1; }
|
||||||
|
if (Buffer[25] < 14) { score += 1; }
|
||||||
|
if (!AllASCII(Buffer, 20)) { score -= 1; }
|
||||||
|
return(score);
|
||||||
|
}
|
||||||
|
|
||||||
|
extern unsigned char ForceHiLoROM;
|
||||||
|
extern unsigned char forceromtype;
|
||||||
|
|
||||||
|
void BankCheck()
|
||||||
|
{
|
||||||
|
unsigned char *ROM = (unsigned char *)romdata;
|
||||||
|
infoloc = 0;
|
||||||
|
Interleaved = false;
|
||||||
|
|
||||||
|
if (NumofBytes >= 0x500000)
|
||||||
|
{
|
||||||
|
if (validChecksum(ROM, 0x207FC0))
|
||||||
|
{
|
||||||
|
deintToP();
|
||||||
|
Interleaved = true;
|
||||||
|
}
|
||||||
|
if (validChecksum(ROM, EHi))
|
||||||
|
{
|
||||||
|
romtype = 2;
|
||||||
|
infoloc = EHi;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!infoloc)
|
||||||
|
{
|
||||||
|
int loscore, hiscore;
|
||||||
|
|
||||||
|
//Deinterleave if neccesary
|
||||||
|
CheckIntl1(ROM);
|
||||||
|
|
||||||
|
loscore = InfoScore(ROM+Lo);
|
||||||
|
if (validChecksum(ROM, Lo)) { loscore += 3; }
|
||||||
|
|
||||||
|
hiscore = InfoScore(ROM+Hi);
|
||||||
|
if (validChecksum(ROM, Hi)) { hiscore += 3; }
|
||||||
|
|
||||||
|
switch(ROM[Lo + 21])
|
||||||
|
{
|
||||||
|
case 32: case 35: case 48: case 50:
|
||||||
|
case 128: case 156: case 176: case 188: case 252: //BS
|
||||||
|
loscore += 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
switch(ROM[Hi + 21])
|
||||||
|
{
|
||||||
|
case 33: case 49: case 53:
|
||||||
|
case 128: case 156: case 176: case 188: case 252: //BS
|
||||||
|
hiscore += 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ForceHiLoROM)
|
||||||
|
{
|
||||||
|
//asm volatile("int $3");
|
||||||
|
if (forceromtype == 1) { loscore += 50; }
|
||||||
|
else if (forceromtype == 2) { hiscore += 50; }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hiscore > loscore)
|
||||||
|
{
|
||||||
|
romtype = 2;
|
||||||
|
infoloc = Hi;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
romtype = 1;
|
||||||
|
infoloc = Lo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//Checksum functions
|
||||||
|
unsigned short sum(unsigned char *array, unsigned int size)
|
||||||
|
{
|
||||||
|
unsigned short theSum = 0;
|
||||||
|
unsigned int i;
|
||||||
|
for (i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
theSum += array[i];
|
||||||
|
}
|
||||||
|
return(theSum);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Not entirely accurate pow, but good for our needs and very fast
|
||||||
|
unsigned int npow(register unsigned int base, register unsigned int exponent)
|
||||||
|
{
|
||||||
|
register unsigned int total = base;
|
||||||
|
register unsigned int i;
|
||||||
|
for (i = 1; i < exponent; i++)
|
||||||
|
{
|
||||||
|
total *= base;
|
||||||
|
}
|
||||||
|
return(total);
|
||||||
|
}
|
||||||
|
|
||||||
|
extern unsigned char SPC7110Enable;
|
||||||
|
extern unsigned char BSEnable;
|
||||||
|
extern unsigned short Checksumvalue;
|
||||||
|
void CalcChecksum()
|
||||||
|
{
|
||||||
|
unsigned char *ROM = (unsigned char *)romdata;
|
||||||
|
unsigned short Mbit = NumofBanks >> 2, Checksum;
|
||||||
|
unsigned int ROMSize = NumofBytes;
|
||||||
|
unsigned int Bank = infoloc;
|
||||||
|
|
||||||
|
|
||||||
|
if ((Mbit == 10 || Mbit == 20 || Mbit == 40) && !SPC7110Enable)
|
||||||
|
{
|
||||||
|
unsigned int P1Size = npow(2, ROM[Bank + 23] - 7) * 65536;
|
||||||
|
unsigned short part1 = sum(ROM, P1Size),
|
||||||
|
part2 = sum(ROM+P1Size, ROMSize-P1Size);
|
||||||
|
Checksumvalue = part1 + part2*4;
|
||||||
|
}
|
||||||
|
else if ((Mbit == 12 || Mbit == 24 || Mbit == 48) && !SPC7110Enable)
|
||||||
|
{
|
||||||
|
unsigned int P1Size = npow(2, ROM[Bank + 23] - 7) * 65536;
|
||||||
|
unsigned short part1 = sum(ROM, P1Size),
|
||||||
|
part2 = sum(ROM+P1Size, ROMSize-P1Size);
|
||||||
|
Checksumvalue = part1 + part2 + part2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Checksumvalue = sum(ROM, ROMSize);
|
||||||
|
if (BSEnable)
|
||||||
|
{
|
||||||
|
Checksumvalue -= sum(&ROM[Bank - 16], 48); //Fix for BS Dumps
|
||||||
|
}
|
||||||
|
else if (Mbit == 24)
|
||||||
|
{
|
||||||
|
Checksumvalue += Checksumvalue; //Fix for 24Mb SPC7110 ROMs
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -55,7 +55,7 @@ PREOBJ=${OBJDIR}/dosbuff.o ${OBJDIR}/ipx.o ${OBJDIR}/zipx.o
|
|||||||
|
|
||||||
ZIPOBJ=${ZIPDIR}/zzip.o ${ZIPDIR}/unzip.o ${ZIPDIR}/zpng.o
|
ZIPOBJ=${ZIPDIR}/zzip.o ${ZIPDIR}/unzip.o ${ZIPDIR}/zpng.o
|
||||||
|
|
||||||
MAINOBJ=cfgload.o endmem.o fixsin.o init.o ui.o vcache.o water.o smoke.o burn.o
|
MAINOBJ=cfgload.o endmem.o fixsin.o init.o initc.o ui.o vcache.o water.o smoke.o burn.o
|
||||||
|
|
||||||
|
|
||||||
OBJS=${CHIPSOBJ} ${CPUOBJ} ${DOSOBJ} ${GUIOBJ} ${VIDEOBJ} ${PREOBJ} ${MAINOBJ} ${ZIPOBJ}
|
OBJS=${CHIPSOBJ} ${CPUOBJ} ${DOSOBJ} ${GUIOBJ} ${VIDEOBJ} ${PREOBJ} ${MAINOBJ} ${ZIPOBJ}
|
||||||
@@ -109,6 +109,7 @@ ${CHIPDIR}/dsp1emu.o: ${CHIPDIR}/dsp1emu.c
|
|||||||
ui.o: ui.asm macros.mac
|
ui.o: ui.asm macros.mac
|
||||||
cfgload.o:cfgload.asm macros.mac
|
cfgload.o:cfgload.asm macros.mac
|
||||||
init.o:init.asm macros.mac
|
init.o:init.asm macros.mac
|
||||||
|
initc.o:initc.c
|
||||||
${DOSDIR}/debug.o: ${DOSDIR}/debug.asm macros.mac
|
${DOSDIR}/debug.o: ${DOSDIR}/debug.asm macros.mac
|
||||||
${CPUDIR}/execute.o: ${CPUDIR}/execute.asm macros.mac
|
${CPUDIR}/execute.o: ${CPUDIR}/execute.asm macros.mac
|
||||||
${CPUDIR}/table.o: ${CPUDIR}/table.asm ${CPUDIR}/65816d.inc\
|
${CPUDIR}/table.o: ${CPUDIR}/table.asm ${CPUDIR}/65816d.inc\
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ PREOBJ=
|
|||||||
|
|
||||||
ZIPOBJ=${ZIPDIR}/zzip.obj ${ZIPDIR}/unzip.obj ${ZIPDIR}/zpng.obj
|
ZIPOBJ=${ZIPDIR}/zzip.obj ${ZIPDIR}/unzip.obj ${ZIPDIR}/zpng.obj
|
||||||
|
|
||||||
MAINOBJ=cfgload.obj endmem.obj fixsin.obj init.obj ui.obj vcache.obj water.obj smoke.obj burn.obj
|
MAINOBJ=cfgload.obj endmem.obj fixsin.obj init.obj initc.obj ui.obj vcache.obj water.obj smoke.obj burn.obj
|
||||||
|
|
||||||
OBJS=${CHIPSOBJ} ${CPUOBJ} ${WINOBJ} ${GUIOBJ} ${VIDEOBJ} ${ZIPOBJ} ${MAINOBJ} ${WINDOSOBJ}
|
OBJS=${CHIPSOBJ} ${CPUOBJ} ${WINOBJ} ${GUIOBJ} ${VIDEOBJ} ${ZIPOBJ} ${MAINOBJ} ${WINDOSOBJ}
|
||||||
LIBS=
|
LIBS=
|
||||||
@@ -126,6 +126,7 @@ ${CHIPDIR}/dsp1proc.obj: ${CHIPDIR}/dsp1proc.asm macros.mac
|
|||||||
ui.obj: ui.asm macros.mac
|
ui.obj: ui.asm macros.mac
|
||||||
cfgload.obj:cfgload.asm macros.mac
|
cfgload.obj:cfgload.asm macros.mac
|
||||||
init.obj:init.asm macros.mac
|
init.obj:init.asm macros.mac
|
||||||
|
initc.obj:initc.c
|
||||||
${DOSDIR}/debug.obj: ${DOSDIR}/debug.asm macros.mac
|
${DOSDIR}/debug.obj: ${DOSDIR}/debug.asm macros.mac
|
||||||
${CPUDIR}/addrni.obj: ${CPUDIR}/addrni.asm
|
${CPUDIR}/addrni.obj: ${CPUDIR}/addrni.asm
|
||||||
${CPUDIR}/execute.obj: ${CPUDIR}/execute.asm macros.mac
|
${CPUDIR}/execute.obj: ${CPUDIR}/execute.asm macros.mac
|
||||||
|
|||||||
Reference in New Issue
Block a user