Major updates!

This commit is contained in:
n-a-c-h
2003-07-09 21:02:33 +00:00
parent 334a6926c5
commit e427bd55ea
7 changed files with 14485 additions and 14576 deletions

View File

@@ -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\

View File

@@ -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

View File

@@ -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

View File

@@ -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
View 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
}
}
}

View File

@@ -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\

View File

@@ -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