📄 ppu.asm
字号:
%if 0
SNEeSe, an Open Source Super NES emulator.
Copyright (c) 1998-2004 Charles Bilyue'.
Portions Copyright (c) 2003-2004 Daniel Horchner.
This is free software. See 'LICENSE' for details.
You must read and accept the license prior to use.
%endif
;%define FORCE_MOSAIC 2
%define Set_Based_Tile_Cache
;%define Profile_VRAM_Writes
;%define Check_Within_Tile_Set
;%define NO_DMA_WRITE
;%define TRAP_BGHOFS
;%define TRAP_BGVOFS
; PPU.asm - Contains the hardware mapping functions
%define SNEeSe_ppu_ppu_asm
%include "misc.inc"
%include "ppu/ppu.inc"
%include "cpu/dma.inc"
%include "ppu/sprites.inc"
%include "ppu/screen.inc"
%include "ppu/tiles.inc"
%include "cpu/cpumem.inc"
%include "cycles.inc"
%include "cpu/regs.inc"
EXTERN SNES_R2137,SNES_R213C,SNES_R213D
EXTERN SNES_R4016,SNES_R4017
EXTERN SNES_R4200,SNES_R4202,SNES_R4203
EXTERN SNES_R4210,SNES_R4211,SNES_R4212,SNES_R4213
EXTERN SNES_R4214,SNES_R4215,SNES_R4216,SNES_R4217
EXTERN SNES_R4218,SNES_R4219,SNES_R421A,SNES_R421B
EXTERN SNES_R421C,SNES_R421D,SNES_R421E,SNES_R421F
EXTERN SNES_W4016,SNES_W4017
EXTERN SNES_W4200,SNES_W4201,SNES_W4202,SNES_W4203
EXTERN SNES_W4204,SNES_W4205,SNES_W4206,SNES_W4207
EXTERN SNES_W4208,SNES_W4209,SNES_W420A,SNES_W420B
EXTERN SNES_W420D,SNES_W4210
EXTERN HVBJOY
EXTERN_C LastRenderLine
EXTERN_C BrightnessLevel
EXTERN_C NMITIMEN
EXTERN_C Real_SNES_Palette
EXTERN OPHCT,OPVCT
EXTERN_C SNES_COUNTRY
EXTERN Ready_Line_Render
EXTERN_C PaletteChanged
EXTERN_C Offset_Change_Disable
EXTERN_C fixedpalettecheck
EXTERN_C SPC_MASK
EXTERN_C OutputScreen
EXTERN_C MosaicLine
EXTERN_C Map_Address,Map_Byte
EXTERN_C 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: Open Bus A
DUPLICATE dd,0x100,C_LABEL(CPU_OPEN_BUS_READ)
EXPORT_C Read_Map_21
; 2100-2103: Open Bus A
DUPLICATE dd,4,C_LABEL(CPU_OPEN_BUS_READ)
; 2104-2106: Open Bus B (PPU1)
DUPLICATE dd,3,C_LABEL(UNSUPPORTED_READ)
; 2107: Open Bus A
dd C_LABEL(CPU_OPEN_BUS_READ)
; 2108-210A: Open Bus B (PPU1)
DUPLICATE dd,3,C_LABEL(UNSUPPORTED_READ)
; 210B-2113: Open Bus A
DUPLICATE dd,9,C_LABEL(CPU_OPEN_BUS_READ)
; 2114-2116: Open Bus B (PPU1)
DUPLICATE dd,3,C_LABEL(UNSUPPORTED_READ)
; 2117: Open Bus A
dd C_LABEL(CPU_OPEN_BUS_READ)
; 2118-211A: Open Bus B (PPU1)
DUPLICATE dd,3,C_LABEL(UNSUPPORTED_READ)
; 211B-2123: Open Bus A
DUPLICATE dd,9,C_LABEL(CPU_OPEN_BUS_READ)
; 2124-2126: Open Bus B (PPU1)
DUPLICATE dd,3,C_LABEL(UNSUPPORTED_READ)
; 2127: Open Bus A
dd C_LABEL(CPU_OPEN_BUS_READ)
; 2128-212A: Open Bus B (PPU1)
DUPLICATE dd,3,C_LABEL(UNSUPPORTED_READ)
; 212B-2133: Open Bus A
DUPLICATE dd,9,C_LABEL(CPU_OPEN_BUS_READ)
dd SNES_R2134 ; MPYL
dd SNES_R2135 ; MPYM
dd SNES_R2136 ; MPYH
dd SNES_R2137 ; SLHV
dd SNES_R2138 ; OAMDATAREAD
dd SNES_R2139 ; VMDATALREAD
dd SNES_R213A ; 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,C_LABEL(UNSUPPORTED_READ) ; APUI00-APUI03
dd SNES_R2180 ; WMDATA ; 2180 WMDATA - read/write to Work RAM
; 2181-21FF: Open Bus A
DUPLICATE dd,0x7F,C_LABEL(CPU_OPEN_BUS_READ)
; 2200-3FFF: Open Bus A
DUPLICATE dd,0x1E00,C_LABEL(CPU_OPEN_BUS_READ)
EXPORT_C Read_Map_40
; 4000-4015: Open Bus A - 12 master cycles
DUPLICATE dd,0x16,C_LABEL(CPU_OPEN_BUS_READ_LEGACY)
dd SNES_R4016 ; JOYC1
dd SNES_R4017 ; JOYC2
; 4018-40FF: Open Bus A - 12 master cycles
DUPLICATE dd,0xE8,C_LABEL(CPU_OPEN_BUS_READ_LEGACY)
; 4100-41FF: Open Bus A - 12 master cycles
DUPLICATE dd,0x100,C_LABEL(CPU_OPEN_BUS_READ_LEGACY)
EXPORT_C Read_Map_42
; 4200-420F: Open Bus A
DUPLICATE dd,0x10,C_LABEL(CPU_OPEN_BUS_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
; 4220-42FF: Open Bus A
DUPLICATE dd,0xE0,C_LABEL(CPU_OPEN_BUS_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
; 4380-43FF: Open Bus A
DUPLICATE dd,0x80,C_LABEL(CPU_OPEN_BUS_READ)
; 4400-5FFF: Open Bus A
DUPLICATE dd,0x1C00,C_LABEL(CPU_OPEN_BUS_READ)
ALIGND
EXPORT_C Write_Map_20_5F
; 2000-20FF: Unmapped
DUPLICATE dd,0x100,C_LABEL(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,C_LABEL(UNSUPPORTED_WRITE)
DUPLICATE dd,0x40,C_LABEL(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,C_LABEL(UNSUPPORTED_WRITE)
; 2200-3FFF: Unmapped
DUPLICATE dd,0x1E00,C_LABEL(UNSUPPORTED_WRITE)
EXPORT_C Write_Map_40
DUPLICATE dd,0x16,C_LABEL(UNSUPPORTED_WRITE)
dd SNES_W4016 ; JOYC1
dd SNES_W4017 ; JOYC2
DUPLICATE dd,0xE8,C_LABEL(UNSUPPORTED_WRITE)
; 4100-41FF: Unmapped
DUPLICATE dd,0x100,C_LABEL(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,C_LABEL(UNSUPPORTED_WRITE)
%else
dd SNES_W420B ; MDMAEN
dd SNES_W420C ; HDMAEN
%endif
dd SNES_W420D ; MEMSEL
DUPLICATE dd,2,C_LABEL(UNSUPPORTED_WRITE)
dd C_LABEL(IGNORE_WRITE) ; RDNMI
dd C_LABEL(IGNORE_WRITE) ; TIMEUP
dd C_LABEL(IGNORE_WRITE) ; HVBJOY
dd C_LABEL(IGNORE_WRITE) ; RDIO
dd C_LABEL(IGNORE_WRITE) ; RDDIVL
dd C_LABEL(IGNORE_WRITE) ; RDDIVH
dd C_LABEL(IGNORE_WRITE) ; RDMPYL
dd C_LABEL(IGNORE_WRITE) ; RDMPYH
dd C_LABEL(IGNORE_WRITE) ; JOY1L
dd C_LABEL(IGNORE_WRITE) ; JOY1H
dd C_LABEL(IGNORE_WRITE) ; JOY2L
dd C_LABEL(IGNORE_WRITE) ; JOY2H
dd C_LABEL(IGNORE_WRITE) ; JOY3L
dd C_LABEL(IGNORE_WRITE) ; JOY3H
dd C_LABEL(IGNORE_WRITE) ; JOY4L
dd C_LABEL(IGNORE_WRITE) ; JOY4H
DUPLICATE dd,0xE0,C_LABEL(UNSUPPORTED_WRITE)
EXPORT_C Write_Map_43
%ifdef NO_DMA_WRITE
DUPLICATE dd,0x80,C_LABEL(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,C_LABEL(UNSUPPORTED_WRITE)
; 4400-5FFF: Unmapped
DUPLICATE dd,0x1C00,C_LABEL(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,C_LABEL(Render_8x8_C2)
dd C_LABEL(Render_8x8_C4),C_LABEL(Render_8x8_C8)
dd C_LABEL(SCREEN_MODE_7),C_LABEL(Render_Offset_8x8_C2)
dd C_LABEL(Render_Offset_8x8_C4),C_LABEL(Render_Offset_8x8_C8)
dd 0,C_LABEL(Render_8x8_C2)
LineRenderLarge:
dd 0,C_LABEL(Render_16x16_C2)
dd C_LABEL(Render_16x16_C4),C_LABEL(Render_16x16_C8)
dd C_LABEL(SCREEN_MODE_7),C_LABEL(Render_Offset_16x16_C2)
dd C_LABEL(Render_Offset_16x16_C4),C_LABEL(Render_Offset_16x16_C8)
dd 0,C_LABEL(Render_16x16_C2)
LineRenderEvenSmall:
dd 0,C_LABEL(Render_16x8_Even_C2)
dd C_LABEL(Render_16x8_Even_C4),0
dd C_LABEL(SCREEN_MODE_7),C_LABEL(Render_16x8_Even_C2)
;dd C_LABEL(Render_16x8_Even_C4),0
dd C_LABEL(Render_Offset_16x8_Even_C4),0
LineRenderEvenLarge:
dd 0,C_LABEL(Render_16x16_Even_C2)
dd C_LABEL(Render_16x16_Even_C4),0
dd C_LABEL(SCREEN_MODE_7),C_LABEL(Render_16x16_Even_C2)
;dd C_LABEL(Render_16x16_Even_C4),0
dd C_LABEL(Render_Offset_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 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
ALIGNB
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
VMDATAREAD_buffer:skipl
VMDATAREAD_update:skipl ;funcptr
CGHigh: skipb ; Holds whether writing to first or second byte
CGReadHigh: skipb ; Whether reading lo or high byte
BGOFS_Last_Write:skipb
EXPORT_C Current_Line_Timing,skipl
EXPORT_C SETINI,skipb
EXPORT STAT78,skipb ; Enable support for field register
EXPORT Redo_Offset_Change,skipb
EXPORT Redo_Offset_Change_VOffsets,skipb
EXPORT BGMODE_Allowed_Layer_Mask,skipb
EXPORT BGMODE_Tile_Layer_Mask,skipb
EXPORT BGMODE_Allowed_Offset_Change,skipb
%macro BG_WIN_DATA 2
EXPORT_C TableWin%2BG%1
EXPORT_C WinBG%1_%2_Count,skipb
EXPORT_C WinBG%1_%2_Bands,skipb 2*3
%endmacro
; MapAddress - base address of tilemap
; VMapAddress - address of tilemap vertically adjusted for current scanline
; WSEL - window area enable/invert bits from W12SEL/W34SEL
; WLOG - dual-window logic bits from WBGLOG
; VL/VR are vertically adjusted for current scanline
; VL/VR will be same if tilemap only 32 tiles wide!
; SetAddress - address of tileset in cache
%macro BG_DATA 1
ALIGNB
EXPORT_C TableBG%1
EXPORT WSELBG%1,skipb
EXPORT WLOGBG%1,skipb
EXPORT_C BGSC%1,skipb ; xxxxxxab xxxxxx=base address, ab=SC Size
EXPORT DepthBG%1,skipb
TileHeightBG%1: skipb
TileWidthBG%1: skipb
EXPORT MosaicBG%1,skipb
EXPORT NBABG%1,skipb ; Unused in BG3/4
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 VMapAddressBG%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
NBATableBG%1: skipl ; Unused in BG3/4
EXPORT LineCounter_BG%1,skipl
EXPORT M0_Color_BG%1,skipl
EXPORT BG_Flag_BG%1,skipb
EXPORT OC_Flag_BG%1,skipb ; Unused in BG3/4
; Unclipped display area: main screen
BG_WIN_DATA %1,Main
; Unclipped display area: sub screen
BG_WIN_DATA %1,Sub
; Used in layering; first screen area (second screen removed in 16-bit)
BG_WIN_DATA %1,Low
; Used in layering; second screen area (first screen removed)
BG_WIN_DATA %1,High
; Used in layering; area to draw for both screens (16-bit only)
BG_WIN_DATA %1,Both
EXPORT Priority_Used_BG%1,skipb
EXPORT Priority_Unused_BG%1,skipb
skipb 239*2
%endmacro
BG_DATA 1
BG_DATA 2
BG_DATA 3
BG_DATA 4
EXPORT_EQU_C BG1SC,C_LABEL(BGSC1)
EXPORT_EQU_C BG2SC,C_LABEL(BGSC2)
EXPORT_EQU_C BG3SC,C_LABEL(BGSC3)
EXPORT_EQU_C BG4SC,C_LABEL(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 C_LABEL(Reset_Sprites)
call C_LABEL(Reset_Mode_7)
call Invalidate_Tile_Caches
; Reset renderer
mov byte [C_LABEL(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],C_LABEL(Render_Layering_Option_0)
mov byte [C_LABEL(Layering_Mode)],0
mov dword [C_LABEL(LastRenderLine)],224
mov [Display_Needs_Update],al
mov byte [Redo_Windowing],-1
mov byte [Redo_Layering],-1
mov dword [Window_Offset_First],BG_Win_Main
mov dword [Window_Offset_Second],BG_Win_Sub
mov [Layers_Low],al
mov [Layers_High],al
mov [WMADDL],eax
mov [VRAMAddress],eax
mov dword [SCINC],1
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
%ifdef FORCE_MOSAIC
;***
mov byte [MOSAIC],0x0F + (FORCE_MOSAIC << 4)
mov byte [MosaicBG1],0x10
mov byte [MosaicBG2],0x20
mov byte [MosaicBG3],0x40
mov byte [MosaicBG4],0x80
mov dword [Mosaic_Size],FORCE_MOSAIC+1
mov dword [Mosaic_Size_Select],256*FORCE_MOSAIC
%endif
mov byte [STAT78],3
mov [CGAddress],eax
mov [CGHigh],al
mov [CGReadHigh],al
mov [BGOFS_Last_Write],al
mov [C_LABEL(BGSC1)],al
mov [C_LABEL(BGSC2)],al
mov [C_LABEL(BGSC3)],al
mov [C_LABEL(BGSC4)],al
mov byte [Redo_Offset_Change],0
mov byte [Redo_Offset_Change_VOffsets],0xFF
mov [C_LABEL(BGMODE)],al
mov [C_LABEL(Base_BGMODE)],al
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -