mirror of
https://github.com/lscharen/iigs-game-engine.git
synced 2024-06-29 21:29:34 +00:00
Secret sauce
This commit is contained in:
parent
aaf70af236
commit
cb13c2ae2d
|
@ -1 +1,4 @@
|
||||||
SMBStart EXT ; Base address of the ROM. Should be XX/8000 in the bank the ROM is loaded into
|
SMBStart EXT ; Base address of the ROM. Should be XX/8000 in the bank the ROM is loaded into
|
||||||
|
NonMaskableInterrupt EXT ; Called every VBL
|
||||||
|
ExtIn EXT
|
||||||
|
ROMBase EXT
|
718
demos/smb/Main.s
718
demos/smb/Main.s
|
@ -9,43 +9,735 @@
|
||||||
use GTE.Macs
|
use GTE.Macs
|
||||||
use Externals.s
|
use Externals.s
|
||||||
|
|
||||||
|
; Keycodes
|
||||||
|
LEFT_ARROW equ $08
|
||||||
|
RIGHT_ARROW equ $15
|
||||||
|
UP_ARROW equ $0B
|
||||||
|
DOWN_ARROW equ $0A
|
||||||
|
|
||||||
mx %00
|
mx %00
|
||||||
|
|
||||||
; Direct page space
|
; Direct page space
|
||||||
MyUserId equ 0
|
MyUserId equ 0
|
||||||
|
ROMStk equ 2
|
||||||
|
ROMZeroPg equ 4
|
||||||
|
LastScroll equ 6
|
||||||
|
Tmp0 equ 240
|
||||||
|
Tmp1 equ 242
|
||||||
|
Tmp2 equ 244
|
||||||
|
Tmp3 equ 246
|
||||||
|
|
||||||
phk
|
phk
|
||||||
plb
|
plb
|
||||||
sta MyUserId ; GS/OS passes the memory manager user ID for the application into the program
|
sta MyUserId ; GS/OS passes the memory manager user ID for the application into the program
|
||||||
|
|
||||||
_MTStartUp ; GTE requires the miscellaneous toolset to be running
|
_MTStartUp ; GTE requires the miscellaneous toolset to be running
|
||||||
|
|
||||||
pea $00A0 ; Load from System:Tools
|
stz LastScroll
|
||||||
pea $0100 ; Tool160, version 1.0
|
|
||||||
_LoadOneTool
|
|
||||||
|
|
||||||
clc ; Give GTE a page of direct page memory
|
; The next two direct pages will be used by GTE, so get another 2 pages beyond that for the ROM. We get
|
||||||
|
; 4K of DP/Stack space by default, so there is plenty to share
|
||||||
tdc
|
tdc
|
||||||
adc #$0100
|
clc
|
||||||
pha
|
adc #$300
|
||||||
pea $0000 ; Default fast mode
|
sta ROMZeroPg
|
||||||
lda MyUserId ; Pass the userId for memory allocation
|
clc
|
||||||
pha
|
adc #$1FF ; Stack starts at the top of the page
|
||||||
_GTEStartUp
|
sta ROMStk
|
||||||
|
|
||||||
|
* ldx #SMBStart
|
||||||
|
* jsr romxfer
|
||||||
|
|
||||||
|
* ; Call the main loop 23 times
|
||||||
|
* lda #23
|
||||||
|
* :pre pha
|
||||||
|
* jsr triggerNMI
|
||||||
|
* pla
|
||||||
|
* dec
|
||||||
|
* bne :pre
|
||||||
|
|
||||||
|
* :gloop
|
||||||
|
* jsr triggerNMI
|
||||||
|
* bra :gloop
|
||||||
|
|
||||||
|
* brl Quit
|
||||||
|
|
||||||
|
lda #ENGINE_MODE_USER_TOOL ; Engine in Fast Mode as a User Tool
|
||||||
|
jsr GTEStartUp ; Load and install the GTE User Tool
|
||||||
|
|
||||||
|
; Install a VBL callback task that we will use to invoke the NMI routine in the ROM
|
||||||
|
pea vblCallback
|
||||||
|
pea #^nmiTask
|
||||||
|
pea #nmiTask
|
||||||
|
_GTESetAddress
|
||||||
|
|
||||||
|
; Install a custom sprite renderer that will read directly off of the OAM table
|
||||||
|
pea extSpriteRenderer
|
||||||
|
pea #^drawOAMSprites
|
||||||
|
pea #drawOAMSprites
|
||||||
|
_GTESetAddress
|
||||||
|
|
||||||
|
; Get the address of a low-level routine that can be used to draw a tile directly to the graphics screen
|
||||||
|
pea rawDrawTile
|
||||||
|
_GTEGetAddress
|
||||||
|
lda 1,s
|
||||||
|
sta drawTilePatch+1
|
||||||
|
lda 2,s
|
||||||
|
sta drawTilePatch+2
|
||||||
|
pla
|
||||||
|
plx
|
||||||
|
|
||||||
; Initialize the graphics screen playfield (256x160). The NES is 240 lines high, so 160
|
; Initialize the graphics screen playfield (256x160). The NES is 240 lines high, so 160
|
||||||
; is a reasonable compromise.
|
; is a reasonable compromise.
|
||||||
|
|
||||||
pea #160
|
pea #128
|
||||||
pea #200
|
pea #200
|
||||||
_GTESetScreenMode
|
_GTESetScreenMode
|
||||||
|
|
||||||
|
pea $0000
|
||||||
|
pea #^Greyscale
|
||||||
|
pea #Greyscale
|
||||||
|
_GTESetPalette
|
||||||
|
|
||||||
; Convert the CHR ROM from the cart into GTE tiles
|
; Convert the CHR ROM from the cart into GTE tiles
|
||||||
|
|
||||||
; jsr LoadTilesFromROM
|
ldx #0
|
||||||
|
ldy #0
|
||||||
|
:tloop
|
||||||
|
phx
|
||||||
|
phy
|
||||||
|
|
||||||
|
lda #TileBuff
|
||||||
|
jsr ConvertROMTile
|
||||||
|
|
||||||
|
lda 1,s
|
||||||
|
|
||||||
|
pha
|
||||||
|
inc
|
||||||
|
pha
|
||||||
|
pea #^TileBuff
|
||||||
|
pea #TileBuff
|
||||||
|
_GTELoadTileSet
|
||||||
|
|
||||||
|
ply
|
||||||
|
iny
|
||||||
|
|
||||||
|
pla
|
||||||
|
clc
|
||||||
|
adc #16 ; NES tiles are 16 bytes
|
||||||
|
tax
|
||||||
|
cpx #512*16
|
||||||
|
bcc :tloop
|
||||||
|
|
||||||
|
; Put the tile set on the screen
|
||||||
|
|
||||||
|
* lda #0
|
||||||
|
* stz Tmp1
|
||||||
|
* :yloop stz Tmp0
|
||||||
|
* :xloop
|
||||||
|
* pha
|
||||||
|
* pei Tmp0
|
||||||
|
* pei Tmp1
|
||||||
|
* pha
|
||||||
|
* _GTESetTile
|
||||||
|
* pla
|
||||||
|
* inc
|
||||||
|
|
||||||
|
* inc Tmp0
|
||||||
|
* ldx Tmp0
|
||||||
|
* cpx #32
|
||||||
|
* bcc :xloop
|
||||||
|
|
||||||
|
* inc Tmp1
|
||||||
|
* ldx Tmp1
|
||||||
|
* cpx #20
|
||||||
|
* bcc :yloop
|
||||||
|
|
||||||
|
* ; Render and wait for the user to continue
|
||||||
|
* pea $0000
|
||||||
|
* _GTERender
|
||||||
|
|
||||||
|
* :wait1
|
||||||
|
* pha
|
||||||
|
* _GTEReadControl
|
||||||
|
* pla
|
||||||
|
* and #$007F
|
||||||
|
* cmp #' '
|
||||||
|
* bne :wait1
|
||||||
|
|
||||||
|
; Set an internal flag to tell the VBL interrupt handler that it is
|
||||||
|
; ok to start invoking the game logic. The ROM code has to be run
|
||||||
|
; at 60 Hz because it controls the audio. Bad audio is way worse
|
||||||
|
; than a choppy refresh rate.
|
||||||
|
;
|
||||||
|
; Call the boot code in the ROM
|
||||||
|
|
||||||
|
ldx #SMBStart
|
||||||
|
jsr romxfer
|
||||||
|
|
||||||
|
EvtLoop
|
||||||
|
:spin lda ppustatus ; Set the bit that the VBL has started
|
||||||
|
bit #$80
|
||||||
|
beq :spin
|
||||||
|
and #$FF7F
|
||||||
|
sta ppustatus
|
||||||
|
|
||||||
|
jsr triggerNMI
|
||||||
|
|
||||||
|
lda #$2000
|
||||||
|
jsr CopyNametable
|
||||||
|
|
||||||
|
lda ppuscroll+1
|
||||||
|
and #$00FF
|
||||||
|
lsr
|
||||||
|
pha
|
||||||
|
sta LastScroll
|
||||||
|
lda ppuscroll
|
||||||
|
and #$00FF
|
||||||
|
pha
|
||||||
|
_GTESetBG0Origin
|
||||||
|
|
||||||
|
pea $FFFF ; NES mode
|
||||||
|
_GTERender
|
||||||
|
|
||||||
|
pha
|
||||||
|
_GTEReadControl
|
||||||
|
pla
|
||||||
|
|
||||||
|
; Map the GTE field to the NES controller format: A-B-Select-Start-Up-Down-Left-Right
|
||||||
|
|
||||||
|
pha
|
||||||
|
and #PAD_BUTTON_A+PAD_BUTTON_B ; bits 0x200 and 0x100
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
sta native_joy
|
||||||
|
lda 1,s
|
||||||
|
and #$00FF
|
||||||
|
cmp #'n'
|
||||||
|
bne *+7
|
||||||
|
lda #$0020
|
||||||
|
bra :nes_merge
|
||||||
|
cmp #'m'
|
||||||
|
bne *+7
|
||||||
|
lda #$0010
|
||||||
|
bra :nes_merge
|
||||||
|
cmp #UP_ARROW
|
||||||
|
bne *+7
|
||||||
|
lda #$0008
|
||||||
|
bra :nes_merge
|
||||||
|
cmp #DOWN_ARROW
|
||||||
|
bne *+7
|
||||||
|
lda #$0004
|
||||||
|
bra :nes_merge
|
||||||
|
cmp #LEFT_ARROW
|
||||||
|
bne *+7
|
||||||
|
lda #$0002
|
||||||
|
bra :nes_merge
|
||||||
|
cmp #RIGHT_ARROW
|
||||||
|
bne :nes_done
|
||||||
|
lda #$0001
|
||||||
|
:nes_merge ora native_joy
|
||||||
|
sta native_joy
|
||||||
|
:nes_done
|
||||||
|
pla
|
||||||
|
; bit #PAD_KEY_DOWN
|
||||||
|
; bne *+5
|
||||||
|
; brl EvtLoop
|
||||||
|
|
||||||
|
and #$007F
|
||||||
|
|
||||||
|
cmp #'1' ; Copy nametable 1
|
||||||
|
bne :not_1
|
||||||
|
lda #$2000
|
||||||
|
jsr CopyNametable
|
||||||
|
brl EvtLoop
|
||||||
|
:not_1
|
||||||
|
|
||||||
|
cmp #'2'
|
||||||
|
bne :not_2
|
||||||
|
lda #$2400
|
||||||
|
jsr CopyNametable
|
||||||
|
:not_2
|
||||||
|
|
||||||
|
cmp #'s' ; next step
|
||||||
|
bne :not_n
|
||||||
|
jsr triggerNMI
|
||||||
|
:not_n
|
||||||
|
|
||||||
|
cmp #'q'
|
||||||
|
beq Exit
|
||||||
|
brl EvtLoop
|
||||||
|
|
||||||
|
Exit
|
||||||
_GTEShutDown
|
_GTEShutDown
|
||||||
|
Quit
|
||||||
_QuitGS qtRec
|
_QuitGS qtRec
|
||||||
qtRec adrl $0000
|
qtRec adrl $0000
|
||||||
da $00
|
da $00
|
||||||
|
Greyscale dw $0000,$5555,$AAAA,$FFFF
|
||||||
|
dw $0000,$5555,$AAAA,$FFFF
|
||||||
|
dw $0000,$5555,$AAAA,$FFFF
|
||||||
|
dw $0000,$5555,$AAAA,$FFFF
|
||||||
|
|
||||||
|
; Copy the tile and attribute bytes into the GTE buffer
|
||||||
|
;
|
||||||
|
; A = Nametable address ($2000, $2400, $2800, or $2C00)
|
||||||
|
CopyNametable
|
||||||
|
lda ppuctrl
|
||||||
|
and #$0003 ; nametable select bits
|
||||||
|
xba
|
||||||
|
asl
|
||||||
|
asl
|
||||||
|
clc
|
||||||
|
adc #2*32
|
||||||
|
sta Tmp0 ; base address offset into nametable memory
|
||||||
|
|
||||||
|
; ora #$2000
|
||||||
|
; clc
|
||||||
|
; adc #PPU_MEM
|
||||||
|
; clc
|
||||||
|
; adc #2*32
|
||||||
|
; sta Tmp0 ; base address
|
||||||
|
|
||||||
|
; NES RAM $6D = page, $86 = player_x_in_page can be used to get a global position in the level, then subtracting the
|
||||||
|
; player's x coordinate will give us the global coordinate of the left edge of the screen and allow us to map between
|
||||||
|
; the GTE tile buffer and the PPU nametables
|
||||||
|
|
||||||
|
lda ppuscroll+1
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
and #$001F
|
||||||
|
sta Tmp1 ; starting offset
|
||||||
|
|
||||||
|
; Copy the first two rows from $2400 because they don't scroll
|
||||||
|
|
||||||
|
ldy #0
|
||||||
|
:yloop
|
||||||
|
ldx #0
|
||||||
|
|
||||||
|
cpy #2
|
||||||
|
bcs :offset
|
||||||
|
|
||||||
|
tya
|
||||||
|
clc
|
||||||
|
adc #2
|
||||||
|
asl
|
||||||
|
asl
|
||||||
|
asl
|
||||||
|
asl
|
||||||
|
asl
|
||||||
|
|
||||||
|
; lda #$0000+{2*32}
|
||||||
|
sta Tmp2
|
||||||
|
lda #0
|
||||||
|
sta Tmp3
|
||||||
|
bra :xloop
|
||||||
|
|
||||||
|
:offset
|
||||||
|
lda Tmp0 ; Get the base address for this line
|
||||||
|
ora Tmp1 ; Move over to the first horizontal tile
|
||||||
|
sta Tmp2 ; coarse x-scroll
|
||||||
|
|
||||||
|
lda Tmp1
|
||||||
|
sta Tmp3 ; Keep a separate count for the GTE tile position
|
||||||
|
:xloop
|
||||||
|
phx ; Save X and Y
|
||||||
|
phy
|
||||||
|
|
||||||
|
pei Tmp3 ; Wrap-around tile column
|
||||||
|
phy ; No vertical scroll, so screen_y = tile_y
|
||||||
|
|
||||||
|
ldx Tmp2 ; Nametable address
|
||||||
|
lda PPU_MEM+$2000,x
|
||||||
|
and #$00FF
|
||||||
|
ora #$0100
|
||||||
|
pha
|
||||||
|
|
||||||
|
; Advance to the next tile (handle nametable wrapping)
|
||||||
|
|
||||||
|
lda #$001F
|
||||||
|
and Tmp2
|
||||||
|
cmp #$001F
|
||||||
|
bne :inc_x
|
||||||
|
txa
|
||||||
|
and #$FFE0
|
||||||
|
eor #$0400
|
||||||
|
sta Tmp2
|
||||||
|
bra :x_hop
|
||||||
|
|
||||||
|
:inc_x inx
|
||||||
|
stx Tmp2
|
||||||
|
:x_hop
|
||||||
|
|
||||||
|
_GTESetTile
|
||||||
|
|
||||||
|
ply
|
||||||
|
plx
|
||||||
|
|
||||||
|
lda Tmp3
|
||||||
|
inc
|
||||||
|
cmp #41
|
||||||
|
bcc *+5
|
||||||
|
lda #0
|
||||||
|
sta Tmp3
|
||||||
|
|
||||||
|
inx
|
||||||
|
cpx #33
|
||||||
|
bcc :xloop
|
||||||
|
|
||||||
|
lda Tmp0
|
||||||
|
clc
|
||||||
|
adc #32
|
||||||
|
sta Tmp0
|
||||||
|
|
||||||
|
iny
|
||||||
|
cpy #25
|
||||||
|
bcc :yloop
|
||||||
|
|
||||||
|
rts
|
||||||
|
|
||||||
|
; Trigger an NMI in the ROM
|
||||||
|
triggerNMI
|
||||||
|
ldal ppuctrl ; If the ROM has not enabled VBL NMI, also skip
|
||||||
|
bit #$80
|
||||||
|
beq :skip
|
||||||
|
|
||||||
|
lda ppustatus ; Set the bit that the VBL has started
|
||||||
|
ora #$80
|
||||||
|
sta ppustatus
|
||||||
|
|
||||||
|
ldx #NonMaskableInterrupt
|
||||||
|
jmp romxfer
|
||||||
|
:skip rts
|
||||||
|
|
||||||
|
; Expose joypad bits from GTE to the ROM: A-B-Select-Start-Up-Down-Left-Right
|
||||||
|
native_joy ENT
|
||||||
|
db 0,0
|
||||||
|
|
||||||
|
; X = address in the rom file
|
||||||
|
; A = address to write
|
||||||
|
|
||||||
|
ConvertROMTile
|
||||||
|
DPtr equ Tmp1
|
||||||
|
MPtr equ Tmp2
|
||||||
|
|
||||||
|
sta DPtr
|
||||||
|
clc
|
||||||
|
adc #32 ; Move to the mask
|
||||||
|
sta MPtr
|
||||||
|
lda #0 ; Clear A and B
|
||||||
|
|
||||||
|
sep #$20 ; 8-bit mode
|
||||||
|
ldy #0
|
||||||
|
|
||||||
|
:loop
|
||||||
|
lda CHR_ROM,x ; Load the high bits
|
||||||
|
rol
|
||||||
|
rol
|
||||||
|
rol
|
||||||
|
rol
|
||||||
|
and #$06
|
||||||
|
sta Tmp0
|
||||||
|
|
||||||
|
lda CHR_ROM+8,x
|
||||||
|
and #$C0
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
ora Tmp0 ; Combine the two and create a lookup value
|
||||||
|
|
||||||
|
phx
|
||||||
|
tax
|
||||||
|
lda DLUT,x ; Look up the two, 4-bit pixel values for this quad of bits
|
||||||
|
sta (DPtr),y
|
||||||
|
lda MLUT,x
|
||||||
|
sta (MPtr),y
|
||||||
|
iny
|
||||||
|
plx
|
||||||
|
|
||||||
|
; Repeat for bits 4 & 5
|
||||||
|
|
||||||
|
ldal CHR_ROM,x ; Load the high bits
|
||||||
|
and #$30
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
sta Tmp0
|
||||||
|
|
||||||
|
ldal CHR_ROM+8,x
|
||||||
|
and #$30
|
||||||
|
lsr
|
||||||
|
ora Tmp0 ; Combine the two and create a lookup value
|
||||||
|
|
||||||
|
phx
|
||||||
|
tax
|
||||||
|
lda DLUT,x
|
||||||
|
sta (DPtr),y
|
||||||
|
lda MLUT,x
|
||||||
|
sta (MPtr),y
|
||||||
|
iny
|
||||||
|
plx
|
||||||
|
|
||||||
|
; Repeat for bits 2 & 3
|
||||||
|
|
||||||
|
ldal CHR_ROM,x ; Load the high bits
|
||||||
|
and #$0C
|
||||||
|
lsr
|
||||||
|
sta Tmp0
|
||||||
|
|
||||||
|
ldal CHR_ROM+8,x
|
||||||
|
and #$0C
|
||||||
|
asl
|
||||||
|
ora Tmp0 ; Combine the two and create a lookup value
|
||||||
|
|
||||||
|
phx
|
||||||
|
tax
|
||||||
|
lda DLUT,x
|
||||||
|
sta (DPtr),y
|
||||||
|
lda MLUT,x
|
||||||
|
sta (MPtr),y
|
||||||
|
iny
|
||||||
|
plx
|
||||||
|
|
||||||
|
; Repeat for bits 0 & 1
|
||||||
|
|
||||||
|
ldal CHR_ROM,x ; Load the high bits
|
||||||
|
and #$03
|
||||||
|
asl
|
||||||
|
sta Tmp0
|
||||||
|
|
||||||
|
ldal CHR_ROM+8,x
|
||||||
|
and #$03
|
||||||
|
asl
|
||||||
|
asl
|
||||||
|
asl
|
||||||
|
ora Tmp0 ; Combine the two and create a lookup value
|
||||||
|
|
||||||
|
phx
|
||||||
|
tax
|
||||||
|
lda DLUT,x
|
||||||
|
sta (DPtr),y
|
||||||
|
lda MLUT,x
|
||||||
|
sta (MPtr),y
|
||||||
|
iny
|
||||||
|
plx
|
||||||
|
|
||||||
|
inx
|
||||||
|
cpy #32
|
||||||
|
bcs :done
|
||||||
|
brl :loop
|
||||||
|
:done
|
||||||
|
rep #$20
|
||||||
|
|
||||||
|
; Flip the tile before returning
|
||||||
|
ldy #16
|
||||||
|
ldx DPtr
|
||||||
|
:rloop
|
||||||
|
lda: 0,x
|
||||||
|
jsr reverse
|
||||||
|
sta: 66,x
|
||||||
|
lda: 2,x
|
||||||
|
jsr reverse
|
||||||
|
sta: 64,x
|
||||||
|
inx
|
||||||
|
inx
|
||||||
|
inx
|
||||||
|
inx
|
||||||
|
dey
|
||||||
|
bne :rloop
|
||||||
|
rts
|
||||||
|
|
||||||
|
reverse
|
||||||
|
xba
|
||||||
|
sta Tmp0
|
||||||
|
and #$0F0F
|
||||||
|
asl
|
||||||
|
asl
|
||||||
|
asl
|
||||||
|
asl
|
||||||
|
sta Tmp1
|
||||||
|
lda Tmp0
|
||||||
|
and #$F0F0
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
lsr
|
||||||
|
ora Tmp1
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
DLUT dw $00,$01,$10,$11 ; CHR_ROM[0] = xx, CHR_ROM[8] = 00
|
||||||
|
dw $02,$03,$12,$13 ; CHR_ROM[0] = xx, CHR_ROM[8] = 01
|
||||||
|
dw $20,$21,$30,$31 ; CHR_ROM[0] = xx, CHR_ROM[8] = 10
|
||||||
|
dw $22,$23,$32,$33 ; CHR_ROM[0] = xx, CHR_ROM[8] = 11
|
||||||
|
|
||||||
|
MLUT dw $FF,$F0,$0F,$00
|
||||||
|
dw $F0,$F0,$00,$00
|
||||||
|
dw $0F,$00,$0F,$00
|
||||||
|
dw $00,$00,$00,$00
|
||||||
|
|
||||||
|
; Extracted tiles
|
||||||
|
TileBuff ds 128
|
||||||
|
|
||||||
|
GTEStartUp
|
||||||
|
pha ; Save engine mode
|
||||||
|
|
||||||
|
pea $0000
|
||||||
|
_LoaderStatus
|
||||||
|
pla
|
||||||
|
|
||||||
|
pea $0000
|
||||||
|
pea $0000
|
||||||
|
pea $0000
|
||||||
|
pea $0000
|
||||||
|
pea $0000 ; result space
|
||||||
|
|
||||||
|
lda MyUserId
|
||||||
|
pha
|
||||||
|
|
||||||
|
pea #^ToolPath
|
||||||
|
pea #ToolPath
|
||||||
|
pea $0001 ; do not load into special memory
|
||||||
|
_InitialLoad
|
||||||
|
bcc *+4
|
||||||
|
brk $01
|
||||||
|
|
||||||
|
ply
|
||||||
|
pla ; Address of the loaded tool
|
||||||
|
plx
|
||||||
|
ply
|
||||||
|
ply
|
||||||
|
|
||||||
|
pea $8000 ; User toolset
|
||||||
|
pea $00A0 ; Set the tool set number
|
||||||
|
phx
|
||||||
|
pha ; Address of function pointer table
|
||||||
|
_SetTSPtr
|
||||||
|
bcc *+4
|
||||||
|
brk $02
|
||||||
|
|
||||||
|
plx ; Pop the Engine Mode value
|
||||||
|
|
||||||
|
clc ; Give GTE two pages of direct page memory
|
||||||
|
tdc
|
||||||
|
adc #$0100
|
||||||
|
pha
|
||||||
|
phx
|
||||||
|
lda MyUserId ; Pass the userId for memory allocation
|
||||||
|
pha
|
||||||
|
_GTEStartUp
|
||||||
|
bcc *+4
|
||||||
|
brk $03
|
||||||
|
|
||||||
|
rts
|
||||||
|
|
||||||
|
ToolPath str '1/Tool160'
|
||||||
|
|
||||||
|
* ; Store sprite and tile data as 0000000w wxxyyzz0 to facilitate swizzle loads
|
||||||
|
|
||||||
|
* ; sprite high priority (8-bit acc, compiled)
|
||||||
|
* ldy #PPU_DATA
|
||||||
|
* lda screen
|
||||||
|
* andl tilemask,x
|
||||||
|
* ora (palptr),y ; 512 byte lookup table per palette
|
||||||
|
* sta screen
|
||||||
|
|
||||||
|
* ; sprite low (this is just slow) ....
|
||||||
|
* lda screen
|
||||||
|
* beq empty
|
||||||
|
* ; do 4 bits to figure out a mask and then
|
||||||
|
|
||||||
|
|
||||||
|
* bit #$FF00
|
||||||
|
* ...
|
||||||
|
* ...
|
||||||
|
* ldy #PPU_DATA
|
||||||
|
* lda (palptr),y
|
||||||
|
* eor screen
|
||||||
|
* andl tilemask,x
|
||||||
|
* and bgmask
|
||||||
|
* eor screen
|
||||||
|
* sta screen
|
||||||
|
|
||||||
|
* ; tile
|
||||||
|
* ldy tiledata,x
|
||||||
|
* lda (palptr),y
|
||||||
|
* ldy tmp
|
||||||
|
* sta abs,y
|
||||||
|
|
||||||
|
|
||||||
|
* ; Custom tile renderer that swizzles the tile data based on the PPU attribute tables. This
|
||||||
|
* ; is more complicate than just combining the palette select bits with the tile index bits
|
||||||
|
* ; because the NES can have >16 colors on screen at once, we remap the possible colors
|
||||||
|
* ; onto a smaller set of indices.
|
||||||
|
* SwizzleTile
|
||||||
|
* tax
|
||||||
|
* ]line equ 0
|
||||||
|
* lup 8
|
||||||
|
* ldal tiledata+{]line*4},x ; Tile data is 00ww00xx 00yy00zz
|
||||||
|
* ora metatile ; Pre-calculated metatile mask
|
||||||
|
* and tilemask+{]line*4},x ; Set any zero indices to actual zero
|
||||||
|
* sta: $0004+{]line*$1000},y
|
||||||
|
* ldal tiledata+{]line*4}+2,x
|
||||||
|
* sta: $0001+{]line*$1000},y
|
||||||
|
* ]line equ ]line+1
|
||||||
|
* --^
|
||||||
|
* plb
|
||||||
|
* rts
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
; Transfer control to the ROM. This function is trampoline that is responsible for
|
||||||
|
; setting up the direct page and stack for the ROM and then passing control into
|
||||||
|
; the ROM wrapped in a JSL/RTL vector stashed in the ROM space.
|
||||||
|
;
|
||||||
|
; X = ROM Address
|
||||||
|
romxfer phb ; Save the bank and direct page
|
||||||
|
phd
|
||||||
|
tsc
|
||||||
|
sta StkSave+1 ; Save the current stack in the main program
|
||||||
|
pea #^ExtIn ; Set the bank to the ROM
|
||||||
|
plb
|
||||||
|
|
||||||
|
lda ROMStk ; Set the ROM stack address
|
||||||
|
tcs
|
||||||
|
lda ROMZeroPg ; Set the ROM zero page
|
||||||
|
tcd
|
||||||
|
|
||||||
|
jml ExtIn
|
||||||
|
ExtRtn ENT
|
||||||
|
tsx ; Copy the stack address returned by the emulator
|
||||||
|
StkSave lda #$0000
|
||||||
|
tcs
|
||||||
|
|
||||||
|
pld
|
||||||
|
plb
|
||||||
|
stx ROMStk ; Keep an updated copy of the stack address
|
||||||
|
rts
|
||||||
|
|
||||||
|
; VBL Interrupt task (called in native 8-bit mode)
|
||||||
|
mx %11
|
||||||
|
nmiTask
|
||||||
|
ldal ppustatus ; Set the bit that the VBL has started
|
||||||
|
ora #$80
|
||||||
|
stal ppustatus
|
||||||
|
|
||||||
|
ldal ppuctrl
|
||||||
|
bit #$80 ; Should an NMI be generated with the VBL?
|
||||||
|
beq :skip
|
||||||
|
|
||||||
|
php
|
||||||
|
; jsr triggerNMI
|
||||||
|
plp
|
||||||
|
:skip
|
||||||
|
rtl
|
||||||
|
mx %00
|
||||||
|
put palette.s
|
||||||
|
put ppu.s
|
||||||
|
|
||||||
|
ds \,$00 ; pad to the next page boundary
|
||||||
|
PPU_MEM
|
||||||
|
CHR_ROM put chr2.s ; 8K of CHR-ROM at PPU memory $0000 - $2000
|
||||||
|
PPU_NT ds $2000 ; Nametable memory from $2000 - $3000, $3F00 - $3F14 is palette RAM
|
||||||
|
PPU_OAM ds 256 ; 256 bytes of separate OAM RAM
|
||||||
|
|
||||||
|
|
|
@ -14,3 +14,4 @@ REM Cadius does not overwrite files, so clear the root folder first
|
||||||
|
|
||||||
REM Now copy files and folders as needed
|
REM Now copy files and folders as needed
|
||||||
%CADIUS% ADDFILE %IMAGE% %FOLDER% .\SuperMarioGS
|
%CADIUS% ADDFILE %IMAGE% %FOLDER% .\SuperMarioGS
|
||||||
|
%CADIUS% ADDFILE %IMAGE% %FOLDER% ..\..\src\Tool160
|
||||||
|
|
512
demos/smb/chr2.s
Normal file
512
demos/smb/chr2.s
Normal file
|
@ -0,0 +1,512 @@
|
||||||
|
db $03,$0F,$1F,$1F,$1C,$24,$26,$66,$00,$00,$00,$00,$1F,$3F,$3F,$7F
|
||||||
|
db $E0,$C0,$80,$FC,$80,$C0,$00,$20,$00,$20,$60,$00,$F0,$FC,$FE,$FE
|
||||||
|
db $60,$70,$18,$07,$0F,$1F,$3F,$7F,$7F,$7F,$1F,$07,$00,$1E,$3F,$7F
|
||||||
|
db $FC,$7C,$00,$00,$E0,$F0,$F8,$F8,$FC,$FC,$F8,$C0,$C2,$67,$2F,$37
|
||||||
|
db $7F,$7F,$FF,$FF,$07,$07,$0F,$0F,$7F,$7E,$FC,$F0,$F8,$F8,$F0,$70
|
||||||
|
db $FD,$FE,$B4,$F8,$F8,$F9,$FB,$FF,$37,$36,$5C,$00,$00,$01,$03,$1F
|
||||||
|
db $1F,$3F,$FF,$FF,$FC,$70,$70,$38,$08,$24,$E3,$F0,$F8,$70,$70,$38
|
||||||
|
db $FF,$FF,$FF,$1F,$00,$00,$00,$00,$1F,$1F,$1F,$1F,$00,$00,$00,$00
|
||||||
|
db $00,$00,$01,$07,$0F,$0F,$0E,$12,$00,$00,$00,$00,$00,$00,$0F,$1F
|
||||||
|
db $00,$00,$F0,$E0,$C0,$FE,$40,$60,$00,$00,$00,$10,$30,$00,$F8,$FE
|
||||||
|
db $13,$33,$30,$18,$04,$0F,$1F,$1F,$1F,$3F,$3F,$1F,$07,$08,$17,$17
|
||||||
|
db $00,$10,$7E,$3E,$00,$00,$C0,$E0,$FF,$FF,$FE,$FE,$FC,$E0,$40,$A0
|
||||||
|
db $3F,$3F,$3F,$1F,$1F,$1F,$1F,$1F,$37,$27,$23,$03,$01,$00,$00,$00
|
||||||
|
db $F0,$F0,$F0,$F8,$F8,$F8,$F8,$F8,$CC,$FF,$FF,$FF,$FF,$70,$00,$08
|
||||||
|
db $FF,$FF,$FF,$FE,$F0,$C0,$80,$00,$F0,$F0,$F0,$F0,$F0,$C0,$80,$00
|
||||||
|
db $FC,$FC,$F8,$78,$78,$78,$7E,$7E,$10,$60,$80,$00,$78,$78,$7E,$7E
|
||||||
|
db $00,$03,$0F,$1F,$1F,$1C,$24,$26,$00,$00,$00,$00,$00,$1F,$3F,$3F
|
||||||
|
db $00,$E0,$C0,$80,$FC,$80,$C0,$00,$00,$00,$20,$60,$00,$F0,$FC,$FE
|
||||||
|
db $66,$60,$30,$18,$0F,$1F,$3F,$3F,$7F,$7F,$3F,$1F,$00,$16,$2F,$2F
|
||||||
|
db $20,$FC,$7C,$00,$00,$E0,$E0,$F0,$FE,$FC,$FC,$F8,$C0,$60,$20,$30
|
||||||
|
db $3F,$3F,$3F,$3F,$3F,$3F,$3F,$1F,$2F,$2F,$2F,$0F,$07,$03,$00,$00
|
||||||
|
db $F0,$90,$00,$08,$0C,$1C,$FC,$F8,$10,$F0,$F0,$F0,$F0,$E0,$C0,$E0
|
||||||
|
db $0F,$0F,$07,$07,$07,$0F,$0F,$03,$01,$03,$01,$04,$07,$0F,$0F,$03
|
||||||
|
db $F8,$F0,$E0,$F0,$B0,$80,$E0,$E0,$F8,$F0,$E0,$70,$B0,$80,$E0,$E0
|
||||||
|
db $03,$3F,$7F,$19,$09,$09,$28,$5C,$00,$30,$70,$7F,$FF,$FF,$F7,$F3
|
||||||
|
db $F8,$E0,$E0,$FC,$26,$30,$80,$10,$00,$18,$10,$00,$F8,$F8,$FE,$FF
|
||||||
|
db $3E,$1E,$3F,$38,$30,$30,$00,$3A,$E7,$0F,$0F,$1F,$1F,$1F,$0F,$07
|
||||||
|
db $78,$1E,$80,$FE,$7E,$7E,$7F,$7F,$FF,$FE,$FC,$C6,$8E,$EE,$FF,$FF
|
||||||
|
db $3C,$3F,$1F,$0F,$07,$3F,$21,$20,$03,$00,$00,$0E,$07,$3F,$3F,$3F
|
||||||
|
db $FF,$FF,$FF,$FE,$FE,$FE,$FC,$70,$FF,$7F,$3F,$0E,$C0,$C0,$E0,$E0
|
||||||
|
db $0F,$9F,$CF,$FF,$7F,$3F,$1E,$0E,$00,$80,$C8,$FE,$7F,$3F,$1E,$0E
|
||||||
|
db $20,$C0,$80,$80,$00,$00,$00,$00,$E0,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $00,$00,$03,$0F,$1F,$1F,$1C,$24,$00,$00,$00,$00,$00,$00,$1F,$3F
|
||||||
|
db $00,$04,$E6,$E0,$FF,$FF,$8F,$83,$0E,$1F,$1F,$1F,$1F,$03,$FF,$FF
|
||||||
|
db $26,$26,$60,$78,$18,$0F,$7F,$FF,$3F,$3F,$7F,$7F,$1F,$00,$7E,$FF
|
||||||
|
db $01,$21,$FE,$7A,$06,$FE,$FC,$FC,$FF,$FF,$FE,$FE,$FE,$DE,$5C,$6C
|
||||||
|
db $FF,$CF,$87,$07,$07,$0F,$1F,$1F,$FF,$FF,$FE,$FC,$F8,$B0,$60,$00
|
||||||
|
db $F8,$F8,$F0,$B8,$F8,$F9,$FB,$FF,$28,$30,$18,$40,$00,$01,$03,$0F
|
||||||
|
db $1F,$FF,$FF,$FF,$FF,$FE,$C0,$80,$10,$EC,$E3,$E0,$E0,$E0,$C0,$80
|
||||||
|
db $FF,$FF,$FF,$3F,$00,$00,$00,$00,$0F,$0F,$0F,$0F,$00,$00,$00,$00
|
||||||
|
db $13,$33,$30,$18,$04,$0F,$1F,$1F,$1F,$3F,$3F,$1F,$07,$09,$13,$17
|
||||||
|
db $00,$10,$7E,$30,$E0,$F0,$F0,$E0,$FF,$FF,$FE,$FF,$FE,$FC,$F8,$E0
|
||||||
|
db $1F,$1F,$0F,$0F,$0F,$1F,$1F,$1F,$17,$17,$03,$00,$00,$00,$00,$00
|
||||||
|
db $F0,$F0,$F8,$F8,$B8,$F8,$F8,$F8,$D0,$90,$18,$08,$40,$00,$00,$00
|
||||||
|
db $3F,$FF,$FF,$FF,$F6,$C6,$84,$00,$30,$F0,$F0,$F1,$F6,$C6,$84,$00
|
||||||
|
db $F0,$E0,$80,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $1F,$1F,$3F,$3F,$1F,$0F,$0F,$1F,$1F,$1F,$3F,$3E,$7C,$78,$F0,$E0
|
||||||
|
db $F0,$F0,$F8,$F8,$B8,$F8,$F8,$F0,$B0,$90,$18,$08,$40,$00,$00,$00
|
||||||
|
db $E0,$F0,$F0,$F0,$F0,$F0,$F8,$F0,$C0,$E0,$FC,$FE,$FF,$7F,$03,$00
|
||||||
|
db $1F,$1F,$1F,$3F,$3E,$3C,$38,$18,$00,$00,$10,$38,$3E,$3C,$38,$18
|
||||||
|
db $00,$03,$07,$07,$0A,$0B,$0C,$00,$00,$00,$00,$07,$0F,$0F,$0F,$03
|
||||||
|
db $00,$E0,$FC,$20,$20,$10,$3C,$00,$00,$00,$00,$F0,$FC,$FE,$FC,$F8
|
||||||
|
db $07,$07,$07,$1F,$1F,$3E,$21,$01,$07,$0F,$1B,$18,$10,$30,$21,$01
|
||||||
|
db $E0,$E0,$E0,$F0,$F0,$E0,$C0,$E0,$A8,$FC,$F8,$00,$00,$00,$C0,$E0
|
||||||
|
db $07,$0F,$0E,$14,$16,$18,$00,$3F,$00,$00,$0F,$1F,$1F,$1F,$07,$3C
|
||||||
|
db $C0,$F8,$40,$40,$20,$78,$00,$C0,$00,$00,$E0,$F8,$FC,$F8,$F0,$C0
|
||||||
|
db $3F,$0E,$0F,$1F,$3F,$7C,$70,$38,$FC,$ED,$C0,$00,$00,$60,$70,$38
|
||||||
|
db $F0,$F8,$E4,$FC,$FC,$7C,$00,$00,$7E,$1E,$04,$0C,$0C,$0C,$00,$00
|
||||||
|
db $07,$0F,$0E,$14,$16,$18,$00,$0F,$00,$00,$0F,$1F,$1F,$1F,$07,$0D
|
||||||
|
db $1F,$1F,$1F,$1C,$0C,$07,$07,$07,$1E,$1C,$1E,$0F,$07,$00,$07,$07
|
||||||
|
db $E0,$60,$F0,$70,$E0,$E0,$F0,$80,$60,$90,$00,$80,$00,$E0,$F0,$80
|
||||||
|
db $07,$1F,$3F,$12,$13,$08,$1F,$31,$00,$10,$3F,$7F,$7F,$3F,$03,$0F
|
||||||
|
db $C0,$F0,$40,$00,$30,$18,$C0,$F8,$00,$00,$E0,$F8,$FC,$F8,$B0,$38
|
||||||
|
db $31,$39,$1F,$1F,$0F,$5F,$7E,$3C,$1F,$07,$00,$0E,$0F,$53,$7C,$3C
|
||||||
|
db $F8,$F8,$F0,$E0,$E0,$C0,$00,$00,$F8,$F8,$F0,$00,$00,$80,$00,$00
|
||||||
|
db $00,$E0,$FC,$27,$27,$11,$3E,$04,$07,$07,$03,$F7,$FF,$FF,$FE,$FC
|
||||||
|
db $3F,$7F,$3F,$0F,$1F,$3F,$7F,$4F,$3E,$7F,$FF,$E2,$50,$38,$70,$40
|
||||||
|
db $F8,$F9,$F9,$B7,$FF,$FF,$E0,$00,$E8,$71,$01,$4B,$03,$03,$00,$00
|
||||||
|
db $07,$07,$0F,$3F,$3F,$3F,$26,$04,$05,$03,$01,$30,$30,$30,$26,$04
|
||||||
|
db $F0,$F0,$F0,$E0,$C0,$00,$00,$00,$FE,$FC,$E0,$00,$00,$00,$00,$00
|
||||||
|
db $07,$07,$0F,$1F,$3F,$0F,$1C,$18,$05,$03,$01,$10,$30,$0C,$1C,$18
|
||||||
|
db $E0,$E0,$E0,$E0,$C0,$80,$00,$00,$C0,$E0,$F0,$78,$18,$08,$00,$00
|
||||||
|
db $07,$0F,$1F,$0F,$3F,$0F,$1C,$18,$07,$0F,$3E,$7C,$30,$0C,$1C,$18
|
||||||
|
db $E0,$E0,$E0,$40,$C0,$80,$00,$00,$60,$60,$60,$80,$00,$00,$00,$00
|
||||||
|
db $7F,$FF,$FF,$FB,$0F,$0F,$0F,$1F,$73,$F3,$F0,$F4,$F0,$F0,$70,$60
|
||||||
|
db $3F,$7E,$7C,$7C,$3C,$3C,$FC,$FC,$00,$00,$00,$00,$3C,$3C,$FC,$FC
|
||||||
|
db $60,$70,$18,$08,$0F,$1F,$3F,$7F,$7F,$7F,$1F,$07,$0B,$1B,$3B,$7B
|
||||||
|
db $FC,$7C,$00,$20,$F0,$F8,$FC,$FE,$FC,$FC,$F8,$E0,$D0,$D8,$DC,$DE
|
||||||
|
db $0B,$0F,$1F,$1E,$3C,$3C,$3C,$7C,$C4,$E0,$E0,$40,$00,$3C,$3C,$7C
|
||||||
|
db $1F,$3F,$0D,$07,$0F,$0E,$1C,$3C,$1D,$3C,$3A,$38,$30,$00,$1C,$3C
|
||||||
|
db $00,$00,$00,$00,$00,$00,$00,$00,$22,$55,$55,$55,$55,$55,$77,$22
|
||||||
|
db $00,$07,$1F,$FF,$07,$1F,$0F,$06,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $3F,$FF,$FF,$FF,$FF,$FF,$FB,$76,$00,$00,$CF,$07,$7F,$00,$00,$00
|
||||||
|
db $20,$F8,$FF,$C3,$FD,$FE,$F0,$40,$00,$00,$3C,$FC,$FE,$E0,$00,$00
|
||||||
|
db $40,$E0,$40,$40,$41,$41,$4F,$47,$40,$E0,$40,$3F,$3E,$3E,$30,$38
|
||||||
|
db $00,$00,$00,$00,$00,$00,$E0,$C0,$00,$00,$00,$F8,$F8,$F8,$18,$38
|
||||||
|
db $43,$46,$44,$40,$40,$40,$40,$40,$3C,$39,$3B,$3F,$00,$00,$00,$00
|
||||||
|
db $80,$C0,$40,$00,$00,$00,$00,$00,$78,$38,$B8,$F8,$00,$00,$00,$00
|
||||||
|
db $31,$30,$38,$7C,$7F,$FF,$FF,$FB,$3F,$3F,$0F,$77,$77,$F7,$F7,$F7
|
||||||
|
db $10,$7E,$3E,$00,$1E,$FE,$FF,$FF,$FF,$FE,$FE,$FE,$FA,$FA,$F3,$E7
|
||||||
|
db $FF,$FF,$E3,$C3,$87,$48,$3C,$FC,$F0,$F8,$FC,$7C,$78,$38,$3C,$FC
|
||||||
|
db $00,$FF,$C3,$83,$83,$FF,$FF,$FF,$FF,$00,$C3,$81,$81,$C3,$FF,$00
|
||||||
|
db $1F,$1F,$0F,$07,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $F0,$FB,$FF,$FF,$FE,$3E,$0C,$04,$00,$0B,$1F,$1F,$1E,$3E,$0C,$04
|
||||||
|
db $1F,$1F,$0F,$0F,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $FB,$FF,$FF,$FF,$FF,$00,$00,$00,$03,$0F,$0F,$0F,$0F,$00,$00,$00
|
||||||
|
db $00,$18,$3C,$7E,$6E,$DF,$DF,$DF,$00,$18,$3C,$7E,$76,$FB,$FB,$FB
|
||||||
|
db $00,$18,$18,$3C,$3C,$3C,$3C,$1C,$00,$10,$10,$20,$20,$20,$20,$20
|
||||||
|
db $00,$08,$08,$08,$08,$08,$08,$00,$00,$08,$08,$08,$08,$08,$08,$08
|
||||||
|
db $00,$08,$08,$04,$04,$04,$04,$04,$00,$10,$10,$38,$38,$38,$38,$38
|
||||||
|
db $3C,$7E,$77,$FB,$9F,$5F,$8E,$20,$00,$18,$3C,$0E,$0E,$04,$00,$00
|
||||||
|
db $5C,$2E,$8F,$3F,$7B,$77,$7E,$3C,$00,$00,$04,$06,$1E,$3C,$18,$00
|
||||||
|
db $13,$4F,$3F,$BF,$3F,$7A,$F8,$F8,$00,$00,$01,$0A,$17,$0F,$2F,$1F
|
||||||
|
db $00,$08,$05,$0F,$2F,$1D,$1C,$3C,$00,$00,$00,$00,$05,$07,$0F,$07
|
||||||
|
db $00,$00,$00,$00,$02,$0B,$07,$0F,$00,$00,$00,$00,$00,$00,$01,$03
|
||||||
|
db $00,$00,$00,$00,$00,$08,$04,$04,$00,$60,$F0,$F8,$7C,$3E,$7E,$7F
|
||||||
|
db $02,$02,$02,$05,$71,$7F,$7F,$7F,$3F,$5F,$7F,$3E,$0E,$0A,$51,$20
|
||||||
|
db $00,$00,$00,$00,$00,$00,$00,$04,$00,$00,$00,$00,$00,$00,$0E,$1F
|
||||||
|
db $02,$02,$00,$01,$13,$3F,$7F,$7F,$3F,$7F,$7F,$FE,$EC,$CA,$51,$20
|
||||||
|
db $00,$40,$60,$70,$73,$27,$0F,$1F,$00,$40,$63,$77,$7C,$38,$F8,$E4
|
||||||
|
db $00,$00,$00,$00,$03,$07,$0F,$1F,$00,$00,$03,$07,$0C,$18,$F8,$E4
|
||||||
|
db $7F,$7F,$3F,$3F,$1F,$1F,$0F,$07,$03,$44,$28,$10,$08,$04,$03,$04
|
||||||
|
db $03,$07,$0F,$1F,$3F,$77,$77,$F5,$03,$07,$0F,$1F,$27,$7B,$78,$FB
|
||||||
|
db $C0,$E0,$F0,$F8,$FC,$EE,$EE,$AF,$C0,$E0,$F0,$F8,$E4,$DE,$1E,$DF
|
||||||
|
db $F1,$FF,$78,$00,$00,$18,$1C,$0E,$FF,$FF,$7F,$0F,$0F,$07,$03,$00
|
||||||
|
db $8F,$FF,$1E,$00,$0C,$3E,$7E,$7C,$FF,$FF,$FE,$F0,$F0,$C0,$80,$00
|
||||||
|
db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$18,$24,$24,$18,$00,$00
|
||||||
|
db $00,$02,$41,$41,$61,$33,$06,$3C,$3C,$7E,$FF,$FF,$FF,$FF,$7E,$3C
|
||||||
|
db $03,$07,$0F,$1F,$3F,$7F,$7F,$FF,$03,$07,$0F,$1F,$3F,$63,$41,$C1
|
||||||
|
db $C0,$E0,$F0,$F8,$FC,$FE,$FE,$FF,$C0,$80,$00,$00,$8C,$FE,$FE,$F3
|
||||||
|
db $FF,$FF,$FF,$78,$00,$00,$00,$00,$C1,$E3,$FF,$47,$0F,$0F,$0F,$07
|
||||||
|
db $FF,$FF,$FF,$1E,$00,$20,$20,$40,$F1,$F9,$FF,$E2,$F0,$F0,$F0,$E0
|
||||||
|
db $16,$1F,$3F,$7F,$3D,$1D,$3F,$1F,$16,$1F,$00,$00,$05,$0D,$3F,$1F
|
||||||
|
db $80,$80,$C0,$E0,$F0,$F0,$F0,$F8,$80,$80,$00,$00,$00,$A0,$A0,$E0
|
||||||
|
db $3C,$FA,$B1,$72,$F2,$DB,$DF,$5F,$00,$04,$4E,$8C,$0C,$7F,$FF,$FF
|
||||||
|
db $00,$00,$00,$01,$01,$01,$06,$1E,$00,$00,$00,$00,$00,$00,$01,$01
|
||||||
|
db $00,$00,$00,$00,$00,$00,$00,$00,$FF,$7F,$3F,$1F,$0F,$07,$03,$01
|
||||||
|
db $00,$7C,$D6,$92,$BA,$EE,$FE,$38,$FF,$83,$29,$6D,$45,$11,$01,$C7
|
||||||
|
db $00,$15,$3F,$62,$5F,$FF,$9F,$7D,$08,$08,$02,$1F,$22,$02,$02,$00
|
||||||
|
db $00,$00,$00,$00,$00,$00,$00,$00,$08,$08,$08,$08,$08,$08,$08,$08
|
||||||
|
db $2F,$1E,$2F,$2F,$2F,$15,$0D,$0E,$10,$1E,$10,$50,$10,$08,$00,$00
|
||||||
|
db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$FE,$00,$00,$00,$00
|
||||||
|
db $1C,$3E,$7F,$FF,$FF,$FE,$7C,$38,$1C,$2A,$77,$EE,$DD,$AA,$74,$28
|
||||||
|
db $00,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$00,$EF,$EF,$EF,$00
|
||||||
|
db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FE,$00,$EF,$EF,$EF,$00
|
||||||
|
db $7F,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$00,$7F,$5F,$7F,$7F,$7F,$7F,$7F
|
||||||
|
db $68,$4E,$E0,$E0,$E0,$F0,$F8,$FC,$B8,$9E,$80,$C0,$E0,$F0,$F8,$7C
|
||||||
|
db $3F,$5C,$39,$3B,$BB,$F9,$FC,$FE,$00,$23,$57,$4F,$57,$27,$C3,$21
|
||||||
|
db $C0,$F0,$F0,$F0,$F0,$E0,$C0,$00,$00,$30,$70,$70,$F0,$E0,$C0,$00
|
||||||
|
db $FE,$FC,$61,$0F,$FF,$FE,$F0,$E0,$13,$0F,$1E,$F0,$FC,$F8,$F0,$E0
|
||||||
|
db $6E,$40,$E0,$E0,$E0,$E0,$E0,$C0,$BE,$90,$80,$C0,$C0,$80,$00,$00
|
||||||
|
db $01,$01,$03,$03,$07,$7F,$7F,$3F,$01,$01,$03,$03,$07,$7F,$7D,$3D
|
||||||
|
db $06,$07,$3F,$3C,$19,$7B,$7F,$3F,$06,$04,$30,$23,$06,$64,$60,$00
|
||||||
|
db $3F,$7F,$7F,$1F,$3F,$3F,$07,$06,$00,$60,$60,$00,$20,$30,$04,$06
|
||||||
|
db $03,$07,$0F,$0F,$0F,$0F,$07,$03,$00,$01,$01,$00,$00,$00,$00,$00
|
||||||
|
db $F8,$F8,$F8,$A0,$E1,$FF,$FF,$FF,$FE,$FF,$FF,$40,$01,$03,$03,$03
|
||||||
|
db $0F,$0F,$0F,$1F,$1F,$1F,$0F,$07,$01,$01,$00,$00,$00,$00,$00,$00
|
||||||
|
db $E0,$F8,$F8,$F8,$FF,$FE,$F0,$C0,$E0,$FE,$FF,$7F,$03,$02,$00,$00
|
||||||
|
db $01,$0F,$0F,$1F,$39,$33,$37,$7F,$01,$0D,$08,$00,$36,$2C,$08,$60
|
||||||
|
db $7F,$3F,$3F,$3F,$1F,$0F,$0F,$01,$60,$00,$20,$30,$00,$08,$0D,$01
|
||||||
|
db $00,$00,$03,$03,$47,$67,$77,$77,$01,$01,$03,$43,$67,$77,$7B,$78
|
||||||
|
db $00,$00,$00,$00,$88,$98,$F8,$F0,$00,$00,$80,$84,$CC,$DC,$BC,$3C
|
||||||
|
db $7E,$7F,$FF,$1F,$07,$30,$1C,$0C,$33,$07,$07,$E3,$38,$3F,$1C,$0C
|
||||||
|
db $7E,$38,$F6,$ED,$DF,$38,$70,$60,$98,$C7,$C8,$92,$30,$F8,$70,$60
|
||||||
|
db $00,$00,$00,$03,$03,$47,$67,$77,$00,$01,$01,$03,$43,$67,$77,$7B
|
||||||
|
db $00,$00,$00,$00,$00,$88,$98,$F8,$00,$00,$00,$80,$84,$CC,$DC,$BC
|
||||||
|
db $77,$7E,$7F,$FF,$1F,$07,$70,$F0,$78,$33,$07,$07,$E3,$38,$7F,$F0
|
||||||
|
db $F0,$7E,$38,$F6,$ED,$DF,$38,$3C,$3C,$98,$C7,$C8,$92,$30,$F8,$3C
|
||||||
|
db $03,$07,$0A,$1A,$1C,$1E,$0B,$08,$00,$10,$7F,$7F,$7F,$1F,$0F,$0F
|
||||||
|
db $1C,$3F,$3F,$3D,$3F,$1F,$00,$00,$03,$33,$39,$3A,$38,$18,$00,$00
|
||||||
|
db $00,$00,$04,$4C,$4E,$4E,$46,$6F,$10,$38,$3C,$74,$76,$76,$7E,$7D
|
||||||
|
db $00,$1F,$3F,$3F,$4F,$5F,$7F,$7F,$00,$00,$11,$0A,$34,$2A,$51,$20
|
||||||
|
db $7F,$67,$A3,$B0,$D8,$DE,$DC,$C8,$7F,$67,$63,$70,$38,$3E,$7C,$B8
|
||||||
|
db $7F,$7F,$7F,$1F,$47,$70,$70,$39,$51,$0A,$04,$EA,$79,$7F,$70,$39
|
||||||
|
db $E8,$E8,$E0,$C0,$10,$70,$E0,$C0,$58,$38,$10,$30,$F0,$F0,$E0,$C0
|
||||||
|
db $00,$00,$00,$20,$66,$66,$66,$62,$00,$08,$1C,$3C,$7A,$7A,$7A,$7E
|
||||||
|
db $00,$00,$1F,$3F,$7F,$4F,$5F,$7F,$00,$00,$00,$11,$0A,$34,$2A,$51
|
||||||
|
db $77,$7F,$3F,$B7,$B3,$DB,$DA,$D8,$7F,$7D,$3F,$37,$33,$3B,$3A,$78
|
||||||
|
db $7F,$7F,$7F,$7F,$1F,$07,$70,$F0,$20,$51,$0A,$04,$EA,$39,$7F,$F0
|
||||||
|
db $CC,$E8,$E8,$E0,$C0,$18,$7C,$3E,$BC,$58,$38,$10,$30,$F8,$FC,$3E
|
||||||
|
db $03,$0F,$1F,$3F,$3B,$3F,$7F,$7F,$00,$00,$00,$06,$0E,$0C,$00,$00
|
||||||
|
db $80,$F0,$F8,$FC,$FE,$FE,$FF,$FE,$00,$00,$00,$00,$00,$00,$0F,$18
|
||||||
|
db $7F,$7F,$7F,$7F,$FF,$0F,$03,$00,$00,$00,$00,$00,$F8,$3E,$3B,$18
|
||||||
|
db $FE,$FB,$FF,$FF,$F6,$E0,$C0,$00,$10,$14,$10,$10,$38,$78,$F8,$30
|
||||||
|
db $00,$03,$0F,$1F,$3F,$3B,$3F,$7F,$00,$00,$00,$00,$06,$0E,$0C,$00
|
||||||
|
db $00,$C0,$F0,$F8,$FC,$FE,$FE,$FF,$00,$00,$00,$00,$00,$00,$00,$0F
|
||||||
|
db $7F,$7F,$7F,$7F,$7F,$FF,$0F,$03,$00,$00,$00,$00,$00,$F8,$7E,$F3
|
||||||
|
db $FE,$FE,$FB,$FF,$FF,$F6,$E0,$C0,$18,$10,$14,$10,$10,$38,$7C,$DE
|
||||||
|
db $00,$01,$01,$01,$01,$00,$00,$08,$00,$0D,$1E,$1E,$1E,$1F,$0F,$07
|
||||||
|
db $78,$F0,$F8,$E4,$C0,$CA,$CA,$C0,$78,$F0,$00,$1A,$3F,$35,$35,$3F
|
||||||
|
db $0F,$1F,$9F,$FF,$FF,$7F,$74,$20,$00,$00,$80,$E0,$E0,$70,$73,$21
|
||||||
|
db $E4,$FF,$FE,$FC,$9C,$1E,$00,$00,$1A,$07,$0C,$18,$78,$FE,$FC,$F0
|
||||||
|
db $00,$01,$03,$03,$07,$03,$01,$00,$00,$01,$02,$00,$38,$7C,$7E,$3F
|
||||||
|
db $00,$5F,$7F,$7F,$3F,$3F,$14,$00,$3F,$40,$60,$60,$20,$30,$13,$01
|
||||||
|
db $C0,$E0,$F0,$30,$38,$3C,$3C,$FC,$C0,$E0,$30,$D0,$D0,$D0,$D0,$00
|
||||||
|
db $07,$0F,$1F,$22,$20,$25,$25,$1F,$07,$0F,$02,$1D,$1F,$1A,$1A,$02
|
||||||
|
db $FE,$FE,$7E,$3A,$02,$01,$41,$41,$38,$7C,$FC,$FC,$FC,$FE,$BE,$BE
|
||||||
|
db $1F,$3F,$7E,$5C,$40,$80,$82,$82,$1C,$3E,$3F,$3F,$3F,$7F,$7D,$7D
|
||||||
|
db $82,$80,$A0,$44,$43,$40,$21,$1E,$7D,$7F,$5F,$3B,$3C,$3F,$1E,$00
|
||||||
|
db $1C,$3F,$3E,$3C,$40,$80,$82,$82,$1C,$3E,$3F,$1F,$3F,$7F,$7D,$7D
|
||||||
|
db $00,$00,$80,$80,$92,$9D,$C7,$EF,$00,$00,$00,$60,$62,$65,$3F,$1F
|
||||||
|
db $00,$23,$33,$3F,$3F,$7F,$7F,$7F,$70,$3C,$3C,$18,$00,$00,$02,$07
|
||||||
|
db $FE,$F8,$A0,$00,$00,$00,$80,$80,$CF,$7A,$5A,$10,$00,$00,$C0,$80
|
||||||
|
db $7E,$7F,$7D,$3F,$1E,$8F,$8F,$19,$85,$84,$86,$C6,$E7,$73,$73,$E1
|
||||||
|
db $E0,$0E,$73,$F3,$F9,$F9,$F8,$70,$80,$4E,$77,$F3,$FB,$F9,$FA,$78
|
||||||
|
db $0E,$66,$E2,$F6,$FF,$FF,$1F,$98,$11,$39,$7D,$39,$00,$00,$E0,$E7
|
||||||
|
db $00,$00,$00,$04,$0F,$0F,$1F,$07,$00,$00,$07,$07,$16,$10,$00,$38
|
||||||
|
db $F3,$E7,$EE,$EC,$CD,$CF,$CF,$DF,$CF,$1F,$17,$10,$33,$30,$30,$20
|
||||||
|
db $27,$3F,$3F,$78,$3C,$1F,$1F,$73,$38,$30,$40,$C7,$07,$66,$E0,$6C
|
||||||
|
db $9F,$3E,$7C,$FC,$F8,$F8,$C0,$40,$60,$C0,$80,$04,$9E,$FF,$F0,$F8
|
||||||
|
db $7F,$7E,$78,$01,$07,$1F,$3C,$7C,$24,$01,$07,$FE,$FF,$7F,$3F,$7F
|
||||||
|
db $FC,$F8,$A0,$FE,$FC,$F0,$80,$00,$CF,$7A,$0A,$FE,$FC,$00,$00,$00
|
||||||
|
db $7E,$7F,$7F,$3F,$1F,$8F,$8F,$18,$85,$86,$83,$C3,$E1,$70,$70,$E0
|
||||||
|
db $9F,$3E,$7C,$F8,$F8,$3C,$18,$F8,$60,$C0,$80,$00,$98,$FC,$FE,$FF
|
||||||
|
db $7F,$7F,$78,$01,$07,$13,$F1,$03,$24,$00,$07,$FE,$FF,$7F,$FF,$03
|
||||||
|
db $00,$00,$1C,$1D,$1B,$C3,$E3,$E1,$03,$0F,$23,$62,$64,$3C,$1C,$1E
|
||||||
|
db $E0,$CD,$1D,$4F,$EE,$FF,$3F,$3F,$1F,$3D,$6D,$4F,$EE,$F3,$20,$03
|
||||||
|
db $3F,$3F,$00,$00,$70,$B8,$FC,$FC,$07,$07,$1F,$3F,$0F,$47,$03,$00
|
||||||
|
db $07,$0F,$1F,$3F,$3E,$7C,$78,$78,$00,$00,$03,$07,$0F,$0F,$1F,$1F
|
||||||
|
db $3F,$5C,$39,$3B,$BF,$FF,$FE,$FE,$00,$23,$57,$4F,$57,$2F,$DF,$21
|
||||||
|
db $C0,$C0,$80,$80,$80,$80,$00,$00,$00,$00,$00,$00,$80,$80,$00,$00
|
||||||
|
db $FE,$FC,$61,$0F,$7F,$3F,$1F,$1E,$23,$0F,$1E,$F0,$1C,$3F,$1F,$1E
|
||||||
|
db $F0,$78,$E4,$C8,$CC,$BE,$BE,$3E,$00,$80,$18,$30,$34,$FE,$FE,$FE
|
||||||
|
db $00,$01,$00,$07,$07,$07,$07,$1F,$00,$00,$01,$04,$06,$06,$07,$07
|
||||||
|
db $00,$00,$0F,$3F,$3F,$0F,$00,$00,$0F,$3F,$7F,$F8,$F8,$7F,$3F,$0F
|
||||||
|
db $78,$7C,$7E,$7F,$3F,$3F,$1B,$09,$1F,$1F,$1F,$0B,$01,$01,$00,$00
|
||||||
|
db $0C,$00,$00,$00,$07,$7F,$7C,$00,$03,$1F,$3F,$3F,$78,$00,$03,$FF
|
||||||
|
db $01,$E1,$71,$79,$3D,$3D,$1F,$03,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $3F,$3F,$1F,$1B,$36,$30,$7F,$3F,$23,$27,$1F,$07,$0F,$1F,$7F,$3F
|
||||||
|
db $F8,$F8,$F8,$B8,$18,$D8,$D8,$B8,$E0,$80,$80,$40,$E0,$E0,$E0,$C0
|
||||||
|
db $01,$02,$04,$04,$08,$08,$10,$10,$03,$07,$0F,$1F,$3F,$7F,$FF,$1F
|
||||||
|
db $00,$0F,$13,$0D,$0D,$13,$0C,$20,$1F,$10,$0C,$12,$12,$2C,$3F,$3F
|
||||||
|
db $00,$24,$00,$24,$00,$04,$00,$00,$37,$36,$36,$36,$16,$16,$12,$02
|
||||||
|
db $0F,$41,$00,$88,$00,$44,$00,$00,$10,$7E,$FF,$FF,$F6,$76,$3A,$1A
|
||||||
|
db $38,$7C,$FE,$FE,$3B,$03,$03,$03,$00,$00,$38,$04,$00,$00,$00,$00
|
||||||
|
db $03,$33,$7B,$7F,$FF,$FB,$03,$03,$00,$00,$00,$38,$40,$00,$00,$00
|
||||||
|
db $DC,$C0,$E0,$E0,$E0,$E0,$E0,$C0,$FC,$A0,$80,$80,$00,$00,$00,$00
|
||||||
|
db $3F,$5F,$3F,$3F,$BB,$F8,$FE,$FE,$07,$27,$57,$4F,$57,$27,$C1,$21
|
||||||
|
db $1F,$0F,$0F,$1F,$1F,$1E,$38,$30,$1D,$0F,$0F,$1F,$1F,$1E,$38,$30
|
||||||
|
db $00,$20,$60,$60,$70,$F0,$F8,$F8,$00,$00,$38,$10,$4C,$18,$86,$24
|
||||||
|
db $F8,$FC,$FC,$7E,$7E,$3E,$1F,$07,$00,$42,$0A,$40,$10,$02,$08,$02
|
||||||
|
db $00,$C0,$70,$B8,$F4,$F2,$F5,$7B,$00,$00,$80,$40,$08,$0C,$0A,$84
|
||||||
|
db $00,$DF,$10,$FF,$DF,$FF,$FF,$F9,$00,$00,$CF,$20,$20,$20,$26,$2E
|
||||||
|
db $1F,$1F,$3E,$FC,$F8,$F0,$C0,$00,$E0,$E0,$C0,$00,$00,$00,$00,$00
|
||||||
|
db $F8,$FC,$FE,$FF,$FF,$DF,$DF,$00,$2F,$23,$21,$20,$20,$00,$00,$00
|
||||||
|
db $C1,$F1,$79,$7D,$3D,$3F,$1F,$03,$C1,$B1,$59,$6D,$35,$3B,$1F,$03
|
||||||
|
db $02,$06,$0E,$0E,$1E,$1E,$3E,$3E,$00,$02,$00,$08,$02,$00,$28,$00
|
||||||
|
db $3E,$3E,$3E,$3E,$1E,$1E,$0E,$02,$04,$10,$02,$10,$04,$00,$0A,$00
|
||||||
|
db $C1,$F1,$79,$7D,$3D,$3F,$1F,$03,$C1,$B1,$59,$6D,$35,$3B,$1F,$03
|
||||||
|
db $7C,$00,$00,$FF,$C3,$7F,$1F,$03,$00,$0F,$1F,$FF,$FC,$63,$1F,$03
|
||||||
|
db $FF,$FF,$7C,$00,$00,$7C,$FF,$FF,$00,$00,$FE,$C6,$C6,$FE,$00,$00
|
||||||
|
db $FF,$FF,$00,$04,$0C,$18,$30,$00,$00,$00,$06,$06,$0C,$18,$70,$60
|
||||||
|
db $FF,$FF,$00,$04,$04,$04,$08,$08,$00,$00,$06,$06,$04,$04,$08,$08
|
||||||
|
db $08,$10,$10,$00,$00,$10,$10,$08,$08,$10,$30,$30,$30,$30,$10,$08
|
||||||
|
db $7F,$3F,$3F,$3E,$1F,$0F,$03,$00,$00,$00,$01,$03,$01,$00,$00,$00
|
||||||
|
db $03,$0F,$FF,$7F,$7F,$7F,$7F,$7F,$03,$0E,$F8,$00,$00,$00,$00,$00
|
||||||
|
db $00,$00,$00,$00,$00,$00,$00,$00,$22,$65,$25,$25,$25,$25,$77,$72
|
||||||
|
db $00,$00,$00,$00,$00,$00,$00,$00,$62,$95,$15,$25,$45,$85,$F7,$F2
|
||||||
|
db $00,$00,$00,$00,$00,$00,$00,$00,$A2,$A5,$A5,$A5,$F5,$F5,$27,$22
|
||||||
|
db $00,$00,$00,$00,$00,$00,$00,$00,$F2,$85,$85,$E5,$15,$15,$F7,$E2
|
||||||
|
db $00,$00,$00,$00,$00,$00,$00,$00,$62,$95,$55,$65,$B5,$95,$97,$62
|
||||||
|
db $00,$00,$00,$00,$00,$00,$00,$00,$20,$50,$50,$50,$50,$50,$70,$20
|
||||||
|
db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $00,$00,$00,$00,$00,$00,$00,$00,$66,$E6,$66,$66,$66,$67,$F3,$00
|
||||||
|
db $00,$00,$00,$00,$00,$00,$00,$00,$5E,$59,$59,$59,$5E,$D8,$98,$00
|
||||||
|
db $00,$00,$00,$00,$00,$7C,$38,$00,$00,$00,$00,$00,$00,$04,$08,$00
|
||||||
|
db $38,$4C,$C6,$C6,$C6,$64,$38,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $18,$38,$18,$18,$18,$18,$7E,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $7C,$C6,$0E,$3C,$78,$E0,$FE,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $7E,$0C,$18,$3C,$06,$C6,$7C,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $1C,$3C,$6C,$CC,$FE,$0C,$0C,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $FC,$C0,$FC,$06,$06,$C6,$7C,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $3C,$60,$C0,$FC,$C6,$C6,$7C,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $FE,$C6,$0C,$18,$30,$30,$30,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $7C,$C6,$C6,$7C,$C6,$C6,$7C,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $7C,$C6,$C6,$7E,$06,$0C,$78,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $38,$6C,$C6,$C6,$FE,$C6,$C6,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $FC,$C6,$C6,$FC,$C6,$C6,$FC,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $3C,$66,$C0,$C0,$C0,$66,$3C,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $F8,$CC,$C6,$C6,$C6,$CC,$F8,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $FE,$C0,$C0,$FC,$C0,$C0,$FE,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $FE,$C0,$C0,$FC,$C0,$C0,$C0,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $3E,$60,$C0,$CE,$C6,$66,$3E,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $C6,$C6,$C6,$FE,$C6,$C6,$C6,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $7E,$18,$18,$18,$18,$18,$7E,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $1E,$06,$06,$06,$C6,$C6,$7C,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $C6,$CC,$D8,$F0,$F8,$DC,$CE,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $60,$60,$60,$60,$60,$60,$7E,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $C6,$EE,$FE,$FE,$D6,$C6,$C6,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $C6,$E6,$F6,$FE,$DE,$CE,$C6,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $7C,$C6,$C6,$C6,$C6,$C6,$7C,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $FC,$C6,$C6,$C6,$FC,$C0,$C0,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $7C,$C6,$C6,$C6,$DE,$CC,$7A,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $FC,$C6,$C6,$CE,$F8,$DC,$CE,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $78,$CC,$C0,$7C,$06,$C6,$7C,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $7E,$18,$18,$18,$18,$18,$18,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $C6,$C6,$C6,$C6,$C6,$C6,$7C,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $C6,$C6,$C6,$EE,$7C,$38,$10,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $C6,$C6,$D6,$FE,$FE,$EE,$C6,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $C6,$EE,$7C,$38,$7C,$EE,$C6,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $66,$66,$66,$3C,$18,$18,$18,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $FE,$0E,$1C,$38,$70,$E0,$FE,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $00,$00,$00,$00,$00,$00,$00,$00,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
|
||||||
|
db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
|
||||||
|
db $00,$00,$00,$7E,$7E,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $00,$00,$44,$28,$10,$28,$44,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$7F,$7F,$7F,$7F,$7F,$7F,$7F,$7F
|
||||||
|
db $18,$3C,$3C,$3C,$18,$18,$00,$18,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $FF,$7F,$7F,$7F,$7F,$FF,$E3,$C1,$FF,$80,$80,$80,$80,$00,$1C,$3E
|
||||||
|
db $80,$80,$80,$C1,$E3,$FF,$FF,$FF,$7F,$7F,$7F,$3E,$1C,$00,$00,$FF
|
||||||
|
db $38,$7C,$7C,$7C,$7C,$7C,$38,$00,$08,$04,$04,$04,$04,$04,$08,$00
|
||||||
|
db $03,$06,$0C,$0C,$08,$08,$04,$03,$03,$05,$0B,$0B,$0F,$0F,$07,$03
|
||||||
|
db $01,$02,$04,$08,$10,$20,$40,$80,$01,$03,$07,$0F,$1F,$3F,$7F,$FF
|
||||||
|
db $00,$00,$00,$00,$00,$07,$38,$C0,$00,$00,$00,$00,$00,$07,$3F,$FF
|
||||||
|
db $00,$00,$00,$00,$00,$E0,$1C,$03,$00,$00,$00,$00,$00,$E0,$FC,$FF
|
||||||
|
db $80,$40,$20,$10,$08,$04,$02,$01,$80,$C0,$E0,$F0,$F8,$FC,$FE,$FF
|
||||||
|
db $04,$0E,$0E,$0E,$6E,$64,$60,$60,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
|
||||||
|
db $07,$0F,$1F,$1F,$7F,$FF,$FF,$7F,$07,$08,$10,$00,$60,$80,$80,$40
|
||||||
|
db $03,$07,$1F,$3F,$3F,$3F,$79,$F7,$03,$04,$18,$20,$20,$20,$46,$88
|
||||||
|
db $C0,$E0,$F0,$F4,$FE,$BF,$DF,$FF,$C0,$20,$10,$14,$0A,$41,$21,$01
|
||||||
|
db $90,$B8,$F8,$FA,$FF,$FF,$FF,$FE,$90,$A8,$48,$0A,$05,$01,$01,$02
|
||||||
|
db $3B,$1D,$0E,$0F,$07,$00,$00,$00,$24,$12,$09,$08,$07,$00,$00,$00
|
||||||
|
db $FF,$BF,$1C,$C0,$F3,$FF,$7E,$1C,$00,$40,$E3,$3F,$0C,$81,$62,$1C
|
||||||
|
db $BF,$7F,$3D,$83,$C7,$FF,$FF,$3C,$40,$80,$C2,$7C,$38,$00,$C3,$3C
|
||||||
|
db $FC,$FE,$FF,$FE,$FE,$F8,$60,$00,$04,$02,$01,$00,$06,$98,$60,$00
|
||||||
|
db $C0,$20,$10,$10,$10,$10,$20,$C0,$C0,$E0,$F0,$F0,$F0,$F0,$E0,$C0
|
||||||
|
db $00,$00,$00,$00,$3F,$7F,$E0,$C0,$00,$00,$00,$00,$00,$00,$1C,$3E
|
||||||
|
db $88,$9C,$88,$80,$80,$80,$80,$80,$7F,$7F,$7F,$3E,$1C,$00,$00,$00
|
||||||
|
db $FE,$FE,$FE,$FE,$FE,$FE,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
|
||||||
|
db $08,$14,$24,$C4,$03,$40,$A1,$26,$00,$08,$18,$38,$FC,$BF,$5E,$D9
|
||||||
|
db $FF,$FF,$FF,$FF,$7F,$7F,$7F,$7F,$81,$81,$81,$81,$81,$81,$81,$81
|
||||||
|
db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$01,$01,$01,$01,$01,$01,$01,$01
|
||||||
|
db $7F,$80,$80,$98,$9C,$8C,$80,$80,$00,$7F,$7F,$67,$67,$7F,$7F,$7F
|
||||||
|
db $FF,$01,$01,$FF,$10,$10,$10,$FF,$00,$FF,$FF,$FF,$FF,$FF,$FF,$FF
|
||||||
|
db $80,$80,$80,$80,$80,$80,$80,$80,$7F,$7F,$7F,$7F,$7F,$7F,$7F,$7F
|
||||||
|
db $01,$01,$01,$FF,$10,$10,$10,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
|
||||||
|
db $FF,$00,$00,$00,$00,$00,$00,$00,$00,$FF,$FF,$FF,$FF,$FF,$FF,$FF
|
||||||
|
db $FE,$01,$01,$19,$1D,$0D,$01,$01,$00,$FF,$FF,$E7,$E7,$FF,$FF,$FF
|
||||||
|
db $01,$01,$01,$01,$01,$01,$01,$01,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
|
||||||
|
db $3F,$7F,$7F,$FF,$FF,$FF,$FF,$FF,$3F,$60,$40,$C0,$80,$80,$80,$80
|
||||||
|
db $FF,$FF,$FF,$FF,$FF,$FF,$7E,$3C,$80,$80,$80,$80,$80,$81,$42,$3C
|
||||||
|
db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $FF,$FF,$FF,$FF,$FF,$FF,$FE,$7C,$00,$00,$00,$00,$00,$01,$82,$7C
|
||||||
|
db $FF,$FF,$FF,$FF,$FF,$FF,$FE,$7C,$00,$00,$00,$00,$00,$01,$83,$FF
|
||||||
|
db $F8,$FC,$FE,$FE,$FF,$FF,$FF,$FF,$F8,$04,$02,$02,$01,$01,$01,$01
|
||||||
|
db $FF,$FF,$FF,$FF,$FF,$FF,$7E,$3C,$01,$01,$01,$01,$01,$81,$42,$3C
|
||||||
|
db $00,$08,$08,$08,$10,$10,$10,$00,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
|
||||||
|
db $00,$7F,$7F,$78,$73,$73,$73,$7F,$7F,$80,$A0,$87,$8F,$8E,$8E,$86
|
||||||
|
db $00,$FF,$FF,$3F,$9F,$9F,$9F,$1F,$FE,$01,$05,$C1,$E1,$71,$71,$F1
|
||||||
|
db $7E,$7E,$7F,$7E,$7E,$7F,$7F,$FF,$81,$81,$80,$81,$81,$A0,$80,$FF
|
||||||
|
db $7F,$7F,$FF,$7F,$7F,$FF,$FF,$FF,$F1,$C1,$C1,$81,$C1,$C5,$01,$FF
|
||||||
|
db $7F,$80,$A0,$80,$80,$80,$80,$80,$7F,$FF,$FF,$FF,$FF,$FF,$FF,$FF
|
||||||
|
db $FE,$01,$05,$01,$01,$01,$01,$01,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF
|
||||||
|
db $80,$80,$80,$80,$80,$A0,$80,$7F,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$7F
|
||||||
|
db $01,$01,$01,$01,$01,$05,$01,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE
|
||||||
|
db $00,$00,$00,$00,$FC,$FE,$07,$03,$00,$00,$00,$00,$00,$00,$38,$7C
|
||||||
|
db $11,$39,$11,$01,$01,$01,$01,$01,$FE,$FE,$FE,$7C,$38,$00,$00,$00
|
||||||
|
db $EF,$28,$28,$28,$28,$28,$EF,$00,$20,$E7,$E7,$E7,$E7,$E7,$EF,$00
|
||||||
|
db $FE,$82,$82,$82,$82,$82,$FE,$00,$02,$7E,$7E,$7E,$7E,$7E,$FE,$00
|
||||||
|
db $80,$80,$80,$98,$9C,$8C,$80,$7F,$7F,$7F,$7F,$67,$67,$7F,$7F,$7F
|
||||||
|
db $FF,$FF,$83,$F3,$F3,$F3,$F3,$F3,$FF,$80,$FC,$8C,$8C,$8C,$8C,$8C
|
||||||
|
db $FF,$FF,$F0,$F6,$F6,$F6,$F6,$F6,$FF,$00,$0F,$09,$09,$09,$09,$09
|
||||||
|
db $FF,$FF,$00,$00,$00,$00,$00,$00,$FF,$00,$FF,$FF,$FF,$FF,$FF,$FF
|
||||||
|
db $FF,$FF,$01,$57,$2F,$57,$2F,$57,$FF,$01,$FF,$A9,$D1,$A9,$D1,$A9
|
||||||
|
db $F3,$F3,$F3,$F3,$F3,$F3,$FF,$3F,$8C,$8C,$8C,$8C,$8C,$8C,$FF,$3F
|
||||||
|
db $F6,$F6,$F6,$F6,$F6,$F6,$FF,$FF,$09,$09,$09,$09,$09,$09,$FF,$FF
|
||||||
|
db $00,$00,$00,$00,$00,$00,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
|
||||||
|
db $2F,$57,$2F,$57,$2F,$57,$FF,$FC,$D1,$A9,$D1,$A9,$D1,$A9,$FF,$FC
|
||||||
|
db $3C,$3C,$3C,$3C,$3C,$3C,$3C,$3C,$23,$23,$23,$23,$23,$23,$23,$23
|
||||||
|
db $FB,$FB,$FB,$FB,$FB,$FB,$FB,$FB,$04,$04,$04,$04,$04,$04,$04,$04
|
||||||
|
db $BC,$5C,$BC,$5C,$BC,$5C,$BC,$5C,$44,$A4,$44,$A4,$44,$A4,$44,$A4
|
||||||
|
db $1F,$20,$40,$40,$80,$80,$80,$81,$1F,$3F,$7F,$7F,$FF,$FF,$FF,$FE
|
||||||
|
db $FF,$80,$80,$C0,$FF,$FF,$FE,$FE,$FF,$7F,$7F,$3F,$00,$00,$01,$01
|
||||||
|
db $FF,$7F,$7F,$FF,$FF,$07,$03,$03,$FF,$80,$80,$00,$00,$F8,$FC,$FC
|
||||||
|
db $FF,$00,$00,$00,$00,$81,$C3,$FF,$FF,$FF,$FF,$FF,$FF,$7E,$3C,$00
|
||||||
|
db $F8,$FC,$FE,$FE,$E3,$C1,$81,$81,$F8,$04,$02,$02,$1D,$3F,$7F,$7F
|
||||||
|
db $83,$FF,$FF,$FF,$FF,$FF,$7F,$1F,$FC,$80,$80,$80,$80,$80,$60,$1F
|
||||||
|
db $FC,$FC,$FC,$FC,$FE,$FE,$FF,$FF,$03,$03,$03,$03,$01,$01,$00,$FF
|
||||||
|
db $01,$01,$01,$01,$03,$03,$07,$FF,$FE,$FE,$FE,$FE,$FC,$FC,$F8,$FF
|
||||||
|
db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$00,$00,$00,$00,$00,$00,$00,$FF
|
||||||
|
db $81,$C1,$E3,$FF,$FF,$FF,$FF,$FE,$7F,$3F,$1D,$01,$01,$01,$03,$FE
|
||||||
|
db $FF,$FF,$FF,$FF,$FF,$FB,$B5,$CE,$80,$80,$80,$80,$80,$84,$CA,$B1
|
||||||
|
db $FF,$FF,$FF,$FF,$FF,$DF,$AD,$73,$01,$01,$01,$01,$01,$21,$53,$8D
|
||||||
|
db $77,$77,$77,$77,$77,$77,$77,$77,$00,$00,$00,$00,$77,$FF,$FF,$FF
|
||||||
|
db $00,$00,$00,$00,$00,$00,$00,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
|
||||||
|
db $77,$77,$77,$77,$00,$00,$00,$00,$FF,$FF,$FF,$77,$77,$77,$77,$77
|
||||||
|
db $01,$01,$01,$19,$1D,$0D,$01,$FE,$FF,$FF,$FF,$E7,$E7,$FF,$FF,$FE
|
||||||
|
db $20,$78,$7F,$FE,$FE,$FE,$FE,$FE,$00,$21,$21,$41,$41,$41,$41,$41
|
||||||
|
db $04,$9A,$FA,$FD,$FD,$FD,$FD,$FD,$00,$80,$80,$80,$80,$80,$80,$80
|
||||||
|
db $7E,$38,$21,$00,$01,$00,$01,$00,$21,$21,$01,$01,$01,$01,$01,$01
|
||||||
|
db $FA,$8A,$84,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80,$80
|
||||||
|
db $02,$04,$00,$10,$00,$40,$80,$00,$01,$01,$06,$08,$18,$20,$20,$C0
|
||||||
|
db $0B,$0B,$3B,$0B,$FB,$0B,$0B,$0A,$04,$04,$C4,$F4,$F4,$04,$04,$05
|
||||||
|
db $90,$10,$1F,$10,$1F,$10,$10,$90,$70,$F0,$F0,$FF,$FF,$F0,$F0,$70
|
||||||
|
db $3F,$78,$E7,$CF,$58,$58,$50,$90,$C0,$87,$18,$B0,$E7,$E7,$EF,$EF
|
||||||
|
db $B0,$FC,$E2,$C1,$C1,$83,$8F,$7E,$6F,$43,$5D,$3F,$3F,$7F,$7F,$FF
|
||||||
|
db $FE,$03,$0F,$91,$70,$60,$20,$31,$03,$FF,$F1,$6E,$CF,$DF,$FF,$FF
|
||||||
|
db $3F,$3F,$1D,$39,$7B,$F3,$86,$FE,$FD,$FB,$FB,$F7,$F7,$0F,$7F,$FF
|
||||||
|
db $FF,$FF,$FF,$FF,$FF,$80,$80,$FF,$FF,$80,$80,$80,$80,$FF,$FF,$80
|
||||||
|
db $FE,$FF,$FF,$FF,$FF,$03,$03,$FF,$FE,$03,$03,$03,$03,$FF,$FF,$03
|
||||||
|
db $00,$FF,$FF,$FF,$FF,$FF,$00,$00,$00,$FF,$00,$00,$00,$00,$FF,$FF
|
||||||
|
db $3C,$FC,$FC,$FC,$FC,$FC,$04,$04,$23,$F3,$0B,$0B,$0B,$07,$FF,$FF
|
||||||
|
db $FF,$FF,$FF,$FF,$80,$FF,$FF,$FF,$80,$80,$80,$80,$FF,$80,$80,$80
|
||||||
|
db $FF,$FF,$FF,$FF,$03,$FF,$FF,$FF,$03,$03,$03,$03,$FF,$03,$03,$03
|
||||||
|
db $FF,$FF,$FF,$FF,$FF,$00,$FF,$FF,$00,$00,$00,$00,$00,$FF,$00,$00
|
||||||
|
db $FC,$FC,$FE,$FE,$FE,$02,$FE,$FE,$07,$07,$03,$03,$03,$FF,$03,$03
|
||||||
|
db $FF,$80,$80,$80,$80,$80,$80,$80,$80,$FF,$FF,$FF,$FF,$FF,$FF,$FF
|
||||||
|
db $FF,$03,$03,$03,$03,$03,$03,$03,$03,$FF,$FF,$FF,$FF,$FF,$FF,$FF
|
||||||
|
db $02,$02,$02,$02,$02,$02,$04,$04,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
|
||||||
|
db $80,$80,$AA,$D5,$AA,$FF,$FF,$FF,$FF,$FF,$D5,$AA,$D5,$80,$80,$FF
|
||||||
|
db $03,$03,$AB,$57,$AB,$FF,$FF,$FE,$FF,$FF,$57,$AB,$57,$03,$03,$FE
|
||||||
|
db $00,$55,$AA,$55,$FF,$FF,$FF,$00,$FF,$AA,$55,$AA,$00,$00,$FF,$00
|
||||||
|
db $04,$54,$AC,$5C,$FC,$FC,$FC,$3C,$FF,$AF,$57,$AB,$0B,$0B,$F3,$23
|
||||||
|
db $3F,$3F,$3F,$3F,$00,$00,$00,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
|
||||||
|
db $7E,$7C,$7C,$78,$00,$00,$00,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
|
||||||
|
db $1F,$0F,$0F,$07,$00,$00,$00,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
|
||||||
|
db $FE,$FC,$FC,$F8,$00,$00,$00,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
|
||||||
|
db $00,$00,$00,$00,$FF,$FF,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $18,$18,$18,$18,$18,$18,$18,$18,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $07,$1F,$3F,$FF,$7F,$7F,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
|
||||||
|
db $E1,$F9,$FD,$FF,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
|
||||||
|
db $F0,$10,$10,$10,$10,$10,$10,$FF,$00,$E0,$E0,$E0,$E0,$E0,$E0,$E0
|
||||||
|
db $1F,$10,$10,$10,$10,$10,$10,$FF,$00,$0F,$0F,$0F,$0F,$0F,$0F,$0F
|
||||||
|
db $92,$92,$92,$FE,$FE,$00,$00,$00,$48,$48,$6C,$00,$00,$00,$FE,$00
|
||||||
|
db $0A,$0A,$3A,$0A,$FB,$0B,$0B,$0B,$05,$05,$C5,$F5,$F4,$04,$04,$04
|
||||||
|
db $90,$90,$9F,$90,$9F,$90,$90,$90,$70,$70,$70,$7F,$7F,$70,$70,$70
|
||||||
|
db $01,$01,$01,$01,$01,$01,$01,$01,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $80,$80,$80,$80,$80,$80,$80,$80,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $08,$88,$91,$D1,$53,$53,$73,$3F,$FF,$FF,$FF,$FF,$FF,$FE,$BE,$CE
|
||||||
|
db $00,$00,$07,$0F,$0C,$1B,$1B,$1B,$00,$00,$00,$00,$03,$04,$04,$04
|
||||||
|
db $00,$00,$E0,$F0,$F0,$F8,$F8,$F8,$00,$00,$60,$30,$30,$98,$98,$98
|
||||||
|
db $1B,$1B,$1B,$1B,$1B,$0F,$0F,$07,$04,$04,$04,$04,$04,$03,$00,$00
|
||||||
|
db $F8,$F8,$F8,$F8,$F8,$F0,$F0,$E0,$98,$98,$98,$98,$98,$30,$30,$60
|
||||||
|
db $F1,$11,$11,$1F,$10,$10,$10,$FF,$0F,$EF,$EF,$EF,$EF,$EF,$EF,$E0
|
||||||
|
db $1F,$10,$10,$F0,$10,$10,$10,$FF,$E0,$EF,$EF,$EF,$EF,$EF,$EF,$0F
|
||||||
|
db $7F,$BF,$DF,$EF,$F0,$F0,$F0,$F0,$80,$40,$20,$10,$0F,$0F,$0F,$0F
|
||||||
|
db $F0,$F0,$F0,$F0,$FF,$FF,$FF,$FF,$0F,$0F,$0F,$0F,$1F,$3F,$7F,$FF
|
||||||
|
db $FF,$FF,$FF,$FF,$0F,$0F,$0F,$0F,$01,$03,$07,$0F,$FF,$FF,$FF,$FF
|
||||||
|
db $0F,$0F,$0F,$0F,$F7,$FB,$FD,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
|
||||||
|
db $00,$00,$00,$00,$00,$00,$18,$18,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $1F,$3F,$7F,$7F,$7F,$FF,$FF,$FF,$1F,$20,$40,$40,$40,$80,$82,$82
|
||||||
|
db $FF,$FF,$FF,$7F,$7F,$7F,$3F,$1E,$82,$80,$A0,$44,$43,$40,$21,$1E
|
||||||
|
db $F8,$FC,$FE,$FE,$FE,$FF,$FF,$FF,$F8,$04,$02,$02,$02,$01,$41,$41
|
||||||
|
db $FF,$FF,$FF,$FE,$FE,$FE,$FC,$78,$41,$01,$05,$22,$C2,$02,$84,$78
|
||||||
|
db $7F,$80,$80,$80,$80,$80,$80,$80,$80,$7F,$7F,$7F,$7F,$7F,$7F,$7F
|
||||||
|
db $DE,$61,$61,$61,$71,$5E,$7F,$61,$61,$DF,$DF,$DF,$DF,$FF,$C1,$DF
|
||||||
|
db $80,$80,$C0,$F0,$BF,$8F,$81,$7E,$7F,$7F,$FF,$3F,$4F,$71,$7F,$FF
|
||||||
|
db $61,$61,$C1,$C1,$81,$81,$83,$FE,$DF,$DF,$BF,$BF,$7F,$7F,$7F,$7F
|
||||||
|
db $00,$00,$03,$0F,$1F,$3F,$7F,$7F,$00,$00,$03,$0C,$10,$20,$40,$40
|
||||||
|
db $00,$00,$C0,$F0,$F8,$FC,$FE,$FE,$00,$00,$C0,$30,$08,$04,$02,$02
|
||||||
|
db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$80,$80,$80,$80,$80,$80,$80,$80
|
||||||
|
db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$01,$01,$01,$01,$01,$01,$01,$01
|
||||||
|
db $7F,$7F,$7F,$3F,$3F,$1F,$0F,$07,$40,$40,$40,$20,$30,$1C,$0F,$07
|
||||||
|
db $FE,$FE,$FE,$FC,$FC,$F8,$F0,$F0,$02,$02,$02,$04,$0C,$38,$F0,$F0
|
||||||
|
db $0F,$0F,$0F,$0F,$0F,$0F,$07,$0F,$08,$08,$08,$08,$08,$0C,$05,$0A
|
||||||
|
db $F0,$F0,$F0,$F0,$F0,$F0,$E0,$F0,$10,$50,$50,$50,$50,$30,$A0,$50
|
||||||
|
db $81,$C1,$A3,$A3,$9D,$81,$81,$81,$00,$41,$22,$22,$1C,$00,$00,$00
|
||||||
|
db $E3,$F7,$C1,$C1,$C1,$C1,$F7,$E3,$E3,$14,$3E,$3E,$3E,$3E,$14,$E3
|
||||||
|
db $00,$00,$07,$0F,$0C,$1B,$1B,$1B,$FF,$FF,$F8,$F0,$F0,$E0,$E0,$E0
|
||||||
|
db $00,$00,$E0,$F0,$F0,$F8,$F8,$F8,$FF,$FF,$7F,$3F,$3F,$9F,$9F,$9F
|
||||||
|
db $1B,$1B,$1B,$1B,$1B,$0F,$0F,$07,$E0,$E0,$E0,$E0,$E0,$F3,$F0,$F8
|
||||||
|
db $F8,$F8,$F8,$F8,$F8,$F0,$F0,$E0,$9F,$9F,$9F,$9F,$9F,$3F,$3F,$7F
|
||||||
|
db $E0,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$00,$70,$1F,$10,$70,$7F,$7F,$7F
|
||||||
|
db $07,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$00,$03,$F8,$00,$03,$FB,$FB,$FB
|
||||||
|
db $FF,$FF,$FF,$FF,$FF,$FE,$FF,$EF,$7C,$7B,$76,$75,$75,$77,$17,$67
|
||||||
|
db $FF,$DF,$EF,$AF,$AF,$6F,$EF,$E7,$3B,$FB,$7B,$FB,$FB,$F3,$F8,$F3
|
||||||
|
db $1F,$1F,$3F,$3F,$70,$63,$E7,$E5,$0F,$0F,$1F,$1F,$3F,$3C,$78,$7A
|
||||||
|
db $F0,$F0,$F8,$F8,$0C,$C4,$E4,$A6,$F8,$F8,$FC,$FC,$FE,$3E,$1E,$5F
|
||||||
|
db $E9,$E9,$E9,$EF,$E2,$E3,$F0,$FF,$76,$76,$76,$70,$7D,$7C,$7F,$7F
|
||||||
|
db $96,$96,$96,$F6,$46,$C6,$0E,$FE,$6F,$6F,$6F,$0F,$BF,$3F,$FF,$FF
|
||||||
|
db $00,$00,$00,$00,$00,$00,$7E,$3C,$3C,$7E,$7E,$FF,$FF,$FF,$42,$00
|
||||||
|
db $3C,$42,$99,$A1,$A1,$99,$42,$3C,$00,$00,$00,$00,$00,$00,$00,$00
|
||||||
|
db $0F,$1F,$1F,$3F,$3F,$7F,$7F,$7F,$F0,$E0,$E0,$C0,$C0,$80,$80,$80
|
||||||
|
db $F0,$F8,$F8,$FC,$FC,$FE,$FE,$FE,$0F,$07,$07,$03,$03,$01,$01,$01
|
||||||
|
db $7F,$7F,$3F,$3F,$3F,$3F,$1F,$1F,$80,$80,$C0,$C0,$E0,$F8,$FE,$FF
|
||||||
|
db $FE,$FF,$FF,$FF,$FC,$FC,$FE,$FE,$FF,$7F,$1F,$07,$03,$03,$01,$81
|
||||||
|
db $7F,$7F,$7F,$3F,$3F,$3F,$3F,$1F,$80,$80,$80,$C0,$C0,$E0,$E0,$F0
|
||||||
|
db $FE,$FE,$FF,$FF,$FF,$FF,$FF,$FE,$01,$01,$01,$03,$03,$07,$07,$0F
|
||||||
|
db $1F,$0F,$0F,$07,$00,$00,$00,$00,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
|
||||||
|
db $FE,$FC,$FC,$F8,$00,$00,$00,$00,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
|
||||||
|
db $7E,$7E,$7E,$7E,$7F,$7F,$7F,$7F,$81,$81,$81,$81,$81,$81,$81,$81
|
||||||
|
db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$01,$01,$01,$03,$03,$07,$07,$0F
|
||||||
|
db $FE,$FE,$FE,$FE,$FF,$FF,$FF,$FF,$01,$01,$01,$01,$01,$01,$01,$01
|
||||||
|
db $7F,$7F,$7F,$7F,$7F,$7F,$7F,$7F,$81,$81,$81,$81,$81,$81,$81,$81
|
||||||
|
db $FF,$FF,$FF,$FF,$FC,$FE,$FE,$7E,$FF,$03,$03,$03,$03,$03,$03,$FF
|
||||||
|
db $FF,$FF,$FF,$FF,$00,$00,$00,$00,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
|
||||||
|
db $7F,$7F,$7F,$7F,$7F,$7F,$7F,$7F,$80,$80,$80,$80,$80,$80,$80,$80
|
||||||
|
db $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$01,$01,$01,$03,$07,$03,$01,$01
|
||||||
|
db $7E,$7E,$7F,$7F,$7F,$7F,$7F,$7F,$81,$81,$81,$81,$81,$81,$81,$81
|
||||||
|
db $3F,$3F,$3F,$3F,$00,$00,$00,$00,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
|
||||||
|
db $7E,$7C,$7C,$78,$00,$00,$00,$00,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
|
||||||
|
db $FE,$FE,$FF,$FF,$7F,$7F,$7F,$7F,$81,$81,$81,$81,$81,$81,$81,$81
|
||||||
|
db $7F,$7F,$3F,$3F,$3F,$3F,$1F,$1F,$80,$80,$C0,$C0,$E0,$F8,$FE,$FF
|
||||||
|
db $3F,$BF,$FF,$FF,$FC,$FC,$FE,$FE,$FF,$7F,$1F,$07,$03,$03,$01,$81
|
||||||
|
db $7F,$7F,$7E,$7E,$7F,$7F,$7F,$7F,$81,$81,$81,$81,$81,$81,$81,$81
|
||||||
|
db $7E,$7E,$7E,$7E,$7F,$7F,$7F,$7F,$81,$81,$81,$81,$81,$81,$81,$81
|
||||||
|
db $81,$C3,$C3,$E7,$E7,$FF,$FF,$FF,$7E,$3C,$3C,$18,$18,$00,$00,$00
|
||||||
|
db $0F,$43,$5B,$53,$31,$19,$0F,$07,$F2,$FE,$FE,$FF,$FF,$EF,$F7,$F8
|
||||||
|
db $C1,$C3,$C6,$84,$FC,$FC,$0E,$02,$BF,$BE,$BD,$7B,$7B,$07,$F3,$FD
|
||||||
|
db $10,$20,$22,$BA,$E6,$E1,$C0,$C0,$FF,$FF,$FF,$67,$59,$9E,$BF,$BF
|
||||||
|
db $20,$A6,$54,$26,$20,$C6,$54,$26,$20,$E6,$54,$26,$21,$06,$54,$26
|
||||||
|
db $20,$85,$01,$44,$20,$86,$54,$48,$20,$9A,$01,$49,$20,$A5,$C9,$46
|
||||||
|
db $20,$BA,$C9,$4A,$20,$A6,$0A,$D0,$D1,$D8,$D8,$DE,$D1,$D0,$DA,$DE
|
||||||
|
db $D1,$20,$C6,$0A,$D2,$D3,$DB,$DB,$DB,$D9,$DB,$DC,$DB,$DF,$20,$E6
|
||||||
|
db $0A,$D4,$D5,$D4,$D9,$DB,$E2,$D4,$DA,$DB,$E0,$21,$06,$0A,$D6,$D7
|
||||||
|
db $D6,$D7,$E1,$26,$D6,$DD,$E1,$E1,$21,$26,$14,$D0,$E8,$D1,$D0,$D1
|
||||||
|
db $DE,$D1,$D8,$D0,$D1,$26,$DE,$D1,$DE,$D1,$D0,$D1,$D0,$D1,$26,$21
|
||||||
|
db $46,$14,$DB,$42,$42,$DB,$42,$DB,$42,$DB,$DB,$42,$26,$DB,$42,$DB
|
||||||
|
db $42,$DB,$42,$DB,$42,$26,$21,$66,$46,$DB,$21,$6C,$0E,$DF,$DB,$DB
|
||||||
|
db $DB,$26,$DB,$DF,$DB,$DF,$DB,$DB,$E4,$E5,$26,$21,$86,$14,$DB,$DB
|
||||||
|
db $DB,$DE,$43,$DB,$E0,$DB,$DB,$DB,$26,$DB,$E3,$DB,$E0,$DB,$DB,$E6
|
||||||
|
db $E3,$26,$21,$A6,$14,$DB,$DB,$DB,$DB,$42,$DB,$DB,$DB,$D4,$D9,$26
|
||||||
|
db $DB,$D9,$DB,$DB,$D4,$D9,$D4,$D9,$E7,$21,$C5,$16,$5F,$95,$95,$95
|
||||||
|
db $95,$95,$95,$95,$95,$97,$98,$78,$95,$96,$95,$95,$97,$98,$97,$98
|
||||||
|
db $95,$7A,$21,$ED,$0E,$CF,$01,$09,$08,$05,$24,$17,$12,$17,$1D,$0E
|
||||||
|
db $17,$0D,$18,$22,$4B,$0D,$01,$24,$19,$15,$0A,$22,$0E,$1B,$24,$10
|
||||||
|
db $0A,$16,$0E,$22,$8B,$0D,$02,$24,$19,$15,$0A,$22,$0E,$1B,$24,$10
|
||||||
|
db $0A,$16,$0E,$22,$EC,$04,$1D,$18,$19,$28,$22,$F6,$01,$00,$23,$C9
|
||||||
|
db $56,$55,$23,$E2,$04,$99,$AA,$AA,$AA,$23,$EA,$04,$99,$AA,$AA,$AA
|
||||||
|
db $00,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
|
|
@ -8,13 +8,17 @@
|
||||||
"cadius": "C:\\Programs\\IIgsXDev\\bin\\Cadius.exe",
|
"cadius": "C:\\Programs\\IIgsXDev\\bin\\Cadius.exe",
|
||||||
"gsport": "C:\\Programs\\gsport\\gsport_0.31\\GSPort.exe",
|
"gsport": "C:\\Programs\\gsport\\gsport_0.31\\GSPort.exe",
|
||||||
"macros": "../../macros",
|
"macros": "../../macros",
|
||||||
"crossrunner": "C:\\Programs\\Crossrunner\\Crossrunner.exe"
|
"crossrunner": "C:\\Program Files\\Crossrunner\\Crossrunner.exe"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "npm run build && npm run build:image && npm run gsport",
|
"test": "npm run build && npm run build:image && npm run gsport",
|
||||||
"gsport": "%npm_package_config_gsport%",
|
"gsport": "%npm_package_config_gsport%",
|
||||||
"build": "%npm_package_config_merlin32% -V %npm_package_config_macros% App.s",
|
"build:sys16": "%npm_package_config_merlin32% -V %npm_package_config_macros% App.s",
|
||||||
"build:image": "build-image.bat %npm_package_config_cadius%"
|
"build": "npm run build:tool && npm run build:sys16",
|
||||||
|
"build:tool": "%npm_package_config_merlin32% -V %npm_package_config_macros% ../../src/Master.s",
|
||||||
|
"build:image": "build-image.bat %npm_package_config_cadius%",
|
||||||
|
"debug": "\"%npm_package_config_crossrunner%\" SuperMarioGS -Source SuperMarioGS_S02__Output.txt -Source SuperMarioGS_S03__Output.txt -Debug -CompatibilityLayer"
|
||||||
|
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
|
69
demos/smb/palette.s
Normal file
69
demos/smb/palette.s
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
; NES Palette (52 entries)
|
||||||
|
nesPalette
|
||||||
|
dw $0888
|
||||||
|
dw $004A
|
||||||
|
dw $001B
|
||||||
|
dw $0409
|
||||||
|
dw $0A06
|
||||||
|
dw $0C02
|
||||||
|
dw $0C10
|
||||||
|
dw $0910
|
||||||
|
dw $0630
|
||||||
|
dw $0140
|
||||||
|
dw $0050
|
||||||
|
dw $0043
|
||||||
|
dw $0046
|
||||||
|
dw $0000
|
||||||
|
dw $0111
|
||||||
|
dw $0111
|
||||||
|
|
||||||
|
dw $0CCC
|
||||||
|
dw $007F
|
||||||
|
dw $025F
|
||||||
|
dw $083F
|
||||||
|
dw $0F3B
|
||||||
|
dw $0F35
|
||||||
|
dw $0F20
|
||||||
|
dw $0D30
|
||||||
|
dw $0C60
|
||||||
|
dw $0380
|
||||||
|
dw $0190
|
||||||
|
dw $0095
|
||||||
|
dw $00AD
|
||||||
|
dw $0222
|
||||||
|
dw $0111
|
||||||
|
dw $0111
|
||||||
|
|
||||||
|
dw $0FFF
|
||||||
|
dw $01DF
|
||||||
|
dw $07AF
|
||||||
|
dw $0D8F
|
||||||
|
dw $0F4F
|
||||||
|
dw $0F69
|
||||||
|
dw $0F93
|
||||||
|
dw $0F91
|
||||||
|
dw $0FC2
|
||||||
|
dw $0AE1
|
||||||
|
dw $03F3
|
||||||
|
dw $01FA
|
||||||
|
dw $00FF
|
||||||
|
dw $0666
|
||||||
|
dw $0111
|
||||||
|
dw $0111
|
||||||
|
|
||||||
|
dw $0FFF
|
||||||
|
dw $0AFF
|
||||||
|
dw $0BEF
|
||||||
|
dw $0DAF
|
||||||
|
dw $0FBF
|
||||||
|
dw $0FAB
|
||||||
|
dw $0FDB
|
||||||
|
dw $0FEA
|
||||||
|
dw $0FF9
|
||||||
|
dw $0DE9
|
||||||
|
dw $0AEB
|
||||||
|
dw $0AFD
|
||||||
|
dw $09FF
|
||||||
|
dw $0EEE
|
||||||
|
dw $0111
|
||||||
|
dw $0111
|
521
demos/smb/ppu.s
Normal file
521
demos/smb/ppu.s
Normal file
|
@ -0,0 +1,521 @@
|
||||||
|
; PPU simulator
|
||||||
|
;
|
||||||
|
; Any read/write to the PPU registers in the ROM is intercepted and passed here.
|
||||||
|
|
||||||
|
mx %11
|
||||||
|
dw $a5a5 ; marker to find in memory
|
||||||
|
ppuaddr ds 2 ; 16-bit ppu address
|
||||||
|
w_bit dw 1 ; currently writing to high or low to the address latch
|
||||||
|
vram_buff dw 0 ; latched data when reading VRAM ($0000 - $3EFF)
|
||||||
|
|
||||||
|
ppuincr dw 1 ; 1 or 32 depending on bit 2 of PPUCTRL
|
||||||
|
spadr dw $0000 ; Sprite pattern table ($0000 or $1000) depending on bit 3 of PPUCTRL
|
||||||
|
ntaddr dw $2000 ; Base nametable address ($2000, $2400, $2800, $2C00), bits 0 and 1 of PPUCTRL
|
||||||
|
bgadr dw $0000 ; Background pattern table address
|
||||||
|
ppuctrl dw 0 ; Copy of the ppu ctrl byte
|
||||||
|
ppumask dw 0 ; Copy of the ppu mask byte
|
||||||
|
ppustatus dw 0
|
||||||
|
oamaddr dw 0 ; Typically this will always be 0
|
||||||
|
ppuscroll dw 0 ; Y X coordinates
|
||||||
|
|
||||||
|
ntbase db $20,$24,$28,$2c
|
||||||
|
|
||||||
|
assert_lt mac
|
||||||
|
cmp ]1
|
||||||
|
bcc ok
|
||||||
|
brk ]2
|
||||||
|
ok
|
||||||
|
<<<
|
||||||
|
|
||||||
|
assert_x_lt mac
|
||||||
|
cpx ]1
|
||||||
|
bcc ok
|
||||||
|
brk ]2
|
||||||
|
ok
|
||||||
|
<<<
|
||||||
|
|
||||||
|
cond mac
|
||||||
|
bit ]1
|
||||||
|
beq cond_0
|
||||||
|
lda ]3
|
||||||
|
bra cond_s
|
||||||
|
cond_0 lda ]2
|
||||||
|
cond_s sta ]4
|
||||||
|
<<<
|
||||||
|
|
||||||
|
; $2000 - PPUCTRL (Write only)
|
||||||
|
PPUCTRL_WRITE ENT
|
||||||
|
php
|
||||||
|
phb
|
||||||
|
phk
|
||||||
|
plb
|
||||||
|
|
||||||
|
sta ppuctrl
|
||||||
|
phx
|
||||||
|
|
||||||
|
; Set the pattern table base address
|
||||||
|
and #$03
|
||||||
|
tax
|
||||||
|
lda ntbase,x
|
||||||
|
sta ntaddr+1
|
||||||
|
|
||||||
|
; Set the vram increment
|
||||||
|
lda ppuctrl
|
||||||
|
cond #$04;#$01;#$20;ppuincr
|
||||||
|
|
||||||
|
; Set the sprite table address
|
||||||
|
lda ppuctrl
|
||||||
|
cond #$08;#$00;#$10;spadr+1
|
||||||
|
|
||||||
|
; Set the background table address
|
||||||
|
lda ppuctrl
|
||||||
|
cond #$10;#$00;#$10;bgadr+1
|
||||||
|
|
||||||
|
plx
|
||||||
|
lda ppuctrl
|
||||||
|
plb
|
||||||
|
plp
|
||||||
|
rtl
|
||||||
|
|
||||||
|
; $2001 - PPUMASK (Write only)
|
||||||
|
PPUMASK_WRITE ENT
|
||||||
|
stal ppumask
|
||||||
|
rtl
|
||||||
|
|
||||||
|
|
||||||
|
; $2002 - PPUSTATUS For "ldx ppustatus"
|
||||||
|
PPUSTATUS_READ_X ENT
|
||||||
|
php
|
||||||
|
pha
|
||||||
|
|
||||||
|
lda #1
|
||||||
|
stal w_bit ; Reset the address latch used by PPUSCROLL and PPUADDR
|
||||||
|
|
||||||
|
ldal ppustatus
|
||||||
|
tax
|
||||||
|
and #$7F ; Clear the VBL flag
|
||||||
|
stal ppustatus
|
||||||
|
|
||||||
|
pla ; Restore the accumulator (return value in X)
|
||||||
|
plp
|
||||||
|
phx ; re-read x to set any relevant flags
|
||||||
|
plx
|
||||||
|
|
||||||
|
rtl
|
||||||
|
|
||||||
|
PPUSTATUS_READ ENT
|
||||||
|
php
|
||||||
|
|
||||||
|
lda #1
|
||||||
|
stal w_bit ; Reset the address latch used by PPUSCROLL and PPUADDR
|
||||||
|
|
||||||
|
ldal ppustatus
|
||||||
|
pha
|
||||||
|
and #$7F ; Clear the VBL flag
|
||||||
|
stal ppustatus
|
||||||
|
|
||||||
|
pla ; pop the return value
|
||||||
|
plp
|
||||||
|
pha ; re-read accumulator to set any relevant flags
|
||||||
|
pla
|
||||||
|
rtl
|
||||||
|
|
||||||
|
; $2003
|
||||||
|
OAMADDR_WRITE ENT
|
||||||
|
stal oamaddr
|
||||||
|
rtl
|
||||||
|
|
||||||
|
; $2005 - PPU SCROLL
|
||||||
|
PPUSCROLL_WRITE ENT
|
||||||
|
php
|
||||||
|
phb
|
||||||
|
phk
|
||||||
|
plb
|
||||||
|
phx
|
||||||
|
pha
|
||||||
|
|
||||||
|
ldx w_bit
|
||||||
|
sta ppuscroll,x
|
||||||
|
txa
|
||||||
|
eor #$01
|
||||||
|
sta w_bit
|
||||||
|
|
||||||
|
pla
|
||||||
|
plx
|
||||||
|
plb
|
||||||
|
plp
|
||||||
|
rtl
|
||||||
|
|
||||||
|
; $2006 - PPUADDR
|
||||||
|
PPUADDR_WRITE ENT
|
||||||
|
php
|
||||||
|
phb
|
||||||
|
phk
|
||||||
|
plb
|
||||||
|
phx
|
||||||
|
pha
|
||||||
|
|
||||||
|
ldx w_bit
|
||||||
|
sta ppuaddr,x
|
||||||
|
; assert_lt #$40;$D0
|
||||||
|
txa
|
||||||
|
eor #$01
|
||||||
|
sta w_bit
|
||||||
|
|
||||||
|
pla
|
||||||
|
plx
|
||||||
|
plb
|
||||||
|
plp
|
||||||
|
rtl
|
||||||
|
|
||||||
|
; 2007 - PPUDATA (Read/Write)
|
||||||
|
;
|
||||||
|
; If reading from the $0000 - $3EFF range, the value from vram_buff is returned and the actual data is loaded
|
||||||
|
; post-fetch.
|
||||||
|
PPUDATA_READ ENT
|
||||||
|
php
|
||||||
|
phb
|
||||||
|
phk
|
||||||
|
plb
|
||||||
|
phx
|
||||||
|
|
||||||
|
rep #$30 ; do a 16-bit update of the address
|
||||||
|
ldx ppuaddr
|
||||||
|
txa
|
||||||
|
; assert_lt #$4000;$d1
|
||||||
|
|
||||||
|
clc
|
||||||
|
adc ppuincr
|
||||||
|
sta ppuaddr
|
||||||
|
sep #$20 ; back to 8-bit acc for the read itself
|
||||||
|
|
||||||
|
cpx #$3F00 ; check which range of memory we are accessing?
|
||||||
|
bcc :buff_read
|
||||||
|
|
||||||
|
lda PPU_MEM,x
|
||||||
|
bra :out
|
||||||
|
|
||||||
|
:buff_read
|
||||||
|
lda vram_buff ; read from the buffer
|
||||||
|
pha
|
||||||
|
lda PPU_MEM,x ; put the data in the buffer for the next read
|
||||||
|
sta vram_buff
|
||||||
|
pla ; pop the return value
|
||||||
|
|
||||||
|
:out
|
||||||
|
sep #$10
|
||||||
|
plx
|
||||||
|
plb
|
||||||
|
plp
|
||||||
|
|
||||||
|
pha
|
||||||
|
pla
|
||||||
|
rtl
|
||||||
|
|
||||||
|
PPUDATA_WRITE ENT
|
||||||
|
php
|
||||||
|
phb
|
||||||
|
phk
|
||||||
|
plb
|
||||||
|
pha
|
||||||
|
phx
|
||||||
|
|
||||||
|
rep #$10
|
||||||
|
ldx ppuaddr
|
||||||
|
sta PPU_MEM,x
|
||||||
|
|
||||||
|
rep #$30
|
||||||
|
txa
|
||||||
|
clc
|
||||||
|
adc ppuincr
|
||||||
|
sta ppuaddr
|
||||||
|
|
||||||
|
cpx #$3F00
|
||||||
|
bcs :extra
|
||||||
|
|
||||||
|
sep #$30
|
||||||
|
plx
|
||||||
|
pla
|
||||||
|
plb
|
||||||
|
plp
|
||||||
|
rtl
|
||||||
|
|
||||||
|
; Do some extra work to keep palette data in sync
|
||||||
|
;
|
||||||
|
; Based on the palette data that SMB uses, we map the NES palette entries as
|
||||||
|
;
|
||||||
|
; NES Description IIgs Palette
|
||||||
|
; ----------------------------------------
|
||||||
|
; BG0 Background color 0
|
||||||
|
; BG0,1 Light Green 1
|
||||||
|
; BG0,2 Dark Green 2
|
||||||
|
; BG0,3 Black 3
|
||||||
|
; BG1,1 Peach 4
|
||||||
|
; BG1,2 Brown 5
|
||||||
|
; BG1,3 Black 3
|
||||||
|
; BG2,1 White 6
|
||||||
|
; BG2,2 Light Blue 7
|
||||||
|
; BG2,3 Black 3
|
||||||
|
; BG3,1 Cycle 8 ; Coins / Blocks
|
||||||
|
; BG3,2 Brown 5
|
||||||
|
; BG3,3 Black 3
|
||||||
|
; SP0 0
|
||||||
|
; SP0,1 Red 9
|
||||||
|
; SP0,2 Orange 10
|
||||||
|
; SP0,3 Olive 11
|
||||||
|
; SP1,1 Dark Green 2
|
||||||
|
; SP1,2 White 6
|
||||||
|
; SP1,3 Orange 10
|
||||||
|
; SP2,1 Red 9
|
||||||
|
; SP2,2 White 6
|
||||||
|
; SP2,3 Orange 10
|
||||||
|
; SP3,1 Black 3
|
||||||
|
; SP3,2 Peach 4
|
||||||
|
; SP3,3 Brown 5
|
||||||
|
;
|
||||||
|
; There are 4 color to spare in case we need to add more entries. This mapping table is important because
|
||||||
|
; we have to have a custom tile rendering function and custom sprite rendering function that will dynamically
|
||||||
|
; map the 2-bit tile data into the proper palette range. This will likely be implemented with an 8-bit
|
||||||
|
; swizzle table. Possible optimization later on is to pre-swizzle certain tiles assuming that the palette
|
||||||
|
; assignments never change.
|
||||||
|
;
|
||||||
|
; BG Palette 2 can probably be ignored because it's just for the top of the screen and we can use a separate
|
||||||
|
; SCB palette for that line
|
||||||
|
mx %00
|
||||||
|
:extra
|
||||||
|
txa
|
||||||
|
and #$001F
|
||||||
|
asl
|
||||||
|
tax
|
||||||
|
jmp (palTbl,x)
|
||||||
|
|
||||||
|
palTbl dw ppu_3F00,ppu_3F01,ppu_3F02,ppu_3F03
|
||||||
|
dw ppu_3F04,ppu_3F05,ppu_3F06,ppu_3F07
|
||||||
|
dw ppu_3F08,ppu_3F09,ppu_3F0A,ppu_3F0B
|
||||||
|
dw ppu_3F0C,ppu_3F0D,ppu_3F0E,ppu_3F0F
|
||||||
|
dw ppu_3F10,ppu_3F11,ppu_3F12,ppu_3F13
|
||||||
|
dw ppu_3F14,ppu_3F15,ppu_3F16,ppu_3F17
|
||||||
|
dw ppu_3F18,ppu_3F19,ppu_3F1A,ppu_3F1B
|
||||||
|
dw ppu_3F1C,ppu_3F1D,ppu_3F1E,ppu_3F1F
|
||||||
|
|
||||||
|
ppu_3F00
|
||||||
|
lda PPU_MEM+$3F00
|
||||||
|
ldx #0
|
||||||
|
brl extra_out
|
||||||
|
|
||||||
|
ppu_3F01
|
||||||
|
lda PPU_MEM+$3F01
|
||||||
|
ldx #2
|
||||||
|
brl extra_out
|
||||||
|
|
||||||
|
ppu_3F02
|
||||||
|
lda PPU_MEM+$3F02
|
||||||
|
ldx #4
|
||||||
|
brl extra_out
|
||||||
|
|
||||||
|
ppu_3F03
|
||||||
|
lda PPU_MEM+$3F03
|
||||||
|
ldx #6
|
||||||
|
brl extra_out
|
||||||
|
|
||||||
|
ppu_3F05
|
||||||
|
lda PPU_MEM+$3F05
|
||||||
|
ldx #8
|
||||||
|
brl extra_out
|
||||||
|
|
||||||
|
ppu_3F06
|
||||||
|
lda PPU_MEM+$3F06
|
||||||
|
ldx #10
|
||||||
|
brl extra_out
|
||||||
|
|
||||||
|
ppu_3F07
|
||||||
|
lda PPU_MEM+$3F07
|
||||||
|
ldx #12
|
||||||
|
brl extra_out
|
||||||
|
|
||||||
|
ppu_3F09
|
||||||
|
lda PPU_MEM+$3F05
|
||||||
|
ldx #14
|
||||||
|
brl extra_out
|
||||||
|
|
||||||
|
ppu_3F0A
|
||||||
|
lda PPU_MEM+$3F06
|
||||||
|
ldx #16
|
||||||
|
brl extra_out
|
||||||
|
|
||||||
|
ppu_3F0B
|
||||||
|
lda PPU_MEM+$3F07
|
||||||
|
ldx #18
|
||||||
|
brl extra_out
|
||||||
|
|
||||||
|
ppu_3F0D
|
||||||
|
lda PPU_MEM+$3F05
|
||||||
|
ldx #20
|
||||||
|
brl extra_out
|
||||||
|
|
||||||
|
ppu_3F0E
|
||||||
|
lda PPU_MEM+$3F06
|
||||||
|
ldx #22
|
||||||
|
brl extra_out
|
||||||
|
|
||||||
|
ppu_3F0F
|
||||||
|
lda PPU_MEM+$3F07
|
||||||
|
ldx #24
|
||||||
|
brl extra_out
|
||||||
|
|
||||||
|
ppu_3F10
|
||||||
|
lda PPU_MEM+$3F10
|
||||||
|
ldx #0
|
||||||
|
brl extra_out
|
||||||
|
|
||||||
|
ppu_3F04
|
||||||
|
ppu_3F08
|
||||||
|
ppu_3F0C
|
||||||
|
ppu_3F11
|
||||||
|
ppu_3F12
|
||||||
|
ppu_3F13
|
||||||
|
ppu_3F14
|
||||||
|
ppu_3F15
|
||||||
|
ppu_3F16
|
||||||
|
ppu_3F17
|
||||||
|
ppu_3F18
|
||||||
|
ppu_3F19
|
||||||
|
ppu_3F1A
|
||||||
|
ppu_3F1B
|
||||||
|
ppu_3F1C
|
||||||
|
ppu_3F1D
|
||||||
|
ppu_3F1E
|
||||||
|
ppu_3F1F
|
||||||
|
|
||||||
|
; Exit code to set a IIgs palette entry from the PPU memory
|
||||||
|
;
|
||||||
|
; A = NES palette value
|
||||||
|
; X = IIgs Palette index
|
||||||
|
extra_out
|
||||||
|
phy
|
||||||
|
and #$00FF
|
||||||
|
asl
|
||||||
|
tay
|
||||||
|
lda nesPalette,y
|
||||||
|
ply
|
||||||
|
stal $E19E00,x
|
||||||
|
|
||||||
|
sep #$30
|
||||||
|
plx
|
||||||
|
pla
|
||||||
|
plb
|
||||||
|
plp
|
||||||
|
rtl
|
||||||
|
|
||||||
|
; Trigger a copy from a page of memory to OAM. Since this is a DMA operation, we can cheat and do a 16-bit copy
|
||||||
|
PPUDMA_WRITE ENT
|
||||||
|
php
|
||||||
|
phb
|
||||||
|
phk
|
||||||
|
plb
|
||||||
|
|
||||||
|
phx
|
||||||
|
pha
|
||||||
|
|
||||||
|
rep #$30
|
||||||
|
xba
|
||||||
|
and #$FF00
|
||||||
|
tax
|
||||||
|
|
||||||
|
]n equ 0
|
||||||
|
lup 128
|
||||||
|
ldal ROMBase+]n,x
|
||||||
|
sta PPU_OAM+]n
|
||||||
|
]n = ]n+2
|
||||||
|
--^
|
||||||
|
|
||||||
|
sep #$30
|
||||||
|
|
||||||
|
pla
|
||||||
|
plx
|
||||||
|
plb
|
||||||
|
plp
|
||||||
|
rtl
|
||||||
|
|
||||||
|
y_offset equ 16
|
||||||
|
x_offset equ 16
|
||||||
|
|
||||||
|
drawOAMSprites
|
||||||
|
:tmp equ 238
|
||||||
|
phb
|
||||||
|
php
|
||||||
|
|
||||||
|
phk
|
||||||
|
plb
|
||||||
|
|
||||||
|
sep #$30 ; 8-bit cpu
|
||||||
|
ldx #4 ; Ok to always skip sprite 0
|
||||||
|
|
||||||
|
:oam_loop
|
||||||
|
lda PPU_OAM+3,x ; remove this test once we can clip sprites
|
||||||
|
cmp #241
|
||||||
|
bcs :hidden
|
||||||
|
|
||||||
|
lda PPU_OAM,x ; Y-coordinate
|
||||||
|
cmp #200+y_offset-9
|
||||||
|
bcs :hidden
|
||||||
|
|
||||||
|
phx
|
||||||
|
inc ; Compensate for PPU delayed scanline
|
||||||
|
rep #$30
|
||||||
|
and #$00FF
|
||||||
|
asl
|
||||||
|
asl
|
||||||
|
asl
|
||||||
|
asl
|
||||||
|
asl
|
||||||
|
sta :tmp
|
||||||
|
asl
|
||||||
|
asl
|
||||||
|
clc
|
||||||
|
adc :tmp
|
||||||
|
clc
|
||||||
|
adc #$2000-{y_offset*160}+x_offset
|
||||||
|
sta :tmp
|
||||||
|
|
||||||
|
lda PPU_OAM+3,x
|
||||||
|
lsr
|
||||||
|
and #$007F
|
||||||
|
clc
|
||||||
|
adc :tmp
|
||||||
|
tay
|
||||||
|
|
||||||
|
lda PPU_OAM+2,x
|
||||||
|
bit #$0040 ; horizontal flip
|
||||||
|
bne :hflip
|
||||||
|
|
||||||
|
lda PPU_OAM,x ; Load the tile index into the high byte (x256)
|
||||||
|
and #$FF00
|
||||||
|
lsr ; multiple by 128
|
||||||
|
tax
|
||||||
|
bra drawTilePatch
|
||||||
|
|
||||||
|
:hflip
|
||||||
|
lda PPU_OAM,x ; Loda the tile index into the high byte (x256)
|
||||||
|
and #$FF00
|
||||||
|
lsr ; multiple by 128
|
||||||
|
adc #64 ; horizontal flip
|
||||||
|
tax
|
||||||
|
|
||||||
|
drawTilePatch
|
||||||
|
jsl $000000 ; Draw the tile on the graphics screen
|
||||||
|
|
||||||
|
:hop
|
||||||
|
sep #$30
|
||||||
|
plx
|
||||||
|
|
||||||
|
:hidden
|
||||||
|
inx
|
||||||
|
inx
|
||||||
|
inx
|
||||||
|
inx
|
||||||
|
bne :oam_loop
|
||||||
|
|
||||||
|
plp
|
||||||
|
plb
|
||||||
|
rtl
|
358
demos/smb/rom.s
358
demos/smb/rom.s
|
@ -668,23 +668,79 @@ GameOverModeValue = 3
|
||||||
; .mem 8
|
; .mem 8
|
||||||
|
|
||||||
;-------------------------------------------------------------------------------------
|
;-------------------------------------------------------------------------------------
|
||||||
mx %11
|
|
||||||
; External wrapper is responsible for setting the stack
|
|
||||||
|
|
||||||
put chr.s
|
; External wrapper is responsible for setting the stack
|
||||||
ds $6000
|
PPUCTRL_WRITE EXT
|
||||||
|
PPUMASK_WRITE EXT
|
||||||
|
PPUSTATUS_READ EXT
|
||||||
|
PPUSTATUS_READ_X EXT
|
||||||
|
OAMADDR_WRITE EXT
|
||||||
|
PPUSCROLL_WRITE EXT
|
||||||
|
PPUADDR_WRITE EXT
|
||||||
|
PPUDATA_READ EXT
|
||||||
|
PPUDATA_WRITE EXT
|
||||||
|
PPUDMA_WRITE EXT
|
||||||
|
|
||||||
|
ROMBase ENT
|
||||||
|
ds $8000-14-50
|
||||||
|
|
||||||
|
; Hooks to call back to the GTE harness for PPU memory-mapped accesses
|
||||||
|
mx %11
|
||||||
|
PPU_CTRL_W
|
||||||
|
jsl PPUCTRL_WRITE
|
||||||
|
rts
|
||||||
|
PPU_MASK_W
|
||||||
|
jsl PPUMASK_WRITE
|
||||||
|
rts
|
||||||
|
PPU_STATUS_R
|
||||||
|
jsl PPUSTATUS_READ
|
||||||
|
rts
|
||||||
|
PPU_STATUS_RX
|
||||||
|
jsl PPUSTATUS_READ_X
|
||||||
|
rts
|
||||||
|
OAM_ADDR_W
|
||||||
|
jsl OAMADDR_WRITE
|
||||||
|
rts
|
||||||
|
PPU_SCROLL_W
|
||||||
|
jsl PPUSCROLL_WRITE
|
||||||
|
rts
|
||||||
|
PPU_ADDRESS_W
|
||||||
|
jsl PPUADDR_WRITE
|
||||||
|
rts
|
||||||
|
PPU_DATA_R
|
||||||
|
jsl PPUDATA_READ
|
||||||
|
rts
|
||||||
|
PPU_DATA_W
|
||||||
|
jsl PPUDATA_WRITE
|
||||||
|
rts
|
||||||
|
SPR_DMA_W
|
||||||
|
jsl PPUDMA_WRITE
|
||||||
|
rts
|
||||||
|
|
||||||
|
; Enter via a JML. X = target address, Stack and Direct page set up properly. B = ROM bank. Called in 16-bit native mode
|
||||||
|
mx %00
|
||||||
|
|
||||||
|
ExtRtn EXT
|
||||||
|
ExtIn ENT
|
||||||
|
stx :patch+1
|
||||||
|
sep #$30
|
||||||
|
:patch jsr $0000
|
||||||
|
rep #$30
|
||||||
|
jml ExtRtn
|
||||||
|
|
||||||
|
mx %11
|
||||||
SMBStart ENT
|
SMBStart ENT
|
||||||
Start
|
Start
|
||||||
; sei ;pretty standard 6502 type init here
|
; sei ;pretty standard 6502 type init here
|
||||||
; cld
|
; cld
|
||||||
lda #%00010000 ;init PPU control register 1
|
lda #%00010000 ;init PPU control register 1
|
||||||
sta PPU_CTRL_REG1
|
jsr PPU_CTRL_W
|
||||||
; ldx #$ff ;reset stack pointer
|
; ldx #$ff ;reset stack pointer
|
||||||
; txs
|
; txs
|
||||||
VBlank1 lda PPU_STATUS ;wait two frames
|
;VBlank1 jsr PPU_STATUS_R ;wait two frames
|
||||||
bpl VBlank1
|
; bpl VBlank1
|
||||||
VBlank2 lda PPU_STATUS
|
;VBlank2 jsr PPU_STATUS_R
|
||||||
bpl VBlank2
|
; bpl VBlank2
|
||||||
ldy #ColdBootOffset ;load default cold boot pointer
|
ldy #ColdBootOffset ;load default cold boot pointer
|
||||||
ldx #$05 ;this is where we check for a warm boot
|
ldx #$05 ;this is where we check for a warm boot
|
||||||
WBootCheck lda TopScoreDisplay,x ;check each score digit in the top score
|
WBootCheck lda TopScoreDisplay,x ;check each score digit in the top score
|
||||||
|
@ -696,7 +752,8 @@ WBootCheck lda TopScoreDisplay,x ;check each score d
|
||||||
cmp #$a5 ;another location has a specific value
|
cmp #$a5 ;another location has a specific value
|
||||||
bne ColdBoot
|
bne ColdBoot
|
||||||
ldy #WarmBootOffset ;if passed both, load warm boot pointer
|
ldy #WarmBootOffset ;if passed both, load warm boot pointer
|
||||||
ColdBoot jsr InitializeMemory ;clear memory using pointer in Y
|
ColdBoot
|
||||||
|
jsr InitializeMemory ;clear memory using pointer in Y
|
||||||
sta SND_DELTA_REG+1 ;reset delta counter load register
|
sta SND_DELTA_REG+1 ;reset delta counter load register
|
||||||
sta OperMode ;reset primary mode of operation
|
sta OperMode ;reset primary mode of operation
|
||||||
lda #$a5 ;set warm boot flag
|
lda #$a5 ;set warm boot flag
|
||||||
|
@ -705,7 +762,7 @@ ColdBoot jsr InitializeMemory ;clear memory using
|
||||||
lda #%00001111
|
lda #%00001111
|
||||||
sta SND_MASTERCTRL_REG ;enable all sound channels except dmc
|
sta SND_MASTERCTRL_REG ;enable all sound channels except dmc
|
||||||
lda #%00000110
|
lda #%00000110
|
||||||
sta PPU_CTRL_REG2 ;turn off clipping for OAM and background
|
jsr PPU_MASK_W ;turn off clipping for OAM and background
|
||||||
jsr MoveAllSpritesOffscreen
|
jsr MoveAllSpritesOffscreen
|
||||||
jsr InitializeNameTables ;initialize both name tables
|
jsr InitializeNameTables ;initialize both name tables
|
||||||
inc DisableScreenFlag ;set flag to disable screen output
|
inc DisableScreenFlag ;set flag to disable screen output
|
||||||
|
@ -713,28 +770,28 @@ ColdBoot jsr InitializeMemory ;clear memory using
|
||||||
ora #%10000000 ;enable NMIs
|
ora #%10000000 ;enable NMIs
|
||||||
jsr WritePPUReg1
|
jsr WritePPUReg1
|
||||||
; EndlessLoop jmp EndlessLoop ;endless loop, need I say more?
|
; EndlessLoop jmp EndlessLoop ;endless loop, need I say more?
|
||||||
rtl ; GTE - Return to caller
|
InternalRts rts ; GTE - Return to caller
|
||||||
|
ds 17 ; Add back inthe bytes we commented out
|
||||||
;-------------------------------------------------------------------------------------
|
;-------------------------------------------------------------------------------------
|
||||||
;$00 - vram buffer address table low, also used for pseudorandom bit
|
;$00 - vram buffer address table low, also used for pseudorandom bit
|
||||||
;$01 - vram buffer address table high
|
;$01 - vram buffer address table high
|
||||||
|
|
||||||
VRAM_AddrTable_Low
|
VRAM_AddrTable_Low
|
||||||
db <VRAM_Buffer1,<WaterPaletteData,
|
db <VRAM_Buffer1, <WaterPaletteData, <GroundPaletteData
|
||||||
db <UndergroundPaletteData,<CastlePaletteData,
|
db <UndergroundPaletteData, <CastlePaletteData, <VRAM_Buffer1_Offset
|
||||||
db <VRAM_Buffer2,<VRAM_Buffer2,
|
db <VRAM_Buffer2, <VRAM_Buffer2, <BowserPaletteData
|
||||||
db <DaySnowPaletteData,<NightSnowPaletteData,
|
db <DaySnowPaletteData, <NightSnowPaletteData, <MushroomPaletteData
|
||||||
db <MarioThanksMessage,<LuigiThanksMessage,
|
db <MarioThanksMessage, <LuigiThanksMessage, <MushroomRetainerSaved
|
||||||
db <PrincessSaved1,<PrincessSaved2,
|
db <PrincessSaved1, <PrincessSaved2, <WorldSelectMessage1
|
||||||
db <WorldSelectMessage2
|
db <WorldSelectMessage2
|
||||||
|
|
||||||
VRAM_AddrTable_High
|
VRAM_AddrTable_High
|
||||||
db >VRAM_Buffer1,>WaterPaletteData,
|
db >VRAM_Buffer1, >WaterPaletteData, >GroundPaletteData
|
||||||
db >UndergroundPaletteData,>CastlePaletteData,
|
db >UndergroundPaletteData, >CastlePaletteData, >VRAM_Buffer1_Offset
|
||||||
db >VRAM_Buffer2,>VRAM_Buffer2,
|
db >VRAM_Buffer2, >VRAM_Buffer2, >BowserPaletteData
|
||||||
db >DaySnowPaletteData,>NightSnowPaletteData,
|
db >DaySnowPaletteData, >NightSnowPaletteData, >MushroomPaletteData
|
||||||
db >MarioThanksMessage,>LuigiThanksMessage,
|
db >MarioThanksMessage, >LuigiThanksMessage, >MushroomRetainerSaved
|
||||||
db >PrincessSaved1,>PrincessSaved2,
|
db >PrincessSaved1, >PrincessSaved2, >WorldSelectMessage1
|
||||||
db >WorldSelectMessage2
|
db >WorldSelectMessage2
|
||||||
|
|
||||||
VRAM_Buffer_Offset
|
VRAM_Buffer_Offset
|
||||||
|
@ -742,12 +799,12 @@ VRAM_Buffer_Offset
|
||||||
|
|
||||||
; This is the actual entry point (60 times per second to keep speeed). Uncomment hardware
|
; This is the actual entry point (60 times per second to keep speeed). Uncomment hardware
|
||||||
; stuff that doesn't need to be communicated to the GTE wrapper
|
; stuff that doesn't need to be communicated to the GTE wrapper
|
||||||
NonMaskableInterrupt
|
NonMaskableInterrupt ENT
|
||||||
lda Mirror_PPU_CTRL_REG1 ;disable NMIs in mirror reg
|
lda Mirror_PPU_CTRL_REG1 ;disable NMIs in mirror reg
|
||||||
and #%01111111 ;save all other bits
|
and #%01111111 ;save all other bits
|
||||||
sta Mirror_PPU_CTRL_REG1
|
sta Mirror_PPU_CTRL_REG1
|
||||||
and #%01111110 ;alter name table address to be $2800
|
and #%01111110 ;alter name table address to be $2800
|
||||||
sta PPU_CTRL_REG1 ;(essentially $2000) but save other bits
|
jsr PPU_CTRL_W ;(essentially $2000) but save other bits
|
||||||
lda Mirror_PPU_CTRL_REG2 ;disable OAM and background display by default
|
lda Mirror_PPU_CTRL_REG2 ;disable OAM and background display by default
|
||||||
and #%11100110
|
and #%11100110
|
||||||
ldy DisableScreenFlag ;get screen disable flag
|
ldy DisableScreenFlag ;get screen disable flag
|
||||||
|
@ -756,13 +813,13 @@ NonMaskableInterrupt
|
||||||
ora #%00011110
|
ora #%00011110
|
||||||
ScreenOff sta Mirror_PPU_CTRL_REG2 ;save bits for later but not in register at the moment
|
ScreenOff sta Mirror_PPU_CTRL_REG2 ;save bits for later but not in register at the moment
|
||||||
and #%11100111 ;disable screen for now
|
and #%11100111 ;disable screen for now
|
||||||
sta PPU_CTRL_REG2
|
jsr PPU_MASK_W
|
||||||
ldx PPU_STATUS ;reset flip-flop and reset scroll registers to zero
|
jsr PPU_STATUS_RX ;reset flip-flop and reset scroll registers to zero
|
||||||
lda #$00
|
lda #$00
|
||||||
jsr InitScroll
|
jsr InitScroll
|
||||||
sta PPU_SPR_ADDR ;reset spr-ram address register
|
jsr OAM_ADDR_W ;reset spr-ram address register
|
||||||
lda #$02 ;perform spr-ram DMA access on $0200-$02ff
|
lda #$02 ;perform spr-ram DMA access on $0200-$02ff
|
||||||
sta SPR_DMA
|
jsr SPR_DMA_W
|
||||||
ldx VRAM_Buffer_AddrCtrl ;load control for pointer to buffer contents
|
ldx VRAM_Buffer_AddrCtrl ;load control for pointer to buffer contents
|
||||||
lda VRAM_AddrTable_Low,x ;set indirect at $00 to pointer
|
lda VRAM_AddrTable_Low,x ;set indirect at $00 to pointer
|
||||||
sta $00
|
sta $00
|
||||||
|
@ -780,8 +837,12 @@ InitBuffer ldx VRAM_Buffer_Offset,y
|
||||||
sta VRAM_Buffer1,x
|
sta VRAM_Buffer1,x
|
||||||
sta VRAM_Buffer_AddrCtrl ;reinit address control to $0301
|
sta VRAM_Buffer_AddrCtrl ;reinit address control to $0301
|
||||||
lda Mirror_PPU_CTRL_REG2 ;copy mirror of $2001 to register
|
lda Mirror_PPU_CTRL_REG2 ;copy mirror of $2001 to register
|
||||||
sta PPU_CTRL_REG2
|
jsr PPU_MASK_W
|
||||||
jsr SoundEngine ;play sound
|
|
||||||
|
; jsr SoundEngine ;play sound
|
||||||
|
bra *+3
|
||||||
|
ds 1
|
||||||
|
|
||||||
jsr ReadJoypads ;read joypads
|
jsr ReadJoypads ;read joypads
|
||||||
jsr PauseRoutine ;handle pause
|
jsr PauseRoutine ;handle pause
|
||||||
jsr UpdateTopScore
|
jsr UpdateTopScore
|
||||||
|
@ -821,37 +882,49 @@ RotPRandomBit ror PseudoRandomBitReg,x ;rotate carry into
|
||||||
bne RotPRandomBit
|
bne RotPRandomBit
|
||||||
lda Sprite0HitDetectFlag ;check for flag here
|
lda Sprite0HitDetectFlag ;check for flag here
|
||||||
beq SkipSprite0
|
beq SkipSprite0
|
||||||
Sprite0Clr lda PPU_STATUS ;wait for sprite 0 flag to clear, which will
|
|
||||||
and #%01000000 ;not happen until vblank has ended
|
; With the GTE wrapper we render the status screen directly from the NES RAM area
|
||||||
bne Sprite0Clr
|
; into a native output, so no need to busy-wait on Sprite 0 hit detection since
|
||||||
|
; there is no split-screen
|
||||||
|
|
||||||
|
;Sprite0Clr lda PPU_STATUS ;wait for sprite 0 flag to clear, which will
|
||||||
|
; and #%01000000 ;not happen until vblank has ended
|
||||||
|
; bne Sprite0Clr
|
||||||
|
bra *+7
|
||||||
|
ds 5
|
||||||
|
|
||||||
lda GamePauseStatus ;if in pause mode, do not bother with sprites at all
|
lda GamePauseStatus ;if in pause mode, do not bother with sprites at all
|
||||||
lsr
|
lsr
|
||||||
bcs Sprite0Hit
|
bcs Sprite0Hit
|
||||||
jsr MoveSpritesOffscreen
|
jsr MoveSpritesOffscreen
|
||||||
jsr SpriteShuffler
|
jsr SpriteShuffler
|
||||||
Sprite0Hit lda PPU_STATUS ;do sprite #0 hit detection
|
Sprite0Hit
|
||||||
and #%01000000
|
; lda PPU_STATUS ;do sprite #0 hit detection
|
||||||
beq Sprite0Hit
|
; and #%01000000
|
||||||
ldy #$14 ;small delay, to wait until we hit horizontal blank time
|
; beq Sprite0Hit
|
||||||
HBlankDelay dey
|
; ldy #$14 ;small delay, to wait until we hit horizontal blank time
|
||||||
bne HBlankDelay
|
;HBlankDelay dey
|
||||||
|
; bne HBlankDelay
|
||||||
|
bra *+12
|
||||||
|
ds 10
|
||||||
|
|
||||||
SkipSprite0 lda HorizontalScroll ;set scroll registers from variables
|
SkipSprite0 lda HorizontalScroll ;set scroll registers from variables
|
||||||
sta PPU_SCROLL_REG
|
jsr PPU_SCROLL_W
|
||||||
lda VerticalScroll
|
lda VerticalScroll
|
||||||
sta PPU_SCROLL_REG
|
jsr PPU_SCROLL_W
|
||||||
lda Mirror_PPU_CTRL_REG1 ;load saved mirror of $2000
|
lda Mirror_PPU_CTRL_REG1 ;load saved mirror of $2000
|
||||||
pha
|
pha
|
||||||
sta PPU_CTRL_REG1
|
jsr PPU_CTRL_W
|
||||||
lda GamePauseStatus ;if in pause mode, do not perform operation mode stuff
|
lda GamePauseStatus ;if in pause mode, do not perform operation mode stuff
|
||||||
lsr
|
lsr
|
||||||
bcs SkipMainOper
|
bcs SkipMainOper
|
||||||
jsr OperModeExecutionTree ;otherwise do one of many, many possible subroutines
|
jsr OperModeExecutionTree ;otherwise do one of many, many possible subroutines
|
||||||
SkipMainOper lda PPU_STATUS ;reset flip-flop
|
SkipMainOper jsr PPU_STATUS_R ;reset flip-flop
|
||||||
pla
|
pla
|
||||||
ora #%10000000 ;reactivate NMIs
|
ora #%10000000 ;reactivate NMIs
|
||||||
sta PPU_CTRL_REG1
|
jsr PPU_CTRL_W
|
||||||
; rti ;we are done until the next frame!
|
; rti ;we are done until the next frame!
|
||||||
rtl
|
rts
|
||||||
|
|
||||||
;-------------------------------------------------------------------------------------
|
;-------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -1595,15 +1668,15 @@ DrawTitleScreen
|
||||||
lda OperMode ;are we in title screen mode?
|
lda OperMode ;are we in title screen mode?
|
||||||
bne IncModeTask_B ;if not, exit
|
bne IncModeTask_B ;if not, exit
|
||||||
lda #>TitleScreenDataOffset ;load address $1ec0 into
|
lda #>TitleScreenDataOffset ;load address $1ec0 into
|
||||||
sta PPU_ADDRESS ;the vram address register
|
jsr PPU_ADDRESS_W ;the vram address register
|
||||||
lda #<TitleScreenDataOffset
|
lda #<TitleScreenDataOffset
|
||||||
sta PPU_ADDRESS
|
jsr PPU_ADDRESS_W
|
||||||
lda #$03 ;put address $0300 into
|
lda #$03 ;put address $0300 into
|
||||||
sta $01 ;the indirect at $00
|
sta $01 ;the indirect at $00
|
||||||
ldy #$00
|
ldy #$00
|
||||||
sty $00
|
sty $00
|
||||||
lda PPU_DATA ;do one garbage read
|
jsr PPU_DATA_R ;do one garbage read
|
||||||
OutputTScr lda PPU_DATA ;get title screen from chr-rom
|
OutputTScr jsr PPU_DATA_R ;get title screen from chr-rom
|
||||||
sta ($00),y ;store 256 bytes into buffer
|
sta ($00),y ;store 256 bytes into buffer
|
||||||
iny
|
iny
|
||||||
bne ChkHiByte ;if not past 256 bytes, do not increment
|
bne ChkHiByte ;if not past 256 bytes, do not increment
|
||||||
|
@ -2125,10 +2198,10 @@ RemBridge lda BlockGfxData,x ;write top left and
|
||||||
;METATILE GRAPHICS TABLE
|
;METATILE GRAPHICS TABLE
|
||||||
|
|
||||||
MetatileGraphics_Low
|
MetatileGraphics_Low
|
||||||
db <Palette0_MTiles,<Palette1_MTiles,
|
db <Palette0_MTiles, <Palette1_MTiles, <Palette2_MTiles, <Palette3_MTiles
|
||||||
|
|
||||||
MetatileGraphics_High
|
MetatileGraphics_High
|
||||||
db >Palette0_MTiles,>Palette1_MTiles,
|
db >Palette0_MTiles, >Palette1_MTiles, >Palette2_MTiles, >Palette3_MTiles
|
||||||
|
|
||||||
Palette0_MTiles
|
Palette0_MTiles
|
||||||
db $24,$24,$24,$24 ;blank
|
db $24,$24,$24,$24 ;blank
|
||||||
|
@ -2384,15 +2457,21 @@ JumpEngine
|
||||||
iny
|
iny
|
||||||
lda ($04),y ;load pointer from indirect
|
lda ($04),y ;load pointer from indirect
|
||||||
sta $06 ;note that if an RTS is performed in next routine
|
sta $06 ;note that if an RTS is performed in next routine
|
||||||
|
sta :je_patch+1
|
||||||
iny ;it will return to the execution before the sub
|
iny ;it will return to the execution before the sub
|
||||||
lda ($04),y ;that called this routine
|
lda ($04),y ;that called this routine
|
||||||
sta $07
|
sta $07
|
||||||
jmp ($06) ;jump to the address we loaded
|
sta :je_patch+2
|
||||||
|
; jmp ($06) ;jump to the address we loaded
|
||||||
|
|
||||||
|
; GTE Note: We run in a different bank with a direct page != 0, so jmp (abs) cannot work, but we're in RAM now
|
||||||
|
; so self-modifying code to the rescue
|
||||||
|
:je_patch jmp $0000
|
||||||
|
|
||||||
;-------------------------------------------------------------------------------------
|
;-------------------------------------------------------------------------------------
|
||||||
|
|
||||||
InitializeNameTables
|
InitializeNameTables
|
||||||
lda PPU_STATUS ;reset flip-flop
|
jsr PPU_STATUS_R ;reset flip-flop
|
||||||
lda Mirror_PPU_CTRL_REG1 ;load mirror of ppu reg $2000
|
lda Mirror_PPU_CTRL_REG1 ;load mirror of ppu reg $2000
|
||||||
ora #%00010000 ;set sprites for first 4k and background for second 4k
|
ora #%00010000 ;set sprites for first 4k and background for second 4k
|
||||||
and #%11110000 ;clear rest of lower nybble, leave higher alone
|
and #%11110000 ;clear rest of lower nybble, leave higher alone
|
||||||
|
@ -2400,13 +2479,13 @@ InitializeNameTables
|
||||||
lda #$24 ;set vram address to start of name table 1
|
lda #$24 ;set vram address to start of name table 1
|
||||||
jsr WriteNTAddr
|
jsr WriteNTAddr
|
||||||
lda #$20 ;and then set it to name table 0
|
lda #$20 ;and then set it to name table 0
|
||||||
WriteNTAddr sta PPU_ADDRESS
|
WriteNTAddr jsr PPU_ADDRESS_W
|
||||||
lda #$00
|
lda #$00
|
||||||
sta PPU_ADDRESS
|
jsr PPU_ADDRESS_W
|
||||||
ldx #$04 ;clear name table with blank tile #24
|
ldx #$04 ;clear name table with blank tile #24
|
||||||
ldy #$c0
|
ldy #$c0
|
||||||
lda #$24
|
lda #$24
|
||||||
InitNTLoop sta PPU_DATA ;count out exactly 768 tiles
|
InitNTLoop jsr PPU_DATA_W ;count out exactly 768 tiles
|
||||||
dey
|
dey
|
||||||
bne InitNTLoop
|
bne InitNTLoop
|
||||||
dex
|
dex
|
||||||
|
@ -2415,7 +2494,7 @@ InitNTLoop sta PPU_DATA ;count out exactly
|
||||||
txa
|
txa
|
||||||
sta VRAM_Buffer1_Offset ;init vram buffer 1 offset
|
sta VRAM_Buffer1_Offset ;init vram buffer 1 offset
|
||||||
sta VRAM_Buffer1 ;init vram buffer 1
|
sta VRAM_Buffer1 ;init vram buffer 1
|
||||||
InitATLoop sta PPU_DATA
|
InitATLoop jsr PPU_DATA_W
|
||||||
dey
|
dey
|
||||||
bne InitATLoop
|
bne InitATLoop
|
||||||
sta HorizontalScroll ;reset scroll variables
|
sta HorizontalScroll ;reset scroll variables
|
||||||
|
@ -2424,7 +2503,7 @@ InitATLoop sta PPU_DATA
|
||||||
|
|
||||||
;-------------------------------------------------------------------------------------
|
;-------------------------------------------------------------------------------------
|
||||||
;$00 - temp joypad bit
|
;$00 - temp joypad bit
|
||||||
|
native_joy EXT
|
||||||
ReadJoypads
|
ReadJoypads
|
||||||
lda #$01 ;reset and clear strobe of joypad ports
|
lda #$01 ;reset and clear strobe of joypad ports
|
||||||
sta JOYPAD_PORT
|
sta JOYPAD_PORT
|
||||||
|
@ -2433,17 +2512,20 @@ ReadJoypads
|
||||||
sta JOYPAD_PORT
|
sta JOYPAD_PORT
|
||||||
jsr ReadPortBits
|
jsr ReadPortBits
|
||||||
inx ;increment for joypad 2's port
|
inx ;increment for joypad 2's port
|
||||||
ReadPortBits ldy #$08
|
ReadPortBits
|
||||||
PortLoop pha ;push previous bit onto stack
|
; ldy #$08
|
||||||
lda JOYPAD_PORT,x ;read current bit on joypad port
|
;PortLoop pha ;push previous bit onto stack
|
||||||
sta $00 ;check d1 and d0 of port output
|
; lda JOYPAD_PORT,x ;read current bit on joypad port
|
||||||
lsr ;this is necessary on the old
|
; sta $00 ;check d1 and d0 of port output
|
||||||
ora $00 ;famicom systems in japan
|
; lsr ;this is necessary on the old
|
||||||
lsr
|
; ora $00 ;famicom systems in japan
|
||||||
pla ;read bits from stack
|
; lsr
|
||||||
rol ;rotate bit from carry flag
|
; pla ;read bits from stack
|
||||||
dey
|
; rol ;rotate bit from carry flag
|
||||||
bne PortLoop ;count down bits left
|
; dey
|
||||||
|
; bne PortLoop ;count down bits left
|
||||||
|
ldal native_joy,x
|
||||||
|
|
||||||
sta SavedJoypadBits,x ;save controller status here always
|
sta SavedJoypadBits,x ;save controller status here always
|
||||||
pha
|
pha
|
||||||
and #%00110000 ;check for select or start
|
and #%00110000 ;check for select or start
|
||||||
|
@ -2462,10 +2544,10 @@ Save8Bits pla
|
||||||
;$01 - vram buffer address table high
|
;$01 - vram buffer address table high
|
||||||
|
|
||||||
WriteBufferToScreen
|
WriteBufferToScreen
|
||||||
sta PPU_ADDRESS ;store high byte of vram address
|
jsr PPU_ADDRESS_W ;store high byte of vram address
|
||||||
iny
|
iny
|
||||||
lda ($00),y ;load next byte (second)
|
lda ($00),y ;load next byte (second)
|
||||||
sta PPU_ADDRESS ;store low byte of vram address
|
jsr PPU_ADDRESS_W ;store low byte of vram address
|
||||||
iny
|
iny
|
||||||
lda ($00),y ;load next byte (third)
|
lda ($00),y ;load next byte (third)
|
||||||
asl ;shift to left and save in stack
|
asl ;shift to left and save in stack
|
||||||
|
@ -2486,7 +2568,7 @@ GetLength lsr ;shift back to the
|
||||||
OutputToVRAM bcs RepeatByte ;if carry set, repeat loading the same byte
|
OutputToVRAM bcs RepeatByte ;if carry set, repeat loading the same byte
|
||||||
iny ;otherwise increment Y to load next byte
|
iny ;otherwise increment Y to load next byte
|
||||||
RepeatByte lda ($00),y ;load more data from buffer and write to vram
|
RepeatByte lda ($00),y ;load more data from buffer and write to vram
|
||||||
sta PPU_DATA
|
jsr PPU_DATA_W
|
||||||
dex ;done writing?
|
dex ;done writing?
|
||||||
bne OutputToVRAM
|
bne OutputToVRAM
|
||||||
sec
|
sec
|
||||||
|
@ -2497,23 +2579,23 @@ RepeatByte lda ($00),y ;load more data fro
|
||||||
adc $01
|
adc $01
|
||||||
sta $01
|
sta $01
|
||||||
lda #$3f ;sets vram address to $3f00
|
lda #$3f ;sets vram address to $3f00
|
||||||
sta PPU_ADDRESS
|
jsr PPU_ADDRESS_W
|
||||||
lda #$00
|
lda #$00
|
||||||
sta PPU_ADDRESS
|
jsr PPU_ADDRESS_W
|
||||||
sta PPU_ADDRESS ;then reinitializes it for some reason
|
jsr PPU_ADDRESS_W ;then reinitializes it for some reason
|
||||||
sta PPU_ADDRESS
|
jsr PPU_ADDRESS_W
|
||||||
UpdateScreen ldx PPU_STATUS ;reset flip-flop
|
UpdateScreen jsr PPU_STATUS_RX ;reset flip-flop
|
||||||
ldy #$00 ;load first byte from indirect as a pointer
|
ldy #$00 ;load first byte from indirect as a pointer
|
||||||
lda ($00),y
|
lda ($00),y
|
||||||
bne WriteBufferToScreen ;if byte is zero we have no further updates to make here
|
bne WriteBufferToScreen ;if byte is zero we have no further updates to make here
|
||||||
InitScroll sta PPU_SCROLL_REG ;store contents of A into scroll registers
|
InitScroll jsr PPU_SCROLL_W ;store contents of A into scroll registers
|
||||||
sta PPU_SCROLL_REG ;and end whatever subroutine led us here
|
jsr PPU_SCROLL_W ;and end whatever subroutine led us here
|
||||||
rts
|
rts
|
||||||
|
|
||||||
;-------------------------------------------------------------------------------------
|
;-------------------------------------------------------------------------------------
|
||||||
|
|
||||||
WritePPUReg1
|
WritePPUReg1
|
||||||
sta PPU_CTRL_REG1 ;write contents of A to PPU register 1
|
jsr PPU_CTRL_W ;write contents of A to PPU register 1
|
||||||
sta Mirror_PPU_CTRL_REG1 ;and its mirror
|
sta Mirror_PPU_CTRL_REG1 ;and its mirror
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
@ -2763,8 +2845,8 @@ ISpr0Loop lda Sprite0Data,y
|
||||||
sta Sprite_Data,y
|
sta Sprite_Data,y
|
||||||
dey
|
dey
|
||||||
bpl ISpr0Loop
|
bpl ISpr0Loop
|
||||||
jsr DoNothing2 ;these jsrs doesn't do anything useful
|
; jsr DoNothing2 ;these jsrs doesn't do anything useful
|
||||||
jsr DoNothing1
|
; jsr DoNothing1
|
||||||
inc Sprite0HitDetectFlag ;set sprite #0 check flag
|
inc Sprite0HitDetectFlag ;set sprite #0 check flag
|
||||||
inc OperMode_Task ;increment to next task
|
inc OperMode_Task ;increment to next task
|
||||||
rts
|
rts
|
||||||
|
@ -4492,39 +4574,39 @@ EnemyAddrHOffsets
|
||||||
db $1f,$06,$1c,$00
|
db $1f,$06,$1c,$00
|
||||||
|
|
||||||
EnemyDataAddrLow
|
EnemyDataAddrLow
|
||||||
db <E_CastleArea1, <E_CastleArea2,
|
db <E_CastleArea1, <E_CastleArea2, <E_CastleArea3, <E_CastleArea4, <E_CastleArea5, <E_CastleArea6
|
||||||
db <E_GroundArea1, <E_GroundArea2,
|
db <E_GroundArea1, <E_GroundArea2, <E_GroundArea3, <E_GroundArea4, <E_GroundArea5, <E_GroundArea6
|
||||||
db <E_GroundArea7, <E_GroundArea8,
|
db <E_GroundArea7, <E_GroundArea8, <E_GroundArea9, <E_GroundArea10, <E_GroundArea11, <E_GroundArea12
|
||||||
db <E_GroundArea13, <E_GroundArea14,
|
db <E_GroundArea13, <E_GroundArea14, <E_GroundArea15, <E_GroundArea16, <E_GroundArea17, <E_GroundArea18
|
||||||
db <E_GroundArea19, <E_GroundArea20,
|
db <E_GroundArea19, <E_GroundArea20, <E_GroundArea21, <E_GroundArea22, <E_UndergroundArea1
|
||||||
db <E_UndergroundArea2, <E_UndergroundArea3,
|
db <E_UndergroundArea2, <E_UndergroundArea3, <E_WaterArea1, <E_WaterArea2, <E_WaterArea3
|
||||||
|
|
||||||
EnemyDataAddrHigh
|
EnemyDataAddrHigh
|
||||||
db >E_CastleArea1, >E_CastleArea2,
|
db >E_CastleArea1, >E_CastleArea2, >E_CastleArea3, >E_CastleArea4, >E_CastleArea5, >E_CastleArea6
|
||||||
db >E_GroundArea1, >E_GroundArea2,
|
db >E_GroundArea1, >E_GroundArea2, >E_GroundArea3, >E_GroundArea4, >E_GroundArea5, >E_GroundArea6
|
||||||
db >E_GroundArea7, >E_GroundArea8,
|
db >E_GroundArea7, >E_GroundArea8, >E_GroundArea9, >E_GroundArea10, >E_GroundArea11, >E_GroundArea12
|
||||||
db >E_GroundArea13, >E_GroundArea14,
|
db >E_GroundArea13, >E_GroundArea14, >E_GroundArea15, >E_GroundArea16, >E_GroundArea17, >E_GroundArea18
|
||||||
db >E_GroundArea19, >E_GroundArea20,
|
db >E_GroundArea19, >E_GroundArea20, >E_GroundArea21, >E_GroundArea22, >E_UndergroundArea1
|
||||||
db >E_UndergroundArea2, >E_UndergroundArea3,
|
db >E_UndergroundArea2, >E_UndergroundArea3, >E_WaterArea1, >E_WaterArea2, >E_WaterArea3
|
||||||
|
|
||||||
AreaDataHOffsets
|
AreaDataHOffsets
|
||||||
db $00,$03,$19,$1c
|
db $00,$03,$19,$1c
|
||||||
|
|
||||||
AreaDataAddrLow
|
AreaDataAddrLow
|
||||||
db <L_WaterArea1, <L_WaterArea2,
|
db <L_WaterArea1, <L_WaterArea2, <L_WaterArea3, <L_GroundArea1, <L_GroundArea2, <L_GroundArea3
|
||||||
db <L_GroundArea4, <L_GroundArea5,
|
db <L_GroundArea4, <L_GroundArea5, <L_GroundArea6, <L_GroundArea7, <L_GroundArea8, <L_GroundArea9
|
||||||
db <L_GroundArea10, <L_GroundArea11,
|
db <L_GroundArea10, <L_GroundArea11, <L_GroundArea12, <L_GroundArea13, <L_GroundArea14, <L_GroundArea15
|
||||||
db <L_GroundArea16, <L_GroundArea17,
|
db <L_GroundArea16, <L_GroundArea17, <L_GroundArea18, <L_GroundArea19, <L_GroundArea20, <L_GroundArea21
|
||||||
db <L_GroundArea22, <L_UndergroundArea1,
|
db <L_GroundArea22, <L_UndergroundArea1, <L_UndergroundArea2, <L_UndergroundArea3, <L_CastleArea1
|
||||||
db <L_CastleArea2, <L_CastleArea3,
|
db <L_CastleArea2, <L_CastleArea3, <L_CastleArea4, <L_CastleArea5, <L_CastleArea6
|
||||||
|
|
||||||
AreaDataAddrHigh
|
AreaDataAddrHigh
|
||||||
db >L_WaterArea1, >L_WaterArea2,
|
db >L_WaterArea1, >L_WaterArea2, >L_WaterArea3, >L_GroundArea1, >L_GroundArea2, >L_GroundArea3
|
||||||
db >L_GroundArea4, >L_GroundArea5,
|
db >L_GroundArea4, >L_GroundArea5, >L_GroundArea6, >L_GroundArea7, >L_GroundArea8, >L_GroundArea9
|
||||||
db >L_GroundArea10, >L_GroundArea11,
|
db >L_GroundArea10, >L_GroundArea11, >L_GroundArea12, >L_GroundArea13, >L_GroundArea14, >L_GroundArea15
|
||||||
db >L_GroundArea16, >L_GroundArea17,
|
db >L_GroundArea16, >L_GroundArea17, >L_GroundArea18, >L_GroundArea19, >L_GroundArea20, >L_GroundArea21
|
||||||
db >L_GroundArea22, >L_UndergroundArea1,
|
db >L_GroundArea22, >L_UndergroundArea1, >L_UndergroundArea2, >L_UndergroundArea3, >L_CastleArea1
|
||||||
db >L_CastleArea2, >L_CastleArea3,
|
db >L_CastleArea2, >L_CastleArea3, >L_CastleArea4, >L_CastleArea5, >L_CastleArea6
|
||||||
|
|
||||||
;ENEMY OBJECT DATA
|
;ENEMY OBJECT DATA
|
||||||
|
|
||||||
|
@ -15989,14 +16071,14 @@ MusicHeaderData
|
||||||
|
|
||||||
db GroundLevelLeadInHdr-MHD ;ground level music layout
|
db GroundLevelLeadInHdr-MHD ;ground level music layout
|
||||||
db GroundLevelPart1Hdr-MHD, GroundLevelPart1Hdr-MHD
|
db GroundLevelPart1Hdr-MHD, GroundLevelPart1Hdr-MHD
|
||||||
db GroundLevelPart2AHdr-MHD, GroundLevelPart2BHdr-MHD,
|
db GroundLevelPart2AHdr-MHD, GroundLevelPart2BHdr-MHD, GroundLevelPart2AHdr-MHD, GroundLevelPart2CHdr-MHD
|
||||||
db GroundLevelPart2AHdr-MHD, GroundLevelPart2BHdr-MHD,
|
db GroundLevelPart2AHdr-MHD, GroundLevelPart2BHdr-MHD, GroundLevelPart2AHdr-MHD, GroundLevelPart2CHdr-MHD
|
||||||
db GroundLevelPart3AHdr-MHD, GroundLevelPart3BHdr-MHD,
|
db GroundLevelPart3AHdr-MHD, GroundLevelPart3BHdr-MHD, GroundLevelPart3AHdr-MHD, GroundLevelLeadInHdr-MHD
|
||||||
db GroundLevelPart1Hdr-MHD, GroundLevelPart1Hdr-MHD
|
db GroundLevelPart1Hdr-MHD, GroundLevelPart1Hdr-MHD
|
||||||
db GroundLevelPart4AHdr-MHD, GroundLevelPart4BHdr-MHD,
|
db GroundLevelPart4AHdr-MHD, GroundLevelPart4BHdr-MHD, GroundLevelPart4AHdr-MHD, GroundLevelPart4CHdr-MHD
|
||||||
db GroundLevelPart4AHdr-MHD, GroundLevelPart4BHdr-MHD,
|
db GroundLevelPart4AHdr-MHD, GroundLevelPart4BHdr-MHD, GroundLevelPart4AHdr-MHD, GroundLevelPart4CHdr-MHD
|
||||||
db GroundLevelPart3AHdr-MHD, GroundLevelPart3BHdr-MHD,
|
db GroundLevelPart3AHdr-MHD, GroundLevelPart3BHdr-MHD, GroundLevelPart3AHdr-MHD, GroundLevelLeadInHdr-MHD
|
||||||
db GroundLevelPart4AHdr-MHD, GroundLevelPart4BHdr-MHD,
|
db GroundLevelPart4AHdr-MHD, GroundLevelPart4BHdr-MHD, GroundLevelPart4AHdr-MHD, GroundLevelPart4CHdr-MHD
|
||||||
|
|
||||||
;music headers
|
;music headers
|
||||||
;header format is as follows
|
;header format is as follows
|
||||||
|
@ -16006,28 +16088,28 @@ MusicHeaderData
|
||||||
;1 byte - square 1 data offset
|
;1 byte - square 1 data offset
|
||||||
;1 byte - noise data offset (not used by secondary music)
|
;1 byte - noise data offset (not used by secondary music)
|
||||||
|
|
||||||
TimeRunningOutHdr db $08, <TimeRunOutMusData,
|
TimeRunningOutHdr db $08, <TimeRunOutMusData, >TimeRunOutMusData, $27, $18
|
||||||
Star_CloudHdr db $20, <Star_CloudMData,
|
Star_CloudHdr db $20, <Star_CloudMData, >Star_CloudMData, $2e, $1a, $40
|
||||||
EndOfLevelMusHdr db $20, <WinLevelMusData,
|
EndOfLevelMusHdr db $20, <WinLevelMusData, >WinLevelMusData, $3d, $21
|
||||||
ResidualHeaderData db $20,$c4,$fc,$3f,$1d
|
ResidualHeaderData db $20, $c4, $fc, $3f, $1d
|
||||||
UndergroundMusHdr db $18, <UndergroundMusData,
|
UndergroundMusHdr db $18, <UndergroundMusData, >UndergroundMusData, $00, $00
|
||||||
SilenceHdr db $08, <SilenceData,
|
SilenceHdr db $08, <SilenceData, >SilenceData, $00
|
||||||
CastleMusHdr db $00, <CastleMusData,
|
CastleMusHdr db $00, <CastleMusData, >CastleMusData, $93, $62
|
||||||
VictoryMusHdr db $10, <VictoryMusData,
|
VictoryMusHdr db $10, <VictoryMusData, >VictoryMusData, $24, $14
|
||||||
GameOverMusHdr db $18, <GameOverMusData,
|
GameOverMusHdr db $18, <GameOverMusData, >GameOverMusData, $1e, $14
|
||||||
WaterMusHdr db $08, <WaterMusData,
|
WaterMusHdr db $08, <WaterMusData, >WaterMusData, $a0, $70, $68
|
||||||
WinCastleMusHdr db $08, <EndOfCastleMusData,
|
WinCastleMusHdr db $08, <EndOfCastleMusData, >EndOfCastleMusData, $4c, $24
|
||||||
GroundLevelPart1Hdr db $18, <GroundM_P1Data,
|
GroundLevelPart1Hdr db $18, <GroundM_P1Data, >GroundM_P1Data, $2d, $1c, $b8
|
||||||
GroundLevelPart2AHdr db $18, <GroundM_P2AData,
|
GroundLevelPart2AHdr db $18, <GroundM_P2AData, >GroundM_P2AData, $20, $12, $70
|
||||||
GroundLevelPart2BHdr db $18, <GroundM_P2BData,
|
GroundLevelPart2BHdr db $18, <GroundM_P2BData, >GroundM_P2BData, $1b, $10, $44
|
||||||
GroundLevelPart2CHdr db $18, <GroundM_P2CData,
|
GroundLevelPart2CHdr db $18, <GroundM_P2CData, >GroundM_P2CData, $11, $0a, $1c
|
||||||
GroundLevelPart3AHdr db $18, <GroundM_P3AData,
|
GroundLevelPart3AHdr db $18, <GroundM_P3AData, >GroundM_P3AData, $2d, $10, $58
|
||||||
GroundLevelPart3BHdr db $18, <GroundM_P3BData,
|
GroundLevelPart3BHdr db $18, <GroundM_P3BData, >GroundM_P3BData, $14, $0d, $3f
|
||||||
GroundLevelLeadInHdr db $18, <GroundMLdInData,
|
GroundLevelLeadInHdr db $18, <GroundMLdInData, >GroundMLdInData, $15, $0d, $21
|
||||||
GroundLevelPart4AHdr db $18, <GroundM_P4AData,
|
GroundLevelPart4AHdr db $18, <GroundM_P4AData, >GroundM_P4AData, $18, $10, $7a
|
||||||
GroundLevelPart4BHdr db $18, <GroundM_P4BData,
|
GroundLevelPart4BHdr db $18, <GroundM_P4BData, >GroundM_P4BData, $19, $0f, $54
|
||||||
GroundLevelPart4CHdr db $18, <GroundM_P4CData,
|
GroundLevelPart4CHdr db $18, <GroundM_P4CData, >GroundM_P4CData, $1e, $12, $2b
|
||||||
DeathMusHdr db $18, <DeathMusData,
|
DeathMusHdr db $18, <DeathMusData, >DeathMusData, $1e, $0f, $2d
|
||||||
|
|
||||||
;--------------------------------
|
;--------------------------------
|
||||||
|
|
||||||
|
|
|
@ -180,6 +180,8 @@ scanlineHorzOffset equ $0001
|
||||||
scanlineHorzOffset2 equ $0002
|
scanlineHorzOffset2 equ $0002
|
||||||
tileStore equ $0003
|
tileStore equ $0003
|
||||||
vblCallback equ $0004
|
vblCallback equ $0004
|
||||||
|
extSpriteRenderer equ $0005
|
||||||
|
rawDrawTile equ $0006
|
||||||
|
|
||||||
; CopyPicToBG1 flags
|
; CopyPicToBG1 flags
|
||||||
COPY_PIC_NORMAL equ $0000 ; Copy into BG1 buffer in "normal mode"
|
COPY_PIC_NORMAL equ $0000 ; Copy into BG1 buffer in "normal mode"
|
||||||
|
|
|
@ -193,6 +193,8 @@ scanlineHorzOffset equ $0001 ; Table of 416 words, a double-array o
|
||||||
scanlineHorzOffset2 equ $0002 ; Table of 416 words, a double-array of scanline offset values. Values must be in range [0, 163]
|
scanlineHorzOffset2 equ $0002 ; Table of 416 words, a double-array of scanline offset values. Values must be in range [0, 163]
|
||||||
tileStore equ $0003
|
tileStore equ $0003
|
||||||
vblCallback equ $0004 ; User routine to be called by VBL interrupt. Set to $000000 to disconnect
|
vblCallback equ $0004 ; User routine to be called by VBL interrupt. Set to $000000 to disconnect
|
||||||
|
extSpriteRenderer equ $0005
|
||||||
|
rawDrawTile equ $0006
|
||||||
|
|
||||||
; CopyPicToBG1 flags
|
; CopyPicToBG1 flags
|
||||||
COPY_PIC_NORMAL equ $0000 ; Copy into BG1 buffer in "normal mode" treating the buffer as a 164x208 pixmap with stride of 256
|
COPY_PIC_NORMAL equ $0000 ; Copy into BG1 buffer in "normal mode" treating the buffer as a 164x208 pixmap with stride of 256
|
||||||
|
@ -307,6 +309,7 @@ ObjectList EXT
|
||||||
StartXMod164Tbl EXT
|
StartXMod164Tbl EXT
|
||||||
LastOffsetTbl EXT
|
LastOffsetTbl EXT
|
||||||
BG1StartXMod164Tbl EXT
|
BG1StartXMod164Tbl EXT
|
||||||
|
ExtSpriteRenderer EXT
|
||||||
|
|
||||||
; Tool error codes
|
; Tool error codes
|
||||||
NO_TIMERS_AVAILABLE equ 10
|
NO_TIMERS_AVAILABLE equ 10
|
||||||
|
|
81
src/Render.s
81
src/Render.s
|
@ -153,6 +153,87 @@ _DoOverlay
|
||||||
:disp jsl $000000
|
:disp jsl $000000
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
; Special NES renderer that externalizes the sprite rendreing in order to exceed the internal limit of 16 sprites
|
||||||
|
_RenderNES
|
||||||
|
jsr _ApplyBG0YPos
|
||||||
|
jsr _ApplyBG0XPosPre
|
||||||
|
jsr _ApplyTiles ; This function actually draws the new tiles into the code field
|
||||||
|
; jsr _ApplyBG0XPos ; Patch the code field instructions with exit BRA opcode
|
||||||
|
|
||||||
|
stz tmp1 ; virt_line_x2
|
||||||
|
lda #16*2
|
||||||
|
sta tmp2 ; lines_left_x2
|
||||||
|
lda #0 ; Xmod164
|
||||||
|
jsr _ApplyBG0XPosAlt
|
||||||
|
lda tmp4 ; :exit_offset
|
||||||
|
stal nesTopOffset
|
||||||
|
|
||||||
|
lda #16*2
|
||||||
|
sta tmp1 ; virt_line_x2
|
||||||
|
lda ScreenHeight
|
||||||
|
sec
|
||||||
|
sbc #16
|
||||||
|
asl
|
||||||
|
sta tmp2 ; lines_left_x2
|
||||||
|
lda StartXMod164 ; Xmod164
|
||||||
|
jsr _ApplyBG0XPosAlt
|
||||||
|
lda tmp4
|
||||||
|
stal nesBottomOffset
|
||||||
|
|
||||||
|
ldx #0 ; Blit the full virtual buffer to the screen
|
||||||
|
ldy ScreenHeight
|
||||||
|
jsr _BltRange
|
||||||
|
|
||||||
|
lda ExtSpriteRenderer
|
||||||
|
ora ExtSpriteRenderer+2
|
||||||
|
beq :no_sprite
|
||||||
|
|
||||||
|
lda ExtSpriteRenderer
|
||||||
|
stal :patch+1
|
||||||
|
lda ExtSpriteRenderer+1
|
||||||
|
stal :patch+2
|
||||||
|
:patch jsl $000000
|
||||||
|
|
||||||
|
:no_sprite
|
||||||
|
|
||||||
|
stz tmp1 ; :virt_line_x2
|
||||||
|
lda #16*2
|
||||||
|
sta tmp2 ; :lines_left_x2
|
||||||
|
ldal nesTopOffset
|
||||||
|
sta tmp4 ; :exit_offset
|
||||||
|
jsr _RestoreBG0OpcodesAlt
|
||||||
|
|
||||||
|
lda #16*2
|
||||||
|
sta tmp1 ; :virt_line_x2
|
||||||
|
lda ScreenHeight
|
||||||
|
sec
|
||||||
|
sbc #16
|
||||||
|
asl
|
||||||
|
sta tmp2 ; lines_left_x2
|
||||||
|
ldal nesBottomOffset
|
||||||
|
sta tmp4 ; :exit_offset
|
||||||
|
jsr _RestoreBG0OpcodesAlt
|
||||||
|
|
||||||
|
; lda StartYMod208 ; Restore the fields back to their original state
|
||||||
|
; ldx ScreenHeight
|
||||||
|
; jsr _RestoreBG0Opcodes
|
||||||
|
|
||||||
|
lda StartY
|
||||||
|
sta OldStartY
|
||||||
|
lda StartX
|
||||||
|
sta OldStartX
|
||||||
|
|
||||||
|
lda BG1StartY
|
||||||
|
sta OldBG1StartY
|
||||||
|
lda BG1StartX
|
||||||
|
sta OldBG1StartX
|
||||||
|
|
||||||
|
stz DirtyBits
|
||||||
|
stz LastRender ; Mark that a full render was just performed
|
||||||
|
rts
|
||||||
|
|
||||||
|
nesTopOffset ds 2
|
||||||
|
nesBottomOffset ds 2
|
||||||
|
|
||||||
; Use the per-scanline tables to set the screen. This is really meant to be used without the built-in tilemap
|
; Use the per-scanline tables to set the screen. This is really meant to be used without the built-in tilemap
|
||||||
; support and is more of a low-level way to control the background rendering
|
; support and is more of a low-level way to control the background rendering
|
||||||
|
|
|
@ -137,6 +137,33 @@ RTL_OPCODE equ $6B
|
||||||
lda :rtnval ; Address in the compile memory
|
lda :rtnval ; Address in the compile memory
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
; Draw a tile directly to the graphics screen as a sprite
|
||||||
|
;
|
||||||
|
; Y = screen address
|
||||||
|
; X = tile address
|
||||||
|
; A = $0001 = ignore mask
|
||||||
|
|
||||||
|
_DrawTileToScreen
|
||||||
|
phb
|
||||||
|
pea $0101
|
||||||
|
plb
|
||||||
|
plb
|
||||||
|
|
||||||
|
]line equ 0
|
||||||
|
lup 8
|
||||||
|
lda: {]line*SHR_LINE_WIDTH}+2,y
|
||||||
|
andl tiledata+{]line*4}+32+2,x
|
||||||
|
oral tiledata+{]line*4}+2,x
|
||||||
|
sta: {]line*SHR_LINE_WIDTH}+2,y
|
||||||
|
lda: {]line*SHR_LINE_WIDTH},y
|
||||||
|
andl tiledata+{]line*4}+32,x
|
||||||
|
oral tiledata+{]line*4},x
|
||||||
|
sta: {]line*SHR_LINE_WIDTH},y
|
||||||
|
]line equ ]line+1
|
||||||
|
--^
|
||||||
|
plb
|
||||||
|
rtl ; special exit
|
||||||
|
|
||||||
; Draw a sprite directly to the graphics screen. If sprite is clipped at all, do not draw.
|
; Draw a sprite directly to the graphics screen. If sprite is clipped at all, do not draw.
|
||||||
;
|
;
|
||||||
; X = sprite record index
|
; X = sprite record index
|
||||||
|
|
36
src/Tool.s
36
src/Tool.s
|
@ -298,6 +298,9 @@ _TSRender
|
||||||
|
|
||||||
_TSEntry
|
_TSEntry
|
||||||
lda :flags,s
|
lda :flags,s
|
||||||
|
cmp #$FFFF ; Hack! Special mode...
|
||||||
|
beq :nes
|
||||||
|
|
||||||
bit #RENDER_WITH_SHADOWING
|
bit #RENDER_WITH_SHADOWING
|
||||||
beq :no_shadowing
|
beq :no_shadowing
|
||||||
jsr _RenderWithShadowing
|
jsr _RenderWithShadowing
|
||||||
|
@ -311,6 +314,10 @@ _TSRender
|
||||||
|
|
||||||
:no_scanline
|
:no_scanline
|
||||||
jsr _Render
|
jsr _Render
|
||||||
|
bra :done
|
||||||
|
|
||||||
|
:nes
|
||||||
|
jsr _RenderNES
|
||||||
|
|
||||||
:done
|
:done
|
||||||
_TSExit #0;#2
|
_TSExit #0;#2
|
||||||
|
@ -915,7 +922,16 @@ _TSGetAddress
|
||||||
lda BG1StartXMod164Tbl+2
|
lda BG1StartXMod164Tbl+2
|
||||||
sta :output+2,s
|
sta :output+2,s
|
||||||
bra :out
|
bra :out
|
||||||
:next_2
|
|
||||||
|
:next_2 cmp #rawDrawTile
|
||||||
|
bne :next_3
|
||||||
|
|
||||||
|
lda #_DrawTileToScreen
|
||||||
|
sta :output,s
|
||||||
|
lda #^_DrawTileToScreen
|
||||||
|
sta :output+2,s
|
||||||
|
bra :out
|
||||||
|
:next_3
|
||||||
:out
|
:out
|
||||||
_TSExit #0;#2
|
_TSExit #0;#2
|
||||||
|
|
||||||
|
@ -933,7 +949,7 @@ _TSSetAddress
|
||||||
sta StartXMod164Tbl
|
sta StartXMod164Tbl
|
||||||
lda :ptr+2,s
|
lda :ptr+2,s
|
||||||
sta StartXMod164Tbl+2
|
sta StartXMod164Tbl+2
|
||||||
bra :out
|
brl :out
|
||||||
|
|
||||||
:next_1
|
:next_1
|
||||||
cmp #scanlineHorzOffset2
|
cmp #scanlineHorzOffset2
|
||||||
|
@ -943,7 +959,7 @@ _TSSetAddress
|
||||||
sta BG1StartXMod164Tbl
|
sta BG1StartXMod164Tbl
|
||||||
lda :ptr+2,s
|
lda :ptr+2,s
|
||||||
sta BG1StartXMod164Tbl+2
|
sta BG1StartXMod164Tbl+2
|
||||||
bra :out
|
brl :out
|
||||||
|
|
||||||
:next_2 cmp #vblCallback
|
:next_2 cmp #vblCallback
|
||||||
bne :next_3
|
bne :next_3
|
||||||
|
@ -956,15 +972,25 @@ _TSSetAddress
|
||||||
stal _VblTaskPatch+1 ; long addressing because we're patching code in the K bank
|
stal _VblTaskPatch+1 ; long addressing because we're patching code in the K bank
|
||||||
lda :ptr+1,s
|
lda :ptr+1,s
|
||||||
stal _VblTaskPatch+2
|
stal _VblTaskPatch+2
|
||||||
bra :out
|
brl :out
|
||||||
|
|
||||||
:vbl_restore
|
:vbl_restore
|
||||||
lda #_TaskStub
|
lda #_TaskStub
|
||||||
stal _VblTaskPatch+1
|
stal _VblTaskPatch+1
|
||||||
lda #>_TaskStub
|
lda #>_TaskStub
|
||||||
stal _VblTaskPatch+2
|
stal _VblTaskPatch+2
|
||||||
|
brl :out
|
||||||
|
|
||||||
|
:next_3 cmp #extSpriteRenderer
|
||||||
|
bne :next_4
|
||||||
|
|
||||||
|
lda :ptr,s
|
||||||
|
sta ExtSpriteRenderer
|
||||||
|
lda :ptr+2,s
|
||||||
|
sta ExtSpriteRenderer+2
|
||||||
bra :out
|
bra :out
|
||||||
:next_3
|
|
||||||
|
:next_4
|
||||||
:out
|
:out
|
||||||
_TSExit #0;#6
|
_TSExit #0;#6
|
||||||
|
|
||||||
|
|
|
@ -153,11 +153,11 @@ _ApplyBG0XPos
|
||||||
|
|
||||||
; If there are saved opcodes that have not been restored, do not run this routine
|
; If there are saved opcodes that have not been restored, do not run this routine
|
||||||
lda LastPatchOffset
|
lda LastPatchOffset
|
||||||
beq :ok
|
beq *+3
|
||||||
rts
|
rts
|
||||||
|
|
||||||
; This code is fairly succinct. See the corresponding code in Vert.s for more detailed comments.
|
; This code is fairly succinct. See the corresponding code in Vert.s for more detailed comments.
|
||||||
:ok
|
|
||||||
lda StartYMod208 ; This is the base line of the virtual screen
|
lda StartYMod208 ; This is the base line of the virtual screen
|
||||||
asl
|
asl
|
||||||
sta :virt_line_x2 ; Keep track of it
|
sta :virt_line_x2 ; Keep track of it
|
||||||
|
@ -228,7 +228,8 @@ _ApplyBG0XPos
|
||||||
lda StartXMod164
|
lda StartXMod164
|
||||||
|
|
||||||
; Alternate entry point if the virt_line_x2 and lines_left_x2 and XMod164 values are passed in externally
|
; Alternate entry point if the virt_line_x2 and lines_left_x2 and XMod164 values are passed in externally
|
||||||
_ApplyBG0XPosAlt
|
|
||||||
|
_RestoreBG0OpcodesAlt
|
||||||
:stk_save equ tmp0
|
:stk_save equ tmp0
|
||||||
:virt_line_x2 equ tmp1
|
:virt_line_x2 equ tmp1
|
||||||
:lines_left_x2 equ tmp2
|
:lines_left_x2 equ tmp2
|
||||||
|
|
|
@ -560,6 +560,9 @@ _stamp_step ENT
|
||||||
BG1YCache ENT
|
BG1YCache ENT
|
||||||
ds 32
|
ds 32
|
||||||
|
|
||||||
|
ExtSpriteRenderer ENT
|
||||||
|
dw 0,0
|
||||||
|
|
||||||
; Scaling tables for the BG1 rotation tables.
|
; Scaling tables for the BG1 rotation tables.
|
||||||
ScalingTables ENT
|
ScalingTables ENT
|
||||||
dw Scale0,Scale1,Scale2,Scale3
|
dw Scale0,Scale1,Scale2,Scale3
|
||||||
|
|
Loading…
Reference in New Issue
Block a user