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

View File

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

View File

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

View File

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

View File

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