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 PrintChar
EXTSYM TextFile
EXTSYM mode7tab
EXTSYM Setper2exec,per2exec
EXTSYM MovieCounter
EXTSYM chaton
@@ -125,6 +124,7 @@ EXTSYM addOnSize
EXTSYM SPC7PackIndexLoad,SPC7110IndexSize
EXTSYM DumpROMLoadInfo
EXTSYM SetupSramSize
EXTSYM IntlEHi
EXTSYM SetaCmdEnable,setaramdata
EXTSYM setaaccessbankr8,setaaccessbankw8,setaaccessbankr8a,setaaccessbankw8a
@@ -1956,7 +1956,9 @@ NEWSYM initsnes
mov eax,[ram7f]
mov [snesmmap+7Fh*4],eax
mov [snesmap2+7Fh*4],eax
call prepare48mbit
pushad
call IntlEHi ;Interleave 48Mb ROM, because the map is broken
popad
ret
.hirom
; set addresses 8000-FFFF
@@ -2328,150 +2330,6 @@ SDD1memmap:
mov [snesmap2+7Fh*4],eax
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
NEWSYM SFXCounter, dd 0
@@ -2499,35 +2357,6 @@ NEWSYM preparesfx
jne .noac
mov byte[SfxAC],1
.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
mov esi,[romdata]
mov edi,[romdata]
@@ -2565,80 +2394,6 @@ NEWSYM preparesfx
jnz .n
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
;*******************************************************

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
bool AllASCII(unsigned char *b, int size)
{