📄 sa1regs.asm
字号:
popad ret.cumulativesum popad retsa12300r: 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 retsa12301r: mov al,[SA1Message] test byte[SA1IRQExec+1],1 jz .notexecuted or al,80h.notexecuted retsa12306r:; call UpdateArithStuff mov al,[SA1ARR1] retsa12307r:; call UpdateArithStuff mov al,[SA1ARR1+1] retsa12308r:; call UpdateArithStuff mov al,[SA1ARR1+2] retsa12309r:; call UpdateArithStuff mov al,[SA1ARR1+3] retsa1230Ar:; call UpdateArithStuff mov al,[SA1ARR2] retsa1230Br: mov al,[SA1Overflow] retNEWSYM IRamRead mov al,[IRAM+ecx-3000h] retNEWSYM IRamWrite mov [IRAM+ecx-3000h],al retNEWSYM IRamWrite2 mov [IRAM+ecx-3000h],al xor dh,dh retNEWSYM sa1223Fw mov [SA1Overflow+1],al ret; Variable Length DataNEWSYM 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 retNEWSYM sa12259w mov [VarLenAddr],al mov [VarLenAddrB],al mov byte[VarLenBarrel],0 mov byte[VarLenBarrel+1],0 retNEWSYM sa1225Aw mov [VarLenAddr+1],al mov [VarLenAddrB+1],al mov byte[VarLenBarrel],0 mov byte[VarLenBarrel+1],0 retNEWSYM sa1225Bw mov [VarLenAddr+2],al mov [VarLenAddrB+2],al mov byte[VarLenBarrel],0 mov byte[VarLenBarrel+1],0 ret; Variable Length ReadNEWSYM 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 retNEWSYM 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 retNEWSYM sa1230Er mov al,10h ret; Approximate H locNEWSYM sa12302r test byte[SA1TimerSet],80h jnz .timeron mov al,[CurrentExecSA1] shl al,2 add al,dh ret.timeron mov al,[SA1TimerCount] retNEWSYM sa12303r test byte[SA1TimerSet],80h jnz .timeron mov al,[CurrentExecSA1] shr al,3 ret.timeron mov al,[SA1TimerCount+1] and al,1 retNEWSYM sa12304r test byte[SA1TimerSet],80h jnz .timeron mov al,[curypos] ret.timeron mov bx,[SA1TimerCount+1] shr bx,1 mov al,bl retNEWSYM 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 retNEWSYM sa12210w ; Timer Settings mov [SA1TimerSet],al retNEWSYM sa12211w ; Timer Clear mov dword[SA1TimerVal],0 retNEWSYM sa12212w mov [SA1TimerCount],al retNEWSYM sa12213w mov [SA1TimerCount+1],al retNEWSYM sa12214w mov [SA1TimerCount+2],al retNEWSYM sa12215w mov [SA1TimerCount+3],al retNEWSYM sa12230w mov [SA1DMAInfo],al retNEWSYM sa12231w mov [SA1DMAChar],al ; if b7=1, then end of chdma process retSA1QuickF sa12232w, SA1DMASourceSA1QuickF sa12233w, SA1DMASource+1SA1QuickF sa12234w, SA1DMASource+2SA1QuickF sa12235w, SA1DMADestNEWSYM sa12236w mov [SA1DMADest+1],al test byte[SA1DMAInfo],10h jnz near sa1chconv test byte[SA1DMAInfo],4 jnz .noiram jmp sa1dmairam.noiram retNEWSYM sa12237w mov [SA1DMADest+2],al test byte[SA1DMAInfo],10h jnz .nobwram test byte[SA1DMAInfo],4 jz .nobwram jmp sa1dmabwram.nobwram retNEWSYM sa12238w mov [SA1DMACount],al retNEWSYM sa12239w mov [SA1DMACount+1],al retSECTION .bssNEWSYM sa1dmaptr, resd 1NEWSYM sa1dmaptrs, resd 1SECTION .textNEWSYM sa1dmairam mov ebx,[SA1DMADest] and ebx,7FFh add ebx,IRAM mov [sa1dmaptr],ebx jmp executesa1dmaNEWSYM sa1dmabwram mov ebx,[SA1DMADest] and ebx,3FFFFh add ebx,[SA1RAMArea] mov [sa1dmaptr],ebxexecutesa1dma: 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 dec ecx jnz .loop.notransfer pop ecx pop eax pop edx retSECTION .bsstempblah resb 1SECTION .text%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 DMAsa1chconv:; or byte[SA1DoIRQ],4 or byte[SA1DoIRQ],8; mov byte[debstop3],1 mov ebx,[SA1DMADest]%ifndef NO_DEBUGGER mov byte[debstop4],1%endif; 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 dec ecx jnz .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 dec ecx jnz .next popad retSECTION .bss.numrows resd 1SECTION .textNEWSYM 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 dec ecx jnz .loopr retNEWSYM 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 dec ecx jnz .loopw setregw 3000h*4,IRamWrite2 retNEWSYM 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 retNEWSYM initSDD1regs setreg 4804h*4,sdd14804 setreg 4805h*4,sdd14805 setreg 4806h*4,sdd14806 setreg 4807h*4,sdd14807 retdbstop:; mov byte[debstop3],1 retNEWSYM 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -