;ZSNES Savestate Format: ; Thanks to ZsKnight for it! ; Meant to be compiled with NASM. ; Obtained from http://members.tripod.com/FDwR/snes.htm ; ; This portion does not contain any part of the SPC ; information, FX chip or SA-1 registers, or extra any ; additional cartridge memory. It does include all the ; 65816c registers, PPU registers, sprites (OAM), palette ; (CGRAM), DMA channels, VRAM, and main memory. ; Altogether, that accounts for 199699 bytes of it. zsmesg db 'ZSNES Save State File V0.6',26 versn db 60 ; version #/100 curcyc db 0 ; cycles left in scanline curypos dw 0 ; current y position cacheud db 1 ; update cache every ? frames ccud db 0 ; current cache increment intrset db 0 ; interrupt set cycpl db 0 ; cycles per scanline cycphb db 0 ; cycles per hblank spcon db 0 ; SPC Enable (1=enabled) stackand dw 01FFh ; value to and stack to keep it from going to the wrong area stackor dw 0100h ; value to or stack to keep it from going to the wrong area ; 65816 registers xat dw 0 xdbt db 0 xpbt db 0 xst dw 0 xdt dw 0 xxt dw 0 xyt dw 0 xp db 0 xe db 0 xpc dw 0 xirqb db 0 ; which bank the irqs start at debugger db 0 ; Start with debugger (1=yes,0=no) Curtableaddr dd 0 ; Current table address curnmi db 0 ; if in NMI(1) or not(0) cycpbl dd 110 ; percentage left of CPU/SPC to run (3.58 = 175) cycpblt dd 110 ; percentage of CPU/SPC to run ; SNES PPU Registers sndrot db 0 ; rotates to use A,X or Y for sound skip sndrot2 db 0 ; rotates a random value for sound skip INTEnab db 0 ; enables NMI(7)/VIRQ(5)/HIRQ(4)/JOY(0) NMIEnab db 1 ; controlled in e65816 loop. Sets to 81h VIRQLoc dw 0 ; VIRQ Y location vidbright db 0 ; screen brightness (0 .. 15) previdbr db 0 ; previous screen brightness forceblnk db 80h ; force blanking on/off ($80=on) objptr dd 0 ; pointer to object data in VRAM objptrn dd 0 ; pointer2 to object data in VRAM objsize1 db 1 ; 1 = 8dot, 4=16 dot, 16=32 dot, = 64=64dot objsize2 db 4 ; large object size objmovs1 db 2 ; number of bytes to move/paragraph objadds1 dw 14 ; number of bytes to add/paragraph objmovs2 db 2 ; number of bytes to move/paragraph objadds2 dw 14 ; number of bytes to add/paragraph oamaddrt dw 0 ; oam address oamaddrs dw 0 ; oam address at beginning of vblank objhipr db 0 ; highest priority object # bgmode db 0 ; graphics mode ( 0 .. 7 ) bg3highst db 0 ; is 1 if background 3 has the highest priority bgtilesz db 0 ; 0=8x8, 1=16x16; bit0=bg1, bit1=bg2, etc mosaicon db 0 ; mosaic on, bit 0=bg1, bit1=bg2, etc mosaicsz db 0 ; mosaic size in pixels bg1ptr dw 0 ; pointer to background1 bg2ptr dw 0 ; pointer to background2 bg3ptr dw 0 ; pointer to background3 bg4ptr dw 0 ; pointer to background4 bg1ptrb dw 0 ; pointer to background1 bg2ptrb dw 0 ; pointer to background2 bg3ptrb dw 0 ; pointer to background3 bg4ptrb dw 0 ; pointer to background4 bg1ptrc dw 0 ; pointer to background1 bg2ptrc dw 0 ; pointer to background2 bg3ptrc dw 0 ; pointer to background3 bg4ptrc dw 0 ; pointer to background4 bg1ptrd dw 0 ; pointer to background1 bg2ptrd dw 0 ; pointer to background2 bg3ptrd dw 0 ; pointer to background3 bg4ptrd dw 0 ; pointer to background4 bg1scsize db 0 ; bg #1 screen size (0=1x1,1=1x2,2=2x1,3=2x2) bg2scsize db 0 ; bg #2 screen size (0=1x1,1=1x2,2=2x1,3=2x2) bg3scsize db 0 ; bg #3 screen size (0=1x1,1=1x2,2=2x1,3=2x2) bg4scsize db 0 ; bg #4 screen size (0=1x1,1=1x2,2=2x1,3=2x2) bg1objptr dw 0 ; pointer to tiles in background1 bg2objptr dw 0 ; pointer to tiles in background2 bg3objptr dw 0 ; pointer to tiles in background3 bg4objptr dw 0 ; pointer to tiles in background4 bg1scrolx dw 0 ; background 1 x position bg2scrolx dw 0 ; background 2 x position bg3scrolx dw 0 ; background 3 x position bg4scrolx dw 0 ; background 4 x position bg1sx dw 0 ; Temporary Variable for Debugging purposes bg1scroly dw 0 ; background 1 y position bg2scroly dw 0 ; background 2 y position bg3scroly dw 0 ; background 3 y position bg4scroly dw 0 ; background 4 y position addrincr dw 2 ; vram increment (2,64,128,256) vramincr db 0 ; 0 = inrement at 2118/2139, 1 = 2119,213A vramread db 0 ; 0 = address set, 1 = already read once vramaddr dd 0 ; vram address cgaddr dw 0 ; cg (palette) address cgmod db 0 ; if cgram is modified or not scrnon dw 0 ; main & sub screen on scrndist db 0 ; which background is disabled resolutn dw 224 ; screen resolution multa db 0 ; multiplier A diva dw 0 ; divisor C divres dw 0 ; quotent of divc/divb multres dw 0 ; result of multa * multb/remainder of divc/divb latchx dw 0 ; latched x value latchy dw 0 ; latched y value latchxr db 0 ; low or high byte read for x value latchyr db 0 ; low or high byte read for y value frskipper db 0 ; used to control frame skipping winl1 db 0 ; window 1 left position winr1 db 0 ; window 1 right position winl2 db 0 ; window 2 left position winr2 db 0 ; window 2 right position winbg1en db 0 ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on BG1 winbg2en db 0 ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on BG2 winbg3en db 0 ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on BG3 winbg4en db 0 ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on BG4 winobjen db 0 ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on sprites wincolen db 0 ; Win1 on (IN/OUT) or Win2 on (IN/OUT) on backarea winlogica db 0 ; Window logic type for BG1 to 4 winlogicb db 0 ; Window logic type for Sprites and Backarea winenabm db 0 ; Window logic enable for main screen winenabs db 0 ; Window logic enable for sub screen mode7set db 0 ; mode 7 settings mode7A dw 0 ; A value for Mode 7 mode7B dw 0 ; B value for Mode 7 mode7C dw 0 ; C value for Mode 7 mode7D dw 0 ; D value for Mode 7 mode7X0 dw 0 ; Center X for Mode 7 mode7Y0 dw 0 ; Center Y for Mode 7 JoyAPos db 0 ; Old-Style Joystick Read Position for Joy 1 & 3 JoyBPos db 0 ; Old-Style Joystick Read Position for Joy 2 & 4 compmult dd 0 ; Complement Multiplication for Mode 7 joyalt db 0 ; temporary joystick alternation wramrwadr dd 0 ; continuous read/write to wram address dmadata times 129 db 0 ; dma data (written from ports 43xx) irqon db 0 ; if IRQ has been called (80h) or not (0) nexthdma db 0 ; HDMA data to execute once vblank ends curhdma db 0 ; Currently executed hdma hdmadata times 8*19 db 0 ; 4 dword register addresses, # of bytes to ; transfer/line, address increment (word) hdmatype db 0 ; if first time executing hdma or not coladdr db 0 ; red value of color to add coladdg db 0 ; green value of color to add coladdb db 0 ; blue value of color to add colnull db 0 ; keep this 0 (when accessing colors by dword) scaddset db 0 ; screen/fixed color addition settings scaddtype db 0 ; which screen to add/sub Voice0Disabl2 db 1 ; Disable Voice 0 Voice1Disabl2 db 1 ; Disable Voice 1 Voice2Disabl2 db 1 ; Disable Voice 2 Voice3Disabl2 db 1 ; Disable Voice 3 Voice4Disabl2 db 1 ; Disable Voice 4 Voice5Disabl2 db 1 ; Disable Voice 5 Voice6Disabl2 db 1 ; Disable Voice 6 Voice7Disabl2 db 1 ; Disable Voice 7 oamram times 1024 db 0 ; OAMRAM (544 bytes) cgram times 512 db 0 ; CGRAM pcgram times 512 db 0 ; Previous CGRAM vraminctype db 0 ; New variables vramincby8on db 0 ; if increment by 8 is on vramincby8left db 0 ; how many left vramincby8totl db 0 ; how many in total (32,64,128) vramincby8rowl db 0 ; how many left in that row (start at 8) vramincby8ptri dw 0 ; increment by how many when rowl = 0 nexthprior db 0 doirqnext db 0 vramincby8var dw 0 screstype db 0 extlatch db 0 cfield db 0 interlval db 0 HIRQLoc dw 0 ; HIRQ X location tempdat times 490 db 0 ; expandable area wram7E times 65536 db 0 wram7F times 65536 db 0 vram times 65536 db 0 ;wram7E times 16384 dd 0 ; compiles four times as fast