www.pudn.com > zsnes117b-src.zip > regs.inc


;Copyright (C) 1997-2001 ZSNES Team ( zsknight@zsnes.com / _demo_@zsnes.com ) 
; 
;This program is free software; you can redistribute it and/or 
;modify it under the terms of the GNU General Public License 
;as published by the Free Software Foundation; either 
;version 2 of the License, or (at your option) any later 
;version. 
; 
;This program is distributed in the hope that it will be useful, 
;but WITHOUT ANY WARRANTY; without even the implied warranty of 
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
;GNU General Public License for more details. 
; 
;You should have received a copy of the GNU General Public License 
;along with this program; if not, write to the Free Software 
;Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 
 
 
EXTSYM SFXEnable,regptr,initsfxregsr,initSA1regs,SA1Enable,initSDD1regs 
EXTSYM SPC7110Enable,initSPC7110regs,RTCEnable,RTCReset 
EXTSYM curypos,cycpl,debuggeron,pdh,Reg4212hack 
EXTSYM vram 
EXTSYM romispal 
EXTSYM reg1read,spcnumread,spcon 
EXTSYM reg2read 
EXTSYM reg3read 
EXTSYM reg4read 
EXTSYM JoyEOrig,JoyENow 
EXTSYM snesmouse 
EXTSYM cycphb,joycontren 
EXTSYM DosExit,invalid,numinst,previdmode,printhex,printnum 
 
 
 
 
 
 
NEWSYM initregr 
    ; Fill register pointer with invalid register accesses 
    mov edi,[regptr] 
    add edi,8000h 
    mov ecx,3000h 
    mov eax,regINVALID 
.loopa 
    mov [edi],eax 
    add edi,4 
    loop .loopa 
    ; Set all valid register accesses 
    setreg 2134h*4,reg2134r 
    setreg 2135h*4,reg2135r 
    setreg 2136h*4,reg2136r 
    setreg 2137h*4,reg2137r 
    setreg 2138h*4,reg2138r 
    setreg 2139h*4,reg2139r 
    setreg 213Ah*4,reg213Ar 
    setreg 213Bh*4,reg213Br 
    setreg 213Ch*4,reg213Cr 
    setreg 213Dh*4,reg213Dr 
    setreg 213Eh*4,reg213Er 
    setreg 213Fh*4,reg213Fr 
    setreg 2140h*4,reg2140r 
    setreg 2141h*4,reg2141r 
    setreg 2142h*4,reg2142r 
    setreg 2143h*4,reg2143r 
    setreg 2180h*4,reg2180r 
    setreg 4016h*4,reg4016r 
    setreg 4017h*4,reg4017r 
    setreg 4210h*4,reg4210r 
    setreg 4211h*4,reg4211r 
    setreg 4212h*4,reg4212r 
    setreg 4213h*4,reg4213r 
    setreg 4214h*4,reg4214r 
    setreg 4215h*4,reg4215r 
    setreg 4216h*4,reg4216r 
    setreg 4217h*4,reg4217r 
    setreg 4218h*4,reg4218r 
    setreg 4219h*4,reg4219r 
    setreg 421Ah*4,reg421Ar 
    setreg 421Bh*4,reg421Br 
    setreg 421Ch*4,reg421Cr 
    setreg 421Dh*4,reg421Dr 
    setreg 421Eh*4,reg421Er 
    setreg 421Fh*4,reg421Fr 
 
    setreg 4300h*4,reg43XXr 
    setreg 4301h*4,reg43XXr 
    setreg 4302h*4,reg43XXr 
    setreg 4303h*4,reg43XXr 
    setreg 4304h*4,reg43XXr 
    setreg 4305h*4,reg43XXr 
    setreg 4306h*4,reg43XXr 
    setreg 4307h*4,reg43XXr 
    setreg 4308h*4,reg43XXr 
    setreg 4309h*4,reg43XXr 
    setreg 430Ah*4,reg43XXr 
    setreg 430Bh*4,reg43XXr 
    setreg 430Ch*4,reg43XXr 
    setreg 430Dh*4,reg43XXr 
    setreg 430Eh*4,reg43XXr 
    setreg 430Fh*4,reg43XXr 
    setreg 4310h*4,reg43XXr 
    setreg 4311h*4,reg43XXr 
    setreg 4312h*4,reg43XXr 
    setreg 4313h*4,reg43XXr 
    setreg 4314h*4,reg43XXr 
    setreg 4315h*4,reg43XXr 
    setreg 4316h*4,reg43XXr 
    setreg 4317h*4,reg43XXr 
    setreg 4318h*4,reg43XXr 
    setreg 4319h*4,reg43XXr 
    setreg 431Ah*4,reg43XXr 
    setreg 431Bh*4,reg43XXr 
    setreg 431Ch*4,reg43XXr 
    setreg 431Dh*4,reg43XXr 
    setreg 431Eh*4,reg43XXr 
    setreg 431Fh*4,reg43XXr 
    setreg 4320h*4,reg43XXr 
    setreg 4321h*4,reg43XXr 
    setreg 4322h*4,reg43XXr 
    setreg 4323h*4,reg43XXr 
    setreg 4324h*4,reg43XXr 
    setreg 4325h*4,reg43XXr 
    setreg 4326h*4,reg43XXr 
    setreg 4327h*4,reg43XXr 
    setreg 4328h*4,reg43XXr 
    setreg 4329h*4,reg43XXr 
    setreg 432Ah*4,reg43XXr 
    setreg 432Bh*4,reg43XXr 
    setreg 432Ch*4,reg43XXr 
    setreg 432Dh*4,reg43XXr 
    setreg 432Eh*4,reg43XXr 
    setreg 432Fh*4,reg43XXr 
    setreg 4330h*4,reg43XXr 
    setreg 4331h*4,reg43XXr 
    setreg 4332h*4,reg43XXr 
    setreg 4333h*4,reg43XXr 
    setreg 4334h*4,reg43XXr 
    setreg 4335h*4,reg43XXr 
    setreg 4336h*4,reg43XXr 
    setreg 4337h*4,reg43XXr 
    setreg 4338h*4,reg43XXr 
    setreg 4339h*4,reg43XXr 
    setreg 433Ah*4,reg43XXr 
    setreg 433Bh*4,reg43XXr 
    setreg 433Ch*4,reg43XXr 
    setreg 433Dh*4,reg43XXr 
    setreg 433Eh*4,reg43XXr 
    setreg 433Fh*4,reg43XXr 
    setreg 4340h*4,reg43XXr 
    setreg 4341h*4,reg43XXr 
    setreg 4342h*4,reg43XXr 
    setreg 4343h*4,reg43XXr 
    setreg 4344h*4,reg43XXr 
    setreg 4345h*4,reg43XXr 
    setreg 4346h*4,reg43XXr 
    setreg 4347h*4,reg43XXr 
    setreg 4348h*4,reg43XXr 
    setreg 4349h*4,reg43XXr 
    setreg 434Ah*4,reg43XXr 
    setreg 434Bh*4,reg43XXr 
    setreg 434Ch*4,reg43XXr 
    setreg 434Dh*4,reg43XXr 
    setreg 434Eh*4,reg43XXr 
    setreg 434Fh*4,reg43XXr 
    setreg 4350h*4,reg43XXr 
    setreg 4351h*4,reg43XXr 
    setreg 4352h*4,reg43XXr 
    setreg 4353h*4,reg43XXr 
    setreg 4354h*4,reg43XXr 
    setreg 4355h*4,reg43XXr 
    setreg 4356h*4,reg43XXr 
    setreg 4357h*4,reg43XXr 
    setreg 4358h*4,reg43XXr 
    setreg 4359h*4,reg43XXr 
    setreg 435Ah*4,reg43XXr 
    setreg 435Bh*4,reg43XXr 
    setreg 435Ch*4,reg43XXr 
    setreg 435Dh*4,reg43XXr 
    setreg 435Eh*4,reg43XXr 
    setreg 435Fh*4,reg43XXr 
    setreg 4360h*4,reg43XXr 
    setreg 4361h*4,reg43XXr 
    setreg 4362h*4,reg43XXr 
    setreg 4363h*4,reg43XXr 
    setreg 4364h*4,reg43XXr 
    setreg 4365h*4,reg43XXr 
    setreg 4366h*4,reg43XXr 
    setreg 4367h*4,reg43XXr 
    setreg 4368h*4,reg43XXr 
    setreg 4369h*4,reg43XXr 
    setreg 436Ah*4,reg43XXr 
    setreg 436Bh*4,reg43XXr 
    setreg 436Ch*4,reg43XXr 
    setreg 436Dh*4,reg43XXr 
    setreg 436Eh*4,reg43XXr 
    setreg 436Fh*4,reg43XXr 
    setreg 4370h*4,reg43XXr 
    setreg 4371h*4,reg43XXr 
    setreg 4372h*4,reg43XXr 
    setreg 4373h*4,reg43XXr 
    setreg 4374h*4,reg43XXr 
    setreg 4375h*4,reg43XXr 
    setreg 4376h*4,reg43XXr 
    setreg 4377h*4,reg43XXr 
    setreg 4378h*4,reg43XXr 
    setreg 4379h*4,reg43XXr 
    setreg 437Ah*4,reg43XXr 
    setreg 437Bh*4,reg43XXr 
    setreg 437Ch*4,reg43XXr 
    setreg 437Dh*4,reg43XXr 
    setreg 437Eh*4,reg43XXr 
    setreg 437Fh*4,reg43XXr 
    cmp byte[SFXEnable],0 
    je .nosfx 
    call initsfxregsr 
.nosfx 
    cmp byte[SA1Enable],0 
    je .nosa1 
    call initSA1regs 
.nosa1 
    cmp byte[SDD1Enable],0 
    je .nosdd1 
    call initSDD1regs 
.nosdd1 
    cmp byte[SPC7110Enable],0 
    je .nospc7110 
    call initSPC7110regs 
.nospc7110 
    cmp byte[RTCEnable],0 
    je .noRTC 
    call RTCReset 
.noRTC 
    ret 
 
; global variables 
NEWSYM invreg,    dw 0 
NEWSYM sndrot,    db 0             ; rotates to use A,X or Y for sound skip 
NEWSYM sndrot2,   db 0             ; rotates a random value for sound skip 
NEWSYM INTEnab,   db 0             ; enables NMI(7)/VIRQ(5)/HIRQ(4)/JOY(0) 
NEWSYM NMIEnab,   db 1             ; controlled in e65816 loop.  Sets to 81h 
NEWSYM VIRQLoc,   dw 0             ; VIRQ Y location 
NEWSYM vidbright, db 0             ; screen brightness (0 .. 15) 
NEWSYM previdbr,  db 0             ; previous screen brightness 
NEWSYM forceblnk, db 80h           ; force blanking on/off ($80=on) 
NEWSYM objptr,    dd 0             ; pointer to object data in VRAM 
NEWSYM objptrn,   dd 0             ; pointer2 to object data in VRAM 
NEWSYM objsize1,  db 1             ; 1 = 8dot, 4=16 dot, 16=32 dot, 64=64dot 
NEWSYM objsize2,  db 4             ; large object size 
NEWSYM objmovs1,  db 2             ; number of bytes to move/paragraph 
NEWSYM objadds1,  dw 14            ; number of bytes to add/paragraph 
NEWSYM objmovs2,  db 2             ; number of bytes to move/paragraph 
NEWSYM objadds2,  dw 14            ; number of bytes to add/paragraph 
NEWSYM oamaddrt,  dw 0             ; oam address 
NEWSYM oamaddrs,  dw 0             ; oam address at beginning of vblank 
NEWSYM objhipr,   db 0             ; highest priority object # 
NEWSYM bgmode,    db 0             ; graphics mode ( 0 .. 7 ) 
NEWSYM bg3highst, db 0             ; is 1 if background 3 has the highest priority 
NEWSYM bgtilesz,  db 0             ; 0 = 8x8, 1 = 16x16, bit 0=bg1,bit1=bg2,etc 
NEWSYM mosaicon,  db 0             ; mosaic on, bit 0=bg1,bit1=bg2, etc 
NEWSYM mosaicsz,  db 0             ; mosaic size in pixels 
NEWSYM bg1ptr,    dw 0             ; pointer to background1 
NEWSYM bg2ptr,    dw 0             ; pointer to background2 
NEWSYM bg3ptr,    dw 0             ; pointer to background3 
NEWSYM bg4ptr,    dw 0             ; pointer to background4 
NEWSYM bg1ptrb,   dw 0             ; pointer to background1 
NEWSYM bg2ptrb,   dw 0             ; pointer to background2 
NEWSYM bg3ptrb,   dw 0             ; pointer to background3 
NEWSYM bg4ptrb,   dw 0             ; pointer to background4 
NEWSYM bg1ptrc,   dw 0             ; pointer to background1 
NEWSYM bg2ptrc,   dw 0             ; pointer to background2 
NEWSYM bg3ptrc,   dw 0             ; pointer to background3 
NEWSYM bg4ptrc,   dw 0             ; pointer to background4 
NEWSYM bg1ptrd,   dw 0             ; pointer to background1 
NEWSYM bg2ptrd,   dw 0             ; pointer to background2 
NEWSYM bg3ptrd,   dw 0             ; pointer to background3 
NEWSYM bg4ptrd,   dw 0             ; pointer to background4 
NEWSYM bg1scsize, db 0             ; bg #1 screen size (0=1x1,1=1x2,2=2x1,3=2x2) 
NEWSYM bg2scsize, db 0             ; bg #2 screen size (0=1x1,1=1x2,2=2x1,3=2x2) 
NEWSYM bg3scsize, db 0             ; bg #3 screen size (0=1x1,1=1x2,2=2x1,3=2x2) 
NEWSYM bg4scsize, db 0             ; bg #4 screen size (0=1x1,1=1x2,2=2x1,3=2x2) 
NEWSYM bg1objptr, dw 0             ; pointer to tiles in background1 
NEWSYM bg2objptr, dw 0             ; pointer to tiles in background2 
NEWSYM bg3objptr, dw 0             ; pointer to tiles in background3 
NEWSYM bg4objptr, dw 0             ; pointer to tiles in background4 
NEWSYM bg1scrolx, dw 0             ; background 1 x position 
NEWSYM bg2scrolx, dw 0             ; background 2 x position 
NEWSYM bg3scrolx, dw 0             ; background 3 x position 
NEWSYM bg4scrolx, dw 0             ; background 4 x position 
NEWSYM bg1sx,     dw 0             ; Temporary Variable for Debugging purposes 
NEWSYM bg1scroly, dw 0             ; background 1 y position 
NEWSYM bg2scroly, dw 0             ; background 2 y position 
NEWSYM bg3scroly, dw 0             ; background 3 y position 
NEWSYM bg4scroly, dw 0             ; background 4 y position 
NEWSYM addrincr,  dw 2             ; vram increment (2,64,128,256) 
NEWSYM vramincr,  db 0             ; 0 = inrement at 2118/2139, 1 = 2119,213A 
NEWSYM vramread,  db 0             ; 0 = address set, 1 = already read once 
NEWSYM vramaddr,  dd 0             ; vram address 
NEWSYM cgaddr,    dw 0             ; cg (palette) address 
NEWSYM cgmod,     db 0             ; if cgram is modified or not 
NEWSYM scrnon,    dw 0             ; main & sub screen on 
NEWSYM scrndist,  db 0             ; which background is disabled 
NEWSYM resolutn,  dw 224           ; screen resolution 
NEWSYM multa,     db 0             ; multiplier A 
NEWSYM diva,      dw 0             ; divisor C 
NEWSYM divres,    dw 0             ; quotent of divc/divb 
NEWSYM multres,   dw 0             ; result of multa * multb/remainder of divc/divb 
NEWSYM latchx,    dw 0             ; latched x value 
NEWSYM latchy,    dw 0             ; latched y value 
NEWSYM latchxr,   db 0             ; low or high byte read for x value 
NEWSYM latchyr,   db 0             ; low or high byte read for y value 
NEWSYM frskipper, db 0             ; used to control frame skipping 
NEWSYM winl1,     db 0             ; window 1 left position 
NEWSYM winr1,     db 0             ; window 1 right position 
NEWSYM winl2,     db 0             ; window 2 left position 
NEWSYM winr2,     db 0             ; window 2 right position 
NEWSYM winbg1en,  db 0             ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on BG1 
NEWSYM winbg2en,  db 0             ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on BG2 
NEWSYM winbg3en,  db 0             ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on BG3 
NEWSYM winbg4en,  db 0             ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on BG4 
NEWSYM winobjen,  db 0             ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on sprites 
NEWSYM wincolen,  db 0             ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on backarea 
NEWSYM winlogica, db 0             ; Window logic type for BG1 to 4 
NEWSYM winlogicb, db 0             ; Window logic type for Sprites and Backarea 
NEWSYM winenabm,  db 0             ; Window logic enable for main screen 
NEWSYM winenabs,  db 0             ; Window logic enable for sub screen 
NEWSYM mode7set,  db 0             ; mode 7 settings 
NEWSYM mode7A,    dw 0             ; A value for Mode 7 
NEWSYM mode7B,    dw 0             ; B value for Mode 7 
NEWSYM mode7C,    dw 0             ; C value for Mode 7 
NEWSYM mode7D,    dw 0             ; D value for Mode 7 
NEWSYM mode7X0,   dw 0             ; Center X for Mode 7 
NEWSYM mode7Y0,   dw 0             ; Center Y for Mode 7 
NEWSYM JoyAPos,   db 0             ; Old-Style Joystick Read Position for Joy 1 & 3 
NEWSYM JoyBPos,   db 0             ; Old-Style Joystick Read Position for Joy 2 & 4 
NEWSYM compmult,  dd 0             ; Complement Multiplication for Mode 7 
NEWSYM joyalt,    db 0             ; temporary joystick alternation 
 
NEWSYM wramrwadr, dd 0             ; continuous read/write to wram address 
NEWSYM dmadata, times 129 db 0h  ; dma data (written from ports 43xx) 
NEWSYM irqon,     db 0             ; if IRQ has been called (80h) or not (0) 
NEWSYM nexthdma,  db 0             ; HDMA data to execute once vblank ends 
NEWSYM curhdma,   db 0             ; Currently executed hdma 
NEWSYM hdmadata, times 8*19 db 0   ; 4 dword register addresses, # of bytes to 
                           ; transfer/line, address increment (word) 
NEWSYM hdmatype,  db 0             ; if first time executing hdma or not 
NEWSYM coladdr,   db 0             ; red value of color to add 
NEWSYM coladdg,   db 0             ; green value of color to add 
NEWSYM coladdb,   db 0             ; blue value of color to add 
NEWSYM colnull,   db 0             ; keep this 0 (when accessing colors by dword) 
NEWSYM scaddset,  db 0             ; screen/fixed color addition settings 
NEWSYM scaddtype, db 0             ; which screen to add/sub 
NEWSYM Voice0Disabl2, db 1         ; Disable Voice 0 
NEWSYM Voice1Disabl2, db 1         ; Disable Voice 1 
NEWSYM Voice2Disabl2, db 1         ; Disable Voice 2 
NEWSYM Voice3Disabl2, db 1         ; Disable Voice 3 
NEWSYM Voice4Disabl2, db 1         ; Disable Voice 4 
NEWSYM Voice5Disabl2, db 1         ; Disable Voice 5 
NEWSYM Voice6Disabl2, db 1         ; Disable Voice 6 
NEWSYM Voice7Disabl2, db 1         ; Disable Voice 7 
 
NEWSYM oamram,  times 1024 db 0    ; OAMRAM (544 bytes) 
NEWSYM cgram,   times 512 db 0     ; CGRAM 
NEWSYM pcgram,  times 512 db 0     ; Previous CGRAM 
 
NEWSYM vraminctype,  db 0 
 
; New variables 
NEWSYM vramincby8on,   db 0        ; if increment by 8 is on 
NEWSYM vramincby8left, db 0        ; how many left 
NEWSYM vramincby8totl, db 0        ; how many in total (32,64,128) 
NEWSYM vramincby8rowl, db 0        ; how many left in that row (start at 8) 
NEWSYM vramincby8ptri, dw 0        ; increment by how many when rowl = 0 
 
NEWSYM nexthprior,     db 0 
NEWSYM doirqnext,      db 0 
 
NEWSYM vramincby8var,  dw 0 
NEWSYM screstype,      db 0 
NEWSYM extlatch,       db 0 
NEWSYM cfield,         db 0 
NEWSYM interlval,      db 0 
 
NEWSYM HIRQLoc,   dw 0             ; HIRQ X location 
 
NEWSYM KeyOnStA, db 0 
NEWSYM KeyOnStB, db 0 
 
NEWSYM SDD1BankA, db 0 
NEWSYM SDD1BankB, db 1 
NEWSYM SDD1BankC, db 2 
NEWSYM SDD1BankD, db 3 
 
NEWSYM tempdat, times 484 db 0     ; expandable area 
 
num2writeppureg equ $-sndrot 
; pharos equ hack *sigh* 
NEWSYM PHnum2writeppureg, dd num2writeppureg 
 
NEWSYM scrndis,   db 0             ; which background is disabled 
 
ALIGN32 
NEWSYM oamaddr,   dd 0             ; oam address 
 
NEWSYM bg1ptrx,   dd 0             ; pointer to background1 
NEWSYM bg2ptrx,   dd 0             ; pointer to background2 
NEWSYM bg3ptrx,   dd 0             ; pointer to background3 
NEWSYM bg4ptrx,   dd 0             ; pointer to background4 
 
NEWSYM bg1ptry,   dd 0             ; pointer to background1 
NEWSYM bg2ptry,   dd 0             ; pointer to background2 
NEWSYM bg3ptry,   dd 0             ; pointer to background3 
NEWSYM bg4ptry,   dd 0             ; pointer to background4 
 
NEWSYM Voice0Disable, db 1         ; Disable Voice 0 
NEWSYM Voice1Disable, db 1         ; Disable Voice 1 
NEWSYM Voice2Disable, db 1         ; Disable Voice 2 
NEWSYM Voice3Disable, db 1         ; Disable Voice 3 
NEWSYM Voice4Disable, db 1         ; Disable Voice 4 
NEWSYM Voice5Disable, db 1         ; Disable Voice 5 
NEWSYM Voice6Disable, db 1         ; Disable Voice 6 
NEWSYM Voice7Disable, db 1         ; Disable Voice 7 
 
NEWSYM BG116x16t, db 0 
NEWSYM BG216x16t, db 0 
NEWSYM BG316x16t, db 0 
NEWSYM BG416x16t, db 0 
NEWSYM SPC700read, dd 0 
NEWSYM SPC700write, dd 0 
 
NEWSYM JoyCRead, db 0 
 
NEWSYM ClearRegs 
    mov word[VIRQLoc],0 
    mov word[bg1ptr],0 
    mov word[bg2ptr],0 
    mov word[bg3ptr],0 
    mov word[bg4ptr],0 
    mov word[bg1ptrb],0 
    mov word[bg2ptrb],0 
    mov word[bg3ptrb],0 
    mov word[bg4ptrb],0 
    mov word[bg1ptrc],0 
    mov word[bg2ptrc],0 
    mov word[bg3ptrc],0 
    mov word[bg4ptrc],0 
    mov word[bg1ptrd],0 
    mov word[bg2ptrd],0 
    mov word[bg3ptrd],0 
    mov word[bg4ptrd],0 
    mov word[bg1objptr],0 
    mov word[bg2objptr],0 
    mov word[bg3objptr],0 
    mov word[bg4objptr],0 
    ret 
 
; Multiply Result Low 
reg2134r: 
    checkmultchange 
    mov al,[compmult] 
    ret 
 
; Multiply Result Middle 
reg2135r: 
    checkmultchange 
    mov al,[compmult+1] 
    ret 
 
; Multiply Result High 
reg2136r: 
    checkmultchange 
    mov al,[compmult+2] 
    ret 
 
; Software latch for horizontal/vertical counter 
reg2137r: 
    cmp byte[debuggeron],1 
    je .debugger 
    xor ebx,ebx 
    mov bl,[cycpl] 
    sub bl,dh 
    add bx,bx 
    mov [latchx],bx 
    mov bx,[curypos] 
    mov [latchy],bx 
    mov bl,[INTEnab] 
    and bl,30h 
    cmp bl,30h 
    jne .novhirq 
    cmp word[HIRQLoc],0F0h 
    ja .incry 
    cmp dh,20 
    jae .noincly 
.incry 
    inc word[latchy] 
.novhirq 
.noincly 
    xor al,al 
    mov byte[extlatch],0 
    ret 
.debugger 
debblah: 
    xor ebx,ebx 
    mov bl,[cycpl] 
    sub bl,[pdh] 
    add bx,bx 
    mov [latchx],bx 
    mov bx,[curypos] 
    mov [latchy],bx 
    mov bl,[INTEnab] 
    and bl,30h 
    cmp bl,30h 
    jne .novhirq 
    cmp word[HIRQLoc],0F0h 
;    ja .incry 
    cmp word[latchx],80 
;    jb .noincly 
.incry 
    inc word[latchy] 
.novhirq 
.noincly 
    xor al,al 
    mov byte[extlatch],0 
    ret 
 
    push eax 
    push edx 
    xor eax,eax 
    xor ebx,ebx 
    mov al,[cycpl] 
    sub al,[pdh] 
    mov bx,339 
    mul bx 
    xor ebx,ebx 
    mov bl,[cycpl] 
    div bx 
    mov [latchx],ax 
    pop edx 
    pop eax 
    mov bx,[curypos] 
    mov [latchy],bx 
    mov bl,[INTEnab] 
    and bl,30h 
    cmp bl,30h 
    jne .novhirq2 
    cmp word[HIRQLoc],0F0h 
    ja .incry2 
    cmp word[latchx],80 
    jb .noincly2 
.incry2 
    inc word[latchy] 
.novhirq2 
.noincly2 
    xor al,al 
    mov byte[extlatch],0 
    ret 
 
; Read OAM Data (Low, High) 
reg2138r: 
    xor ebx,ebx 
    mov bx,word[oamaddr] 
    add ebx,oamram 
    mov al,[ebx] 
    inc word[oamaddr] 
    cmp word[oamaddr],543 
    ja .wrapoam 
    ret 
.wrapoam 
    mov word[oamaddr],0 
    ret 
 
; Read VRAM Data (Low) 
reg2139r: 
    xor ebx,ebx 
    mov bx,[vramaddr] 
    add ebx,[vram] 
    mov al,[ebx] 
    cmp byte[vramincr],0 
    je .noincr 
    cmp byte[vramread],0 
    je .noincr2 
    mov bx,[addrincr] 
    add [vramaddr],bx 
    cmp byte[vramincby8on],1 
    jne .noincr 
    dec byte[vramincby8left] 
    jnz .noincr 
    add word[vramaddr],2 
    mov bl,byte[vramincby8totl] 
    mov byte[vramincby8left],bl 
    dec byte[vramincby8rowl] 
    jz .nextrow 
    mov bx,[vramincby8ptri] 
    sub [vramaddr],bx 
    jmp .noincr 
.nextrow 
    mov byte[vramincby8rowl],8 
    sub word[vramaddr],16 
.noincr 
    ret 
.noincr2 
    mov byte[vramread],1 
    ret 
 
; Read VRAM Data (High) 
reg213Ar: 
    xor ebx,ebx 
    mov bx,[vramaddr] 
    add ebx,[vram] 
    mov al,[ebx+1] 
    cmp byte[vramincr],1 
    je .noincr 
    cmp byte[vramread],0 
    je .noincr2 
    mov bx,[addrincr] 
    add [vramaddr],bx 
    cmp byte[vramincby8on],1 
    jne .noincr 
    dec byte[vramincby8left] 
    jnz .noincr 
    add word[vramaddr],2 
    mov bl,byte[vramincby8totl] 
    mov byte[vramincby8left],bl 
    dec byte[vramincby8rowl] 
    jz .nextrow 
    mov bx,[vramincby8ptri] 
    sub [vramaddr],bx 
    jmp .noincr 
.nextrow 
    mov byte[vramincby8rowl],8 
    sub word[vramaddr],16 
.noincr 
    ret 
.noincr2 
    mov byte[vramread],1 
    ret 
 
; Read CGRAM Data 
reg213Br: 
    xor ebx,ebx 
    mov bx,[cgaddr] 
    mov al,[cgram+ebx] 
    inc word[cgaddr] 
    and word[cgaddr],01FFh 
    ret 
 
; H counter data by external or software latch 
reg213Cr: 
    cmp byte[latchxr],1 
    je .highv 
    mov al,byte[latchx] 
    mov byte[latchxr],1 
    ret 
.highv 
    mov al,byte[latchx+1] 
    mov byte[latchxr],0 
    ret 
 
; V counter data by external or software latch 
reg213Dr: 
    cmp byte[latchyr],1 
    je .highv 
    mov al,byte[latchy] 
    mov byte[latchyr],1 
    ret 
.highv 
    mov al,byte[latchy+1] 
    mov byte[latchyr],0 
    ret 
 
; PPU Status Flag & Version number (OBJ over flags) 
reg213Er: 
    mov al,01h 
    ret 
 
; PPU Status Flag & Version number (NTSC/PAL/EXTRN Latch flag) 
reg213Fr: 
    mov al,[romispal] 
    shl al,4 
    or al,[cfield] 
    mov byte[latchxr],0 
    mov byte[latchyr],0 
    or al,[extlatch] 
    ret 
 
; Sound Reg #1 
reg2140r: 
    cmp byte[spcon],0 
    je .nosound 
    inc dword[SPC700read] 
    mov al,[reg1read] 
    mov byte[spcnumread],0 
    ret 
.nosound 
    ; Find for D0 
    mov ebx,esi 
    cmp word[ebx],0FB10h 
    jne .noret 
    mov word[ebx],0EAEAh 
.noret 
    mov al,5 
.tryagain 
    cmp byte[ebx],0D0h 
    je .foundit 
    inc ebx 
    dec al 
    jnz .tryagain 
    jmp .notfound 
.foundit 
    mov byte[ebx],0EAh 
    mov byte[ebx+1],0EAh 
.notfound 
    inc byte[sndrot2] 
    cmp byte[sndrot2],3 
    jne .a 
    mov byte[sndrot2],0 
.a 
    xor al,al 
    test byte[sndrot2],01h 
    jz .n 
    mov al,[xa] 
.n 
    ret 
 
; Sound Reg #2 
reg2141r: 
    cmp byte[spcon],0 
    je .nosound 
    inc dword[SPC700read] 
    mov al,[reg2read] 
    mov byte[spcnumread],0 
    ret 
.nosound 
    ; Find for D0 
    mov ebx,esi 
    mov al,3 
.tryagain 
    cmp byte[ebx],0D0h 
    je .foundit 
    inc ebx 
    dec al 
    jnz .tryagain 
    jmp .notfound 
.foundit 
    mov byte[ebx],0EAh 
    mov byte[ebx+1],0EAh 
.notfound 
    xor byte[sndrot],01h 
    mov al,[xa+1] 
    test byte[sndrot],01h 
    jz .n 
    mov al,[xa] 
.n 
    ret 
 
; Sound Reg #3 
reg2142r: 
    cmp byte[spcon],0 
    je .nosound 
    inc dword[SPC700read] 
    mov al,[reg3read] 
    mov byte[spcnumread],0 
    ret 
.nosound 
    ; Find for D0 
    mov ebx,esi 
    mov al,3 
.tryagain 
    cmp byte[ebx],0D0h 
    je .foundit 
    inc ebx 
    dec al 
    jnz .tryagain 
    jmp .notfound 
.foundit 
    mov byte[ebx],0EAh 
    mov byte[ebx+1],0EAh 
.notfound 
    mov al,[xa] 
    test byte[sndrot],01h 
    jz .n 
    mov al,[xa+1] 
.n 
    ret 
 
; Sound Reg #4 
reg2143r: 
    cmp byte[spcon],0 
    je .nosound 
    inc dword[SPC700read] 
    mov al,[reg4read] 
    mov byte[spcnumread],0 
    ret 
.nosound 
    ; Find for D0 
    mov ebx,esi 
    mov al,3 
.tryagain 
    cmp byte[ebx],0D0h 
    je .foundit 
    inc ebx 
    dec al 
    jnz .tryagain 
    jmp .notfound 
.foundit 
    mov byte[ebx],0EAh 
    mov byte[ebx+1],0EAh 
.notfound 
    mov al,[xa+1] 
    ret 
 
; WRAM Read 
reg2180r: 
    mov ebx,[wramrwadr] 
    add ebx,[wramdata] 
    mov al,[ebx] 
    inc dword[wramrwadr] 
    and dword[wramrwadr],01FFFFh 
    ret 
 
; Joystick Data for controller 1 and 2 
 
reg4016r: 
    xor al,al 
    test dword[JoyANow],80000000h 
    jz .noal 
    mov al,1 
.noal 
    rol dword[JoyANow],1 
    ret 
 
NEWSYM MultiTap, db 0 
; Joystick Data for controller 2 and 4 
reg4017r: 
    cmp byte[snesmouse],0 
    jne .nomultitap 
    cmp byte[MultiTap],1 
    je .multitap 
.nomultitap 
    xor al,al 
    test dword[JoyBNow],80000000h 
    jz .noal 
    mov al,1 
.noal 
    rol dword[JoyBNow],1 
    ret 
.multitap 
    test byte[MultiTapStat],1 
    jz .no1 
    mov al,0FFh 
    ret 
.no1 
    test byte[MultiTapStat],80h 
    jz .contr45 
    xor al,al 
    test dword[JoyBNow],80000000h 
    jz .nojb 
    or al,01h 
.nojb 
    test dword[JoyCNow],80000000h 
    jz .nojc 
    or al,02h 
.nojc 
    rol dword[JoyBNow],1 
    rol dword[JoyCNow],1 
    ret 
.contr45 
    xor al,al 
    test dword[JoyDNow],80000000h 
    jz .nojd 
    or al,1 
.nojd 
    test dword[JoyENow],80000000h 
    jz .noje 
    or al,02h 
.noje 
    rol dword[JoyDNow],1 
    rol dword[JoyENow],1 
    ret 
 
; NMI Check Register 
reg4210r: 
    mov al,[NMIEnab] 
    cmp byte[curnmi],0 
    jne .nmi 
    mov byte[NMIEnab],01h 
.nmi 
    mov byte[curnmi],0 
    ret 
 
; Video IRQ Register 
reg4211r: 
    mov al,[irqon] 
    mov byte[irqon],0 
    ret 
 
; H/V Blank Flag & Joystick Controller Enable Flag 
; bit 7 = vblank, 0=out,1=in, bit 6 = hblank, 0=out,1=in, bit 0 = joystick on 
reg4212r: 
    xor al,al 
    cmp byte[joycontren],25 
    jb .nojoyc 
.yesjoy 
    mov al,1 
.nojoyc 
    inc byte[joycontren] 
    cmp byte[joycontren],50 
    jne .n 
    mov byte[joycontren],0 
.n 
    cmp byte[debuggeron],1 
    je .debugger 
    mov bx,[resolutn] 
    sub bx,[Reg4212hack] 
    inc bx 
    cmp word[curypos],bx 
    jb .novbl 
    cmp word[curypos],261 
    jae .novbl 
    or al,80h 
;    jmp .nohblank 
.novbl 
    cmp dh,[cycphb] 
    jae .nohblank 
    or al,40h 
.nohblank 
    test byte[INTEnab],01h 
    jz .nojoy 
    mov bx,[resolutn] 
    add bx,2 
    cmp word[curypos],bx 
    jne .nojoy 
    cmp dh,5 
    ja .nojoy 
    ret 
.nojoy 
    ret 
.debugger 
debblah2: 
    push edx 
    mov dh,[pdh] 
    mov bx,[resolutn] 
    sub bx,[Reg4212hack] 
    inc bx 
    cmp word[curypos],bx 
    jb .novbl 
    cmp word[curypos],261 
    jae .novbl 
    or al,80h 
;    jmp .nohblank 
.novbl 
    cmp dh,[cycphb] 
    jae .nohblank 
    or al,40h 
.nohblank 
    test byte[INTEnab],01h 
    jz .nojoy 
    mov bx,[resolutn] 
    add bx,2 
    cmp word[curypos],bx 
    jne .nojoy 
    cmp dh,5 
    ja .nojoy 
    pop edx 
    ret 
.nojoy 
    pop edx 
    ret 
 
 
    mov bx,[resolutn] 
    inc bx 
    cmp word[curypos],bx 
    jb .novbl2 
    or al,80h 
    jmp .nohblank2 
.novbl2 
    mov bl,[pdh] 
    cmp bl,[cycphb] 
    jae .nohblank2 
    or al,40h 
.nohblank2 
    test byte[INTEnab],01h 
    jz .nojoy2 
    mov bx,[resolutn] 
    add bx,2 
    cmp word[curypos],bx 
    jne .nojoy2 
    cmp byte[pdh],5 
    ja .nojoy 
;    or al,01h 
    ret 
.nojoy2 
    ret 
 
; Programmable I/O port 
reg4213r: 
;    mov al,[mode7A] 
;    xor al,al 
;    mov al,0FFh 
    ret 
 
; Quotent of Divide Result (Low) 
reg4214r: 
    mov al,[divres] 
    ret 
 
; Quotent of Divide Result (High) 
reg4215r: 
    mov al,[divres+1] 
    ret 
 
; Product of Multiplication Result or Remainder of Divide Result (Low) 
reg4216r: 
    mov al,[multres] 
    ret 
 
; Product of Multiplication Result or Remainder of Divide Result (High) 
reg4217r: 
    mov al,[multres+1] 
    ret 
 
; Joystick 1 Low 
; bit7=X,bit6=Y,bit5=L,bit4=R 
reg4218r: 
    mov al,[JoyAOrig+2] 
    ret 
 
; Joystick 1 High 
; bit7=A,bit6=B,bit5=Sel,bit4=Start,bit3=up,bit2=down,bit1=left,bit0=right 
reg4219r: 
    mov al,[JoyAOrig+3] 
    ret 
 
; Joystick 2 Low 
reg421Ar: 
    mov al,[JoyBOrig+2] 
    ret 
 
; Joystick 2 High 
reg421Br: 
    mov al,[JoyBOrig+3] 
    ret 
 
; Joystick 3 Low 
reg421Cr: 
    mov al,[JoyDOrig+2] 
    ret 
 
; Joystick 3 High 
reg421Dr: 
    mov al,[JoyDOrig+3] 
    ret 
 
; Joystick 4 Low 
reg421Er: 
    mov al,[JoyCOrig+2] 
    ret 
 
; Joystick 4 High 
reg421Fr: 
    mov al,[JoyCOrig+3] 
    ret 
 
; DMA Reader 
reg43XXr: 
    xor ebx,ebx 
    mov bx,cx 
    sub bx,4300h 
    mov al,[dmadata+ebx] 
    ret 
 
regINVALID:     ; Invalid Register 
    xor al,al 
;    mov al,30h 
    ret 
    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,2 
    mov dl,13 
    int 21h 
    mov ah,2 
    mov dl,10 
    int 21h 
    mov eax,[numinst]          ;Temporary 
    call printnum 
    jmp DosExit 
 
.invalidreg db 'Invalid Read Register : $'