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
|
||||
|
||||
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}
|
||||
|
||||
@@ -90,6 +90,7 @@ ${CHIPDIR}/dsp1emu.o: ${CHIPDIR}/dsp1emu.c
|
||||
ui.o: ui.asm macros.mac
|
||||
cfgload.o:cfgload.asm macros.mac
|
||||
init.o:init.asm macros.mac
|
||||
initc.o:init.c
|
||||
${DOSDIR}/debug.o: ${DOSDIR}/debug.asm macros.mac
|
||||
${CPUDIR}/execute.o: ${CPUDIR}/execute.asm macros.mac
|
||||
${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 t1cc, LoadDir, SRAMDir, LoadDrive,SRAMDrive, initsnes, romloadskip
|
||||
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 spcRam, spcPCRam, spcS, spcRamDP, spcA, spcX, spcY, spcP, spcNZ
|
||||
EXTSYM Voice0Status, Voice1Status, Voice2Status, Voice3Status, Voice4Status
|
||||
|
||||
@@ -289,69 +289,7 @@ GUIloadfilename:
|
||||
mov byte[CheatWinMode],0
|
||||
mov byte[CheatSearchStatus],0
|
||||
|
||||
call CheckROMType
|
||||
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 SetupROM
|
||||
call showinfogui
|
||||
call initsnes
|
||||
mov byte[snesmouse],0
|
||||
|
||||
@@ -95,6 +95,7 @@ EXTSYM GUIfindUSA,GUIfindEUR,GUIfindJAP,GUIfindZIP,GUIfind1,DTALoc,GUIfindall
|
||||
EXTSYM spc7110romptr,allocspc7110
|
||||
EXTSYM SRAMDir,SRAMDrive,cfgloadsdir,fnamest,statefileloc
|
||||
EXTSYM ForcePal,ForceROMTiming,ForceHiLoROM,InitDir,InitDrive,enterpress,frameskip
|
||||
EXTSYM infoloc
|
||||
EXTSYM gotoroot,headdata,printnum,romispal
|
||||
EXTSYM InitFxTables,SFXSRAM,SfxR1,SfxR2,SfxSCMR,SfxSFR,finterleave
|
||||
EXTSYM initregr,initregw,memtabler16,DSP1Read16b3F,memaccessbankr16
|
||||
@@ -2527,11 +2528,8 @@ NEWSYM initsnes
|
||||
je near .bslorom
|
||||
.notbsx3
|
||||
mov esi,[romdata]
|
||||
add esi,32704+22
|
||||
cmp byte[romtype],2
|
||||
jne .nohirom2b
|
||||
add esi,8000h
|
||||
.nohirom2b
|
||||
add esi,[infoloc]
|
||||
add esi,22
|
||||
mov byte[MultiTap],1
|
||||
cmp byte[pl12s34],1
|
||||
je .nomtap
|
||||
@@ -3247,6 +3245,7 @@ NEWSYM SFXCounter, dd 0
|
||||
SECTION .text
|
||||
|
||||
NEWSYM prepare48mbit
|
||||
mov dword[NumofBanks],192
|
||||
; make table 2 (64,0,65,1,...)
|
||||
mov edi,mode7tab+128
|
||||
mov ecx,64
|
||||
@@ -3469,41 +3468,6 @@ NEWSYM preparesfx
|
||||
jnz .n
|
||||
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:
|
||||
; make table 1 (0 .. 255)
|
||||
mov edi,mode7tab
|
||||
@@ -4077,7 +4041,7 @@ SECTION .bss
|
||||
|
||||
|
||||
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 SramExists, resb 1
|
||||
NEWSYM NumofBanks, resd 1
|
||||
@@ -5021,64 +4985,6 @@ NEWSYM loadfileGUI
|
||||
jnz .loopcheck
|
||||
.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
|
||||
jne .nottempdirdel
|
||||
call PatchIPS
|
||||
@@ -5314,23 +5220,19 @@ SECTION .text
|
||||
|
||||
NEWSYM showinfogui
|
||||
mov esi,[romdata]
|
||||
cmp byte[NumofBanks],128
|
||||
jbe .notEHi1
|
||||
mov ax,word[esi + 040FFDEh]
|
||||
xor ax,word[esi + 040FFDCh]
|
||||
cmp ax,0FFFFh
|
||||
add esi,[infoloc]
|
||||
|
||||
cmp dword[infoloc],40FFC0h
|
||||
jne .notEHi1
|
||||
add esi,040FFC0h
|
||||
mov dword[CSStatus2+23], 'EHi '
|
||||
jmp .nohiromrn
|
||||
.notEHi1
|
||||
add esi,7FC0h
|
||||
mov dword[CSStatus2+23], 'Lo '
|
||||
cmp byte[romtype],2
|
||||
jne .nohiromrn
|
||||
mov dword[CSStatus2+23], 'Hi '
|
||||
add esi,8000h
|
||||
.nohiromrn
|
||||
|
||||
mov edi,CSStatus
|
||||
mov ecx,20
|
||||
.looprn
|
||||
@@ -5432,21 +5334,8 @@ NEWSYM showinfogui
|
||||
je .nobs
|
||||
mov dword[CSStatus+29],'BROA'
|
||||
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
|
||||
sub esi,10
|
||||
sub esi,3
|
||||
mov word[esi],042h ;42 is the answer, and the uCONSRT standard
|
||||
.nobs
|
||||
|
||||
@@ -5497,21 +5386,14 @@ NEWSYM showinfogui
|
||||
shr ecx,2
|
||||
jnz .crcprintloop
|
||||
|
||||
EXTSYM CalcChecksum
|
||||
pushad
|
||||
call CalcChecksum
|
||||
popad
|
||||
|
||||
mov esi,[romdata]
|
||||
cmp byte[NumofBanks],128
|
||||
jbe .notEHi2
|
||||
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
|
||||
add esi,[infoloc]
|
||||
add esi,1Eh
|
||||
mov ax,[Checksumvalue]
|
||||
cmp ax,[esi]
|
||||
jne .failed
|
||||
@@ -5519,32 +5401,8 @@ NEWSYM showinfogui
|
||||
mov dword[CSStatus2+36],'OK '
|
||||
jmp .passed
|
||||
.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'
|
||||
.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[Msgptr],CSStatus
|
||||
mov eax,[MsgCount]
|
||||
@@ -5566,6 +5424,9 @@ NEWSYM showinfogui
|
||||
; Convert to interleaved - If LoROM and offset 7FD5 contains 21h, then
|
||||
; uninterleave
|
||||
|
||||
;This looks like the info it displays if loaded via the command line
|
||||
;Very outdated
|
||||
|
||||
NEWSYM showinfo
|
||||
mov edx,.romsizea
|
||||
cmp byte[Sup48mbit],0
|
||||
@@ -5677,11 +5538,8 @@ NEWSYM showinfo
|
||||
|
||||
; Output Name
|
||||
mov esi,[romdata]
|
||||
add esi,7FC0h
|
||||
cmp byte[romtype],2
|
||||
jne .nohirom2
|
||||
add esi,8000h
|
||||
.nohirom2
|
||||
add esi,[infoloc]
|
||||
|
||||
mov ecx,21
|
||||
.loopb
|
||||
lodsb
|
||||
@@ -6023,248 +5881,74 @@ NEWSYM DSP1Type, resb 1
|
||||
NEWSYM intldone, resb 1
|
||||
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
|
||||
call SetAddressingModes
|
||||
call GenerateBank0Table
|
||||
|
||||
mov byte[intldone],0
|
||||
mov byte[ROMTypeNOTFound],0
|
||||
; 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
|
||||
EXTSYM BankCheck
|
||||
call BankCheck
|
||||
|
||||
mov esi,[romdata]
|
||||
add esi,0FFC0h
|
||||
@@ -6328,24 +6012,10 @@ NEWSYM CheckROMType
|
||||
mov byte[DSP4Enable],0
|
||||
mov byte[BSEnable],0
|
||||
|
||||
|
||||
mov esi,[romdata]
|
||||
cmp byte[NumofBanks],128
|
||||
jbe .notEHi
|
||||
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
|
||||
add esi,[infoloc]
|
||||
add esi,21
|
||||
|
||||
mov ax,[esi]
|
||||
cmp ax,02530h
|
||||
jne .notOBC1
|
||||
@@ -6643,11 +6313,8 @@ SECTION .text
|
||||
NEWSYM SetIRQVectors
|
||||
; Get Vectors (NMI & Reset)
|
||||
mov esi,[romdata]
|
||||
add esi,32704+21
|
||||
cmp byte[romtype],2
|
||||
jne .nohirom9
|
||||
add esi,8000h
|
||||
.nohirom9
|
||||
add esi,[infoloc]
|
||||
add esi,21
|
||||
mov al,[esi]
|
||||
test al,0F0h
|
||||
jnz .yesfastrom
|
||||
@@ -6658,12 +6325,7 @@ NEWSYM SetIRQVectors
|
||||
mov al,[cycpb268]
|
||||
mov [cycpb358],al
|
||||
.yesfastrom
|
||||
mov esi,[romdata]
|
||||
add esi,7FE4h
|
||||
cmp byte[romtype],2
|
||||
jne .nohirom
|
||||
add esi,8000h
|
||||
.nohirom
|
||||
add esi,0Fh
|
||||
cmp word[esi+24],0FFFFh
|
||||
jne .notreseterror
|
||||
mov word[esi+6],0FF9Ch
|
||||
@@ -6709,7 +6371,9 @@ NEWSYM SetIRQVectors
|
||||
NEWSYM outofmemfix
|
||||
mov esi,[romdata]
|
||||
cmp byte[romtype],2
|
||||
je .hirom
|
||||
jne .nhirom
|
||||
add esi,8000h
|
||||
.nhirom
|
||||
mov word[resetv],8000h
|
||||
mov word[xpc],8000h
|
||||
mov byte[esi],58h
|
||||
@@ -6722,20 +6386,6 @@ NEWSYM outofmemfix
|
||||
.notso
|
||||
mov dword[MessageOn],0FFFFFFFFh
|
||||
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
|
||||
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
|
||||
|
||||
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}
|
||||
@@ -109,6 +109,7 @@ ${CHIPDIR}/dsp1emu.o: ${CHIPDIR}/dsp1emu.c
|
||||
ui.o: ui.asm macros.mac
|
||||
cfgload.o:cfgload.asm macros.mac
|
||||
init.o:init.asm macros.mac
|
||||
initc.o:initc.c
|
||||
${DOSDIR}/debug.o: ${DOSDIR}/debug.asm macros.mac
|
||||
${CPUDIR}/execute.o: ${CPUDIR}/execute.asm macros.mac
|
||||
${CPUDIR}/table.o: ${CPUDIR}/table.asm ${CPUDIR}/65816d.inc\
|
||||
|
||||
@@ -63,7 +63,7 @@ PREOBJ=
|
||||
|
||||
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}
|
||||
LIBS=
|
||||
@@ -126,6 +126,7 @@ ${CHIPDIR}/dsp1proc.obj: ${CHIPDIR}/dsp1proc.asm macros.mac
|
||||
ui.obj: ui.asm macros.mac
|
||||
cfgload.obj:cfgload.asm macros.mac
|
||||
init.obj:init.asm macros.mac
|
||||
initc.obj:initc.c
|
||||
${DOSDIR}/debug.obj: ${DOSDIR}/debug.asm macros.mac
|
||||
${CPUDIR}/addrni.obj: ${CPUDIR}/addrni.asm
|
||||
${CPUDIR}/execute.obj: ${CPUDIR}/execute.asm macros.mac
|
||||
|
||||
Reference in New Issue
Block a user