📄 sa1regs.asm
字号:
ret
.cumulativesum
popad
ret
sa12300r:
mov al,[SA1Message+1]
test byte[SA1IRQExec],1
jz .notexecuted
or al,80h
.notexecuted
test byte[SA1IRQExec],2
jz .notexecutedi
or al,20h
.notexecutedi
mov bl,[SA1IRQData+1]
and bl,50h
or al,bl
ret
sa12301r:
mov al,[SA1Message]
test byte[SA1IRQExec+1],1
jz .notexecuted
or al,80h
.notexecuted
ret
sa12306r:
; call UpdateArithStuff
mov al,[SA1ARR1]
ret
sa12307r:
; call UpdateArithStuff
mov al,[SA1ARR1+1]
ret
sa12308r:
; call UpdateArithStuff
mov al,[SA1ARR1+2]
ret
sa12309r:
; call UpdateArithStuff
mov al,[SA1ARR1+3]
ret
sa1230Ar:
; call UpdateArithStuff
mov al,[SA1ARR2]
ret
sa1230Br:
mov al,[SA1Overflow]
ret
NEWSYM IRamRead
mov al,[IRAM+ecx-3000h]
ret
NEWSYM IRamWrite
mov [IRAM+ecx-3000h],al
ret
NEWSYM IRamWrite2
mov [IRAM+ecx-3000h],al
xor dh,dh
ret
NEWSYM sa1223Fw
mov [SA1Overflow+1],al
ret
; Variable Length Data
NEWSYM sa12258w
mov [VarLenBarrel+2],al
mov bl,al
and bl,0Fh
cmp bl,0
jne .not0
mov bl,16
.not0
mov [VarLenBarrel+3],bl
test al,80h
jz .notchange
mov [VarLenBarrel],bl
mov [VarLenBarrel+1],bl
.notchange
ret
NEWSYM sa12259w
mov [VarLenAddr],al
mov [VarLenAddrB],al
mov byte[VarLenBarrel],0
mov byte[VarLenBarrel+1],0
ret
NEWSYM sa1225Aw
mov [VarLenAddr+1],al
mov [VarLenAddrB+1],al
mov byte[VarLenBarrel],0
mov byte[VarLenBarrel+1],0
ret
NEWSYM sa1225Bw
mov [VarLenAddr+2],al
mov [VarLenAddrB+2],al
mov byte[VarLenBarrel],0
mov byte[VarLenBarrel+1],0
ret
; Variable Length Read
NEWSYM sa1230Cr
push ecx
xor ebx,ebx
xor ecx,ecx
mov bl,[VarLenAddr+2]
mov cx,[VarLenAddr]
test ecx,8000h
jz .loweraddr
add ecx,[snesmmap+ebx*4]
jmp .upperaddr
.loweraddr
add ecx,[snesmap2+ebx*4]
.upperaddr
mov ebx,[ecx]
mov cl,[VarLenBarrel+1]
shr ebx,cl
mov al,bl
pop ecx
test byte[VarLenBarrel+2],80h
jnz .autoinc
ret
.autoinc
mov bl,[VarLenBarrel+3]
add [VarLenBarrel],bl
mov bl,[VarLenBarrel]
cmp bl,16
jbe .notover
sub byte[VarLenBarrel],16
add dword[VarLenAddr],2
mov byte[VarLenAddr+3],0
.notover
ret
NEWSYM sa1230Dr
push ecx
xor ebx,ebx
xor ecx,ecx
mov bl,[VarLenAddrB+2]
mov cx,[VarLenAddrB]
test ecx,8000h
jz .loweraddr
add ecx,[snesmmap+ebx*4]
jmp .upperaddr
.loweraddr
add ecx,[snesmap2+ebx*4]
.upperaddr
mov ebx,[ecx]
mov cl,[VarLenBarrel+1]
shr ebx,cl
mov al,bh
pop ecx
test byte[VarLenBarrel+2],80h
jnz .autoinc
ret
.autoinc
mov bl,[VarLenBarrel+3]
add [VarLenBarrel+1],bl
mov bl,[VarLenBarrel+1]
cmp bl,16
jbe .notover
sub byte[VarLenBarrel+1],16
add dword[VarLenAddrB],2
mov byte[VarLenAddrB+3],0
.notover
ret
NEWSYM sa1230Er
mov al,10h
ret
; Approximate H loc
NEWSYM sa12302r
test byte[SA1TimerSet],80h
jnz .timeron
mov al,byte[CurrentExecSA1]
shl al,2
add al,dh
ret
.timeron
mov al,[SA1TimerCount]
ret
NEWSYM sa12303r
test byte[SA1TimerSet],80h
jnz .timeron
mov al,byte[CurrentExecSA1]
shr al,3
ret
.timeron
mov al,[SA1TimerCount+1]
and al,1
ret
NEWSYM sa12304r
test byte[SA1TimerSet],80h
jnz .timeron
mov al,[curypos]
ret
.timeron
mov bx,[SA1TimerCount+1]
shr bx,1
mov al,bl
ret
NEWSYM sa12305r
test byte[SA1TimerSet],80h
jnz .timeron
mov al,[curypos+1]
ret
.timeron
mov bx,[SA1TimerCount+2]
shr bx,1
mov al,bl
and al,1
ret
NEWSYM sa12210w ; Timer Settings
mov [SA1TimerSet],al
ret
NEWSYM sa12211w ; Timer Clear
mov dword[SA1TimerVal],0
ret
NEWSYM sa12212w
mov [SA1TimerCount],al
ret
NEWSYM sa12213w
mov [SA1TimerCount+1],al
ret
NEWSYM sa12214w
mov [SA1TimerCount+2],al
ret
NEWSYM sa12215w
mov [SA1TimerCount+3],al
ret
NEWSYM sa12230w
mov [SA1DMAInfo],al
ret
NEWSYM sa12231w
mov [SA1DMAChar],al
; if b7=1, then end of chdma process
ret
SA1QuickF sa12232w, SA1DMASource
SA1QuickF sa12233w, SA1DMASource+1
SA1QuickF sa12234w, SA1DMASource+2
SA1QuickF sa12235w, SA1DMADest
NEWSYM sa12236w
mov [SA1DMADest+1],al
test byte[SA1DMAInfo],10h
jnz near sa1chconv
test byte[SA1DMAInfo],4
jnz .noiram
jmp sa1dmairam
.noiram
ret
NEWSYM sa12237w
mov [SA1DMADest+2],al
test byte[SA1DMAInfo],10h
jnz .nobwram
test byte[SA1DMAInfo],4
jz .nobwram
jmp sa1dmabwram
.nobwram
ret
NEWSYM sa12238w
mov [SA1DMACount],al
ret
NEWSYM sa12239w
mov [SA1DMACount+1],al
ret
NEWSYM sa1dmaptr, dd 0
NEWSYM sa1dmaptrs, dd 0
NEWSYM sa1dmairam
mov ebx,[SA1DMADest]
and ebx,7FFh
add ebx,IRAM
mov [sa1dmaptr],ebx
jmp executesa1dma
NEWSYM sa1dmabwram
mov ebx,[SA1DMADest]
and ebx,3FFFFh
add ebx,[SA1RAMArea]
mov [sa1dmaptr],ebx
executesa1dma:
test byte[SA1DMAInfo],1
jz .nobwram
mov ebx,[SA1DMASource]
and ebx,3FFFFh
add ebx,[SA1RAMArea]
mov [sa1dmaptrs],ebx
jmp .doneram
.nobwram
test byte[SA1DMAInfo],2
jz .noiram
mov ebx,[SA1DMASource]
and ebx,7FFh
add ebx,IRAM
mov [sa1dmaptrs],ebx
jmp .doneram
.noiram
xor ebx,ebx
mov bl,[SA1DMASource+2]
mov ebx,[snesmmap+ebx*4]
push ecx
xor ecx,ecx
mov cx,[SA1DMASource]
add ebx,ecx
mov [sa1dmaptrs],ebx
pop ecx
.doneram
push edx
push eax
push ecx
mov ecx,[SA1DMACount]
or ecx,ecx
jz .notransfer
mov ebx,[sa1dmaptrs]
mov edx,[sa1dmaptr]
.loop
mov al,[ebx]
mov [edx],al
inc ebx
inc edx
loop .loop
.notransfer
pop ecx
pop eax
pop edx
ret
tempblah db 0
%macro setbit2b 2
test al,%1
jz %%nosb
or word[ebx],%2
%%nosb
%endmacro
%macro setbit2b2 2
test al,%1
jz %%nosb
or word[ebx+16],%2
%%nosb
%endmacro
; Character Conversion DMA
sa1chconv:
; or byte[SA1DoIRQ],4
or byte[SA1DoIRQ],8
; mov byte[debstop3],1
mov ebx,[SA1DMADest]
mov byte[debstop4],1
; and ebx,7FFh
and ebx,3FFFFh
add ebx,[SA1RAMArea]
mov [sa1dmaptr],ebx
mov ebx,[SA1DMASource]
and ebx,3FFFFh
add ebx,[SA1RAMArea]
mov [sa1dmaptrs],ebx
; 4 colors = 32 bytes, 16 colors = 64 bytes, 256 colors = 128 bytes
; SA1DMAChar,bit 2-4 = # of 8x8 tiles/horizontal row (0=1,1=2,2=3,..,5=32)
; SA1DMAChar,bit 0-1 = Color Mode (0=8b,1=4b,2=2b,3=?)
test byte[SA1DMAChar],1
jnz .4bit
test byte[SA1DMAChar],2
jnz near .2bit
mov ebx,[sa1dmaptr]
push ecx
pop ecx
ret
.4bit
pushad
mov edx,[sa1dmaptrs]
mov ebx,[romdata]
add ebx,4096*1024+1024*1024
mov edi,16
.loop34b
push ebx
push edx
mov ecx,32
.loop4b
mov esi,8
push ebx
push edx
.loop24b
mov word[ebx],0
mov al,[edx+3]
setbit2b 10h,0001h
setbit2b 20h,0100h
setbit2b2 40h,0001h
setbit2b2 80h,0100h
setbit2b 01h,0002h
setbit2b 02h,0200h
setbit2b2 04h,0002h
setbit2b2 08h,0200h
mov al,[edx+2]
setbit2b 10h,0004h
setbit2b 20h,0400h
setbit2b2 40h,0004h
setbit2b2 80h,0400h
setbit2b 01h,0008h
setbit2b 02h,0800h
setbit2b2 04h,0008h
setbit2b2 08h,0800h
mov al,[edx+1]
setbit2b 10h,0010h
setbit2b 20h,1000h
setbit2b2 40h,0010h
setbit2b2 80h,1000h
setbit2b 01h,0020h
setbit2b 02h,2000h
setbit2b2 04h,0020h
setbit2b2 08h,2000h
mov al,[edx]
setbit2b 10h,0040h
setbit2b 20h,4000h
setbit2b2 40h,0040h
setbit2b2 80h,4000h
setbit2b 01h,0080h
setbit2b 02h,8000h
setbit2b2 04h,0080h
setbit2b2 08h,8000h
add ebx,2
add edx,128
dec esi
jnz near .loop24b
pop edx
pop ebx
add edx,4
add ebx,32
dec ecx
jnz near .loop4b
pop edx
pop ebx
add edx,128*8
add ebx,128*8
dec edi
jnz near .loop34b
mov ecx,10*128*8
mov edx,[sa1dmaptrs]
mov ebx,[romdata]
add ebx,4096*1024+1024*1024
.next4b
mov al,[ebx]
mov [edx],al
inc ebx
inc edx
loop .next4b
popad
ret
.2bit
pushad
mov edx,[sa1dmaptrs]
mov ebx,[romdata]
add ebx,4096*1024+1024*1024
mov edi,16
.loop3
push ebx
push edx
mov ecx,32
.loop
mov esi,8
push ebx
push edx
.loop2
mov word[ebx],0
mov al,[edx+1]
setbit2b 40h,0001h
setbit2b 80h,0100h
setbit2b 10h,0002h
setbit2b 20h,0200h
setbit2b 04h,0004h
setbit2b 08h,0400h
setbit2b 01h,0008h
setbit2b 02h,0800h
mov al,[edx]
setbit2b 40h,0010h
setbit2b 80h,1000h
setbit2b 10h,0020h
setbit2b 20h,2000h
setbit2b 04h,0040h
setbit2b 08h,4000h
setbit2b 01h,0080h
setbit2b 02h,8000h
add ebx,2
add edx,64
dec esi
jnz near .loop2
pop edx
pop ebx
add edx,2
add ebx,16
dec ecx
jnz near .loop
pop edx
pop ebx
add edx,64*8
add ebx,64*8
dec edi
jnz near .loop3
mov ecx,10*64*8
mov edx,[sa1dmaptrs]
mov ebx,[romdata]
add ebx,4096*1024+1024*1024
.next
mov al,[ebx]
mov [edx],al
inc ebx
inc edx
loop .next
popad
ret
.numrows dd 0
NEWSYM initSA1regs
setreg 2300h*4,sa12300r
setreg 2301h*4,sa12301r
setreg 2302h*4,sa12302r
setreg 2303h*4,sa12303r
setreg 2304h*4,sa12304r
setreg 2305h*4,sa12305r
setreg 2306h*4,sa12306r
setreg 2307h*4,sa12307r
setreg 2308h*4,sa12308r
setreg 2309h*4,sa12309r
setreg 230Ah*4,sa1230Ar
setreg 230Bh*4,sa1230Br
setreg 230Ch*4,sa1230Cr
setreg 230Dh*4,sa1230Dr
setreg 230Eh*4,sa1230Er
; Set IRam, memory address 3000-37FF
mov edi,3000h*4
add edi,[regptr]
mov eax,IRamRead
mov ecx,800h
.loopr
mov [edi],eax
add edi,4
loop .loopr
ret
NEWSYM initSA1regsw
setregw 2200h*4,sa12200w
setregw 2201h*4,sa12201w
setregw 2202h*4,sa12202w
setregw 2203h*4,sa12203w
setregw 2204h*4,sa12204w
setregw 2205h*4,sa12205w
setregw 2206h*4,sa12206w
setregw 2207h*4,sa12207w
setregw 2208h*4,sa12208w
setregw 2209h*4,sa12209w
setregw 220Ah*4,sa1220Aw
setregw 220Bh*4,sa1220Bw
setregw 220Ch*4,sa1220Cw
setregw 220Dh*4,sa1220Dw
setregw 220Eh*4,sa1220Ew
setregw 220Fh*4,sa1220Fw
setregw 2210h*4,sa12210w
setregw 2211h*4,sa12211w
setregw 2212h*4,sa12212w
setregw 2213h*4,sa12213w
setregw 2214h*4,sa12214w
setregw 2215h*4,sa12215w
setregw 2220h*4,sa12220w
setregw 2221h*4,sa12221w
setregw 2222h*4,sa12222w
setregw 2223h*4,sa12223w
setregw 2224h*4,sa12224w
setregw 2225h*4,sa12225w
; Missing 2226-222A
; Missing 2240-224F (Bitmap register file)
setregw 2230h*4,sa12230w
setregw 2231h*4,sa12231w
setregw 2232h*4,sa12232w
setregw 2233h*4,sa12233w
setregw 2234h*4,sa12234w
setregw 2235h*4,sa12235w
setregw 2236h*4,sa12236w
setregw 2237h*4,sa12237w
setregw 2238h*4,sa12238w
setregw 2239h*4,sa12239w
setregw 223Fh*4,sa1223Fw
setregw 2250h*4,sa12250w
setregw 2251h*4,sa12251w
setregw 2252h*4,sa12252w
setregw 2253h*4,sa12253w
setregw 2254h*4,sa12254w
setregw 2259h*4,sa12259w
setregw 225Ah*4,sa1225Aw
setregw 225Bh*4,sa1225Bw
mov edi,3000h*4
add edi,[regptw]
mov eax,IRamWrite
mov ecx,800h
.loopw
mov [edi],eax
add edi,4
loop .loopw
setregw 3000h*4,IRamWrite2
ret
NEWSYM SDD1Reset
setregw 4801h*4,sdd14801w
setregw 4802h*4,dbstop
setregw 4803h*4,dbstop
setregw 4804h*4,sdd14804w
setregw 4805h*4,sdd14805w
setregw 4806h*4,sdd14806w
setregw 4807h*4,sdd14807w
setregw 4808h*4,dbstop
setregw 4809h*4,dbstop
setregw 480Ah*4,dbstop
setregw 480Bh*4,dbstop
setregw 480Ch*4,dbstop
setregw 480Dh*4,dbstop
setregw 480Eh*4,dbstop
setregw 480Fh*4,dbstop
ret
NEWSYM initSDD1regs
setreg 4804h*4,sdd14804
setreg 4805h*4,sdd14805
setreg 4806h*4,sdd14806
setreg 4807h*4,sdd14807
ret
dbstop:
; mov byte[debstop3],1
ret
NEWSYM sdd14801w
cmp al,0
jne .notzero
ret
.notzero
mov byte[AddrNoIncr],0
; set banks C0h-FFh to decompressing routine
push eax
push ebx
mov eax,memtabler8+0C0h*4
mov ebx,40h
.loop
mov dword[eax],memaccessbankr8sdd1
add eax,4
dec ebx
jnz .loop
mov dword[Sdd1Mode],1
pop ebx
pop eax
ret
NEWSYM Sa1RegsAsmEnd
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -