www.pudn.com > sn068s.zip > PPU.ASM
%define Set_Based_Tile_Cache
;%define Profile_VRAM_Writes
;%define Check_Within_Tile_Set
;%define NO_DMA_WRITE
;%define TRAP_BGSC
;%define TRAP_BGHOFS
;%define TRAP_BGVOFS
; PPU.asm - Contains the hardware mapping functions
%define SNEeSe_PPU_asm
%include "misc.ni"
%include "PPU.ni"
%include "scankeys.ni"
%include "key.ni"
%include "DMA.ni"
%include "sprites.ni"
%include "screen.ni"
%include "cpumem.ni"
extern SNES_R2134,SNES_R2135,SNES_R2136,SNES_R2137
extern SNES_R213C,SNES_R213D
extern SNES_R4200,SNES_R4210,SNES_R4211,SNES_R4212
extern SNES_W211A,SNES_W211B,SNES_W211C,SNES_W211D
extern SNES_W211E,SNES_W211F,SNES_W2120
extern SNES_W4200,SNES_W4207,SNES_W4208,SNES_W4209
extern SNES_W420A,SNES_W420D,SNES_W4210,SNES_W4211
extern HVBJOY
extern SCREEN_MODE_7
extern _Reset_Mode_7
extern _LastRenderLine
extern _BrightnessLevel
extern _NMITIMEN
extern _JOYSTICK_ENABLED,_JOYSTICK_ENABLED2
extern _MickeyMouse,_MickeyRead,_MouseButts
extern _key
extern _KEY_A_1,_KEY_X_1,_KEY_L_1,_KEY_R_1
extern _KEY_B_1,_KEY_Y_1,_KEY_SELECT_1,_KEY_START_1
extern _KEY_UP_1,_KEY_DOWN_1,_KEY_LEFT_1,_KEY_RIGHT_1
extern _KEY_A_2,_KEY_X_2,_KEY_L_2,_KEY_R_2
extern _KEY_B_2,_KEY_Y_2,_KEY_SELECT_2,_KEY_START_2
extern _KEY_UP_2,_KEY_DOWN_2,_KEY_LEFT_2,_KEY_RIGHT_2
extern _Real_SNES_Palette
extern OPHCT,OPVCT,_SNES_COUNTRY
extern Ready_Line_Render,Sync_Render
extern _PaletteChanged
extern _Offset_Change_Disable
extern _M7H_13,_M7V_13,Redo_M7
extern _M7SEL,M7_Handler_Table,M7_Handler
extern _fixedpalettecheck
extern Recache_Tile_Set
extern _SPC_MASK
extern _OutputScreen
extern _MosaicLine
extern _Map_Address
extern _Map_Byte
extern _InvalidHWWrite
section .text
EXPORT_C PPU_text_start
section .data
EXPORT_C PPU_data_start
section .bss
EXPORT_C PPU_bss_start
section .data
ALIGND
EXPORT_C Read_Map_20_5F
; 2000-20FF: Unmapped
DUPLICATE dd,0x100,UNSUPPORTED_READ
EXPORT_C Read_Map_21
DUPLICATE dd,0x16,UNSUPPORTED_READ
dd SNES_R2116 ; VMADDL
dd SNES_R2117 ; VMADDH
DUPLICATE dd,0x1C,UNSUPPORTED_READ
dd SNES_R2134 ; MPYL
dd SNES_R2135 ; MPYM
dd SNES_R2136 ; MPYH
dd SNES_R2137 ; SLHV
dd SNES_R2138 ; OAMDATAREAD
dd SNES_R2139_NORM ; VMDATALREAD
dd SNES_R213A_NORM ; VMDATAHREAD
dd SNES_R213B ; CGDATAREAD ; v0.14
dd SNES_R213C ; OPHCT ; v0.14
dd SNES_R213D ; OPVCT
dd SNES_R213E ; STAT77 ; Not supported yet (properly..)
dd SNES_R213F ; STAT78
DUPLICATE dd,0x40,UNSUPPORTED_READ ; APUI00-APUI03
dd SNES_R2180 ; WMDATA ; 2180 WMDATA - read/write to Work RAM
dd SNES_R2181 ; WMADDL ; v0.14
dd SNES_R2182 ; WMADDM ; v0.14
dd SNES_R2183 ; WMADDH ; v0.14
DUPLICATE dd,0x3E,UNSUPPORTED_READ
dd SNES_R21C2 ; Unknown?
dd SNES_R21C3 ; Unknown?
DUPLICATE dd,0x3C,UNSUPPORTED_READ
; 2200-3FFF: Unmapped
DUPLICATE dd,0x1E00,UNSUPPORTED_READ
EXPORT_C Read_Map_40
DUPLICATE dd,0x16,UNSUPPORTED_READ
dd SNES_R4016 ; JOYC1
dd SNES_R4017 ; JOYC2
DUPLICATE dd,0xE8,UNSUPPORTED_READ
; 4100-41FF: Unmapped
DUPLICATE dd,0x100,UNSUPPORTED_READ
EXPORT_C Read_Map_42
dd SNES_R4200 ; NMITIMEN
DUPLICATE dd,0x01,UNSUPPORTED_READ
dd SNES_R4202 ; WRMPYA
dd SNES_R4203 ; WRMPYB
DUPLICATE dd,0x07,UNSUPPORTED_READ
dd SNES_R420B ; MDMAEN
dd SNES_R420C ; HDMAEN
DUPLICATE dd,3,UNSUPPORTED_READ
dd SNES_R4210 ; RDNMI
dd SNES_R4211 ; TIMEUP
dd SNES_R4212 ; HVBJOY
dd SNES_R4213 ; RDIO ; Not yet supported... probably never
dd SNES_R4214 ; RDDIVL
dd SNES_R4215 ; RDDIVH
dd SNES_R4216 ; RDMPYL
dd SNES_R4217 ; RDMPYH
dd SNES_R4218 ; JOY1L
dd SNES_R4219 ; JOY1H
dd SNES_R421A ; JOY2L
dd SNES_R421B ; JOY2H
dd SNES_R421C ; JOY3L ; Not yet supported
dd SNES_R421D ; JOY3H
dd SNES_R421E ; JOY4L ; Not yet supported
dd SNES_R421F ; JOY4H
DUPLICATE dd,0xE0,UNSUPPORTED_READ
EXPORT_C Read_Map_43
MAP_READ_DMA_LIST 0
MAP_READ_DMA_LIST 1
MAP_READ_DMA_LIST 2
MAP_READ_DMA_LIST 3
MAP_READ_DMA_LIST 4
MAP_READ_DMA_LIST 5
MAP_READ_DMA_LIST 6
MAP_READ_DMA_LIST 7
DUPLICATE dd,0x80,UNSUPPORTED_READ
; 4300-5FFF: Unmapped
DUPLICATE dd,0x1D00,UNSUPPORTED_READ
ALIGND
EXPORT_C Write_Map_20_5F
; 2000-20FF: Unmapped
DUPLICATE dd,0x100,UNSUPPORTED_WRITE
EXPORT_C Write_Map_21
dd SNES_W2100 ; INIDISP
dd SNES_W2101 ; OBSEL
dd SNES_W2102 ; OAMADDL
dd SNES_W2103 ; OAMADDH
dd SNES_W2104 ; OAMDATA
dd SNES_W2105 ; BGMODE
dd SNES_W2106 ; MOSAIC
dd SNES_W2107 ; BG1SC
dd SNES_W2108 ; BG2SC
dd SNES_W2109 ; BG3SC
dd SNES_W210A ; BG4SC
dd SNES_W210B ; BG12NBA
dd SNES_W210C ; BG34NBA
dd SNES_W210D ; BG1HOFS
dd SNES_W210E ; BG1VOFS
dd SNES_W210F ; BG2HOFS
dd SNES_W2110 ; BG2VOFS
dd SNES_W2111 ; BG3HOFS
dd SNES_W2112 ; BG3VOFS
dd SNES_W2113 ; BG4HOFS
dd SNES_W2114 ; BG4VOFS
dd SNES_W2115 ; VMAIN
dd SNES_W2116 ; VMADDL
dd SNES_W2117 ; VMADDH
dd SNES_W2118_NORM ; VMDATAL
dd SNES_W2119_NORM ; VMDATAH
dd SNES_W211A ; M7SEL
dd SNES_W211B ; M7A
dd SNES_W211C ; M7B
dd SNES_W211D ; M7C
dd SNES_W211E ; M7D
dd SNES_W211F ; M7X
dd SNES_W2120 ; M7Y
dd SNES_W2121 ; CGADD
dd SNES_W2122 ; CGDATA
dd SNES_W2123 ; W12SEL
dd SNES_W2124 ; W34SEL
dd SNES_W2125 ; WOBJSEL
dd SNES_W2126 ; WH0
dd SNES_W2127 ; WH1
dd SNES_W2128 ; WH2
dd SNES_W2129 ; WH3
dd SNES_W212A ; WBGLOG
dd SNES_W212B ; WOBJLOG
dd SNES_W212C ; TM
dd SNES_W212D ; TS
dd SNES_W212E ; TMW
dd SNES_W212F ; TSW
dd SNES_W2130 ; CGWSEL
dd SNES_W2131 ; CGADSUB
dd SNES_W2132 ; COLDATA
dd SNES_W2133 ; SETINI
DUPLICATE dd,0x0C,UNSUPPORTED_WRITE
DUPLICATE dd,0x40,UNSUPPORTED_WRITE ; APUI00-APUI03
dd SNES_W2180 ; WMDATA ; 2180 WMDATA - read/write to Work RAM
dd SNES_W2181 ; WMADDL ; 2181-3 WMAddress
dd SNES_W2182 ; WMADDM
dd SNES_W2183 ; WMADDH
DUPLICATE dd,0x7C,UNSUPPORTED_WRITE
; 2200-3FFF: Unmapped
DUPLICATE dd,0x1E00,UNSUPPORTED_WRITE
EXPORT_C Write_Map_40
DUPLICATE dd,0x16,UNSUPPORTED_WRITE
dd SNES_W4016 ; JOYC1
dd SNES_W4017 ; JOYC2
DUPLICATE dd,0xE8,UNSUPPORTED_WRITE
; 4100-41FF: Unmapped
DUPLICATE dd,0x100,UNSUPPORTED_WRITE
EXPORT_C Write_Map_42
dd SNES_W4200 ; NMITIMEN
dd SNES_W4201 ; WRIO
dd SNES_W4202 ; WRMPYA
dd SNES_W4203 ; WRMPYB
dd SNES_W4204 ; WRDIVL
dd SNES_W4205 ; WRDIVH
dd SNES_W4206 ; WRDIVB
dd SNES_W4207 ; HTIMEL
dd SNES_W4208 ; HTIMEH
dd SNES_W4209 ; VTIMEL
dd SNES_W420A ; VTIMEH
%ifdef NO_DMA_WRITE
DUPLICATE dd,2,UNSUPPORTED_WRITE
%else
dd SNES_W420B ; MDMAEN
dd SNES_W420C ; HDMAEN
%endif
dd SNES_W420D ; MEMSEL
DUPLICATE dd,2,UNSUPPORTED_WRITE
dd SNES_W4210 ; RDNMI
dd SNES_W4211 ; TIMEUP
dd IGNORE_WRITE ; HVBJOY
dd IGNORE_WRITE ; RDIO
dd IGNORE_WRITE ; RDDIVL
dd IGNORE_WRITE ; RDDIVH
dd IGNORE_WRITE ; RDMPYL
dd IGNORE_WRITE ; RDMPYH
dd IGNORE_WRITE ; JOY1L
dd IGNORE_WRITE ; JOY1H
dd IGNORE_WRITE ; JOY2L
dd IGNORE_WRITE ; JOY2H
dd IGNORE_WRITE ; JOY3L
dd IGNORE_WRITE ; JOY3H
dd IGNORE_WRITE ; JOY4L
dd IGNORE_WRITE ; JOY4H
DUPLICATE dd,0xE0,UNSUPPORTED_WRITE
EXPORT_C Write_Map_43
%ifdef NO_DMA_WRITE
DUPLICATE dd,0x80,UNSUPPORTED_WRITE
%else
MAP_WRITE_DMA_LIST 0
MAP_WRITE_DMA_LIST 1
MAP_WRITE_DMA_LIST 2
MAP_WRITE_DMA_LIST 3
MAP_WRITE_DMA_LIST 4
MAP_WRITE_DMA_LIST 5
MAP_WRITE_DMA_LIST 6
MAP_WRITE_DMA_LIST 7
%endif
DUPLICATE dd,0x80,UNSUPPORTED_WRITE
; 4300-5FFF: Unmapped
DUPLICATE dd,0x1D00,UNSUPPORTED_WRITE
ALIGND
; BG12NBA/BG34NBA to tileset-in-cache address tables
BGNBA_Table_2:
dd 0<<12,1<<12,2<<12,3<<12,4<<12,5<<12,6<<12,7<<12
BGNBA_Table_4:
dd 0<<11,1<<11,2<<11,3<<11,4<<11,5<<11,6<<11,7<<11
BGNBA_Table_8:
dd 0<<10,1<<10,2<<10,3<<10,4<<10,5<<10,6<<10,7<<10
; BGMODE layer depth tables
; Standard
; 1 = 2-bit 2 = 4-bit 3=8-bit
; Offset Change
; 5 = 2-bit 6 = 4-bit 7=8-bit
; Special
; 4 = mode-7 9 = 2-bit mode-0 0 = no more layers
; 4 layers, 8 bytes per layer ([4][8] array)
BGMODE_Depth_Table:
db 9,2,6,3,7,2,6,4
db 9,2,6,2,5,1,0,0
db 9,1,0,0,0,0,0,0
db 9,0,0,0,0,0,0,0
; These layers are allowed ***
BGMODE_Allowed_Layer_Mask_Table:
db 0x1F,0x17,0x13,0x13,0x13,0x13,0x11,0x13
; These layers require tileset recaching before rendering
BGMODE_Tile_Layer_Mask_Table:
db 0x1F,0x17,0x13,0x13,0x13,0x13,0x11,0x10
; These layers allow per-tile offset change
BGMODE_Allowed_Offset_Change_Table:
db 0,0,0xFF,0,0xFF,0,0xFF,0
ALIGND
LineRenderSmall:
dd 0,_Render_8x8_C2,_Render_8x8_C4,_Render_8x8_C8
dd SCREEN_MODE_7
dd _Render_Offset_8x8_C2,_Render_Offset_8x8_C4,_Render_Offset_8x8_C8
dd 0,_Render_8x8_C2
LineRenderLarge:
dd 0,_Render_16x16_C2,_Render_16x16_C4,_Render_16x16_C8
dd SCREEN_MODE_7
dd _Render_Offset_16x16_C2,_Render_Offset_16x16_C4,_Render_Offset_16x16_C8
dd 0,_Render_16x16_C2
LineRenderEvenSmall:
dd 0,_Render_16x8_Even_C2,_Render_16x8_Even_C4,0
dd SCREEN_MODE_7,_Render_16x8_Even_C2,_Render_16x8_Even_C4,0
LineRenderEvenLarge:
dd 0,_Render_16x16_Even_C2,_Render_16x16_Even_C4,0
dd SCREEN_MODE_7,_Render_16x16_Even_C2,_Render_16x16_Even_C4,0
Depth_NBA_Table:
%ifdef USE_8BPL_CACHE_FOR_4BPL
dd 0,BGNBA_Table_2,BGNBA_Table_8,BGNBA_Table_8 ;*
%else
dd 0,BGNBA_Table_2,BGNBA_Table_4,BGNBA_Table_8
%endif
section .bss
ALIGNB
EXPORT_C WRAM ,skipk 128 ; Buffer for Work RAM
EXPORT_C VRAM ,skipk 64 ; Buffer for Video RAM
EXPORT_C SRAM ,skipk 64 ; Buffer for Save RAM
EXPORT_C SPCRAM ,skipk 64 ; Buffer for SPC RAM/ROM
EXPORT_C Blank ,skipk 64 ; Blank ROM buffer
_PortRAM:skipk 24 ; Ports 0x2000-0x5FFF
VRAMAddress: skipl ; VRAM address in PPU
SCINC: skipl ; Used in updating VRAM address
EXPORT Tile_Recache_Set_Begin,skipl
EXPORT Tile_Recache_Set_End ,skipl
EXPORT Mosaic_Size,skipl ; 000xxxxx xxxxx=2-16 pixel size
EXPORT Mosaic_Size_Select,skipl ;Table selector
EXPORT MOSAIC ,skipb ; xxxxabcd xxxx=0-F pixel size,a-d = affect BG4-1
EXPORT_C INIDISP ,skipb ; x000bbbb x=screen on/off,bbbb=Brightness
EXPORT_C BGMODE ,skipb ; abcdefff a-d=tile size bg4-1 (8/16),e=priority bg3,fff=mode
EXPORT_C Base_BGMODE,skipb ; 00000fff fff=mode
EXPORT_C BG12NBA,skipb ; aaaabbbb aaaa=base address 2, bbbb=base address 1
EXPORT_C BG34NBA,skipb ; aaaabbbb aaaa=base address 4, bbbb=base address 3
EXPORT_C VMAIN,skipb ; i000abcd i=inc type,ab=full graphic,cd=SC increment
EXPORT_C W12SEL ,skipb ; Holds plane 1/2 window mask settings
EXPORT_C W34SEL ,skipb ; Holds plane 3/4 window mask settings
EXPORT_C WOBJSEL,skipb ; Holds colour/object window mask settings
skipb
EXPORT_C Win1_Count_In,skipb
EXPORT_C WH0,skipb ; Holds window 1 left position
EXPORT_C TM ,skipb ; 000odcba o=OBJ enable,a-d=BG1-4 enable
EXPORT_C WBGLOG,skipb ; BG Window mask logic
EXPORT_C Win1_Count_Out,skipb
EXPORT_C WH1,skipb ; Holds window 1 right position
EXPORT_C TMW,skipb
EXPORT_C WOBJLOG,skipb ; OBJ/Colour Window mask logic
EXPORT_C Win2_Count_In,skipb
EXPORT_C WH2,skipb ; Holds window 2 left position
EXPORT_C TS ,skipb ; 000odcba o=OBJ enable,a-d=BG1-4 enable
EXPORT_C CGWSEL,skipb
EXPORT_C Win2_Count_Out,skipb
EXPORT_C WH3,skipb ; Holds window 2 right position
EXPORT_C TSW,skipb
EXPORT_C CGADSUB,skipb
EXPORT_C Win1_Bands_In ,skipb 2
EXPORT_C Win2_Bands_In ,skipb 2
EXPORT_C Win1_Bands_Out,skipb 4
EXPORT_C Win2_Bands_Out,skipb 4
EXPORT_C COLDATA,skipl ; Actual data from COLDATA
CGAddress: skipl ; Palette position for writes to CGRAM
WMADDL: skipb ; Work RAM Address Lo Byte
WMADDM: skipb ; Work RAM Address Mid Byte
WMADDH: skipb ; Work RAM Address Hi Byte - Just bit 0 used!
skipb
JOYC1: skipb ; This holds the controller read control byte
Controller1_Pos: skipb ; Shift count for controller 1 read
Controller23_Pos: skipb ; Shift count for controller 2/3 read
Controller45_Pos: skipb ; Shift count for controller 4/5 read
RDDIVL: skipb ; Quotient of divide
RDDIVH: skipb
RDMPYL: skipb ; Multiplication or remainder
RDMPYH: skipb
WRMPYA: skipb ; Multiplicand A
WRMPYB: skipb ; Multiplicand B
WRDIVL: skipb ; Dividend C
WRDIVH: skipb
CGHigh: skipb ; Holds whether writing to first or second byte
CGReadHigh: skipb ; Whether reading lo or high byte
BGOFS_Last_Write:skipb
ALIGNB
JOY1L: skipb ; These are updated per VBL rather than per read!
JOY1H: skipb
skipw
JOY2L: skipb
JOY2H: skipb
skipw
JOY3L: skipb ; These are not updated yet
JOY3H: skipb
skipw
JOY4L: skipb
JOY4H: skipb
skipw
EXPORT_C Current_Line_Timing,skipl
EXPORT_C SETINI,skipb
EXPORT STAT78,skipb ; Enable support for field register
EXPORT Redo_BGs,skipb
EXPORT Redo_Offset_Change,skipb
EXPORT SCR_TM,skipb ; TM taken from here
EXPORT SCR_TS,skipb ; TS taken from here
EXPORT_C Layer_Disable_Mask,skipb ; This is used to force planes to disable!
EXPORT_C Layering_Mode,skipb
EXPORT BGMODE_Allowed_Layer_Mask,skipb
EXPORT BGMODE_Tile_Layer_Mask,skipb
EXPORT BGMODE_Allowed_Offset_Change,skipb
; MapAddress - base address of tilemap
; LMapAddress - address of tilemap for left 32 tiles
; RMapAddress - address of tilemap for right 32 tiles
; L/R will be same if tilemap only 32 tiles wide!
; VL/VR are vertically adjusted for current scanline
; SetAddress - address of tileset in cache
; FirstOffset - first pixel on visible screen in leftmost tile
; TileCount1 - count of visible tiles in left 32 tiles of tilemap
; TileCount2 - count of visible tiles in right 32 tiles of tilemap
; Redo - procedure used to recalculate first offset and tile counts
%macro BG_DATA 1
ALIGNB
EXPORT TableBG%1
EXPORT TileCount1BG%1,skipb
EXPORT TileCount2BG%1,skipb
EXPORT_C BGSC%1,skipb ; xxxxxxab xxxxxx=base address, ab=SC Size
EXPORT DepthBG%1,skipb
EXPORT Redo_BG%1,skipl
EXPORT FirstPixelBG%1,skipl
EXPORT FirstTileBG%1,skipl
EXPORT VScroll_%1,skipl
EXPORT HScroll_%1,skipl
EXPORT VLMapAddressBG%1,skipl
EXPORT VRMapAddressBG%1,skipl
LineRenderBG%1: skipl
EXPORT SetAddressBG%1,skipl ; Address of BG tileset
EXPORT LMapAddressBG%1,skipl
EXPORT RMapAddressBG%1,skipl
EXPORT MapAddressBG%1 ; Screen address of BG
EXPORT TLMapAddressBG%1,skipl
EXPORT TRMapAddressBG%1,skipl
EXPORT BLMapAddressBG%1,skipl
EXPORT BRMapAddressBG%1,skipl
TileHeightBG%1: skipb
TileWidthBG%1: skipb
EXPORT MosaicBG%1,skipb
EXPORT NBABG%1,skipb ; Unused in BG3/4
NBATableBG%1: skipl ; Unused in BG3/4
EXPORT M0_Color_BG%1,skipl
EXPORT Priority_Used_BG%1,skipb
EXPORT Priority_Unused_BG%1,skipb
EXPORT OC_Flag_BG%1,skipb ; Unused in BG3/4
%endmacro
BG_DATA 1
BG_DATA 2
BG_DATA 3
BG_DATA 4
EXPORT_EQU_C BG1SC,_BGSC1
EXPORT_EQU_C BG2SC,_BGSC2
EXPORT_EQU_C BG3SC,_BGSC3
EXPORT_EQU_C BG4SC,_BGSC4
EXPORT_EQU_C BG1HOFS,HScroll_1
EXPORT_EQU_C BG1VOFS,VScroll_1
EXPORT_EQU_C BG2HOFS,HScroll_2
EXPORT_EQU_C BG2VOFS,VScroll_2
EXPORT_EQU_C BG3HOFS,HScroll_3
EXPORT_EQU_C BG3VOFS,VScroll_3
EXPORT_EQU_C BG4HOFS,HScroll_4
EXPORT_EQU_C BG4VOFS,VScroll_4
PaletteData: skipw
section .text
ALIGNC
EXPORT Reset_Ports
pusha
call Reset_Sprites
call Reset_DMA
call _Reset_Mode_7
; cld
; mov edi,_PortRAM
; mov ecx,0x6000 / 4
; mov eax,-1 ; Reset to 0xFF
; push es
; push ds
; pop es
; rep stosd
; pop es
; Reset renderer
mov byte [_Layer_Disable_Mask],0xFF
mov al,[BGMODE_Allowed_Layer_Mask_Table]
mov [BGMODE_Allowed_Layer_Mask],al
mov al,[BGMODE_Tile_Layer_Mask_Table]
mov [BGMODE_Tile_Layer_Mask],al
mov al,[BGMODE_Allowed_Offset_Change_Table]
mov [BGMODE_Allowed_Offset_Change],al
; Set eax to 0, as we're setting most everything to 0...
xor eax,eax
mov dword [Render_Select],_Render_Layering_Option_0
mov byte [_Layering_Mode],0
mov dword [_LastRenderLine],223
mov [SCR_TM],al
mov [SCR_TS],al
mov [WMADDL],eax
mov [VRAMAddress],eax
mov dword [SCINC],1
mov [_VMAIN],al
mov [MOSAIC],al
mov [MosaicBG1],al
mov [MosaicBG2],al
mov [MosaicBG3],al
mov [MosaicBG4],al
mov dword [Mosaic_Size],1
mov dword [Mosaic_Size_Select],0
mov byte [STAT78],3
mov [CGAddress],eax
mov [CGHigh],al
mov [CGReadHigh],al
mov [BGOFS_Last_Write],al
mov [_BGSC1],al
mov [_BGSC2],al
mov [_BGSC3],al
mov [_BGSC4],al
mov byte [Redo_BGs],0x0F
mov byte [Redo_Offset_Change],0
mov [_BGMODE],al
mov [_Base_BGMODE],al
mov [_BG1SC],al
mov [_BG2SC],al
mov [_BG3SC],al
mov [_BG4SC],al
mov [_BG12NBA],al
mov [_BG34NBA],al
mov [NBABG1],al
mov [NBABG2],al
mov [NBABG3],al
mov [NBABG4],al
mov [WRMPYA],al
mov [WRDIVL],al
mov [WRDIVH],al
mov [RDDIVL],al
mov [RDDIVH],al
mov [RDMPYL],al
mov [RDMPYH],al
mov [_WH0],al
mov [_WH2],al
inc eax
mov [_WH1],al
mov [_WH3],al
dec eax
mov [_WBGLOG],al
mov [_WOBJLOG],al
mov [_W12SEL],al
mov [_W34SEL],al
mov [_WOBJSEL],al
mov [_TM],al
mov [_TS],al
mov [_SETINI],al
mov [_COLDATA],eax
mov [_CGWSEL],al
mov [_CGADSUB],al
mov [JOYC1],al
mov byte [Controller1_Pos],16
mov byte [Controller23_Pos],16
mov byte [Controller45_Pos],16
mov dword [JOY1L],(1<<31)
mov dword [JOY2L],(1<<31)
mov dword [JOY3L],(1<<31)
mov dword [JOY4L],(1<<31)
mov [_BrightnessLevel],al
mov byte [_INIDISP],0x80
mov dword [Redo_BG1],Redo_8
mov dword [Redo_BG2],Redo_8
mov dword [Redo_BG3],Redo_8
mov dword [Redo_BG4],Redo_8
mov [_BG1HOFS],eax
mov [_BG1VOFS],eax
mov [_BG2HOFS],eax
mov [_BG2VOFS],eax
mov [_BG3HOFS],eax
mov [_BG3VOFS],eax
mov [_BG4HOFS],eax
mov [_BG4VOFS],eax
mov [SetAddressBG1],eax
mov [SetAddressBG2],eax
mov [SetAddressBG3],eax
mov [SetAddressBG4],eax
mov dword [M0_Color_BG1],0x03030303
mov dword [M0_Color_BG2],0x23232323
mov dword [M0_Color_BG3],0x43434343
mov dword [M0_Color_BG4],0x63636363
mov byte [OC_Flag_BG1],0x20
mov byte [OC_Flag_BG2],0x40
mov dword [NBATableBG1],BGNBA_Table_2
mov dword [NBATableBG2],BGNBA_Table_2
mov dword [NBATableBG3],BGNBA_Table_2
mov dword [NBATableBG4],BGNBA_Table_2
mov dword [LineRenderBG1],_Render_8x8_C2
mov dword [LineRenderBG2],_Render_8x8_C2
mov dword [LineRenderBG3],_Render_8x8_C2
mov dword [LineRenderBG4],_Render_8x8_C2
mov byte [TileHeightBG1],1
mov byte [TileHeightBG2],1
mov byte [TileHeightBG3],1
mov byte [TileHeightBG4],1
mov byte [TileWidthBG1],1
mov byte [TileWidthBG2],1
mov byte [TileWidthBG3],1
mov byte [TileWidthBG4],1
mov byte [DepthBG1],1
mov byte [DepthBG2],1
mov byte [DepthBG3],1
mov byte [DepthBG4],1
mov eax,_VRAM
mov [TLMapAddressBG1],eax ;MapAddressBG1
mov [TLMapAddressBG2],eax ;MapAddressBG2
mov [TLMapAddressBG3],eax ;MapAddressBG3
mov [TLMapAddressBG4],eax ;MapAddressBG4
mov [TRMapAddressBG1],eax
mov [TRMapAddressBG2],eax
mov [TRMapAddressBG3],eax
mov [TRMapAddressBG4],eax
mov [BLMapAddressBG1],eax
mov [BLMapAddressBG2],eax
mov [BLMapAddressBG3],eax
mov [BLMapAddressBG4],eax
mov [BRMapAddressBG1],eax
mov [BRMapAddressBG2],eax
mov [BRMapAddressBG3],eax
mov [BRMapAddressBG4],eax
%if 0
mov [LMapAddressBG1],eax
mov [LMapAddressBG2],eax
mov [LMapAddressBG3],eax
mov [LMapAddressBG4],eax
mov [RMapAddressBG1],eax
mov [RMapAddressBG2],eax
mov [RMapAddressBG3],eax
mov [RMapAddressBG4],eax
%endif
mov dword [OffsetChangeMap_VOffset],0
mov dword [OffsetChangeVMap_VOffset],0
mov eax,[Screen_Mode]
mov [Render_Mode],eax
Set_21_Read 0x39,SNES_R2139_NORM
Set_21_Read 0x3A,SNES_R213A_NORM
Set_21_Write 0x15,SNES_W2115
Set_21_Write 0x18,SNES_W2118_NORM_First
Set_21_Write 0x19,SNES_W2119_NORM_First
popa
ret
; JOYPAD UPDATE FUNCTION.. now called during VBL to accomodate JOYC1 & JOYC2
ALIGNC
EXPORT UPDATE_CONTROLLERS
pusha
call UPDATE_JOYSTICKS
test byte [_NMITIMEN],1
jz .reset_controllers_read
mov byte [Controller1_Pos],0
mov byte [Controller23_Pos],0
mov byte [Controller45_Pos],0
.reset_controllers_read:
; UPDATE CONTROLLER 1
%if 0
cmp byte [_JOYSTICK_ENABLED],1
jne .controller_1_no_joystick
call _poll_joystick
; Below needs to be rewritten to support Allegro 3.1
mov al,0
cmp dword [_joy_b4],0 ; Is A pressed?
je .not_pressed_joy_1_a
or al,0x80
.not_pressed_joy_1_a:
cmp dword [_joy_b2],0 ; Is X pressed?
je .not_pressed_joy_1_x
or al,0x40
.not_pressed_joy_1_x:
cmp dword [_joy_b5],0 ; Is L pressed?
je .not_pressed_joy_1_l
or al,0x20
.not_pressed_joy_1_l:
cmp dword [_joy_b6],0 ; Is R pressed?
je .not_pressed_joy_1_r
or al,0x10
.not_pressed_joy_1_r:
mov [JOY1L],al
mov al,0
cmp dword [_joy_b3],0 ; Is B pressed?
je .not_pressed_joy_1_b
or al,0x80
.not_pressed_joy_1_b:
cmp dword [_joy_b1],0 ; Is Y pressed?
je .not_pressed_joy_1_y
or al,0x40
.not_pressed_joy_1_y:
JUMP_VAR_KEY_UP _KEY_SELECT_1,.not_pressed_joy_1_select,edx
; Is