📄 regsw.inc
字号:
jnz .nen1
; or bl,02h
.nen1
mov [winbg3en],bl
mov bl,al
shr bl,4
test bl,0Ah
jnz .nen2
; or bl,02h
.nen2
mov [winbg4en],bl
ret
; Window mask settings register [WOBJSEL]
reg2125w:
mov bl,al
and bl,0Fh
mov [winobjen],bl
mov bl,al
shr bl,4
mov [wincolen],bl
ret
; Window 1 left position register
reg2126w:
mov [winl1],al
ret
; Window 1 right position register
reg2127w:
mov [winr1],al
ret
; Window 2 left position register
reg2128w:
mov [winl2],al
ret
; Window 2 right position register
reg2129w:
mov [winr2],al
ret
; Mask logic settings for Window 1 & 2 per screen
reg212Aw:
mov [winlogica],al
ret
; Mask logic settings for Colour Windows & OBJ Windows
reg212Bw:
mov [winlogicb],al
ret
; Main screen designation
reg212Cw:
mov [scrnon],al
ret
; Sub-screen designation
reg212Dw:
mov [scrnon+1],al
ret
; Window mask main screen designation register
reg212Ew:
mov [winenabm],al
ret
; Window mask sub screen designation register
reg212Fw:
mov [winenabs],al
ret
; Fixed color addition or screen addition register
reg2130w:
mov [scaddset],al
ret
; Addition/subtraction for screens, BGs, & OBJs
reg2131w:
mov [scaddtype],al
ret
; Fixed colour data for fixed colour +/-
reg2132w:
mov bl,al
and bl,1Fh
test al,20h
jz .nored
mov [coladdr],bl
.nored
test al,40h
jz .nogreen
mov [coladdg],bl
.nogreen
test al,80h
jz .noblue
mov [coladdb],bl
.noblue
ret
; Screen mode/video select register
reg2133w:
mov [interlval],al
and byte[interlval],41h
test al,04h
jnz .line239
mov word[resolutn],224
ret
.line239
mov word[resolutn],239
ret
NEWSYM CleartheScreen, db 0
; Sound Register #1
reg2140w:
mov byte[sndwrit],1
cmp byte[nmistatus],2
jne .n
mov byte[nmirept],0
.n
mov byte[spcRam+0F4h],al
inc dword[SPC700write]
reenablespc
ret
; cmp dword[cycpbl],0FFFFh
; ja .spcreset
; ret
;.spcreset
; mov dword[cycpbl],100
; ret
; Sound Register #2
reg2141w:
mov byte[sndwrit],1
mov byte[spcRam+0F5h],al
inc dword[SPC700write]
reenablespc
ret
; cmp dword[cycpbl],0FFFFh
; ja .spcreset
; ret
;.spcreset
; mov dword[cycpbl],100
; ret
; Sound Register #3
reg2142w:
mov byte[sndwrit],1
mov byte[spcRam+0F6h],al
inc dword[SPC700write]
reenablespc
ret
; cmp dword[cycpbl],0FFFFh
; ja .spcreset
; ret
;.spcreset
; mov dword[cycpbl],100
; ret
; Sound Register #4
reg2143w:
mov byte[sndwrit],1
mov byte[spcRam+0F7h],al
inc dword[SPC700write]
reenablespc
ret
; cmp dword[cycpbl],0FFFFh
; ja .spcreset
; ret
;.spcreset
; mov dword[cycpbl],100
; ret
; Read/write WRAM register
reg2180w:
mov ebx,[wramrwadr]
add ebx,[wramdata]
mov [ebx],al
inc dword[wramrwadr]
and dword[wramrwadr],01FFFFh
ret
; WRAM data register (low byte)
reg2181w:
mov byte[wramrwadr],al
ret
; WRAM data register (middle byte)
reg2182w:
mov byte[wramrwadr+1],al
ret
; WRAM data register (high byte)
reg2183w:
mov bl,al
and bl,01h
mov byte[wramrwadr+2],bl
ret
; Joystick 1 & 2 status bytes
NEWSYM MultiTapStat, db 0
reg4016w:
test byte[INTEnab],1
jnz .nointenab
mov ebx,[JoyAOrig]
mov [JoyANow],ebx
mov ebx,[JoyBOrig]
mov [JoyBNow],ebx
mov ebx,[JoyCOrig]
mov [JoyCNow],ebx
mov ebx,[JoyDOrig]
mov [JoyDNow],ebx
mov ebx,[JoyEOrig]
mov [JoyENow],ebx
cmp al,01h
jne .noreset
or byte[MultiTapStat],1
ret
.noreset
and byte[MultiTapStat],0FEh
ret
.nointenab
cmp al,01h
jne .noone
or byte[MultiTapStat],1
or byte[JoyCRead],2
ret
.noone
and byte[MultiTapStat],0FEh
cmp al,0
jne .nozero
or byte[JoyCRead],1
cmp byte[JoyCRead],3
jne .nozero
.resetports
mov ebx,[JoyAOrig]
mov [JoyANow],ebx
mov ebx,[JoyBOrig]
mov [JoyBNow],ebx
mov ebx,[JoyCOrig]
mov [JoyCNow],ebx
mov ebx,[JoyDOrig]
mov [JoyDNow],ebx
mov ebx,[JoyEOrig]
mov [JoyENow],ebx
.nozero
ret
; Joystick 1 & 2 status bytes
reg4017w:
ret
; Counter enable
reg4200w:
mov byte[INTEnab],al
ret
; Programmable I/O port (out-port)
reg4201w:
mov bl,al
and bl,80h
and byte[MultiTapStat],07Fh
or byte[MultiTapStat],bl
ret
; Multiplicand 'A'
reg4202w:
mov [multa],al
ret
; Multiplier 'B'
reg4203w:
push edx
push eax
xor ah,ah
xor bh,bh
mov bl,[multa]
mul bx
mov [multres],ax
pop eax
pop edx
ret
; Dividend C (Low)
reg4204w:
mov [diva],al
ret
; Dividend C (High)
reg4205w:
mov [diva+1],al
ret
; Divisor B
reg4206w:
cmp al,0
je .divby0
push eax
push edx
xor ebx,ebx
xor edx,edx
mov bl,al
mov ax,[diva]
div bx
mov [divres],ax
mov [multres],dx
pop edx
pop eax
ret
.divby0
push eax
mov word[divres],0FFFFh
mov ax,[diva]
mov [multres],ax
pop eax
ret
DetermineHIRQExec
cmp byte[HIRQSkip],1
je near .ret
add dh,[HIRQCycNext]
mov byte[HIRQCycNext],0
mov byte[HIRQNextExe],0
push eax
push ecx
push edx
mov ax,[HIRQLoc]
xor ecx,ecx
mov cl,[cycpl]
mul cx
mov cx,340
div cx
mov cl,[cycpl]
sub cl,al
pop edx
cmp dh,cl
ja .hirqokay
.notokay
pop ecx
pop eax
.ret
ret
.hirqokay
sub dh,cl
add dh,30
mov [HIRQCycNext],cl
mov byte[HIRQNextExe],1
pop ecx
pop eax
ret
; Video horizontal IRQ beam position/pointer (Low)
reg4207w:
cmp [HIRQLoc],al
je .nohirqc
mov [HIRQLoc],al
mov bx,[curypos]
cmp bx,[VIRQLoc]
je near DetermineHIRQExec
.nohirqc
ret
; Video horizontal IRQ beam position/pointer (High)
reg4208w:
cmp [HIRQLoc+1],al
je .nohirqc
mov [HIRQLoc+1],al
mov bx,[curypos]
cmp bx,[VIRQLoc]
je near DetermineHIRQExec
.nohirqc
ret
; Video vertical IRQ beam position/pointer (Low)
reg4209w:
mov [VIRQLoc],al
; mov bx,[curypos]
cmp byte[HIRQNextExe],1
je .nohirq
ret
.nohirq
mov bx,[curypos]
cmp bx,[VIRQLoc]
je .nocancelhirq
add dh,[HIRQCycNext]
mov byte[HIRQCycNext],0
mov byte[HIRQNextExe],0
.nocancelhirq
ret
; Video vertical IRQ beam position/pointer (High)
reg420Aw:
and al,01h
mov [VIRQLoc+1],al
cmp byte[HIRQNextExe],1
je .nohirq
ret
.nohirq
mov bx,[curypos]
cmp bx,[VIRQLoc]
je .nocancelhirq
add dh,[HIRQCycNext]
mov byte[HIRQCycNext],0
mov byte[HIRQNextExe],0
.nocancelhirq
ret
; Cycle speed register
reg420Dw:
test al,01h
jnz .speed358
; 2.68 Mhz
mov al,[opexec268]
mov byte[cycpl],al ; 2.68 Mhz
mov al,[opexec268cph]
mov byte[cycphb],al ; 2.68 Mhz
and byte[xirqb],00h
mov bl,[cycpb268]
mov byte[cycpblt],bl ; percentage of CPU/SPC to run
ret
.speed358
; 3.58 Mhz
mov al,[opexec358]
mov byte[cycpl],al ; 3.58 Mhz
mov al,[opexec358cph]
mov byte[cycphb],al ; 3.58 Mhz
or byte[xirqb],80h
mov bl,[cycpb358]
mov byte[cycpblt],bl ; percentage of CPU/SPC to run
ret
; ???
reg420Ew:
ret
; NMI Check register
reg4210w:
ret
; Video IRQ register
reg4211w:
ret
; Status register
reg4212w:
ret
; Product of Multiplication Result or Remainder of Divide Result (Low)
reg4216w:
ret
; DMA Control register
reg43X0w:
xor ebx,ebx
mov bx,cx
sub bx,4300h
mov [dmadata+ebx],al
mov byte[hdmarestart],1
ret
; DMA Destination register
reg43X1w:
xor ebx,ebx
mov bx,cx
sub bx,4300h
mov [dmadata+ebx],al
mov byte[hdmarestart],1
ret
; Source address (Low)
reg43x2w:
xor ebx,ebx
mov bx,cx
sub bx,4300h
mov [dmadata+ebx],al
; mov [dmadata+ebx+6],al
ret
; Source address (High)
reg43x3w:
xor ebx,ebx
mov bx,cx
sub bx,4300h
mov [dmadata+ebx],al
; mov [dmadata+ebx+6],al
ret
; Source bank address
reg43x4w
xor ebx,ebx
mov bx,cx
sub bx,4300h
mov [dmadata+ebx],al
ret
; DMA transfer size & HDMA address register (Low)
reg43x5w:
xor ebx,ebx
mov bx,cx
sub bx,4300h
mov [dmadata+ebx],al
ret
; DMA transfer size & HDMA address register (High)
reg43x6w:
xor ebx,ebx
mov bx,cx
sub bx,4300h
mov [dmadata+ebx],al
ret
; DMA transfer size & HDMA address register (Bank)
reg43x7w:
xor ebx,ebx
mov bx,cx
sub bx,4300h
mov [dmadata+ebx],al
ret
; Table Address of A-BUS by DMA < A2 Table Address (Low)
reg43x8w:
xor ebx,ebx
mov bx,cx
sub bx,4300h
mov [dmadata+ebx],al
ret
; Table Address of A-BUS by DMA < A2 Table Address (High)
reg43x9w:
xor ebx,ebx
mov bx,cx
sub bx,4300h
mov [dmadata+ebx],al
ret
; Number of lines for HDMA transfer
reg43XAw:
xor ebx,ebx
mov bx,cx
sub bx,4300h
mov [dmadata+ebx],al
ret
regINVALIDw: ; Invalid Register
ret
regexiter:
mov bl,[xpb]
mov ax,[xpc]
test ax,8000h
jz .loweraddr2
mov eax,[snesmmap+ebx*4]
jmp .nextaddr
.loweraddr2
mov eax,[snesmap2+ebx*4]
.nextaddr
mov ebx,esi
sub ebx,eax ; subtract program counter by address
mov [.invaddr],bx
mov bl,[xpb]
mov [.invbank],bl
mov al,[previdmode]
mov ah,0
int 10h
mov byte[invalid],1
mov [invreg],cx
mov ah,9
mov edx,.invalidreg
int 21h
xor eax,eax
mov ax,[invreg]
call printhex
mov ah,9
mov edx,.invalidreg
int 21h
xor eax,eax
mov al,[.invbank]
call printhex8
mov ax,[.invaddr]
call printhex
mov ah,2
mov dl,13
int 21h
mov ah,2
mov dl,10
int 21h
mov eax,[numinst]
call printnum
jmp DosExit
.invalidreg db 'Invalid Write Register : $'
.invalidaddr db ' at address $'
.invbank db 0
.invaddr db 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -