Removed SuperFX interleave support, Removed really old interleave code, Replaced 48Mb interleave asm monstrosity with much smaller C monster.

This commit is contained in:
n-a-c-h
2004-12-09 20:28:40 +00:00
parent 7f85fcc164
commit 8e9cdec36a
2 changed files with 44 additions and 249 deletions

View File

@@ -33,7 +33,6 @@ EXTSYM cvidmode, newengen, cfgnewgfx, GUI16VID
EXTSYM NewEngEnForce EXTSYM NewEngEnForce
EXTSYM PrintChar EXTSYM PrintChar
EXTSYM TextFile EXTSYM TextFile
EXTSYM mode7tab
EXTSYM Setper2exec,per2exec EXTSYM Setper2exec,per2exec
EXTSYM MovieCounter EXTSYM MovieCounter
EXTSYM chaton EXTSYM chaton
@@ -125,6 +124,7 @@ EXTSYM addOnSize
EXTSYM SPC7PackIndexLoad,SPC7110IndexSize EXTSYM SPC7PackIndexLoad,SPC7110IndexSize
EXTSYM DumpROMLoadInfo EXTSYM DumpROMLoadInfo
EXTSYM SetupSramSize EXTSYM SetupSramSize
EXTSYM IntlEHi
EXTSYM SetaCmdEnable,setaramdata EXTSYM SetaCmdEnable,setaramdata
EXTSYM setaaccessbankr8,setaaccessbankw8,setaaccessbankr8a,setaaccessbankw8a EXTSYM setaaccessbankr8,setaaccessbankw8,setaaccessbankr8a,setaaccessbankw8a
@@ -1956,7 +1956,9 @@ NEWSYM initsnes
mov eax,[ram7f] mov eax,[ram7f]
mov [snesmmap+7Fh*4],eax mov [snesmmap+7Fh*4],eax
mov [snesmap2+7Fh*4],eax mov [snesmap2+7Fh*4],eax
call prepare48mbit pushad
call IntlEHi ;Interleave 48Mb ROM, because the map is broken
popad
ret ret
.hirom .hirom
; set addresses 8000-FFFF ; set addresses 8000-FFFF
@@ -2328,150 +2330,6 @@ SDD1memmap:
mov [snesmap2+7Fh*4],eax mov [snesmap2+7Fh*4],eax
ret ret
;*******************************************************
; Prepare 48mbit Moves blocks around for 48mbit
;*******************************************************
SECTION .data
NEWSYM memdest, dd 0
SECTION .text
NEWSYM prepare48mbit
mov dword[NumofBanks],192
; make table 2 (64,0,65,1,...)
mov edi,mode7tab+128
mov ecx,64
mov al,64
mov ah,0
.nextl2
mov [edi],al
mov [edi+1],ah
inc al
inc ah
add edi,2
dec ecx
jnz .nextl2
mov eax,[romdata]
add eax,200000h
mov [memdest],eax
call ProcessSwapTable
cmp byte[romtype],1
je .nothirom
call UnInterleave48mbit
.nothirom
ret
UnInterleave48mbit:
pushad
; 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 esi,mode7tab+256
mov ecx,40h
xor al,al
.loop
mov [esi+40h],al
inc al
inc esi
dec ecx
jnz .loop
mov esi,mode7tab+256
mov ecx,40h
mov al,40h+1
.loop2
mov [esi+80h],al
add al,2
inc esi
dec ecx
jnz .loop2
mov esi,mode7tab+256
mov ecx,20h
mov al,40h
.loop3
mov [esi+20h],al
add al,2
mov [esi],al
add al,2
inc esi
dec ecx
jnz .loop3
call SwapTable256
popad
ret
NEWSYM ProcessSwapTable
; make table 1 (0 .. 127)
mov edi,mode7tab
mov ecx,128
xor al,al
.nextl
mov [edi],al
inc al
inc edi
dec ecx
jnz .nextl
xor eax,eax
xor ebx,ebx
; sort memory
; start at first entry in table 2
mov esi,mode7tab+128
mov ecx,128
.nextentry
; find which blocks to swap
; search entry from table 2 in table 1
mov al,[esi]
mov edi,mode7tab
.findnext
mov bl,[edi]
cmp bl,al
je .foundit
inc edi
jmp .findnext
.foundit
mov bl,[esi-128]
mov [esi-128],al
mov [edi],bl
mov eax,esi
sub eax,mode7tab+128
mov ebx,edi
sub ebx,mode7tab
; swap blocks at memory location $200000+al*8000h with $200000+bl*8000h
shl eax,15
add eax,[memdest]
shl ebx,15
add ebx,[memdest]
push esi
mov esi,eax
mov edi,ebx
mov edx,2000h
.loopa
mov eax,[esi]
mov ebx,[edi]
mov [esi],ebx
mov [edi],eax
add esi,4
add edi,4
dec edx
jnz .loopa
pop esi
xor eax,eax
xor ebx,ebx
inc esi
dec ecx
jnz near .nextentry
call Makemode7Table
ret
SECTION .data SECTION .data
NEWSYM SFXCounter, dd 0 NEWSYM SFXCounter, dd 0
@@ -2499,35 +2357,6 @@ NEWSYM preparesfx
jne .noac jne .noac
mov byte[SfxAC],1 mov byte[SfxAC],1
.noac .noac
cmp dword[eax+0EFFBBh], 21066396h
je .yesinterleaved
cmp dword[eax+048000h],0E702E1F6h
je .yesinterleaved
jmp .noswapper
.yesinterleaved
mov edi,mode7tab+128
mov ecx,128
mov al,0
.nextl2
mov ah,al
and ah,11100001b
mov bl,al
and bl,00000110b
shl bl,2
or ah,bl
mov bl,al
and bl,00011000b
shr bl,2
or ah,bl
mov [edi],ah
inc al
inc edi
dec ecx
jnz .nextl2
mov eax,[romdata]
mov [memdest],eax
call ProcessSwapTable
.noswapper
; duplicate sfx data ; duplicate sfx data
mov esi,[romdata] mov esi,[romdata]
mov edi,[romdata] mov edi,[romdata]
@@ -2565,80 +2394,6 @@ NEWSYM preparesfx
jnz .n jnz .n
ret ret
SwapTable256:
; make table 1 (0 .. 255)
mov edi,mode7tab
mov ecx,256
xor al,al
.nextlb
mov [edi],al
inc al
inc edi
dec ecx
jnz .nextlb
xor eax,eax
xor ebx,ebx
; sort memory
; start at first entry in table 2
mov esi,mode7tab+256
mov ecx,[NumofBanks]
shr ecx,1
add ecx,ecx
.nextentry
; find which blocks to swap
; search entry from table 2 in table 1
mov al,[esi]
mov edi,mode7tab
.findnext
mov bl,[edi]
cmp bl,al
je .foundit
inc edi
jmp .findnext
.foundit
mov bl,[esi-256]
mov [esi-256],al
mov [edi],bl
mov eax,edi
add eax,256
cmp eax,esi
je near .skipthis
mov eax,esi
sub eax,mode7tab+256
mov ebx,edi
sub ebx,mode7tab
; swap blocks at memory location $200000+al*8000h with $200000+bl*8000h
shl eax,15
add eax,[romdata]
shl ebx,15
add ebx,[romdata]
push esi
mov esi,eax
mov edi,ebx
mov edx,2000h
.loopa
mov eax,[esi]
mov ebx,[edi]
mov [esi],ebx
mov [edi],eax
add esi,4
add edi,4
dec edx
jnz .loopa
pop esi
.skipthis
xor eax,eax
xor ebx,ebx
inc esi
dec ecx
jnz near .nextentry
.endthis
call Makemode7Table
ret
;******************************************************* ;*******************************************************
; Copy execloop ; Copy execloop
;******************************************************* ;*******************************************************

View File

@@ -200,6 +200,46 @@ void CheckIntlEHi(unsigned char *ROM)
} }
} }
//These two functions interleave, yes interleave, because ZSNES has it's large ROM map backwards
void intlv1()
{
char blocks[256];
int i, numblocks = NumofBanks/2;
for (i = 0; i < numblocks; i++)
{
blocks[i + numblocks] = i * 2;
blocks[i] = i * 2 + 1;
}
swapBlocks(blocks);
}
//This is a mess, I wish we didn't need this, but it kicks the old asm code
void IntlEHi()
{
unsigned int temp, i,
*loc1 = romdata,
*loc2 = romdata + 0x100000;
for (i = 0; i < 0x80000; i++)
{
temp = loc1[i];
loc1[i] = loc2[i];
loc2[i] = temp;
}
loc1 = romdata + 0x80000;
loc2 = romdata + 0x100000;
for (i = 0; i < 0x80000; i++)
{
temp = loc1[i];
loc1[i] = loc2[i];
loc2[i] = temp;
}
NumofBanks = 64;
intlv1();
NumofBanks = 192;
}
//ROM loading functions, which some strangly enough were in guiload.inc //ROM loading functions, which some strangly enough were in guiload.inc
bool AllASCII(unsigned char *b, int size) bool AllASCII(unsigned char *b, int size)
{ {