From d74414ee72d10aeb3f38bc0a7ff97b3cc0af4f70 Mon Sep 17 00:00:00 2001 From: shoofle Date: Sat, 10 May 2025 13:05:53 -0400 Subject: [PATCH] i have sinned and done way too much in a commit. sry. --- 00TheFool.inc | 276 +++++++++++------------ 01TheMagician.inc | 5 +- 02TheHighPriestess.inc | 3 + 03TheEmpress.inc | 351 +++++++++++++++++++---------- 04TheEmperor.inc | 2 + 05TheHierophant.inc | 2 + 06TheLovers.inc | 2 + 07TheChariot.inc | 2 + 08Strength.inc | 2 + 09TheHermit.inc | 2 + 10WheelOfFortune.inc | 178 +++++++-------- 11Justice.inc | 2 + 12TheHangedMan.inc | 2 + 13Death.inc | 2 + 14Temperance.inc | 53 ++--- 15TheDevil.inc | 2 + 16TheTower.inc | 6 +- 17TheStar.inc | 5 +- 18TheMoon.inc | 3 +- 19TheSun.inc | 3 +- 20Judgement.inc | 3 +- 21TheWorld.inc | 6 +- Async.inc | 87 +++----- Audio.inc | 2 +- CardHelpers.inc | 65 +++--- CopyRange.inc | 56 ++--- CopyTiles.inc | 35 ++- GraphicsManipulation.inc | 40 ++-- Printing.inc | 384 +++++++------------------------- Random.inc | 4 +- RecreatingCards.inc | 70 ++++-- ScreenCardBrowse.inc | 109 ++++----- ScreenCardRead.inc | 56 ++--- ScreenMainMenu.inc | 128 +++++++---- ScreenShuffle.inc | 73 ++---- ScreenSpreadSelect.inc | 92 +++----- card_art/00thefool.aseprite | Bin 6928 -> 6963 bytes card_art/03theempress.aseprite | Bin 7098 -> 8705 bytes card_art/14temperance.aseprite | Bin 6818 -> 7047 bytes card_art/KeyArtTiles.asm | 183 +++++++++------ card_art/SpriteTiles.asm | 106 ++++----- card_art/screendesigns.aseprite | Bin 5243 -> 5363 bytes main.asm | 20 +- source.zip | Bin 464608 -> 465641 bytes 44 files changed, 1137 insertions(+), 1285 deletions(-) diff --git a/00TheFool.inc b/00TheFool.inc index d87f2e0..54bbea0 100644 --- a/00TheFool.inc +++ b/00TheFool.inc @@ -25,6 +25,7 @@ def Card_Offset_functions equ @-TheFool dw .fInit dw .fUpdate dw .fDraw + dw .fPrintPrep .fInit: ld hl, CVS @@ -72,7 +73,7 @@ def Card_Offset_functions equ @-TheFool ld hl, .cloud1 ; six sprites for the doggie, four for the zero, 4 bytes each ld de, MY_OAM + 10*4 - ld bc, 73*$100 + 15 + ld bc, 78*$100 + 15 ld a, $13 ; one by three call BuildMetaSprite ; set those three sprites to use OBP palette 1 @@ -98,7 +99,7 @@ def Card_Offset_functions equ @-TheFool ld hl, .cloud3 ld de, MY_OAM + 16*4 - ld bc, 88*$100 + 67 + ld bc, 92*$100 + 67 ld a, $11 call BuildMetaSprite ld hl, MY_OAM + 16*4+3 @@ -113,13 +114,12 @@ def Card_Offset_functions equ @-TheFool ld a, [CVS+1] ; checking the high byte of the timer cp a, $06 ; $10 00 = 1 second jp c, .doneWithTimer1 ; if the timer is less than $0600, skip - - ; if the timer is greater or equal to $0600, reset it - ld a, 0 - ld [CVS], a - ld [CVS+1], a - call .dogDance ; and make the dog dance -.doneWithTimer1 + ; if the timer is greater or equal to $0600, reset it + ld a, 0 + ld [CVS], a + ld [CVS+1], a + call .dogDance ; and make the dog dance + .doneWithTimer1 ld hl, CVS+3 call IncrementTimer @@ -127,13 +127,12 @@ def Card_Offset_functions equ @-TheFool ld a, [CVS+3+1] ; check the high byte of the zero sprite timer cp a, $30 ; $10 00 = 1 second jp c, .doneWithTimer2 - jp .doneWithTimer2 - - ld a, 0 - ld [CVS+3], a - ld [CVS+3+1], a - call .zeroRotate -.doneWithTimer2 + + ld a, 0 + ld [CVS+3], a + ld [CVS+3+1], a + call .zeroRotate + .doneWithTimer2 ld hl, CVS+6 call IncrementTimer @@ -141,12 +140,12 @@ def Card_Offset_functions equ @-TheFool ld a, [CVS+6+1] cp a, $20 jp c, .doneWithTimer3 - - ld a, 0 - ld [CVS+6], a - ld [CVS+6+1], a - call .cloud1Move -.doneWithTimer3 + + ld a, 0 + ld [CVS+6], a + ld [CVS+6+1], a + call .cloud1Move + .doneWithTimer3 ld hl, CVS+9 call IncrementTimer @@ -154,12 +153,12 @@ def Card_Offset_functions equ @-TheFool ld a, [CVS+9+1] cp a, $20 jp c, .doneWithTimer4 - - ld a, 0 - ld [CVS+9], a - ld [CVS+9+1], a - call .cloud2Move -.doneWithTimer4 + + ld a, 0 + ld [CVS+9], a + ld [CVS+9+1], a + call .cloud2Move + .doneWithTimer4 ld hl, CVS+12 call IncrementTimer @@ -167,12 +166,12 @@ def Card_Offset_functions equ @-TheFool ld a, [CVS+12+1] cp a, $60 jp c, .doneWithTimer5 - - ld a, 0 - ld [CVS+12], a - ld [CVS+12+1], a - call .cloud3Move -.doneWithTimer5 + + ld a, 0 + ld [CVS+12], a + ld [CVS+12+1], a + call .cloud3Move + .doneWithTimer5 ret .dogDance: @@ -240,6 +239,7 @@ def Card_Offset_functions equ @-TheFool ld hl, .zero ld de, MY_OAM + 6*4 ; we've already written six sprites for the doggie, 4 bytes each ld a, $22 ; two by two + ld bc, 0 ; location of source tile map: hl ; location in memory to write to: de ; y and x in b and c (set above) @@ -273,6 +273,7 @@ def Card_Offset_functions equ @-TheFool ld hl, .cloud1 ; six sprites for the doggie, four for the zero, 4 bytes each ld de, MY_OAM + 10*4 + ld bc, 0 ld a, $13 ; two by two ; location of source tile map: hl ; location in memory to write to: de @@ -283,7 +284,7 @@ def Card_Offset_functions equ @-TheFool .cloud1: db $0e, $0f, $10 .cloud1Anim: - db 9, 73, 15, 73, 15, 73, 16, 73, 17, 73, 18, 73, 19, 73, 18, 73, 17, 73, 16, + db 9, 78, 15, 78, 15, 78, 16, 78, 17, 78, 18, 78, 19, 78, 18, 78, 17, 78, 16, .cloud2Move: ld hl, .cloud2Anim @@ -306,6 +307,7 @@ def Card_Offset_functions equ @-TheFool ld hl, .cloud2 ; six sprites for the doggie, four for the zero, 4 bytes each ld de, MY_OAM + 13*4 + ld bc, 0 ld a, $13 ; two by two ; location of source tile map: hl ; location in memory to write to: de @@ -339,6 +341,7 @@ def Card_Offset_functions equ @-TheFool ld hl, .cloud3 ; six sprites for the doggie, four for the zero, 4 bytes each ld de, MY_OAM + 16*4 + ld bc, 0 ld a, $11 ; location of source tile map: hl ; location in memory to write to: de @@ -349,13 +352,15 @@ def Card_Offset_functions equ @-TheFool .cloud3: db $14 .cloud3Anim: - db 2, 88, 66, 88, 67, + db 2, 92, 66, 92, 67, .fDraw: ret +.fPrintPrep: + ret @@ -370,132 +375,129 @@ def Card_Offset_functions equ @-TheFool db $00,$00,$00,$00,$00,$00,$0e,$0e,$8f,$8b,$ff,$fd,$ff,$01,$ff,$01 db $ff,$00,$ff,$00,$ff,$00,$ff,$80,$ff,$93,$fe,$96,$fc,$dc,$70,$70 db $ff,$01,$ff,$01,$ff,$01,$ff,$01,$ff,$c9,$7f,$4b,$7e,$6e,$38,$38 - db $00,$00,$03,$03,$07,$07,$0c,$0c,$18,$18,$18,$18,$30,$30,$30,$30 - db $00,$00,$c0,$c0,$e0,$e0,$30,$30,$18,$18,$18,$18,$0c,$0c,$0c,$0c - db $30,$30,$30,$30,$18,$18,$18,$18,$0c,$0c,$07,$07,$03,$03,$00,$00 - db $0c,$0c,$0c,$0c,$18,$18,$18,$18,$30,$30,$e0,$e0,$c0,$c0,$00,$00 - db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$00,$3f - db $00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$00,$1f,$00,$ff,$00,$ff - db $00,$00,$00,$00,$00,$00,$00,$00,$00,$80,$00,$c0,$00,$f0,$00,$fc - db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07 - db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$78,$00,$ff,$00,$ff - db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$c0,$00,$f0 - db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$ff + db $00,$00,$00,$03,$00,$07,$00,$0c,$00,$18,$00,$18,$00,$30,$00,$30 + db $00,$00,$00,$c0,$00,$e0,$00,$30,$00,$18,$00,$18,$00,$0c,$00,$0c + db $00,$30,$00,$30,$00,$18,$00,$18,$00,$0c,$00,$07,$00,$03,$00,$00 + db $00,$0c,$00,$0c,$00,$18,$00,$18,$00,$30,$00,$e0,$00,$c0,$00,$00 + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$00,$3f,$00 + db $00,$00,$00,$00,$00,$00,$00,$00,$07,$00,$1f,$00,$ff,$00,$ff,$00 + db $00,$00,$00,$00,$00,$00,$00,$00,$80,$00,$c0,$00,$f0,$00,$f0,$00 + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$00 + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$78,$00,$ff,$00,$ff,$00 + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$c0,$00,$f0,$00 + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$ff,$00 .SpriteTilesEnd: .KeyArtTiles: 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,$00,$00,$00,$00,$80,$00,$80,$00 db $1f,$00,$0f,$00,$0f,$00,$0f,$00,$07,$00,$07,$00,$07,$00,$07,$00 + db $ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00 + db $ff,$00,$ff,$00,$ff,$00,$ff,$00,$fe,$00,$fe,$00,$fe,$00,$fe,$00 + db $c0,$00,$c0,$00,$e0,$00,$e0,$00,$f0,$00,$f0,$00,$f0,$00,$f8,$00 db $07,$00,$03,$00,$03,$00,$03,$00,$03,$00,$03,$00,$01,$00,$01,$00 - db $ff,$00,$ff,$00,$ff,$00,$ff,$00,$e7,$1f,$cf,$30,$9f,$62,$7f,$81 - db $ff,$00,$ff,$00,$ff,$00,$ff,$fc,$e1,$1e,$ff,$3e,$e1,$1e,$90,$ff - db $f8,$00,$f8,$00,$f8,$00,$f8,$00,$f8,$00,$f8,$00,$70,$80,$30,$c0 + db $fe,$00,$fe,$00,$fc,$00,$fc,$00,$fc,$00,$fc,$00,$fc,$00,$fc,$00 + db $f8,$00,$fc,$00,$fc,$00,$fe,$00,$fe,$00,$fe,$00,$ff,$00,$ff,$00 + db $01,$00,$01,$00,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 + db $ff,$00,$ff,$00,$fe,$00,$c0,$00,$87,$1f,$0f,$30,$1f,$62,$7f,$81 + db $ff,$00,$ff,$00,$01,$00,$fc,$fc,$e0,$1e,$fe,$3e,$e0,$1e,$90,$ff + db $f8,$00,$f8,$00,$f8,$00,$f8,$00,$f8,$00,$38,$00,$10,$80,$00,$c0 + db $00,$00,$00,$00,$00,$00,$01,$00,$01,$00,$03,$00,$03,$00,$07,$00 + db $80,$00,$80,$00,$c0,$00,$c0,$00,$c0,$00,$e0,$00,$e0,$00,$f0,$00 db $00,$00,$00,$01,$00,$01,$01,$02,$03,$04,$07,$08,$0f,$10,$0f,$10 - db $79,$86,$f7,$08,$f7,$08,$ef,$10,$ef,$10,$de,$21,$de,$21,$bd,$42 - db $c0,$7f,$80,$7f,$00,$ff,$80,$7f,$f0,$cf,$f8,$87,$f8,$07,$f8,$87 + db $78,$86,$f0,$08,$f2,$08,$e2,$10,$e4,$10,$c4,$21,$c8,$21,$81,$42 + db $40,$7f,$00,$7f,$00,$ff,$00,$7f,$f0,$cf,$f8,$87,$f8,$07,$f8,$87 db $00,$f0,$00,$fc,$00,$f8,$00,$f8,$00,$f8,$00,$f8,$00,$fc,$80,$7c + db $07,$00,$07,$00,$0f,$00,$0f,$00,$0f,$00,$1f,$00,$1f,$00,$3f,$00 + db $f0,$00,$f0,$00,$f8,$00,$f8,$00,$fc,$00,$fc,$00,$fe,$00,$fe,$00 db $1f,$20,$1f,$20,$0f,$11,$07,$0a,$04,$06,$05,$04,$06,$04,$05,$04 - db $fd,$7a,$de,$8f,$a9,$03,$55,$01,$a8,$02,$55,$00,$aa,$00,$55,$00 + db $f9,$7a,$de,$8f,$a9,$03,$55,$01,$a8,$02,$55,$00,$aa,$00,$55,$00 db $fc,$43,$fd,$02,$3e,$c1,$0e,$31,$81,$9e,$8f,$f0,$8e,$71,$5e,$9e db $80,$7c,$80,$7c,$00,$fc,$00,$fc,$17,$ff,$c4,$ff,$0c,$ff,$9f,$3f db $00,$00,$00,$00,$00,$00,$00,$00,$80,$80,$40,$c0,$e0,$e0,$e1,$e0 + db $3f,$00,$3f,$00,$7f,$00,$7f,$00,$7f,$00,$ff,$00,$ff,$00,$ff,$00 + db $ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$7f,$00,$3f,$00,$1f,$00 + db $fe,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00 db $06,$04,$05,$04,$07,$05,$86,$06,$84,$04,$c0,$00,$c0,$00,$c0,$00 - db $aa,$00,$55,$01,$ff,$ff,$3f,$01,$3f,$01,$3e,$02,$3f,$02,$1e,$02 + db $aa,$00,$55,$01,$ff,$ff,$01,$01,$39,$01,$3a,$02,$3b,$02,$1a,$02 db $33,$ae,$ff,$47,$79,$47,$fb,$46,$7e,$44,$e5,$5c,$3e,$44,$b9,$46 db $5f,$0f,$af,$07,$57,$03,$ab,$81,$d5,$81,$ab,$81,$d5,$81,$ab,$81 - db $d1,$f0,$8f,$f8,$87,$fc,$87,$fe,$87,$fe,$87,$fe,$87,$fe,$87,$fe - db $1f,$02,$1e,$02,$1f,$02,$1e,$02,$1f,$02,$1e,$02,$0f,$02,$0e,$03 + db $d1,$f0,$89,$f8,$84,$fc,$86,$fe,$86,$fe,$86,$fe,$86,$fe,$86,$fe + db $0f,$00,$07,$00,$03,$00,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00 + db $e0,$00,$e0,$00,$f0,$00,$f0,$00,$f8,$00,$f8,$00,$f8,$00,$fc,$00 + db $1b,$02,$1a,$02,$1b,$02,$1a,$02,$1b,$02,$1a,$02,$0b,$02,$0a,$03 db $3c,$42,$9e,$21,$5e,$21,$9e,$21,$5f,$20,$af,$10,$4f,$10,$af,$11 db $d5,$81,$ab,$81,$d5,$81,$ab,$81,$d5,$81,$ab,$83,$d7,$83,$ab,$03 - db $87,$fe,$87,$fe,$87,$fe,$87,$fe,$87,$fe,$0f,$fc,$0f,$fc,$1f,$f8 - db $fc,$00,$fe,$00,$fe,$00,$ff,$00,$ff,$00,$7f,$00,$3f,$03,$1f,$07 - db $0f,$01,$0f,$01,$0f,$03,$0f,$0f,$3f,$3f,$ff,$ff,$ff,$ff,$ff,$ff - db $4f,$11,$8f,$31,$e7,$f9,$e3,$ed,$ff,$fd,$ff,$ff,$ff,$ff,$ff,$ff - db $57,$03,$ab,$03,$57,$03,$af,$07,$55,$04,$ae,$04,$55,$04,$ae,$05 - db $3f,$f0,$7f,$e0,$ff,$c0,$ff,$80,$7f,$80,$7f,$80,$7f,$80,$ff,$00 - db $1f,$0f,$7f,$7f,$7f,$7f,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff - db $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$fc,$fc - db $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$bf,$ff,$1f,$3f,$1f,$3f - db $54,$05,$be,$1d,$7d,$3c,$ff,$7e,$ff,$fe,$ff,$fe,$ff,$fe,$ff,$fe - db $e0,$00,$f8,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$1c,$e3,$3b - db $00,$00,$00,$01,$c0,$01,$e1,$02,$e1,$06,$e3,$04,$c7,$08,$8f,$10 - db $ff,$ff,$7f,$ff,$ff,$7f,$ff,$3f,$fe,$1e,$e8,$18,$c0,$20,$88,$40 - db $f8,$f8,$c0,$c0,$80,$80,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 - db $1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f - db $fc,$fc,$fc,$fc,$fc,$fc,$fe,$fe,$fe,$fe,$fc,$fc,$fc,$fc,$fc,$fc - db $e0,$38,$f0,$18,$f8,$0c,$f8,$0e,$fc,$07,$fe,$03,$ff,$01,$ff,$01 - db $ff,$f0,$3f,$20,$3c,$23,$1c,$12,$1e,$1e,$0f,$0e,$07,$84,$0f,$c8 - db $18,$80,$38,$80,$3c,$00,$7c,$00,$fc,$00,$fc,$00,$fc,$00,$ff,$00 - db $1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$1f,$ff,$1f - db $fc,$fc,$fc,$fc,$fe,$fe,$fe,$fe,$ff,$ff,$ff,$ff,$f0,$fc,$bc,$c2 - db $9f,$f0,$fb,$64,$f5,$0a,$ee,$11,$55,$aa,$aa,$55,$55,$aa,$aa,$55 - db $7c,$82,$7e,$81,$3f,$40,$1f,$20,$0f,$90,$87,$48,$43,$a4,$a1,$52 - db $55,$2a,$3b,$04,$15,$8a,$8e,$11,$85,$4a,$c2,$05,$e1,$02,$e2,$11 + db $86,$fe,$86,$fe,$86,$fe,$86,$fe,$86,$fe,$0c,$fc,$0d,$fc,$19,$f8 + db $fc,$00,$fe,$00,$fe,$00,$ff,$00,$ff,$00,$7e,$00,$3e,$00,$18,$00 + db $09,$01,$09,$01,$03,$03,$07,$07,$0f,$0f,$3f,$3f,$ff,$ff,$7f,$ff + db $4f,$11,$8f,$31,$e7,$f9,$f3,$fd,$ff,$fd,$ff,$ff,$ff,$ff,$ff,$ff + db $57,$03,$ab,$03,$57,$03,$af,$07,$54,$04,$ad,$04,$55,$04,$a9,$08 + db $33,$f0,$67,$e0,$cf,$c0,$9f,$80,$3f,$00,$ff,$00,$ff,$00,$ff,$00 + db $fe,$00,$fc,$00,$f8,$00,$f0,$00,$e0,$00,$c0,$00,$80,$00,$00,$00 + db $00,$03,$03,$0c,$0f,$10,$0f,$10,$0f,$10,$1f,$20,$1f,$20,$3f,$40 + db $ff,$7f,$ff,$3f,$ff,$1f,$ff,$0f,$ff,$0f,$ff,$07,$fb,$07,$e0,$18 + db $ff,$ff,$7f,$ff,$7f,$ff,$7f,$ff,$7f,$ff,$7f,$ff,$7f,$ff,$7f,$7f + db $73,$30,$f3,$70,$fb,$f8,$fb,$f8,$fb,$f8,$fb,$f8,$f9,$f8,$f0,$f0 + db $e0,$00,$f8,$00,$ff,$00,$ff,$00,$87,$00,$31,$30,$5c,$7c,$43,$73 + db $00,$00,$00,$00,$c0,$01,$f9,$02,$f1,$02,$e3,$04,$47,$08,$0f,$10 + db $7f,$80,$7f,$80,$fe,$01,$f8,$06,$f0,$08,$e0,$10,$c0,$20,$88,$40 + db $80,$60,$00,$80,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 + db $7f,$7f,$7f,$7e,$3f,$40,$3f,$40,$3f,$40,$3f,$40,$3f,$40,$3f,$40 + db $f0,$f0,$c0,$20,$c0,$20,$c0,$20,$c0,$20,$80,$40,$80,$40,$80,$40 + db $00,$00,$00,$00,$00,$00,$00,$00,$03,$00,$0f,$00,$3f,$00,$7f,$00 + db $03,$00,$0f,$00,$3f,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00 + db $40,$70,$20,$38,$90,$1c,$c8,$0e,$e4,$07,$f2,$03,$f9,$01,$fd,$01 + db $ff,$f0,$3f,$20,$3c,$23,$1c,$12,$1e,$1e,$0e,$0e,$04,$84,$09,$c8 + db $18,$80,$38,$80,$3c,$00,$7c,$00,$fc,$00,$fc,$00,$fc,$00,$fe,$00 + db $3f,$40,$3f,$40,$3f,$40,$3f,$40,$1f,$20,$0f,$10,$07,$08,$03,$04 + db $80,$40,$80,$40,$c0,$20,$c0,$20,$e0,$10,$e0,$10,$f0,$08,$f1,$08 + db $7f,$00,$7f,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00 + db $fc,$00,$fe,$00,$ff,$00,$ee,$11,$55,$aa,$aa,$55,$55,$aa,$aa,$55 + db $93,$f0,$63,$64,$05,$0a,$ee,$11,$55,$aa,$aa,$55,$55,$aa,$aa,$55 + db $55,$aa,$bb,$44,$55,$aa,$ee,$11,$55,$aa,$aa,$55,$55,$aa,$aa,$55 + db $41,$a2,$b8,$41,$54,$a8,$ee,$10,$55,$aa,$aa,$55,$55,$aa,$aa,$55 + db $f9,$04,$f8,$04,$7c,$82,$3c,$42,$1e,$21,$9f,$20,$0f,$90,$87,$48 + db $55,$aa,$bb,$44,$55,$aa,$2e,$51,$15,$2a,$0a,$95,$85,$42,$f2,$31 + db $55,$aa,$aa,$55,$55,$aa,$aa,$55,$11,$ee,$aa,$55,$44,$bb,$aa,$55 db $55,$aa,$aa,$55,$55,$aa,$aa,$55,$11,$ee,$af,$57,$47,$bf,$ae,$5f db $55,$aa,$aa,$55,$55,$aa,$af,$5f,$ff,$ff,$f0,$ff,$fe,$ff,$0f,$ff db $55,$aa,$aa,$55,$55,$aa,$ff,$ff,$ff,$ff,$00,$ff,$00,$ff,$80,$ff - db $50,$a9,$a8,$54,$fd,$fd,$fe,$ff,$38,$f8,$40,$c0,$40,$e0,$40,$ff - db $f1,$08,$60,$9c,$d3,$ef,$7f,$ff,$01,$01,$01,$01,$01,$01,$01,$ff - db $16,$ef,$ae,$57,$46,$bf,$af,$57,$03,$ff,$ab,$57,$01,$ff,$ab,$55 - db $f0,$ff,$3e,$ff,$07,$ff,$01,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff - db $00,$ff,$00,$ff,$fc,$ff,$ff,$ff,$7f,$ff,$00,$ff,$00,$ff,$00,$ff - db $3f,$ff,$00,$ff,$01,$ff,$ff,$ff,$ff,$ff,$01,$ff,$00,$ff,$00,$ff - db $ff,$ff,$00,$ff,$c0,$ff,$f0,$ff,$ff,$ff,$ff,$ff,$00,$ff,$00,$ff - db $00,$ff,$00,$ff,$00,$ff,$02,$ff,$ff,$ff,$ff,$ff,$00,$ff,$00,$ff - db $80,$ff,$80,$ff,$80,$ff,$c0,$ff,$c0,$ff,$c0,$ff,$e0,$ff,$e0,$7f - db $60,$ff,$60,$ff,$60,$ff,$60,$ff,$60,$ff,$30,$ff,$30,$ff,$30,$ff - db $1f,$00,$1f,$00,$1f,$00,$1f,$00,$1f,$00,$1f,$00,$1f,$00,$ff,$00 - db $80,$00,$c0,$00,$40,$00,$60,$00,$33,$00,$3f,$00,$3f,$00,$1f,$00 - db $ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$7f,$00,$3f,$00,$1f,$00 - db $0f,$00,$07,$00,$03,$00,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00 - db $80,$00,$80,$00,$c0,$00,$c0,$00,$c0,$00,$e0,$00,$e0,$00,$f0,$00 - db $f0,$00,$f0,$00,$f8,$00,$f8,$00,$fc,$00,$fc,$00,$fe,$00,$fe,$00 - db $fe,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00 - db $e0,$00,$e0,$00,$f0,$00,$f0,$00,$f8,$00,$f8,$00,$f8,$00,$fc,$00 - db $ff,$00,$ff,$00,$ff,$00,$ee,$11,$55,$aa,$aa,$55,$55,$aa,$aa,$55 - db $55,$aa,$aa,$55,$7f,$ff,$ff,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff + db $55,$aa,$aa,$55,$7f,$ff,$ff,$ff,$00,$fe,$00,$fe,$00,$fe,$00,$fe + db $43,$a4,$a1,$52,$c7,$c7,$18,$18,$60,$60,$80,$80,$80,$c0,$80,$ff + db $c9,$48,$84,$84,$02,$02,$02,$02,$06,$0e,$0c,$1c,$30,$71,$c0,$c7 db $55,$aa,$af,$5f,$ff,$ff,$f8,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff - db $ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00 - db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$01,$01,$01,$01,$00,$00 - db $01,$00,$01,$00,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 - db $ff,$00,$ff,$00,$ff,$00,$ff,$00,$fe,$00,$fe,$00,$fe,$00,$fe,$00 - db $fe,$00,$fe,$00,$fc,$00,$fc,$00,$fc,$00,$fc,$00,$fc,$00,$fc,$00 - db $00,$00,$00,$00,$00,$00,$01,$00,$01,$00,$03,$00,$03,$00,$07,$00 - db $07,$00,$07,$00,$0f,$00,$0f,$00,$0f,$00,$1f,$00,$1f,$00,$3f,$00 - db $3f,$00,$3f,$00,$7f,$00,$7f,$00,$7f,$00,$ff,$00,$ff,$00,$ff,$00 - db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$01,$00 - db $03,$00,$0f,$00,$3f,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00 - db $fe,$00,$fc,$00,$f8,$00,$f0,$00,$e0,$00,$c0,$00,$80,$00,$80,$00 - db $fe,$00,$fc,$00,$f8,$00,$f0,$00,$e0,$00,$c0,$00,$80,$00,$00,$00 - db $01,$ff,$23,$dd,$01,$ff,$ab,$55,$00,$ff,$22,$dd,$00,$ff,$88,$77 - db $5e,$bf,$b8,$44,$54,$aa,$ee,$11,$55,$aa,$aa,$55,$55,$aa,$aa,$55 - db $01,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$80,$ff,$80,$ff - db $00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff - db $55,$aa,$bb,$44,$55,$aa,$ee,$11,$55,$aa,$aa,$55,$55,$aa,$aa,$55 - db $55,$aa,$aa,$55,$55,$aa,$aa,$55,$11,$ee,$aa,$55,$44,$bb,$aa,$55 db $11,$ee,$aa,$55,$44,$bb,$aa,$55,$00,$ff,$aa,$55,$00,$ff,$aa,$55 + db $16,$ef,$ae,$57,$46,$bf,$af,$57,$03,$ff,$ab,$57,$01,$ff,$ab,$55 + db $01,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$80,$ff,$80,$ff + db $f0,$ff,$3e,$ff,$07,$ff,$01,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff + db $00,$fe,$00,$ff,$f8,$ff,$ff,$ff,$7f,$ff,$00,$ff,$00,$ff,$00,$ff + db $7f,$7f,$00,$00,$07,$ff,$ff,$ff,$ff,$ff,$01,$ff,$00,$ff,$00,$ff + db $80,$9f,$00,$3f,$00,$ff,$f0,$ff,$ff,$ff,$ff,$ff,$00,$ff,$00,$ff + db $00,$ff,$00,$ff,$00,$ff,$02,$ff,$ff,$ff,$ff,$ff,$00,$ff,$00,$ff db $00,$ff,$22,$dd,$00,$ff,$aa,$55,$00,$ff,$22,$dd,$00,$ff,$88,$77 - db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$80,$00,$80,$00 - db $c0,$00,$c0,$00,$e0,$00,$e0,$00,$f0,$00,$f0,$00,$f0,$00,$f8,$00 - db $f8,$00,$fc,$00,$fc,$00,$fe,$00,$fe,$00,$fe,$00,$ff,$00,$ff,$00 + db $01,$ff,$23,$dd,$01,$ff,$ab,$55,$00,$ff,$22,$dd,$00,$ff,$88,$77 + db $80,$ff,$80,$ff,$80,$ff,$c0,$ff,$c0,$ff,$c0,$ff,$e0,$ff,$e0,$7f + db $00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff + db $60,$ff,$60,$ff,$60,$ff,$60,$ff,$60,$ff,$30,$ff,$30,$ff,$30,$ff .KeyArtTilesEnd: .BackgroundCopy: ; tiles start at 26 - db $75, $1a, $1b, $61, $61, $64, $1a, $1a - db $76, $1a, $1c, $61, $61, $65, $1a, $1a - db $77, $1a, $63, $1d, $1e, $1f, $1a, $66 - db $61, $5a, $20, $21, $22, $23, $1a, $67 - db $61, $5b, $24, $25, $26, $27, $28, $68 - db $58, $5c, $29, $2a, $2b, $2c, $2d, $61 - db $59, $58, $5d, $2e, $2f, $30, $31, $61 - db $1a, $59, $32, $33, $34, $35, $36, $6c - db $1a, $62, $37, $38, $39, $3a, $6b, $69 - db $3b, $3c, $3d, $3e, $3f, $40, $57, $6a - db $41, $42, $43, $1a, $44, $45, $56, $61 - db $5e, $46, $71, $71, $6e, $47, $48, $71 - db $72, $49, $4a, $4b, $5f, $4c, $4d, $60 - db $73, $4e, $6f, $4f, $50, $51, $52, $53 - db $74, $6d, $54, $70, $70, $70, $70, $70 - db $70, $70, $55, $70, $70, $70, $70, $70 + db $1b, $1a, $1c, $1d, $1d, $1e, $1a, $1a + db $1f, $1a, $20, $1d, $1d, $21, $1a, $1a + db $22, $1a, $23, $24, $25, $26, $1a, $27 + db $1d, $28, $29, $2a, $2b, $2c, $1a, $2d + db $1d, $2e, $2f, $30, $31, $32, $33, $34 + db $35, $36, $37, $38, $39, $3a, $3b, $1d + db $3c, $35, $3d, $3e, $3f, $40, $41, $1d + db $1a, $3c, $42, $43, $44, $45, $46, $47 + db $1a, $1a, $48, $49, $4a, $4b, $47, $1a + db $4c, $4d, $4e, $4f, $50, $51, $52, $53 + db $54, $55, $56, $1a, $57, $58, $59, $1d + db $5a, $5b, $5c, $5c, $5d, $5e, $5f, $5c + db $60, $61, $62, $63, $64, $65, $66, $67 + db $68, $69, $6a, $6b, $6c, $6d, $6e, $6f + db $70, $71, $72, $73, $73, $73, $73, $73 + db $73, $73, $74, $73, $73, $73, $73, $73 .BackgroundCopyEnd: diff --git a/01TheMagician.inc b/01TheMagician.inc index 3f48eca..1cc415c 100644 --- a/01TheMagician.inc +++ b/01TheMagician.inc @@ -13,6 +13,7 @@ TheMagician: dw .fInit dw .fUpdate dw .fDraw + dw .fPrintPrep ; CARD_VARS_START + 0 ; timer for lemniscate ; CARD_VARS_START + 2 ; frame counter 1 @@ -281,7 +282,9 @@ TheMagician: .pentacleSheen: db 22, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 0, 96, 32, 96, 33, 96, 34, 96, 35, 96, 36, 96, 37, 96, 38, 96, 39, 96, 40, 96, 41, .fDraw: - ret + ret +.fPrintPrep: + ret .SpriteTiles: db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 diff --git a/02TheHighPriestess.inc b/02TheHighPriestess.inc index efe6288..9571937 100644 --- a/02TheHighPriestess.inc +++ b/02TheHighPriestess.inc @@ -13,6 +13,7 @@ TheHighPriestess: dw .fInit dw .fUpdate dw .fDraw + dw .fPrintPrep ; original export script by gabriel reis, modified by shoofle .fInit: @@ -100,6 +101,8 @@ TheHighPriestess: .fDraw: ret +.fPrintPrep: + ret .SpriteTiles: db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 diff --git a/03TheEmpress.inc b/03TheEmpress.inc index 053051d..79f3db0 100644 --- a/03TheEmpress.inc +++ b/03TheEmpress.inc @@ -13,133 +13,250 @@ TheEmpress: dw .fInit dw .fUpdate dw .fDraw + dw .fPrintPrep -.fInit: ret -.fUpdate: ret +.fInit: + ld hl, CVS + ld a, 0 + ld [hl+], a ; CVS timer for swing + ld [hl+], a + ld [hl+], a ; CVS+2 frame of animation + + ret +.fUpdate: + ld hl, CVS + call IncrementTimer + + ld a, [CVS+1] ; checking the high byte of the timer + cp a, $08 ; $10 = 1 second, $02 = 1/8 of a second + jp c, :+ ; if the timer is less than $0600, skip + + ; if the timer is greater or equal to $0600, reset it + ld a, 0 + ld [CVS], a + ld [CVS+1], a + + ld b, 4 + ld a, [CVS+2] + inc a + call ArrayClampLoopingB + ld [CVS+2], a + + call .render +: + ret .fDraw: ret +.fPrintPrep: ret + +.render: + ld a, [CVS+2] + cp a, 0 + jp nz, :+ + ld hl, .sprite1 +: cp a, 1 + jp nz, :+ + ld hl, .sprite2 +: cp a, 2 + jp nz, :+ + ld hl, .sprite3 +: cp a, 3 + jp nz, :+ + ld hl, .sprite4 +: + + ld de, MY_OAM + ld b, 8*4 + ld c, 8*2 + ld a, $68 + call BuildMetaSpritePacked + ret +.sprite1 ; 6 talll by 8 wide = 48 + db $00, $00, $08, $00, $00, $00, $0b, $0c + db $00, $09, $0a, $00, $00, $00, $00, $00 + db $00, $00, $00, $00, $00, $00, $00, $00 + db $00, $00, $00, $00, $00, $0e, $04, $0d + db $00, $00, $00, $00, $0f, $05, $01, $10 + db $00, $00, $00, $00, $00, $06, $03, $1e +.sprite2 + db $00, $00, $08, $00, $00, $00, $0b, $0c + db $00, $09, $0a, $00, $00, $00, $00, $00 + db $00, $00, $00, $00, $00, $00, $00, $00 + db $00, $00, $00, $00, $00, $0e, $19, $1a + db $00, $00, $00, $00, $0f, $1c, $1b, $1f + db $00, $00, $00, $00, $00, $06, $03, $1e +.sprite3 + db $00, $20, $21, $00, $00, $00, $22, $23 + db $00, $00, $00, $00, $00, $00, $00, $00 + db $00, $00, $00, $00, $00, $00, $00, $00 + db $00, $00, $00, $00, $00, $15, $13, $14 + db $00, $00, $00, $00, $0f, $1d, $16, $12 + db $00, $00, $00, $00, $00, $06, $03, $1e +.sprite4 + db $00, $20, $21, $00, $00, $00, $22, $23 + db $00, $00, $00, $00, $00, $00, $00, $00 + db $00, $00, $00, $00, $00, $00, $00, $00 + db $00, $00, $00, $00, $00, $15, $24, $25 + db $00, $00, $00, $00, $0f, $11, $18, $17 + db $00, $00, $00, $00, $00, $06, $03, $1e .SpriteTiles: + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 + db $1e,$18,$6c,$08,$7d,$09,$b7,$83,$9f,$87,$8c,$84,$cc,$c4,$4c,$44 + db $00,$00,$c0,$c0,$c0,$c0,$80,$80,$00,$00,$00,$00,$00,$00,$8a,$00 + db $4c,$44,$2c,$04,$25,$05,$a1,$81,$81,$81,$01,$01,$00,$00,$00,$00 + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$63,$60,$73,$70 + db $40,$40,$40,$40,$03,$03,$23,$23,$61,$21,$68,$20,$6c,$24,$4c,$04 + db $16,$14,$12,$10,$12,$10,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 + db $ca,$00,$4a,$00,$5a,$10,$10,$10,$10,$10,$00,$00,$00,$00,$00,$00 + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$0c,$00 + db $0f,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 + db $f0,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$00,$00,$00 + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$f8,$00,$00,$00 + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$3f,$00,$00,$00 + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$3e,$00,$00,$00,$00,$00 + db $01,$01,$01,$01,$01,$01,$08,$08,$0a,$0a,$02,$02,$00,$00,$00,$00 + db $00,$00,$c7,$c7,$c7,$c7,$8e,$8e,$0c,$0c,$08,$08,$08,$08,$8e,$0c + db $40,$40,$41,$41,$01,$01,$20,$20,$60,$20,$68,$20,$6c,$24,$4c,$04 + db $c0,$00,$00,$00,$61,$61,$e1,$e1,$83,$83,$06,$06,$04,$04,$8e,$0c + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$0c,$0c,$0d,$0c + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$ff,$00 + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$3c,$00,$00,$00 + db $0f,$0c,$de,$c4,$de,$c4,$da,$c0,$cd,$c1,$4d,$41,$4a,$42,$4a,$42 + db $00,$00,$60,$60,$e3,$e3,$83,$83,$06,$06,$0c,$0c,$08,$08,$8e,$0c + db $0b,$08,$ba,$88,$b6,$84,$db,$c1,$cd,$c1,$4b,$43,$4a,$42,$4e,$46 + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$31,$30,$33,$30 + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$bf,$00,$00,$00 + db $1a,$18,$2c,$08,$bc,$88,$b5,$81,$9b,$83,$4a,$42,$4c,$44,$4c,$44 + db $40,$40,$40,$40,$01,$01,$21,$21,$61,$21,$68,$20,$6c,$24,$4c,$04 + db $40,$40,$40,$40,$00,$00,$20,$20,$60,$20,$68,$20,$6c,$24,$4c,$04 + db $ce,$0c,$5e,$14,$5e,$14,$10,$10,$10,$10,$00,$00,$00,$00,$00,$00 + db $00,$00,$63,$63,$e7,$e7,$87,$87,$0c,$0c,$08,$08,$08,$08,$8e,$0c + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$0f,$00 + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$0c,$00,$f0,$00 + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$03,$00,$00,$00,$00,$00 + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$f0,$00,$00,$00,$00,$00 + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$19,$18,$19,$18 + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$80,$00,$ff,$00 .SpriteTilesEnd: EmpressMap: - db $7e, $1b, $1c, $1d, $1a, $1a, $78, $79 - db $75, $1e, $5f, $1f, $20, $21, $7d, $7a - db $76, $22, $5f, $23, $74, $7c, $24, $7b - db $77, $25, $26, $27, $71, $28, $1a, $1a - db $1a, $29, $2a, $70, $6d, $6f, $68, $1a - db $1a, $2d, $2e, $6e, $60, $63, $66, $6a - db $2f, $30, $31, $32, $61, $64, $67, $6b - db $33, $34, $5f, $35, $62, $65, $69, $6c - db $36, $37, $38, $39, $3a, $3b, $3c, $73 - db $3d, $3e, $3f, $40, $41, $42, $1a, $1a - db $43, $44, $45, $5f, $46, $47, $48, $1a - db $49, $4a, $2b, $4b, $4c, $5a, $4d, $1a - db $4e, $4f, $50, $51, $52, $53, $54, $55 - db $1a, $1a, $1a, $56, $1a, $57, $58, $59 - db $1a, $1a, $1a, $5b, $5c, $1a, $1a, $7f - db $1a, $1a, $1a, $5d, $5e, $1a, $1a, $1a + db $7d, $7d, $67, $68, $69, $6a, $7d, $7d + db $73, $73, $6b, $6c, $6d, $6e, $73, $73 + db $73, $20, $21, $6f, $70, $71, $61, $61 + db $74, $22, $23, $60, $72, $61, $61, $61 + db $75, $24, $25, $76, $77, $78, $7a, $7b + db $26, $49, $4a, $27, $1a, $79, $73, $73 + db $28, $4b, $5f, $4c, $29, $1a, $1a, $1a + db $2a, $44, $55, $4d, $4e, $2b, $1a, $1a + db $2c, $2d, $45, $43, $52, $4f, $2e, $54 + db $2f, $30, $46, $47, $58, $53, $50, $31 + db $32, $33, $34, $35, $48, $51, $7c, $36 + db $5c, $37, $38, $39, $3a, $3b, $51, $3c + db $5e, $5d, $61, $59, $42, $3d, $3e, $3f + db $62, $63, $61, $5b, $5a, $56, $40, $41 + db $1a, $1a, $64, $1c, $1d, $65, $66, $57 + db $1a, $1a, $1a, $1e, $1f, $1a, $1a, $1a EmpressMapEnd: EmpressTiles: db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 - db $00,$39,$01,$f6,$07,$e8,$06,$79,$1f,$20,$3f,$40,$37,$48,$0f,$70 - db $fe,$01,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00 - db $00,$88,$00,$9f,$80,$7e,$c0,$26,$20,$cc,$c0,$3c,$e0,$1c,$00,$fc - db $0f,$f0,$1b,$64,$13,$ec,$25,$da,$2b,$54,$0f,$f0,$1f,$e0,$3f,$40 - db $c0,$3e,$e0,$1f,$f3,$0f,$73,$8f,$53,$af,$93,$6f,$c3,$3b,$f1,$09 - db $00,$80,$00,$e2,$00,$f3,$00,$ff,$80,$ff,$9c,$ff,$ff,$ff,$f3,$f7 - db $00,$80,$00,$00,$00,$e2,$00,$b3,$00,$fc,$00,$ff,$c0,$cf,$ff,$ff - db $7f,$80,$1f,$e0,$9f,$60,$3f,$c0,$0f,$f0,$03,$fc,$31,$ce,$f9,$06 - db $30,$cc,$b0,$4e,$88,$74,$f0,$0f,$f6,$09,$f0,$0f,$f0,$0e,$e0,$1f - db $80,$b7,$c4,$ff,$fe,$ff,$78,$ff,$ff,$ff,$6f,$6f,$3f,$3f,$01,$31 - db $ff,$00,$0d,$f2,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$38,$00,$00 - db $ff,$00,$ff,$00,$bf,$40,$80,$7f,$80,$7f,$18,$fe,$3c,$7c,$2c,$7c - db $f0,$0f,$9c,$63,$80,$7f,$00,$fe,$00,$fe,$0c,$00,$00,$00,$00,$00 - db $54,$fe,$50,$fe,$18,$f6,$78,$86,$70,$8e,$f0,$0e,$60,$8e,$e0,$06 - db $00,$00,$00,$00,$07,$07,$18,$1c,$20,$30,$40,$60,$43,$43,$86,$c7 - db $2c,$7c,$2c,$7c,$fc,$fc,$0c,$0c,$02,$06,$02,$02,$e1,$e1,$3d,$bd - db $03,$03,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 db $00,$00,$00,$c0,$00,$30,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 - db $84,$84,$84,$8c,$8c,$8d,$88,$88,$88,$88,$98,$f8,$90,$f0,$d8,$d8 - db $05,$05,$05,$a5,$a5,$b5,$07,$07,$05,$65,$04,$04,$08,$e8,$08,$08 - db $01,$01,$00,$00,$01,$00,$07,$06,$0c,$0c,$08,$18,$18,$18,$10,$10 - db $7c,$7c,$00,$03,$f8,$04,$ff,$00,$ff,$00,$7f,$00,$7f,$00,$7f,$00 - db $30,$30,$40,$c0,$3c,$00,$fe,$00,$ff,$01,$ff,$00,$ff,$00,$ff,$00 - db $07,$60,$07,$60,$07,$60,$04,$60,$04,$40,$84,$80,$44,$40,$04,$20 - db $10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$30,$10,$70,$10,$d0 - db $7f,$40,$7f,$40,$7f,$40,$7f,$40,$7f,$40,$ff,$80,$ff,$80,$ff,$80 - db $24,$20,$10,$90,$10,$90,$08,$88,$09,$89,$05,$85,$83,$47,$41,$a1 - db $10,$90,$10,$90,$10,$d0,$10,$d0,$1e,$9e,$03,$83,$00,$c0,$00,$c0 - db $bc,$c3,$77,$f8,$0f,$1f,$00,$00,$00,$00,$80,$80,$f8,$f8,$3f,$47 - db $00,$ff,$ff,$00,$ef,$f0,$3f,$3e,$01,$03,$00,$00,$00,$00,$f8,$f8 - db $c0,$30,$e0,$10,$e0,$18,$e0,$18,$fc,$04,$ff,$87,$ff,$83,$7f,$40 - db $90,$80,$40,$40,$20,$20,$10,$10,$08,$08,$04,$04,$c2,$c2,$e1,$e1 - db $2f,$90,$28,$80,$28,$80,$0f,$80,$0f,$80,$0f,$80,$0f,$00,$9a,$80 - db $82,$30,$02,$30,$00,$20,$80,$20,$c0,$21,$40,$21,$c0,$21,$80,$01 - db $00,$c0,$00,$c0,$00,$c0,$00,$c0,$00,$c0,$00,$40,$00,$40,$00,$60 - db $1f,$60,$1f,$20,$0f,$30,$0f,$10,$0f,$10,$0f,$10,$07,$18,$07,$18 - db $f8,$0c,$fc,$05,$fc,$05,$fe,$03,$ff,$01,$ff,$00,$ff,$00,$ff,$00 - db $3f,$20,$3f,$60,$3f,$60,$6f,$70,$e3,$dc,$f2,$cf,$ff,$01,$ff,$00 - db $f0,$30,$08,$e8,$e6,$1e,$f1,$0f,$f8,$07,$7f,$80,$ff,$c0,$bf,$60 - db $52,$40,$20,$20,$20,$20,$20,$20,$e0,$e0,$1c,$fc,$db,$27,$fe,$01 - db $00,$60,$00,$20,$00,$30,$00,$30,$00,$18,$00,$08,$00,$0c,$00,$04 - db $07,$08,$07,$08,$07,$08,$03,$0c,$02,$0f,$01,$0d,$00,$0c,$00,$04 - db $ff,$00,$ff,$00,$ff,$00,$ff,$00,$7f,$80,$9f,$e0,$67,$78,$1d,$1e - db $df,$30,$cb,$3c,$e5,$1e,$f2,$0f,$f9,$07,$fc,$03,$ff,$00,$ff,$00 - db $ff,$00,$ff,$00,$ff,$00,$ff,$00,$7f,$80,$f7,$98,$77,$f8,$b7,$78 - db $80,$80,$40,$c0,$40,$c0,$c0,$40,$c0,$40,$c0,$40,$c0,$40,$c0,$40 - db $00,$06,$00,$02,$00,$03,$00,$01,$00,$01,$00,$03,$00,$06,$00,$04 - db $00,$04,$00,$00,$00,$80,$00,$80,$00,$c0,$00,$e0,$00,$18,$00,$04 - db $ff,$80,$6f,$70,$1f,$1c,$03,$03,$00,$00,$00,$00,$00,$01,$00,$06 - db $ff,$00,$ff,$00,$ff,$00,$ff,$80,$7f,$e0,$1f,$b0,$0f,$28,$07,$24 - db $c0,$40,$80,$c0,$80,$c0,$80,$c0,$80,$c0,$80,$c0,$80,$c0,$80,$c0 - db $00,$0c,$00,$08,$00,$18,$00,$10,$00,$31,$00,$22,$00,$24,$00,$38 - db $00,$1f,$00,$1f,$00,$60,$00,$80,$00,$00,$00,$00,$00,$00,$00,$00 - db $00,$00,$00,$ff,$00,$7f,$00,$01,$00,$01,$00,$01,$00,$01,$00,$00 - db $00,$78,$00,$90,$00,$10,$00,$10,$00,$10,$00,$08,$00,$88,$00,$88 - db $03,$12,$01,$11,$00,$08,$00,$08,$00,$04,$00,$07,$00,$00,$00,$00 - db $fe,$01,$ff,$00,$ff,$80,$7f,$c0,$3f,$b0,$0f,$9c,$0b,$0b,$10,$10 - db $80,$80,$60,$e0,$d0,$30,$e8,$1c,$fd,$07,$fe,$03,$ff,$00,$ff,$c0 - db $3c,$3c,$44,$44,$44,$44,$84,$84,$04,$84,$04,$84,$04,$84,$04,$84 - db $00,$c4,$00,$44,$00,$62,$00,$23,$00,$31,$00,$19,$00,$0f,$00,$00 - db $10,$10,$10,$10,$18,$18,$0c,$0c,$06,$06,$03,$03,$01,$01,$00,$00 - db $ff,$f0,$6f,$7c,$33,$37,$18,$1b,$0c,$0e,$04,$06,$86,$87,$fe,$ff - db $04,$0c,$04,$8c,$08,$88,$88,$98,$90,$d8,$f0,$fc,$00,$84,$00,$84 - db $b7,$78,$d7,$38,$f7,$18,$ff,$08,$ff,$08,$f7,$0c,$fb,$06,$fd,$03 - db $00,$00,$00,$00,$00,$00,$00,$1f,$00,$04,$00,$04,$00,$04,$00,$04 - db $00,$00,$00,$00,$00,$00,$00,$fc,$00,$90,$00,$90,$00,$90,$00,$90 - db $00,$04,$00,$04,$00,$04,$00,$04,$00,$04,$00,$1f,$00,$00,$00,$00 - db $00,$90,$00,$90,$00,$90,$00,$90,$00,$90,$00,$fc,$00,$00,$00,$00 + db $ff,$00,$ff,$00,$00,$00,$1f,$1f,$04,$0d,$04,$0d,$04,$0d,$04,$0d + db $ff,$00,$ff,$00,$00,$00,$fc,$fc,$90,$b0,$90,$b0,$90,$b0,$90,$b0 + db $04,$0d,$04,$0d,$04,$0d,$04,$0d,$04,$0d,$1f,$1f,$00,$00,$00,$00 + db $90,$b0,$90,$b0,$90,$b0,$90,$b0,$90,$b0,$fc,$fc,$00,$00,$00,$00 + db $00,$ff,$00,$ff,$00,$ff,$00,$f0,$07,$e7,$0f,$cf,$1f,$9f,$3f,$3f + db $00,$ff,$03,$fc,$0f,$c0,$07,$00,$f1,$f0,$fc,$fc,$fe,$fe,$ff,$bf + db $7f,$7f,$7f,$7f,$7f,$7f,$ff,$ff,$ff,$ff,$fe,$fe,$f0,$e0,$f0,$ee + db $ff,$df,$fe,$ee,$ff,$ff,$cf,$cf,$8f,$8f,$07,$07,$03,$03,$03,$3b + db $7a,$66,$10,$20,$51,$a0,$10,$a0,$0a,$b1,$85,$18,$c2,$0c,$00,$0f + db $ab,$33,$80,$02,$00,$82,$04,$02,$28,$c4,$d0,$0d,$21,$18,$00,$f8 + db $00,$00,$00,$00,$0f,$0f,$1f,$1f,$3a,$3c,$78,$71,$70,$60,$70,$68 + db $00,$00,$80,$80,$f0,$f0,$78,$f8,$3c,$3c,$3c,$bc,$1e,$1e,$0f,$8f + db $70,$60,$60,$74,$60,$70,$68,$70,$68,$72,$60,$78,$20,$38,$34,$39 + db $00,$00,$80,$80,$c0,$c0,$f0,$f0,$f8,$f8,$fc,$fc,$fe,$fe,$ff,$ff + db $30,$3c,$3a,$3c,$19,$3e,$1d,$3e,$0c,$3f,$0e,$3f,$06,$3f,$07,$1f + db $80,$80,$c0,$c0,$e0,$e0,$f0,$f0,$f8,$f8,$c0,$f8,$c0,$7c,$c0,$6f + db $03,$1f,$01,$1d,$00,$1c,$00,$0e,$00,$0e,$00,$0e,$00,$0e,$00,$0e + db $bc,$c0,$9e,$e1,$cf,$f0,$67,$78,$33,$3c,$19,$1e,$0e,$0f,$07,$07 + db $00,$c0,$00,$f0,$00,$38,$00,$0c,$00,$06,$80,$03,$00,$81,$00,$aa + db $00,$0e,$00,$07,$00,$07,$00,$07,$00,$07,$00,$07,$00,$03,$00,$03 + db $03,$03,$00,$00,$00,$00,$00,$00,$00,$00,$00,$80,$00,$80,$00,$80 + db $00,$60,$00,$60,$00,$60,$10,$70,$18,$f8,$fc,$fc,$fc,$fc,$fe,$fe + db $00,$03,$00,$01,$00,$00,$00,$00,$01,$00,$03,$00,$03,$00,$07,$00 + db $00,$c0,$00,$c0,$00,$e0,$00,$f0,$80,$78,$c0,$3c,$e0,$3f,$f8,$7f + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$e0 + db $00,$07,$00,$03,$00,$03,$00,$03,$00,$01,$00,$01,$00,$01,$00,$01 + db $fe,$fe,$fe,$fe,$fe,$fe,$fe,$fe,$fe,$fe,$7c,$fc,$7c,$fc,$b0,$f8 + db $fc,$ff,$fe,$ff,$fd,$fe,$fb,$fc,$ff,$f8,$f7,$f8,$ff,$f0,$df,$e0 + db $00,$fc,$00,$ff,$c0,$3f,$f8,$07,$ff,$0f,$ff,$0f,$ff,$0e,$ff,$04 + db $00,$01,$00,$80,$00,$f0,$00,$fc,$00,$ff,$e0,$1f,$fe,$1f,$ff,$1f + db $1f,$ff,$0f,$ff,$0f,$ff,$03,$7f,$01,$ff,$01,$fe,$0f,$f0,$ff,$80 + db $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$7f,$3f,$ff + db $a0,$f0,$d0,$f0,$d8,$f8,$dc,$fc,$ec,$fc,$ee,$fe,$f6,$fe,$f6,$fe + db $1f,$ff,$3f,$cf,$3f,$c7,$7f,$83,$7f,$81,$7f,$80,$ff,$80,$bf,$ff + db $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$bf,$df + db $fa,$fe,$fc,$fc,$fe,$fe,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff + db $bf,$4f,$df,$27,$df,$23,$bf,$c1,$ff,$80,$ff,$00,$ff,$00,$ff,$00 + db $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$7f,$ff,$3f,$ff,$1f + db $fe,$83,$fe,$87,$fe,$cf,$fe,$cf,$ff,$e7,$ff,$e3,$ff,$e3,$ff,$f1 + db $00,$7c,$00,$07,$00,$01,$00,$00,$c0,$00,$f0,$00,$00,$f8,$00,$fe + db $07,$06,$07,$07,$03,$83,$83,$03,$c3,$03,$c1,$21,$70,$80,$30,$c8 + db $06,$06,$04,$04,$cc,$0c,$d8,$28,$ff,$08,$ff,$08,$f8,$0f,$3f,$cf + db $cc,$ff,$fc,$ff,$70,$71,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 + db $00,$ff,$0e,$ff,$00,$ff,$00,$ff,$00,$3f,$00,$1f,$00,$0f,$00,$0f + db $03,$ff,$7f,$ff,$7f,$ff,$7f,$ff,$3f,$ff,$3f,$ff,$1f,$ff,$1f,$ff + db $07,$18,$07,$78,$88,$f0,$e0,$c0,$60,$e0,$30,$30,$1f,$5c,$07,$17 + db $f0,$0c,$23,$07,$23,$03,$03,$03,$03,$03,$01,$01,$87,$01,$01,$01 + db $01,$05,$00,$01,$00,$00,$00,$00,$18,$18,$1c,$1c,$0c,$0c,$0e,$0e + db $07,$07,$03,$83,$03,$03,$01,$01,$01,$01,$01,$01,$01,$00,$03,$00 + db $0f,$00,$fe,$01,$f9,$06,$e4,$18,$90,$60,$40,$80,$80,$00,$00,$c0 + db $9f,$9f,$87,$07,$03,$03,$01,$01,$01,$00,$01,$00,$01,$00,$01,$00 + db $d0,$67,$d0,$61,$d8,$60,$dc,$e0,$c7,$f8,$f9,$fe,$7e,$ff,$3f,$ff + db $00,$a5,$00,$b5,$00,$f5,$e0,$f5,$e0,$f5,$e0,$f7,$e3,$ff,$7f,$ff + db $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff + db $01,$00,$01,$00,$3f,$c0,$1f,$60,$07,$39,$01,$0f,$00,$03,$00,$00 + db $3f,$7f,$3f,$7f,$2f,$7f,$37,$7f,$3b,$ff,$fd,$ff,$fe,$ff,$ff,$ff + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$80,$00,$c0 + db $00,$00,$00,$00,$f3,$00,$ff,$00,$ff,$80,$ff,$e0,$ff,$ff,$1f,$1f + db $ff,$e3,$eb,$f5,$f3,$7d,$ff,$3f,$ff,$0f,$ff,$03,$ff,$00,$ff,$00 + db $ff,$0f,$ff,$07,$ff,$03,$ff,$01,$ff,$00,$0f,$00,$02,$00,$00,$00 + db $00,$00,$80,$01,$80,$01,$c0,$05,$40,$95,$00,$d5,$00,$d5,$00,$d7 + db $ff,$1f,$ff,$0f,$ff,$0f,$ff,$07,$ff,$07,$ff,$03,$ff,$03,$ff,$01 + db $ff,$f0,$ff,$f8,$ff,$f8,$ff,$7c,$ff,$7c,$ff,$3e,$ff,$1e,$ff,$0e + db $ff,$01,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00 + db $0f,$00,$0f,$00,$1f,$01,$1f,$01,$3f,$01,$3f,$03,$3f,$03,$3f,$07 + db $ff,$c0,$ff,$80,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00 + db $3f,$0f,$3f,$0f,$3f,$1f,$3f,$1e,$3f,$0c,$3f,$00,$3f,$00,$1f,$00 + db $e3,$e3,$3f,$3f,$07,$47,$00,$15,$00,$00,$00,$00,$00,$00,$00,$00 + db $02,$3f,$1c,$7f,$3f,$1f,$3f,$00,$bf,$80,$bf,$80,$bf,$80,$bf,$80 db $ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00 - db $eb,$03,$eb,$03,$fe,$06,$fc,$1f,$fe,$3f,$f8,$3f,$fc,$3f,$f1,$7e - db $f9,$7e,$71,$7e,$7b,$7c,$63,$7c,$73,$7c,$e7,$f8,$e4,$f8,$c4,$d0 - db $8c,$b1,$88,$b1,$88,$b1,$88,$b1,$88,$a1,$98,$a1,$98,$a1,$18,$21 - db $88,$f9,$00,$53,$31,$4f,$e1,$1f,$f3,$0f,$e3,$1a,$e7,$18,$e7,$18 - db $e7,$18,$c7,$30,$ce,$31,$cf,$30,$9c,$63,$0e,$f1,$08,$b7,$08,$b5 - db $08,$f5,$0b,$f4,$13,$68,$13,$68,$03,$68,$07,$68,$07,$78,$27,$d0 - db $e6,$fe,$e4,$f4,$c4,$f4,$c3,$f0,$ce,$b0,$c7,$38,$8e,$70,$c7,$38 - db $0f,$f1,$9f,$60,$0d,$f1,$1f,$e1,$39,$c7,$1d,$e3,$71,$8d,$79,$85 - db $00,$1e,$c0,$df,$c0,$fe,$80,$ff,$80,$fc,$00,$fe,$00,$ec,$60,$fe - db $e3,$1f,$d3,$2e,$c1,$3c,$81,$3c,$83,$3c,$82,$38,$82,$38,$82,$38 - db $78,$78,$70,$70,$fe,$f8,$fe,$f0,$fe,$f8,$fe,$e0,$fe,$f0,$fc,$e0 - db $fc,$f0,$fc,$c0,$fc,$e0,$f8,$81,$f8,$c1,$f0,$83,$f0,$c3,$e0,$07 - db $80,$0e,$80,$0e,$00,$1c,$00,$1c,$00,$3c,$00,$38,$00,$20,$00,$40 - db $f0,$ff,$e3,$fc,$f1,$fe,$c3,$f8,$e6,$f8,$04,$60,$05,$c1,$2d,$c1 - db $01,$1f,$00,$3e,$03,$3e,$01,$3e,$03,$3e,$01,$7e,$03,$78,$03,$70 - db $e0,$0c,$c1,$0d,$83,$0f,$87,$1f,$67,$7f,$c7,$f7,$ce,$fe,$c8,$f8 - db $00,$00,$00,$00,$00,$00,$00,$00,$01,$01,$00,$0f,$01,$0f,$00,$1f - db $00,$c0,$00,$00,$0c,$0c,$1c,$1f,$38,$3f,$3c,$3f,$70,$7f,$79,$7e - db $00,$00,$00,$00,$00,$00,$00,$80,$00,$80,$00,$00,$00,$00,$00,$00 - db $00,$40,$00,$40,$00,$80,$00,$80,$00,$00,$00,$00,$00,$00,$00,$00 - db $81,$83,$01,$01,$00,$00,$00,$80,$00,$c0,$00,$c0,$00,$40,$00,$c0 - db $00,$00,$00,$03,$00,$07,$00,$0e,$00,$18,$00,$0a,$00,$02,$00,$07 - db $00,$0f,$00,$0f,$00,$0f,$00,$0b,$00,$07,$00,$07,$00,$07,$00,$07 - db $00,$07,$00,$0e,$00,$0f,$00,$0c,$00,$01,$00,$01,$00,$00,$00,$00 - db $00,$39,$00,$ff,$00,$37,$00,$00,$00,$12,$00,$00,$00,$00,$00,$00 - db $00,$94,$00,$fc,$00,$ee,$00,$f6,$00,$7e,$00,$7e,$00,$1c,$00,$1c - db $00,$0c,$00,$04,$00,$e6,$00,$ff,$00,$f7,$00,$1f,$00,$07,$00,$1e - db $00,$fc,$00,$f8,$00,$fc,$6e,$ff,$f8,$ff,$18,$98,$f0,$f0,$e0,$f0 - db $ff,$ff,$e6,$ff,$ed,$ff,$68,$ff,$60,$ff,$48,$fe,$50,$fe,$54,$fe - db $00,$06,$00,$07,$00,$01,$00,$e1,$00,$c0,$00,$c0,$00,$f0,$00,$d8 - db $00,$00,$00,$00,$00,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 - db $00,$84,$00,$fc,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 + db $0f,$00,$07,$00,$03,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 + db $ff,$00,$ff,$00,$ff,$00,$ff,$00,$7f,$00,$0f,$00,$03,$00,$00,$00 + db $1f,$00,$03,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 + db $ff,$00,$c1,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 + db $ff,$00,$ff,$00,$3f,$00,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00 + db $00,$80,$03,$03,$00,$80,$00,$50,$00,$fc,$60,$fe,$60,$ff,$70,$ff + db $00,$01,$00,$01,$00,$03,$00,$10,$00,$40,$00,$7c,$00,$f6,$00,$ff + db $00,$00,$00,$80,$00,$c0,$00,$00,$00,$00,$00,$40,$00,$7c,$00,$98 + db $00,$02,$00,$1c,$00,$00,$00,$c0,$00,$e0,$00,$3c,$00,$3c,$00,$1e + db $73,$ff,$7f,$ff,$3e,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff + db $80,$ff,$f8,$f9,$7f,$ff,$3f,$ff,$3c,$ff,$1d,$ff,$1d,$ff,$1c,$ff + db $00,$f8,$00,$fe,$e0,$fb,$f0,$f6,$d8,$ff,$bf,$ff,$0f,$ff,$0f,$ff + db $00,$00,$00,$00,$01,$01,$01,$fd,$83,$ff,$c2,$ff,$0e,$ff,$fc,$ff + db $f9,$1f,$fa,$1f,$fa,$1f,$fa,$1f,$fa,$1f,$f0,$1f,$72,$1f,$72,$1f + db $7f,$8d,$7f,$80,$ff,$80,$ff,$80,$ff,$80,$ff,$80,$ff,$80,$7f,$80 + db $ff,$e0,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00 + db $3f,$c0,$1f,$e0,$ff,$c0,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00 + db $00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff + db $00,$ff,$0f,$f0,$06,$f8,$00,$fe,$00,$fe,$00,$fe,$02,$fc,$06,$f8 + db $02,$fc,$00,$fe,$00,$ff,$00,$ff,$e0,$1f,$ff,$00,$00,$00,$00,$00 + db $3f,$00,$7f,$00,$01,$7e,$00,$ff,$00,$ff,$00,$ff,$80,$7f,$ff,$00 + db $ff,$00,$ff,$00,$ff,$00,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$fe,$01 + db $ff,$00,$ff,$00,$ff,$00,$07,$f8,$00,$ff,$00,$ff,$00,$ff,$00,$ff + db $00,$ff,$00,$1f,$00,$3f,$00,$ff,$00,$ff,$00,$7f,$00,$03,$00,$00 + db $ff,$00,$ff,$00,$ff,$00,$ff,$00,$03,$fc,$00,$ff,$00,$ff,$00,$ff + db $ff,$00,$ff,$00,$ff,$00,$ff,$00,$00,$ff,$00,$ff,$00,$ff,$00,$ff + db $bf,$ff,$df,$ff,$ef,$ff,$f7,$ff,$f9,$ff,$fe,$ff,$ff,$ff,$ff,$ff + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$ff,$00,$ff,$00,$ff EmpressTilesEnd: diff --git a/04TheEmperor.inc b/04TheEmperor.inc index 314582a..972e6ea 100644 --- a/04TheEmperor.inc +++ b/04TheEmperor.inc @@ -13,6 +13,7 @@ TheEmperor: dw .fInit dw .fUpdate dw .fDraw + dw .fPrintPrep .fInit: ld hl, CVS @@ -316,6 +317,7 @@ TheEmperor: db $00, $00 db $00, $00 .fDraw: ret +.fPrintPrep: ret .SpriteTiles: db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 db $03,$00,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 diff --git a/05TheHierophant.inc b/05TheHierophant.inc index c73bd17..a551705 100644 --- a/05TheHierophant.inc +++ b/05TheHierophant.inc @@ -15,6 +15,7 @@ TheHierophant: dw .fInit dw .fUpdate dw .fDraw + dw .fPrintPrep .fInit: ld hl, CVS @@ -77,6 +78,7 @@ TheHierophant: .fDraw: ret +.fPrintPrep: ret .halo ; 5 tall 7 wide sprites db $00, $01, $02, $0d, $03, $04, $00 diff --git a/06TheLovers.inc b/06TheLovers.inc index 5217c5a..ca94b42 100644 --- a/06TheLovers.inc +++ b/06TheLovers.inc @@ -13,6 +13,7 @@ TheLovers: dw .fInit dw .fUpdate dw .fDraw + dw .fPrintPrep .fInit: ld hl, CVS @@ -45,6 +46,7 @@ TheLovers: call .doRipples ret .fDraw: ret +.fPrintPrep: ret .doRipples: ld a, [CVS+2] diff --git a/07TheChariot.inc b/07TheChariot.inc index 760135f..405c3a6 100644 --- a/07TheChariot.inc +++ b/07TheChariot.inc @@ -13,6 +13,7 @@ TheChariot: dw .fInit dw .fUpdate dw .fDraw + dw .fPrintPrep .fInit: ld a, %00100100 @@ -130,6 +131,7 @@ TheChariot: .fDraw: ret +.fPrintPrep: ret .horse1 ;; 8 by 4 db $01, $02, $03, $04 db $00, $10, $11, $12 diff --git a/08Strength.inc b/08Strength.inc index 2e92478..9a4b2ee 100644 --- a/08Strength.inc +++ b/08Strength.inc @@ -13,6 +13,7 @@ Strength: dw .fInit dw .fUpdate dw .fDraw + dw .fPrintPrep .fInit: ld hl, CVS @@ -118,6 +119,7 @@ Strength: ret .fDraw: ret +.fPrintPrep: ret .cloud1 db $09, $05, $06 diff --git a/09TheHermit.inc b/09TheHermit.inc index 3363719..c568f70 100644 --- a/09TheHermit.inc +++ b/09TheHermit.inc @@ -13,10 +13,12 @@ TheHermit: dw .fInit dw .fUpdate dw .fDraw + dw .fPrintPrep .fInit: ret .fUpdate: ret .fDraw: ret +.fPrintPrep: ret .SpriteTiles: .SpriteTilesEnd: ; original export script by gabriel reis, modified by shoofle diff --git a/10WheelOfFortune.inc b/10WheelOfFortune.inc index a8dc88a..9c94553 100644 --- a/10WheelOfFortune.inc +++ b/10WheelOfFortune.inc @@ -13,6 +13,7 @@ WheelOfFortune: dw .fInit dw .fUpdate dw .fDraw + dw .fPrintPrep .fInit: ld hl, CVS @@ -36,7 +37,25 @@ WheelOfFortune: ; final row ld [hl+], a ; CVS+12 ld [hl+], a ; CVS+13 + + ; setting up the positioins of all the sprites now that w'ere drawing with + ; sprites and not background tiles + ld hl, .numbersBlockSprite + ld de, MY_OAM + ld b, 24 + 6*8 + ld c, 16 + 2*8 + ld a, $44 + call BuildMetaSprite + ; location of source tile map: hl + ; location in memory to write to: de + ; y and x in b and c + ; height and width in a & %11110000 and a & %00001111 ??? that's deranged ret +.numbersBlockSprite + db $90, $00, $00, $90 + db $00, $00, $00, $00 + db $00, $00, $00, $00 + db $90, $00, $00, $90 .fUpdate: ld hl, CVS @@ -44,136 +63,91 @@ WheelOfFortune: ld a, [CVS+1] ; checking the high byte of the timer cp a, $04 ; $10 = 1 second, $02 = 1/8 of a second - jp c, :+ ; if the timer is less than $0600, skip - - ; if the timer is greater or equal to $0600, reset it - ld a, 0 - ld [CVS], a - ld [CVS+1], a - call .updateNumbers -: + jp c, :+ ; if the timer is less than $0400, skip + ; if the timer is greater or equal to $0400, reset it and update numbers + ld a, 0 + ld [CVS], a + ld [CVS+1], a + call .updateNumbers + : ret .updateNumbers: call OneRandomByte ld hl, rLFSR ld de, CVS+2 - call .WriteByte + call DrawByte call OneRandomByte ld hl, rLFSR ld de, CVS+4 - call .WriteByte + call DrawByte call OneRandomByte ld hl, rLFSR ld de, CVS+6 - call .WriteByte + call DrawByte call OneRandomByte ld hl, rLFSR ld de, CVS+8 - call .WriteByte + call DrawByte call OneRandomByte ld hl, rLFSR ld de, CVS+10 - call .WriteByte + call DrawByte call OneRandomByte ld hl, rLFSR ld de, CVS+12 - call .WriteByte - - ret -.fDraw: - ld hl, CVS+2 - ld de, _SCRN0 + 3+1 + 7*32 - ld a, [hl+] - ld [de], a - inc de - ld a, [hl+] - ld [de], a ; first two tiles + call DrawByte - ld de, _SCRN0 + 3+0 + 8*32 - ld a, [hl+] - ld [de], a - inc de - ld a, [hl+] - ld [de], a - inc de - ld a, [hl+] - ld [de], a - inc de - ld a, [hl+] - ld [de], a ; second row, four tles + ; draw those into sprites + ld a, [CVS+2] + ld hl, MY_OAM + 2 + 1*4 + ld [hl], a + ld a, [CVS+3] + ld hl, MY_OAM + 2 + 2*4 + ld [hl], a - ld de, _SCRN0 + 3+0 + 9*32 - ld a, [hl+] - ld [de], a - inc de - ld a, [hl+] - ld [de], a - inc de - ld a, [hl+] - ld [de], a - inc de - ld a, [hl+] - ld [de], a ; third row, four tiles + ld a, [CVS+4] + ld hl, MY_OAM + 2 + 4*4 + ld [hl], a + ld a, [CVS+5] + ld hl, MY_OAM + 2 + 5*4 + ld [hl], a + ld a, [CVS+6] + ld hl, MY_OAM + 2 + 6*4 + ld [hl], a + ld a, [CVS+7] + ld hl, MY_OAM + 2 + 7*4 + ld [hl], a - ld de, _SCRN0 + 3+1 + 10*32 - ld a, [hl+] - ld [de], a - inc de - ld a, [hl+] - ld [de], a ; final two tiles + ld a, [CVS+8] + ld hl, MY_OAM + 2 + 8*4 + ld [hl], a + ld a, [CVS+9] + ld hl, MY_OAM + 2 + 9*4 + ld [hl], a + ld a, [CVS+10] + ld hl, MY_OAM + 2 + 10*4 + ld [hl], a + ld a, [CVS+11] + ld hl, MY_OAM + 2 + 11*4 + ld [hl], a - ret - -.WriteByte: ; accepts [hl] as the number to write, de as location to write tile IDs to -; writes tile IDs for one byte (two nibbles) from [hl] into [de] - ld b, 0 - - push hl - ld a, [hl] - swap a - and a, $0F - ld c, a - ld hl, .lowerHex - add hl, bc - ld a, [hl] - ld [de], a - inc de - - pop hl - ld a, [hl] - and a, $0F - ld c, a - ld hl, .lowerHex - add hl, bc - ld a, [hl] - ld [de], a + ld a, [CVS+12] + ld hl, MY_OAM + 2 + 13*4 + ld [hl], a + ld a, [CVS+13] + ld hl, MY_OAM + 2 + 14*4 + ld [hl], a ret - -.hex ; tile IDs for hex values. this can live elsewhere alongside WriteByte - ; 0, 1, 2, 3, - db $a0, $a1, $a2, $a3 - ; 4, 5, 6, 7, - db $a4, $a5, $a6, $a7 - ; 8, 9 - db $a8, $a9 - ; a, b, c, d, e, f - db $b1, $b2, $b3, $b4, $b5, $b6 -.lowerHex ; tile IDs for hex values. this can live elsewhere alongside WriteByte - ; 0, 1, 2, 3, - db $a0, $a1, $a2, $a3 - ; 4, 5, 6, 7, - db $a4, $a5, $a6, $a7 - ; 8, 9 - db $a8, $a9 - ; a, b, c, d, e, f - db $d1, $d2, $d3, $d4, $d5, $d6 +.fDraw: ret +.fPrintPrep: ret .SpriteTiles: + db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 .SpriteTilesEnd: ; original export script by gabriel reis, modified by shoofle @@ -276,10 +250,10 @@ WheelOfFortune: db $55, $55, $55, $5b, $61, $62, $55, $55 db $56, $4c, $20, $21, $22, $23, $4d, $56 db $1f, $25, $26, $27, $28, $29, $2a, $24 - db $2b, $2c, $2d, $2e, $2e, $2f, $30, $31 - db $32, $33, $2e, $2e, $2e, $2e, $34, $35 - db $36, $37, $2e, $2e, $2e, $2e, $38, $39 - db $3a, $3b, $3c, $2e, $2e, $3d, $3e, $3f + db $2b, $2c, $2d, $1a, $1a, $2f, $30, $31 + db $32, $33, $1a, $1a, $1a, $1a, $34, $35 + db $36, $37, $1a, $1a, $1a, $1a, $38, $39 + db $3a, $3b, $3c, $1a, $1a, $3d, $3e, $3f db $4e, $41, $42, $43, $44, $45, $46, $4f db $50, $40, $48, $49, $4a, $4b, $47, $51 db $6f, $63, $64, $57, $57, $66, $67, $6f diff --git a/11Justice.inc b/11Justice.inc index ac18df7..83f5d95 100644 --- a/11Justice.inc +++ b/11Justice.inc @@ -13,6 +13,7 @@ Justice: dw .fInit dw .fUpdate dw .fDraw + dw .fPrintPrep .fInit: ld hl, CVS @@ -45,6 +46,7 @@ Justice: : ret .fDraw: ret +.fPrintPrep: ret .swing: ld b, 6 diff --git a/12TheHangedMan.inc b/12TheHangedMan.inc index 40e4dfe..ebc6784 100644 --- a/12TheHangedMan.inc +++ b/12TheHangedMan.inc @@ -13,6 +13,7 @@ TheHangedMan: dw .fInit dw .fUpdate dw .fDraw + dw .fPrintPrep .fInit: ld hl, CVS @@ -47,6 +48,7 @@ TheHangedMan: : ret .fDraw: ret +.fPrintPrep: ret .swing: ld a, [CVS+2] diff --git a/13Death.inc b/13Death.inc index 18c21d7..14df3f3 100644 --- a/13Death.inc +++ b/13Death.inc @@ -13,6 +13,7 @@ Death: dw .fInit dw .fUpdate dw .fDraw + dw .fPrintPrep .fInit: ld hl, CVS @@ -123,6 +124,7 @@ Death: : ret .fDraw: ret +.fPrintPrep: ret .blink: ld a, 2 diff --git a/14Temperance.inc b/14Temperance.inc index dbd05c4..9bb5654 100644 --- a/14Temperance.inc +++ b/14Temperance.inc @@ -13,6 +13,7 @@ Temperance: dw .fInit dw .fUpdate dw .fDraw + dw .fPrintPrep .fInit: ld hl, CVS @@ -28,20 +29,20 @@ Temperance: ld a, [CVS+1] ; checking the high byte of the timer cp a, $01 ; $10 = 1 second, $02 = 1/8 of a second jp c, :+ + + ld a, 0 + ld [CVS], a + ld [CVS+1], a - ld a, 0 - ld [CVS], a - ld [CVS+1], a - - ld b, 6 - ld a, [CVS+2] - inc a - call ArrayClampLoopingB - ld [CVS+2], a - - call .waterfall - -: + ld b, 6 + ld a, [CVS+2] + inc a + call ArrayClampLoopingB + ld [CVS+2], a + + call .waterfall + + : ret .fDraw: @@ -54,18 +55,18 @@ Temperance: cp a, 2 jp z, .frame2 -.frame0 - ld a, %10_01_00_00 - ld [rOBP0], a - ret -.frame1 - ld a, %01_00_10_00 - ld [rOBP0], a - ret -.frame2 - ld a, %00_10_01_00 - ld [rOBP0], a - ret + .frame0 + ld a, %10_01_00_00 + ld [rOBP0], a + ret + .frame1 + ld a, %01_00_10_00 + ld [rOBP0], a + ret + .frame2 + ld a, %00_10_01_00 + ld [rOBP0], a + ret .waterfall: ld hl, .waterfall1 @@ -81,6 +82,8 @@ Temperance: call BuildMetaSprite ret +.fPrintPrep: ret + .waterfall1 db $00, $00, $0f db $13, $12, $11 diff --git a/15TheDevil.inc b/15TheDevil.inc index ed631bc..789acae 100644 --- a/15TheDevil.inc +++ b/15TheDevil.inc @@ -13,10 +13,12 @@ TheDevil: dw .fInit dw .fUpdate dw .fDraw + dw .fPrintPrep .fInit: ret .fUpdate: ret .fDraw: ret +.fPrintPrep: ret .SpriteTiles: .SpriteTilesEnd: ; original export script by gabriel reis, modified by shoofle diff --git a/16TheTower.inc b/16TheTower.inc index 5bb2bff..98b6ca8 100644 --- a/16TheTower.inc +++ b/16TheTower.inc @@ -13,6 +13,7 @@ TheTower: dw .fInit dw .fUpdate dw .fDraw + dw .fPrintPrep .fInit: ld hl, CVS @@ -180,7 +181,10 @@ TheTower: ld a, %00_01_10_00 ld [rOBP1], a ret - +.fPrintPrep: + ld a, 1 + ld [CVS+2], a + ret .bolt: ; $55, 18 active sprites diff --git a/17TheStar.inc b/17TheStar.inc index 23a7a65..92361fb 100644 --- a/17TheStar.inc +++ b/17TheStar.inc @@ -13,6 +13,7 @@ TheStar: dw .fInit dw .fUpdate dw .fDraw + dw .fPrintPrep .fInit: ld hl, CVS @@ -169,11 +170,9 @@ TheStar: call ArrayClampLoopingB ld [CVS+5], a : - call .flicker ret .flicker: - ret .fDraw: ld a, [CVS+2] @@ -203,6 +202,8 @@ TheStar: ld [rOBP0], a ret +.fPrintPrep: ret + .starflare db $09, $0a, $0b, $0c db $07, $08, $0d, $04 diff --git a/18TheMoon.inc b/18TheMoon.inc index c96d106..6c9a44e 100644 --- a/18TheMoon.inc +++ b/18TheMoon.inc @@ -13,6 +13,7 @@ TheMoon: dw .fInit dw .fUpdate dw .fDraw + dw .fPrintPrep .fInit: ld hl, CVS @@ -136,7 +137,7 @@ TheMoon: ret .fDraw: ret - +.fPrintPrep: ret .cloud1 db $17 diff --git a/19TheSun.inc b/19TheSun.inc index 316cc11..6a41e4e 100644 --- a/19TheSun.inc +++ b/19TheSun.inc @@ -13,6 +13,7 @@ TheSun: dw .fInit dw .fUpdate dw .fDraw + dw .fPrintPrep .fInit: ld hl, CVS @@ -66,7 +67,7 @@ TheSun: ret .fDraw: ret - +.fPrintPrep: ret .frame1 ; $48 db $66, $66, $02, $21, $53, $12, $22, $66 db $03, $00, $3b, $3c, $3d, $3e, $18, $14 diff --git a/20Judgement.inc b/20Judgement.inc index 9b0c8c6..fa9f40f 100644 --- a/20Judgement.inc +++ b/20Judgement.inc @@ -13,6 +13,7 @@ Judgement: dw .fInit dw .fUpdate dw .fDraw + dw .fPrintPrep .fInit: ld hl, CVS @@ -174,7 +175,7 @@ Judgement: ret .fDraw: ret - +.fPrintPrep: ret .drawSpark: ; hl should point to a curve animation ; d should be the offset into the tile IDs for the sprite animation? diff --git a/21TheWorld.inc b/21TheWorld.inc index 418dbc1..26ef495 100644 --- a/21TheWorld.inc +++ b/21TheWorld.inc @@ -21,6 +21,7 @@ TheWorld: dw .fInit dw .fUpdate dw .fDraw + dw .fPrintPrep .fInit: ld hl, CVS @@ -459,8 +460,6 @@ TheWorld: dw .stripes + 78 db 70 dw .stripes + 84 - db 75 - dw .stripes + 90 db 255 .stripes @@ -479,7 +478,10 @@ db $22, $23, $2b, $27, $29, $30 db $34, $37, $00, $28, $2a, $31 db $35, $38, $00, $00, $39, $00 db $36, $00, $00, $00, $00, $00 + .fDraw: ret +.fPrintPrep: ret + .SpriteTiles: db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 db $00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff,$00,$ff diff --git a/Async.inc b/Async.inc index 65ec4a3..f605dcd 100644 --- a/Async.inc +++ b/Async.inc @@ -17,7 +17,7 @@ def ASYNC_STACK_TOP equ $ffc0 def ASYNC_THREAD_CALL equ ASYNC_STACK_TOP - 2 - 2 ; timing for async execution, in scanlines -def SAFE_ASYNC_START EQU 146 +def SAFE_ASYNC_START EQU 145 def SAFE_ASYNC_END EQU 0 Async_Spawn_HL: @@ -158,59 +158,50 @@ Async_Spawn: pop af reti - -Async_Kill: - ld hl, EndOfInstructions - call Async_Spawn_HL - ret -Async_EnterThread: +Async_EnterThread: ;stack looks like: ;c113 (SMC int @ LYC 90 pc), 004b (hw int @ LYC 90 pc), outer context pc + ; 16 cycles push af push bc push de - push hl - - ; check if there's anything queued up for executing; if no, just clean up - ld a, LOW(ASYNC_STACK_TOP) ; we're checkng if the current async stack is empty - ld hl, vAsyncThreadSP ; comparing to the current thread sp - cp a, [hl] ; are they equal? - jp z, Async_CleanUpThread + push hl ;af, de, bc, hl, c113 (SMC interrupt pc), 004b (hardwired interrput pc), outer context pc - ld a, LOW(Async_ExitThread) - ld [INTERRUPT_LCD], a - ld a, HIGH(Async_ExitThread) + ; 18 cycles + ld a, LOW(Async_ExitThread) + ld [INTERRUPT_LCD], a + ld a, HIGH(Async_ExitThread) ld [INTERRUPT_LCD+1], a - ld a, SAFE_ASYNC_END ; CHANGE ME TO ADJUST SAFE TRANSFER TIMING - ld [rLYC], a ; set lcd interrupt handler to EXIT SAFE MODE on line 153 + ld a, SAFE_ASYNC_END ; CHANGE ME TO ADJUST SAFE TRANSFER TIMING + ld [rLYC], a ; set lcd interrupt handler to EXIT SAFE MODE on line 153 + ; 5 cycles ; save main thread stack pointer - ld hl, sp+0 - ld a, l - ld [vAsyncMainSP], a - ld a, h - ld [vAsyncMainSP+1], a - + ld [vAsyncMainSP], sp + + ; 12 cycless ; load side thread stack pointer - ld a, [vAsyncThreadSP] - ld l, a - ld a, [vAsyncThreadSP+1] - ld h, a - ld sp, hl + ld a, [vAsyncThreadSP] ; 4 + ld l, a ; 1 + ld a, [vAsyncThreadSP+1] ; 4 + ld h, a ; 1 + ld sp, hl ; 2 + ; 12 cycles ; pop registers ; canonical ordering to push should be: AF, BC, DE, HL, ; pop is HL, DE, BC, AF - pop hl - pop de + pop hl + pop de pop bc - pop af + pop af - reti ; "return" to the vAsyncPC wee put on the stack previously. + ; 4 cycles + reti ; "return" to the vAsyncPC wee put on the stack previously. ; 4 ; this is more or less a jump, not a return. ; is that the source of our problems? ; after this instruction executes, stack looks like: @@ -224,8 +215,6 @@ Async_ExitThread: push de push hl - ;af, de, bc, hl, c113 (SMC interrupt pc), 004b (hardwired interrput pc), thread pc, return - ld a, LOW(Async_EnterThread) ld [INTERRUPT_LCD], a ld a, HIGH(Async_EnterThread) @@ -234,11 +223,7 @@ Async_ExitThread: ld [rLYC], a ; set lcd interrupt handler to EXIT SAFE MODE on line 153 ; save side thread stack pointer - ld hl, sp+0 - ld a, l - ld [vAsyncThreadSP], a - ld a, h - ld [vAsyncThreadSP+1], a + ld [vAsyncThreadSP], sp ; load main thread stack pointer ld a, [vAsyncMainSP] @@ -263,12 +248,8 @@ Async_EarlyReturn: ; don't care about current registers bc we're done executing. ; store side thread SP, so everyone knows that the side thread stack is empty - ld hl, sp+0 - ld a, l - ld [vAsyncThreadSP], a - ld a, h - ld [vAsyncThreadSP+1], a - + ld [vAsyncThreadSP], sp ; 5 cycles instead of 13 + ; unset next call ld hl, rIE res 1, [hl] ; disable stat interrupt @@ -289,15 +270,3 @@ Async_EarlyReturn: pop hl reti - - - -Async_CleanUpThread: - ;stack looks like: - ;hl, de, bc, af, c113 (SMC int @ LYC 90 pc), 004b (hw int @ LYC 90 pc), outer context pc - pop hl - pop de - pop bc - pop af - - reti \ No newline at end of file diff --git a/Audio.inc b/Audio.inc index 8e9e866..2520d70 100644 --- a/Audio.inc +++ b/Audio.inc @@ -579,7 +579,7 @@ ChangeLoadedWave: ld c, a add hl, bc ; hl shoulld now ponit to the appropriate wave ld de, _AUD3WAVERAM - ld bc, 16 / 8 ; using by8s for unnecessary optimization, so divide length by 8 + ld bc, 16 call CopyRangeBy8s pop af diff --git a/CardHelpers.inc b/CardHelpers.inc index 7ad46e5..be99816 100644 --- a/CardHelpers.inc +++ b/CardHelpers.inc @@ -85,6 +85,10 @@ LoadCardDataAsync: ld [hl], c inc hl ld [hl], b + ld hl, CARD_PRINT_PREP + ld [hl], c + inc hl + ld [hl], b ei ld a, [vSelectedCardIndex] @@ -117,15 +121,15 @@ LoadCardDataAsync: ; so when we're done writing one, hl will be correctly placed to read the next ; length-prefixed print doesn't require passing a length ; so all we have to set is the destination for each - ld de, $9800 + 32*11 + 10 + ld de, _SCRN0 + 32*11 + 10 call PrintString - ld de, $9800 + 32*12 + 10 + ld de, _SCRN0 + 32*12 + 10 call PrintString - ld de, $9800 + 32*14 + 10 + ld de, _SCRN0 + 32*14 + 10 call PrintString - ld de, $9800 + 32*15 + 10 + ld de, _SCRN0 + 32*15 + 10 call PrintString - ld de, $9800 + 32*16 + 10 + ld de, _SCRN0 + 32*16 + 10 call PrintString ; hl now contains the address after all the strings. @@ -141,7 +145,7 @@ LoadCardDataAsync: ld h, d ld l, e ; source - ld de, $9800 + 32 + 1 ; destination + ld de, _SCRN0 + 32 + 1 ; destination ld b, 16 ; height ld c, 8 ; width @@ -152,11 +156,10 @@ LoadCardDataAsync: ld a, [cvCardAddress + 1] ld h, a ; hl now contains the address of the card data. - ld b, 0 - ld c, Card_Offset_functions ; jump straight to function handles + ld bc, Card_Offset_functions ; jump straight to function handles add hl, bc ; hl now points to the card functions - di ; make sure we never call card_update and card_draw without them being fully set + di ; make sure we never call any callbacks without them being fully set nop ld a, [hl+] ld [CARD_INIT], a @@ -170,6 +173,10 @@ LoadCardDataAsync: ld [CARD_DRAW], a ld a, [hl+] ld [CARD_DRAW+1], a + ld a, [hl+] + ld [CARD_PRINT_PREP], a + ld a, [hl+] + ld [CARD_PRINT_PREP+1], a ei call CardInit @@ -180,8 +187,7 @@ LoadCardDataAsync: ld a, [cvCardAddress + 1] ld h, a ; hl now contains the address of the card data. - ld b, 0 - ld c, Card_Offset_keytiles ; jump straight to keytiles length and location! + ld bc, Card_Offset_keytiles ; jump straight to keytiles length and location! add hl, bc ld a, [hl+] @@ -196,8 +202,8 @@ LoadCardDataAsync: ld h, d ld l, e ; hl takes the source - ld de, $9000 + VARIABLE_TILES_START*$10 ; always load tile data into the same spot in vram - call CopyRange + ld de, _VRAM + $1000 + VARIABLE_TILES_START*$10 ; always load tile data into the same spot in vram + call CopyRangeBy8s ld a, [cvCardAddress] @@ -205,8 +211,7 @@ LoadCardDataAsync: ld a, [cvCardAddress + 1] ld h, a ; hl now contains the address of the card data. - ld b, 0 - ld c, Card_Offset_spritetiles ; jump straight to sprite tiles length and location! + ld bc, Card_Offset_spritetiles ; jump straight to sprite tiles length and location! add hl, bc ld a, [hl+] @@ -221,8 +226,8 @@ LoadCardDataAsync: ld h, d ld l, e ; hl takes the source - ld de, $8000 ; sprite tiles get loaded into the bottom of vram - call CopyRange + ld de, _VRAM ; sprite tiles get loaded into the bottom of vram + call CopyRangeBy8s ret @@ -245,17 +250,15 @@ CardInit: ret CardUpdate: - di - nop call CARD_UPDATE - 1 - ei ret CardDraw: - di - nop call CARD_DRAW - 1 - ei + ret + +CardPrintPrep: + call CARD_PRINT_PREP - 1 ret @@ -308,24 +311,24 @@ CleanUpOutsideSprites: ld a, 17 ; sprites are visible if y value >= 17 cp a, [hl] jp c, :+ ; skip if 17-y < 0 - ld [hl], 0 -: + ld [hl], 0 + : ld a, 152 ; sprites are visible if y value is < 152 cp a, [hl] jp nc, :+ ; skip if 152 - y < 0 - ld [hl], 0 -: + ld [hl], 0 + : inc hl ; look at x value ld a, 8 ; sprites are visible if y value >= 8 cp a, [hl] jp c, :+ ; skip if 8-y <= 0 - ld [hl], 0 -: + ld [hl], 0 + : ld a, 80 ; sprites are visible if x value < 80 cp a, [hl] jp nc, :+ - ld [hl], 0 -: + ld [hl], 0 + : inc hl ; now pointing at tile ID inc hl ; now pointing at attributes inc hl ; now pointing at next OAM y value diff --git a/CopyRange.inc b/CopyRange.inc index b855437..995e4ce 100644 --- a/CopyRange.inc +++ b/CopyRange.inc @@ -1,5 +1,4 @@ CopyRange: -CopyRangeUnsafe: ; hl is source ; de is destination ; bc is length to copy @@ -13,46 +12,35 @@ CopyRangeUnsafe: dec bc ld a, b or a, c ; check if bc is zero - jp nz, .loop + jr nz, .loop ret - -CopyRangeBy8s: -CopyRangeUnsafeBy8s: + +CopyRangeBy8s: ; hl is source ; de is destination - ; bc is 1/8 of length to copy!!! - ; so like this will copy 8*bc bytes! + ; bc is length to copy ld a, b or a, c ret z .loop - ld a, [hl+] - ld [de], a - inc de - ld a, [hl+] - ld [de], a - inc de - ld a, [hl+] - ld [de], a - inc de - ld a, [hl+] - ld [de], a - inc de - ld a, [hl+] - ld [de], a - inc de - ld a, [hl+] - ld [de], a - inc de - ld a, [hl+] - ld [de], a - inc de - ld a, [hl+] - ld [de], a - inc de - dec bc + rept 8 + ld a, [hl+] + ld [de], a + inc de + dec bc + endr ld a, b or a, c ; check if bc is zero - jp nz, .loop - ret \ No newline at end of file + jr nz, .loop + + ret + +CopyOneTileData: + di + rept 16 + ld a, [hl+] + ld [de], a + inc de + endr + reti \ No newline at end of file diff --git a/CopyTiles.inc b/CopyTiles.inc index 6d80a1a..77c72e4 100644 --- a/CopyTiles.inc +++ b/CopyTiles.inc @@ -1,5 +1,4 @@ CopyTilesToMap: -CopyTilesToMapUnsafe: ; copy tiles from where they are linearly packed at an origin (hl) ; to a rectangle in the tilemap in vram (de) ; assuming it has height in b and width in c. @@ -8,35 +7,25 @@ CopyTilesToMapUnsafe: ret z push bc .copyTile - ld a, [hl] ; load from the tile map into a + ld a, [hl+] ; load from the tile map into a ld [de], a ; load from a into the destination - inc hl ; this is slower than using hli but i'm trying to work with this here inc de dec c - ; check if we've completed a line? - ld a, 0 - or a, c ; check if c is zero, if it's not zero go back and copy more bytes - jp nz, .copyTile + jr nz, .copyTile ; if there's lines left to copy, jump back and redo .doneWithLine pop bc - ld a, e - add a, 32 - ld e, a - ld a, d + ; this adds 32-c to de + ld a, 32 + sub a, c ; first calculate 32-c + add a, e + ld e, a + ld a, d adc a, 0 - ld d, a - ld a, e - sub a, c - ld e, a - ld a, d - sbc a, 0 - ld d, a + ld d, a dec b - ld a, b - cp a, 0 - jp nz, CopyTilesToMap + jr nz, CopyTilesToMap ret ; this function is used by practically all the card animations and all over the place. @@ -53,6 +42,10 @@ BuildMetaSprite: push de pop hl ; want hl and de to be swapped just for the sake of consistent apis pop de ; hl now holds the OAM location, de holds the sprite map + ; fundamentally the reason for this is we need to advance through the OAM + ; four times for every time we addvance de, so it makes maybe more sense + ; to increment hl more often? but we can't use hl+ much because we're loading + ; from different places. so maybe this is unnecessary push af ; save to the stack so we can retrieve it for row-wise decrement push bc ; hold onto the upper-left corner so we can update it each row diff --git a/GraphicsManipulation.inc b/GraphicsManipulation.inc index 640e71d..9713b72 100644 --- a/GraphicsManipulation.inc +++ b/GraphicsManipulation.inc @@ -9,40 +9,45 @@ GetDoubledTopNibble: GetDoubledNibbleInner: ; b holds a byte of tile data ; this returns the first byte of the doubled tile data + ld a, b and a, %10000000 ; a contains a0000000 ld c, a - srl c + rrca or a, c ; a now contains aa000000 ld [vBuildingByte], a ; vBuildingByte has aa000000 + ld a, b and a, %01000000 ; a has 0b000000 - srl a ; a has 00b00000 - ld c, a - srl c ; c has 000b0000 + rrca ; a has 00b00000 + ld c, a ; c has 00b00000 + rrca ; a has 000b0000 or a, c ld c, a ; c has 00bb0000 ld a, [vBuildingByte] or a, c ld [vBuildingByte], a ; vBuildingBye has aabb0000 + + ld a, b and a, %00100000 ; 00c00000 - srl a ; 000c0000 - srl a ; 0000c000 + rrca ; 000c0000 + rrca ; 0000c000 ld c, a - srl c ; 00000c00 - or a, c + rrca ; 00000c00 + or a, c ; 0000cc00 ld c, a ld a, [vBuildingByte] or a, c ld [vBuildingByte], a ; vBuildingByte has aabbcc00 + ld a, b and a, %00010000 - srl a - srl a - srl a + rrca + rrca + rrca ld c, a - srl c + rrca or a, c ld c, a ld a, [vBuildingByte] @@ -169,16 +174,7 @@ DrawByte: ; accepts [hl] as the number to write, de as location to write tile ID ret -.hex ; tile IDs for hex values. this can live elsewhere alongside WriteByte - ; 0, 1, 2, 3, - db $a0, $a1, $a2, $a3 - ; 4, 5, 6, 7, - db $a4, $a5, $a6, $a7 - ; 8, 9 - db $a8, $a9 - ; a, b, c, d, e, f - db $b1, $b2, $b3, $b4, $b5, $b6 -.lowerHex ; tile IDs for hex values. this can live elsewhere alongside WriteByte +.lowerHex ; tile IDs for hex values. ; 0, 1, 2, 3, db $a0, $a1, $a2, $a3 ; 4, 5, 6, 7, diff --git a/Printing.inc b/Printing.inc index 6bac91b..e346a86 100644 --- a/Printing.inc +++ b/Printing.inc @@ -203,34 +203,32 @@ PrepNetwork: ld a, 0 ld [vPrinterStart], a - ld a, $1 - ld [rSC], a + ld hl, rSC + set 0, [hl] ret SendByte: ; waits until the thing is free, then sends the byte in a. puts the receiived ; byte in a anad returns. - push af + push hl + + ld hl, rSC .waitForFree - ld a, [rSC] - bit 7, a + bit 7, [hl] jp nz, .waitForFree - pop af ld [rSB], a - ld a, 0 - set 7, a ; request transfer - set 0, a ; set to leader - ld [rSC], a + set 7, [hl] ; request transfer .waitForResponse - ld a, [rSC] - bit 7, a + bit 7, [hl] jp nz, .waitForResponse ld a, [rSB] + + pop hl ret KickOffPrintJob: @@ -241,7 +239,10 @@ KickOffPrintJob: ld [vPrinterStart],a ld a, 0 ld [vPrinterRow], a - + + call CardPrintPrep + call CardUpdate + ret RunPrintJob: @@ -249,44 +250,68 @@ RunPrintJob: cp a, 0 ret z - ld a, [vPrinterRow] - bit 0, a + ld a, [vPrinterRow] ; printer row holds the row of printing we're on; this + ; combines the tile row of the card + borders and also when to wait for printing + ; to finish. also later we use the register for 'whetther it's a row of the card' + bit 0, a ; on even numbered printer rows just jump to the "wait for printable" + ; routine. this should increase the printer row only if the printer is ready + ; and return. jp z, WaitForPrintable - cp a, 1 + cp a, 1 ; if the print row is 1, then we want the top border jp nz, :+ call PlanTopRow - call BuildTopRow - call DoubleTheBuffer - call PrintTheBuffer - ld a, [vPrinterRow] - inc a - ld [vPrinterRow], a - ret + call BuildRow + set 7, a ; set bit 7 as a flaag thatt we've already taken one of these branches. : - cp a, 35 - jp z, DoBottomRow - cp a, 37 - jp z, FinishUp - - call PlanRowA - call BuildTopRow - - ld b, 8 ; pre-increment so that when we pre-decrement in the loop later it works - sla a - sla a - sla a ; mullitply by 8 - add a, 24 ; offset for the border and overscan - add a, b ; start from the bottom row of these tiles, a*8 + 7 - .addSpriteLinesLoop - dec a + cp a, 35 ; if the print row is 35, we want the bottom border + jp nz, :+ + call PlanBottomRow + call BuildRow + set 7, a + : + cp a, 37 ; if the row is 37, we want to clear the buffer and reset + jp nz, :+ + call ClearBuffer - ld [vCurrentScanline], a - call AddSpritesToLine - - dec b - jp nz, .addSpriteLinesLoop - .doneAddSpriteLinesLoop + ld a, 0 + ld [vBlocked], a + ld [vPrinterStart],a + ld [vPrinterRow], a + ld a, 1 + ld [vPrinterIsReady], a + + ret ; don't finish sending the print if we're cleaning up. + : + bit 7, a ; if this bit was set by one of the previous branches, then + ; we aren't drawing a row; otherwise the rest of a holds the printer row for + ; a card row to draw + jp nz, :+ + res 7, a ; get rid of that "drawing a row" bit + srl a ; divide by two to get rid of the "drawing or waiting" bit + dec a ; subtract one to get the row index into card space + + call PlanRowA + call BuildRow + + ld b, 8 ; pre-increment so that when we pre-decrement in the loop later it works + sla a + sla a + sla a + add a, 24 ; multiply by 8 and add 24 to get from card tile space to sprite space + add a, b ; start from the bottom row of these tiles, a*8 + 7 + ld c, a ; c holds the current scanline we're looking at for this inner loop + .addSpriteLinesLoop + dec c + + ld a, c + ld [vCurrentScanline], a + call AddSpritesToLine + + dec b + jp nz, .addSpriteLinesLoop + .doneAddSpriteLinesLoop + : call DoubleTheBuffer call PrintTheBuffer @@ -303,9 +328,7 @@ PlanTopRow: call CopyRange ; copy tiles for the top row to the first buffer ld b, b ret -PlanRowA: - srl a ; divide by two and subtract one to get row numbre in card space - dec a +PlanRowA: ; a should be which row of a tile map we should draw push af ld de, BUFFER_ONE @@ -314,15 +337,16 @@ PlanRowA: ld [de], a inc de + call FindCardTileMap ; now hl points at the beginning of the tile map + pop af push af - call FindCardTileMap ; now hl points at the beginning of the tile map - sla a sla a sla a + sla a ; multiply row number by 8 for the stride of the tile map ld b, 0 - ld c, a ; need to advance it by a*8 bytes. + ld c, a ; advance to the row we're looking for. add hl, bc ld b, 8 : @@ -338,10 +362,16 @@ PlanRowA: pop af ret +PlanBottomRow: + ; draw the bottom of a card as tile ids in buffer one + ld hl, CardBrowse.UITilemap + 20*17 ; + ld bc, 10 + ld de, BUFFER_ONE + call CopyRange ; copy tiles for the top row to the first buffer + ld b, b + ret - - -BuildTopRow: +BuildRow: ; assuming buffer one contains a sequence of ten tile IDs ; this writes the tile data for each of those tiles sequentially into BUFFER_TWO push af @@ -403,7 +433,6 @@ DoubleTheBuffer: ld b, b ret - PrintTheBuffer: call ClearBuffer @@ -445,39 +474,7 @@ WaitForPrintable: ld [vPrinterRow], a ret - -DoMiddleRow: - call ClearBuffer - ld a, [vPrinterRow] - srl a - dec a - call SendRowA - call SendEmpty - call SendPrint - ld a, [vPrinterRow] - inc a - ld [vPrinterRow], a - ret -DoBottomRow: - call ClearBuffer - call SendBottomRow - call SendPrint - ld a, [vPrinterRow] - inc a - ld [vPrinterRow], a - ret -FinishUp: - call ClearBuffer - - ld a, 0 - ld [vBlocked], a - ld [vPrinterStart],a - ld [vPrinterRow], a - ld a, 1 - ld [vPrinterIsReady], a - - ret - + SendEmpty: ld a, 4 @@ -486,218 +483,7 @@ SendEmpty: call SendPacket ret -SendBottomRow: - ; draw the top of a card - ld de, BUFFER_ONE - - ; top half of border - ld a, $11 - ld hl, UITiles - call FindTileData - call WriteTopHalfDoubledTile - - ld c, 8 -.loop - push bc - ld a, $0d - ld hl, UITiles - call FindTileData - call WriteTopHalfDoubledTile - pop bc - dec c - ld a, 0 - or a, c - jp nz, .loop - - ld a, $10 - ld hl, UITiles - call FindTileData - call WriteTopHalfDoubledTile - - ; bottom half of border - ld a, $11 - ld hl, UITiles - call FindTileData - call WriteBottomHalfDoubledTile - - ld c, 8 -.loop2 - push bc - ld a, $0d - ld hl, UITiles - call FindTileData - call WriteBottomHalfDoubledTile - pop bc - dec c - jp nz, .loop2 - - ld a, $10 - ld hl, UITiles - call FindTileData - call WriteBottomHalfDoubledTile - - ld a, 4 ; fill buffer - ld hl, BUFFER_ONE - ld bc, $280 - call SendPacket - - ret -SendTopRow: - ; draw the top of a card - ld de, BUFFER_ONE - - ; top half of border - ld a, $0e - ld hl, UITiles - call FindTileData ; give it a=index into some tiles, hl=what to start from - call WriteTopHalfDoubledTile - - ld c, 8 -.loop - push bc - ld a, $0a - ld hl, UITiles - call FindTileData - call WriteTopHalfDoubledTile - pop bc - dec c - ld a, 0 - or a, c - jp nz, .loop - - ld a, $0f - ld hl, UITiles - call FindTileData - call WriteTopHalfDoubledTile - - ; bottom half of border - ld a, $0e - ld hl, UITiles - call FindTileData - call WriteBottomHalfDoubledTile - - ld c, 8 -.loop2 - push bc - ld a, $0a - ld hl, UITiles - call FindTileData - call WriteBottomHalfDoubledTile - pop bc - dec c - jp nz, .loop2 - - ld a, $0f - ld hl, UITiles - call FindTileData - call WriteBottomHalfDoubledTile - - ld a, 4 ; fill buffer - ld hl, BUFFER_ONE - ld bc, $280 - call SendPacket - - ret - -SendRowA: - push af - - ld de, BUFFER_ONE - - ; left side border - ld a, $0b - ld hl, UITiles - call FindTileData - call WriteTopHalfDoubledTile - - ; find the row of tile data we're looking for - pop af - push af - ; a might be from 0-16, and we needd to multiply it by 8. that should stay - ; within 256 tho so we can just sla three times - call FindCardTileMap - sla a - sla a - sla a - ld b, 0 - ld c, a - add hl, bc - push hl - ; hl now holds the row of the tile map we're interested in. - ld c, 8 -.loop - push bc - ld a, [hl+] - sub a, 26 ; undo the offset normally encoded into the tile data - push hl - call FindCardKeyTiles - call FindTileData - call WriteTopHalfDoubledTile - pop hl - pop bc - dec c - jp nz, .loop - - ; right side border - - ld a, $0c - ld hl, UITiles - call FindTileData - call WriteTopHalfDoubledTile - - ld a, $0b - ld hl, UITiles - call FindTileData - call WriteBottomHalfDoubledTile - - pop hl - ld c, 8 -.loop2 - push bc - ld a, [hl+] - sub a, 26 ; undo the offset normally encoded into the tile data - push hl - call FindCardKeyTiles - call FindTileData - call WriteBottomHalfDoubledTile - pop hl - pop bc - dec c - ld a, 0 - or a, c - jp nz, .loop2 - - ld a, $0c - ld hl, UITiles - call FindTileData - call WriteBottomHalfDoubledTile - - pop af - ; a holds the row we're on - ld b, 8 ; pre-increment so that when we pre-decrement in the loop later it works - sla a - sla a - sla a ; mullitply by 8 - add a, 24 ; offset for the border and overscan - add a, b ; start from the bottom row of these tiles, a*8 + 7 - .addSpriteLinesLoop - dec a - - ld [vCurrentScanline], a - call AddSpritesToLine - - dec b - jp nz, .addSpriteLinesLoop - .doneAddSpriteLinesLoop - - ld a, 4 ; fill buffer - ld hl, BUFFER_ONE - ld bc, $280 - call SendPacket - - ret - SendPrint: call SendEmpty diff --git a/Random.inc b/Random.inc index f0546f5..c1f905c 100644 --- a/Random.inc +++ b/Random.inc @@ -27,9 +27,9 @@ ClockLFSR: ; uses af, bc and clocks one bit of the LFSR. ld a, [rLFSR] ; 2 cycles rra ; 1 cycle ld [rLFSR], a ; 2 cycles - ret ; 37 cycles total. can call roughly three of these per scanline + ret ; 37 cycles total. can call roughly 12? of these per scanline -OneRandomByte: ; clocks LFSR 8 times so a is +OneRandomByte: ; clocks LFSR 8 times so a is a fresh random byte call ClockLFSR call ClockLFSR call ClockLFSR diff --git a/RecreatingCards.inc b/RecreatingCards.inc index 79cd62d..b0e62a8 100644 --- a/RecreatingCards.inc +++ b/RecreatingCards.inc @@ -9,7 +9,14 @@ vTopHalfOfSprite: ds $20 ; two tiles of tile data for the top half of a sprite vBottomHalfOfSprite: ds $20 ; two tiles of tile data for the bottom half of a sprite POPS +CardAdjustTileMap: +; "fix" the tile map copied into BUFFER_ONE if it needs to be edited for proper +; display of a card. so far this should only apply to Wheel of Fortune because +; that's the only card that uses custom non-sprite drawing. +; a holds the row of the tile map we're on. + BuildRelevantSpritesList: +; uses a, bc, de ld a, 0 ; a should now hold how many sprites we've looked at for this row push af @@ -21,7 +28,7 @@ BuildRelevantSpritesList: ld [de], a inc de dec b - jp nz, .buildBlankList + jr nz, .buildBlankList ld de, vCurrentLineOAMOffsets ld bc, $0000 ; starting offset @@ -32,15 +39,12 @@ BuildRelevantSpritesList: call c, AddThisSpriteToDE ; if it is relevant tthen add it push af ; save the counter for the next row cp a, 10 ; if the new counter is 10, then we're full up! and done w sprites - jp z, .doneWithOAM - inc c - inc c - inc c - inc c + jr z, .doneWithOAM ld a, c + add a, 4 cp a, $A0 - jp z, .doneWithOAM - jp .loop + jr z, .doneWithOAM + jr .loop .doneWithOAM pop af ld a, [vCurrentScanline] @@ -83,12 +87,11 @@ AddThisSpriteToDE: AddSpritesToLine: ; operates on sscanline [vCurrentScanline] and buffer BUFFER_ONE - push af push bc call BuildRelevantSpritesList - ld a, 16 ; account for border + ld a, 16 ; account for border and overscan ld [vCurrentDotX], a .loopOverX call GetCurrentBackgroundPixelValueFromBuffer @@ -129,8 +132,6 @@ AddSpritesToLine: inc hl ; point to x value inc hl ; point tto tile id inc hl ; point to attributes - ; palette is bit 4 [hl] - ; priority is bit 7 [hl] bit OAMB_PRI, [hl] ; if priority is zero, continue writing sprite color (skip this block) jp z, :+ @@ -138,6 +139,8 @@ AddSpritesToLine: cp a, 0 jp z, :+ ; if priority is 1 and background is zero, continue writing sprite color pop af ; gotta get that off the stack so it's clean + pop hl ; gotta get this off the stack too, bc we're jumpinig to + ; doneloopingoversprites which doesn't normally pop hl jp .doneLoopingOverSprites ; if priiority is 1 AND backgruond is nonzero, ; we're done with this pixel forever. this does not properly deal with priority ; but it should be good enough for thiis program. @@ -165,7 +168,6 @@ AddSpritesToLine: ld a, b and a, $3 ; now holds just the color itself - call WritePixelToBuffer .nextSprite @@ -181,26 +183,54 @@ AddSpritesToLine: jp nc, .loopOverX pop bc - pop af ret GetPixelFromOAM: ; hl takes an oam record ; a has an x offset ; bit 5, [hl+3] = x flip -; de takes the yx offsets +; we set de to the yx offsets here, and incorporate flippnig push hl push de + inc hl + inc hl + inc hl + bit 5, [hl] + jr z, :+ + ld e, a + ld a, 7 + sub a, e + : + dec hl + dec hl + dec hl ld e, a ; hold on to x offset ld a, [vCurrentScanline] ; y position sub a, [hl] ; currentScanline - y position ld d, a ; hold on to y offset - inc hl ; look at x coord - inc hl ; look at tile id + inc hl + inc hl + inc hl + bit 6, [hl] + jr z, :+ + ld a, 7 + sub a, d + ld d, a + : + dec hl ld a, [hl] - call FindCardSpriteTiles ; puts card sprite tiles in hl - call FindTileData ; uses a + hl to get tile data + cp a, $90 + jr nc, .tileDataFromText + .tileDataFromSpriteTiles + call FindCardSpriteTiles ; puts card sprite tiles in hl + call FindTileData ; uses a + hl to get tile data + jr .foundTileData + .tileDataFromText + sub a, $90 + ld hl, LetterTiles + call FindTileData + .foundTileData ld a, d ; y offset is number of pairs of bytes to skip cp a, 0 @@ -349,8 +379,6 @@ WipeTargetBit: ret - - FindCurrentBufferBytes: ; points hl at the bytes of BUFFER_TWO where the current scanline/dot live ld a, [vCurrentScanline] diff --git a/ScreenCardBrowse.inc b/ScreenCardBrowse.inc index d6d7178..c2b04eb 100644 --- a/ScreenCardBrowse.inc +++ b/ScreenCardBrowse.inc @@ -47,63 +47,59 @@ CardBrowseSetup: ret CardBrowseUpdate: - call CardUpdate + ld a, [vPrinterStart] + cp a, 0 + call z, CardUpdate - ld hl, vTime - call IncrementTimer + call ScrollBackgroundTile - ld a, [vTime+1] - cp a, $01 - jp c, .doneTimer ; reset the timer and do behavior when vTime passes $0100 - - ld a, 0 - ld [vTime], a - ld [vTime+1], a - - ld hl, SquaresTiles - ld a, [vFrameCountSquares] - inc a - call ArrayClampLooping - ld [vFrameCountSquares], a - -.doneTimer ld a, [vTooBusyForPrinter] cp a, 0 jp nz, .donePrinter - call CheckForPrinter - call UpdatePrintUI - call RunPrintJob - + .checkForPrinter + ld a, [vPrinterStart] + cp a, 0 + call z, CheckForPrinter + .updatePrintUI + ld a, [vPrinterStart] + cp a, 0 + call z, UpdatePrintUI + .runPrintJob + ld a, [vPrinterStart] + cp a, 0 + call nz, RunPrintJob + + .printButton + ld hl, rMYBTNP + bit 6, [hl] ; check select? + jp z, .donePrinter + + ld a, [vPrinterState] + cp a, PS_READY + jp nz, .donePrinter + + call KickOffPrintJob + ret + .donePrinter ld hl, rMYBTNP - bit 6, [hl] ; check select? - jp z, .donePrinter - - ld a, [vPrinterState] - cp a, PS_READY - jp nz, .donePrinter - - call KickOffPrintJob - ret -.donePrinter - ld hl, rMYBTNP - bit 4, [hl] + bit 5, [hl] jp z, .doneWithB - ld hl, ScreenMainMenu - call ChangeScene - ret -.doneWithB + ld hl, ScreenMainMenu + call ChangeScene + ret + .doneWithB ld a, [vSelectedCardIndex] ld hl, rMYBTNP bit 0, [hl] jp z, :+ ; skip the following code if left is not pressed - inc a -: + inc a + : bit 1, [hl] jp z, :+ ; skip the following code if right is not pressed - dec a -: + dec a + : ld [vSelectedCardIndex], a ld hl, Cards call ArrayClampLooping @@ -133,36 +129,19 @@ CardBrowseUpdate: CardBrowseDraw: - ; the card data is loaded asynchronously, initiated in CardReadUpdate - - ld hl, SquaresTiles - inc hl - ld b, 0 - ld a, [vFrameCountSquares] - ld c, a - add hl, bc - add hl, bc - ld c, [hl] - inc hl - ld b, [hl] - ld h, b - ld l, c + ld a, [vCurrentBackgroundTile] + ld l, a + ld a, [vCurrentBackgroundTile+1] + ld h, a ld de, _VRAM + $1000 + 1*16 - ld bc, (SquaresTileset8 - SquaresTileset7) / 8 - call CopyRangeBy8s - + call CopyOneTileData + call CardDraw ld de, SAFE_DMA_LOCATION ld a, HIGH(MY_OAM) call RunDMA - ld hl, vPrinterReturnValue - ld de, _SCRN0 + 32*6 + 12 - call DrawByte - ld hl, vPrinterReturnValue+1 - ld de, _SCRN0 + 32*6 + 14 - call DrawByte ret diff --git a/ScreenCardRead.inc b/ScreenCardRead.inc index b7e7272..338ae96 100644 --- a/ScreenCardRead.inc +++ b/ScreenCardRead.inc @@ -40,43 +40,26 @@ CardReadSetup: CardReadUpdate: call CardUpdate - ld hl, vTime - call IncrementTimer + call ScrollBackgroundTile - ld a, [vTime+1] - cp a, $01 - jp c, .doneTimer ; if the timer is less than $0100, skip to end - - ;otherwise reset the timer - ld a, 0 - ld [vTime], a - ld [vTime+1], a - - ld hl, SquaresTiles - ld a, [vFrameCountSquares] - inc a - call ArrayClampLooping - ld [vFrameCountSquares], a - -.doneTimer ld hl, rMYBTNP - bit 4, [hl] + bit 5, [hl] jp z, .doneWithB - ld hl, ScreenSpreadSelect - call ChangeScene - ret -.doneWithB + ld hl, ScreenSpreadSelect + call ChangeScene + ret + .doneWithB ld a, [vSelectedSpreadCard] ld hl, rMYBTNP bit 1, [hl] jp z, :+ ; skip the following code if left is not pressed - dec a -: + dec a + : bit 0, [hl] jp z, :+ ; skip the following code if right is not pressed - inc a -: + inc a + : ld [vSelectedSpreadCard], a ld a, [vCurrentSpread] ld l, a @@ -100,21 +83,12 @@ CardReadUpdate: ret CardReadDraw: - ld hl, SquaresTiles - inc hl - ld b, 0 - ld a, [vFrameCountSquares] - ld c, a - add hl, bc - add hl, bc - ld c, [hl] - inc hl - ld b, [hl] - ld h, b - ld l, c + ld a, [vCurrentBackgroundTile] + ld l, a + ld a, [vCurrentBackgroundTile+1] + ld h, a ld de, _VRAM + $1000 + 1*16 - ld bc, (SquaresTileset8 - SquaresTileset7) / 8 - call CopyRangeUnsafeBy8s + call CopyOneTileData call CardDraw diff --git a/ScreenMainMenu.inc b/ScreenMainMenu.inc index e394d04..80b4f0d 100644 --- a/ScreenMainMenu.inc +++ b/ScreenMainMenu.inc @@ -4,6 +4,7 @@ vSelectedSpreadIndex: db vSelectedSpreadCard: db vSelectedCardIndex: db vFrameCountSquares: db +vCurrentBackgroundTile: dw vTime: dw vBlocked: db println "vBlocked is ", vBlocked ; @@ -56,7 +57,7 @@ MainMenuSetup: def TileStartCardBackSprites23 equ TileStartCardBackSprites24 + spacing ld de, $8000 + TileStartCardBackSprites23*$10; destination of copy ld bc, CardBackSprites23End - CardBackSprites23 - call CopyRangeUnsafe + call CopyRange ld hl, CardBackSprites22 def TileStartCardBackSprites22 equ TileStartCardBackSprites23 + spacing @@ -215,12 +216,12 @@ MainMenuUpdate: ld a, [vMenuIndex] bit 3, [hl] ; select the down key jp z, .doneWithDownInput ; skip the following code if down is not pressed - inc a -.doneWithDownInput + inc a + .doneWithDownInput bit 2, [hl] ; select up key %0000_0100 jp z, .doneWithUpInput ; skip the following code if up is not pressed - dec a -.doneWithUpInput + dec a + .doneWithUpInput ld hl, MenuCount call ArrayClampLooping ld [vMenuIndex], a @@ -228,33 +229,33 @@ MainMenuUpdate: ld hl, rMYBTNP - bit 5, [hl] ; button a pressed? + bit 4, [hl] ; button a pressed? jp z, .doneWithMenuSelect - ld a, [vMenuIndex] - cp a, 0 - jp z, .option1 - cp a, 1 - jp z, .option2 - cp a, 2 - jp z, .option3 - jp .doneWithMenuSelect -.option1 - ld a, 0 - ld [vSelectedSpreadIndex], a - ld hl, ScreenSpreadSelect - call ChangeScene - ret -.option2 - ld hl, ScreenShuffle - call ChangeScene - ret -.option3 - ld a, 0 - ld [vSelectedCardIndex], a - ld hl, ScreenCardBrowse - call ChangeScene - ret -.doneWithMenuSelect + ld a, [vMenuIndex] + cp a, 0 + jp z, .option1 + cp a, 1 + jp z, .option2 + cp a, 2 + jp z, .option3 + jp .doneWithMenuSelect + .option1 + ld a, 0 + ld [vSelectedSpreadIndex], a + ld hl, ScreenSpreadSelect + call ChangeScene + ret + .option2 + ld hl, ScreenShuffle + call ChangeScene + ret + .option3 + ld a, 0 + ld [vSelectedCardIndex], a + ld hl, ScreenCardBrowse + call ChangeScene + ret + .doneWithMenuSelect ld a, [rDELTAT] ld b, a @@ -301,7 +302,15 @@ MainMenuUpdate: call ArrayClampLooping ld [vFrameCountSquares], a - + sla a ; mulltiiply by 2 + ld b, 0 + ld c, a + ld hl, SquaresTiles + 1 + add hl, bc + ld a, [hl+] + ld [vCurrentBackgroundTile], a + ld a, [hl+] + ld [vCurrentBackgroundTile+1], a ld hl, Coords inc hl @@ -358,27 +367,17 @@ MainMenuUpdate: ret MainMenuDraw: + ld a, [vCurrentBackgroundTile] + ld l, a + ld a, [vCurrentBackgroundTile+1] + ld h, a + ld de, _VRAM + $1000 + 1*16 + call CopyOneTileData + ld de, SAFE_DMA_LOCATION ld a, HIGH(MY_OAM) call RunDMA - di - ld hl, SquaresTiles - inc hl - ld b, 0 - ld a, [vFrameCountSquares] - ld c, a - add hl, bc - add hl, bc - ld c, [hl] - inc hl - ld b, [hl] - ld h, b - ld l, c - ld de, _VRAM + $100*16 + 1*16 - ld bc, (SquaresTileset8 - SquaresTileset7) / 8 - call CopyRangeUnsafeBy8s - ld b, 0 ld c, 32 @@ -1068,6 +1067,37 @@ CardBackSprites17: db $00,$80,$00,$80,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; bottom-right db $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 ; empty CardBackSprites17End: + + +ScrollBackgroundTile: + ld hl, vTime + call IncrementTimer + + ld a, [vTime+1] + cp a, $01 + ret c ; if the timer hasn't passed $0100, don't do anythhiing. + + ld a, 0 + ld [vTime], a + ld [vTime+1], a + + ld hl, SquaresTiles + ld a, [vFrameCountSquares] + inc a + call ArrayClampLooping + ld [vFrameCountSquares], a + + sla a ; mulltiiply by 2 + ld b, 0 + ld c, a + ld hl, SquaresTiles + 1 + add hl, bc + ld a, [hl+] + ld [vCurrentBackgroundTile], a + ld a, [hl+] + ld [vCurrentBackgroundTile+1], a + + ret SquaresTiles: db 8 dw SquaresTileset1 diff --git a/ScreenShuffle.inc b/ScreenShuffle.inc index 7b2a2cc..e843a16 100644 --- a/ScreenShuffle.inc +++ b/ScreenShuffle.inc @@ -71,44 +71,26 @@ ShuffleUpdate: ld hl, vShuffleTime call IncrementTimer - ld hl, vTime - call IncrementTimer - - ld a, [vTime+1] - cp a, $01 - jp c, .doneTimer ; if the timer is less than $0100, skip to end - - ;otherwise reset the timer - ld a, 0 - ld [vTime], a - ld [vTime+1], a - - ld hl, SquaresTiles - ld a, [vFrameCountSquares] - inc a - call ArrayClampLooping - ld [vFrameCountSquares], a - -.doneTimer + call ScrollBackgroundTile ld a, [rMYBTNP] cp a, 0 jr z, .doneWithButtons - ld a, [rLFSR] - ld [rLFSR+1], a ; lfsr = (lfsr << 8) + (vShuffleTime & $ff) - ld a, [vShuffleTime] - ld [rLFSR], a - - ; check for B button press and change scene - ld hl, rMYBTNP - bit 4, [hl] - jp z, .doneWithB - ld hl, ScreenMainMenu - call ChangeScene - ret -.doneWithB - call ShuffleButtonHandler -.doneWithButtons + ld a, [rLFSR] + ld [rLFSR+1], a ; lfsr = (lfsr << 8) + (vShuffleTime & $ff) + ld a, [vShuffleTime] + ld [rLFSR], a + + ; check for A button press and change scene + ld hl, rMYBTNP + bit 5, [hl] + jp z, .doneWithB + ld hl, ScreenMainMenu + call ChangeScene + ret + .doneWithB + call ShuffleButtonHandler + .doneWithButtons call ShufflePickAnimation @@ -348,26 +330,17 @@ ShowSprites: ret ShuffleDraw: + ld a, [vCurrentBackgroundTile] + ld l, a + ld a, [vCurrentBackgroundTile+1] + ld h, a + ld de, _VRAM + $1000 + 1*16 + call CopyOneTileData + ld de, SAFE_DMA_LOCATION ld a, HIGH(MY_OAM) call RunDMA - ld hl, SquaresTiles - inc hl - ld b, 0 - ld a, [vFrameCountSquares] - ld c, a - add hl, bc - add hl, bc - ld c, [hl] - inc hl - ld b, [hl] - ld h, b - ld l, c - ld de, _VRAM+$100*16 + 1*16 ; tile number $101 is the sliding background - ld bc, (SquaresTileset8 - SquaresTileset7) / 8 - call CopyRangeUnsafeBy8s - ret ShuffleTeardown: diff --git a/ScreenSpreadSelect.inc b/ScreenSpreadSelect.inc index 0ad4653..0f0d9a1 100644 --- a/ScreenSpreadSelect.inc +++ b/ScreenSpreadSelect.inc @@ -25,6 +25,7 @@ SpreadSelectSetup: ret .asyncTask: ; setup task to be executed async + ld a, HIGH(ZEROES) ld de, SAFE_DMA_LOCATION call RunDMA @@ -46,31 +47,33 @@ SpreadSelectSetup: ret SpreadSelectUpdate: + call ScrollBackgroundTile + ld hl, rMYBTNP - bit 4, [hl] - jp z, .doneB - ld hl, ScreenMainMenu - call ChangeScene - ret -.doneB bit 5, [hl] - jp z, .doneA - ld hl, ScreenCardRead - call ChangeScene - ret -.doneA + jp z, .doneB + ld hl, ScreenMainMenu + call ChangeScene + ret + .doneB + bit 4, [hl] + jp z, .doneA + ld hl, ScreenCardRead + call ChangeScene + ret + .doneA ;up and down ld a, [vSelectedSpreadIndex] bit 3, [hl] ; select the down key jp z, .doneDown ; skip the following code if down is not pressed - inc a ; increment when they press down -.doneDown + inc a ; increment when they press down + .doneDown bit 2, [hl] ; select up key jp z, .doneUp ; skip the following code if up is not pressed - dec a ; decrement when they press up because the deck has card 0 at the top -.doneUp + dec a ; decrement when they press up because the deck has card 0 at the top + .doneUp ld hl, Spreads call ArrayClampLooping ld [vSelectedSpreadIndex], a ; save clamped index @@ -80,12 +83,12 @@ SpreadSelectUpdate: ld hl, rMYBTNP bit 1, [hl] jp z, .doneLeft ; skip the following code if left is not pressed - dec a -.doneLeft + dec a + .doneLeft bit 0, [hl] jp z, .doneRight ; skip the following code if right is not pressed - inc a -.doneRight + inc a + .doneRight ld hl, vCurrentSpread ld c, [hl] inc hl @@ -97,34 +100,6 @@ SpreadSelectUpdate: ld [vSelectedSpreadCard], a - ld hl, vTime - ld a, [rDELTAT] - ld b, a - ld a, [vTime] - add a, b - ld [vTime], a - ld a, [vTime+1] - adc a, 0 - ld [vTime+1], a ; increment time. when the 16bit time register is greater - ; than 4096 ($10_00) then one second has passed. so that's satisfied when - ; vTime+1 is equal to or greater than $10 - - ld a, [vTime+1] - cp a, $01 - jp c, .doneTimer ; if the timer is less than $0100, skip to end - - ;otherwise reset the timer - ld a, 0 - ld [vTime], a - ld [vTime+1], a - - ld hl, SquaresTiles - ld a, [vFrameCountSquares] - inc a - call ArrayClampLooping - ld [vFrameCountSquares], a - -.doneTimer ld a, [vSelectedSpreadIndex] ld hl, vPreviousSpreadIndex cp a, [hl] @@ -219,7 +194,7 @@ DrawSpreadTask: ; draw the spread large in the middle of the screen, and descs ld hl, ONES ld b, 8 ld c, 14 - call CopyTilesToMapUnsafe + call CopyTilesToMap DrawSpreadTaskWithoutRefreshingBackgroundFirst: ; step past the spread layout to get to the spread description ld a, [vCurrentSpread] @@ -280,21 +255,12 @@ DrawSpreadCards: ret SpreadSelectDraw: - ld hl, SquaresTiles - inc hl - ld b, 0 - ld a, [vFrameCountSquares] - ld c, a - add hl, bc - add hl, bc - ld c, [hl] - inc hl - ld b, [hl] - ld h, b - ld l, c - ld de, _VRAM + $100*16 + 1*16 - ld bc, (SquaresTileset8 - SquaresTileset7) / 8 - call CopyRangeUnsafeBy8s + ld a, [vCurrentBackgroundTile] + ld l, a + ld a, [vCurrentBackgroundTile+1] + ld h, a + ld de, _VRAM + $1000 + 1*16 + call CopyOneTileData ret SpreadSelectTeardown: diff --git a/card_art/00thefool.aseprite b/card_art/00thefool.aseprite index e1f21eeccc537b05f0193bcdf643b03fdcd97eeb..475d39966f593659d61a38b3b9ac2227f5711321 100644 GIT binary patch delta 1488 zcmV;>1uy!LHnTPXGm!y*4YL{m0Q&JW0b~FG05h?Ty9*Dr0{{RcAOipZ00sa609%v6 z1s9WU3=MyM0{{ScoV{2JZUrF-6uAGLyTX8ox}W5wH0gkfs{^8KYyT@$u&Z5M*Gy9Yu2tz`@caC5@T=I6tA{7V~OLAz+->p_jy%>XJi5pfB=E^i*-K6yqDF? z1ZqC0$uL<5_xY8@YXY9dZ4o0}>^sJHvURNTX_`0OVqZ#luH?`jOGxLO$+!%@ITxUj z2C5>)j@Y^c3l)SJ&E3|tw2@uC2<<;C%@l#%U=v{2Akvn@t})IFi%~|BxHpGp=b`Y) zD++(>(P5mJ9@Fm5IAQnV0~m_C0N09C38vr32v`Je*ZqCo5>MFHB507Cb3MmXTn2sm z5uhN+#nyk>S0y7oO+62~U&r2{D5SO~S8ufwthQ%?<(;_Fs^aT9*`krv{1RYS4CN8? z*<0_y=X<2O`dk^0b=_SOpD*kNyCb8Dg4lnqpsda|fpPMIu%G#z>=CF)mzO*{-9Um_ zPQ}eVAA|*QIY^RG6F(ht%V(K{J!%Y@`4x3qb`;CMwB0nWyySulEndi)WCODQq;qgPca5zv_2oeiyOLZ+AK2AxL4oA*VHND>D2#LERITqDg=d~5EO!fkBWPHZhKQ}Bek)2r%20@ zwb+RhgwfvhlrpiE(|>*kKE`Q&7v_I=xG6O*OZ+_V0@FLa{pg*v)PJ3x^o3wQfW;QO z_Oax%^odRxJ8*LJ+7SA4-&Zf3X z@g&tj(l@gDao+g%fzJ{YK2RC=CuB^r4aJ&=@vnu_KIi+#kj5+@{1N!D=6J9D*274{vkIcHkiN5@BIe?4n#`iPD9fj z{iKcd{b|5|IJ7H$ao8OnX=uKJy!(sy@BUvu)#GTBXj16;6`p8d9pd>)C-*aK{|D_7 z16Gsq58RVO6;lBMlb01D0RpqS6)6E33;_TD1t0+c00000{{sL300000000UA5|i#1 zAAgO{iB7^m6hKiF6c7+pb`WqE7d90a5D^qXWLE_K|3kbaZ<0wfiM-@w^4i;`wb@pm zH96N|7Y;+WA?K#nISrjlPB*sTfmg2iv~KzQHv9-+2fK1_&(Z}ELKqQ55kp+-5=den zDWs9XfxJV_p|nRh#tBYwX6aOWjw~*4iCimO8~!_oJPIfpni6hsi#wEYj|V(z-4iOP z%KnTRUM$~N$1575i8s8-rdAh!Mt^;2S?$H^nbzm>Z~3`{JK& zmH7h|eH7V!00005AOe%>7BNF(U_byaAm(Pk4S0Z<7mxg41bjfu55xi_=n({BAs`mU qqeg@hN6`Q<0x=U1Gb6Ftk>pu`m;;E}plntk<^*B@&q%XT7{3CpFu*SW delta 1421 zcmV;81#9 z1s9WU3=Mx&0{{ScoW)p+k|QAq6!`ytz7ZP4*JzThI#Rn0jylkyl9ckZP!(5JSZ=Z0 zVhOwuW)Z0X>-i^S#-nURR4~HEc!S#V%!&u<)Gab%ts@s)a*s>^Ds3#MsVoi;%>$;b z$$@Ta6wd_Qi`&NBgNWQ22__z~cuez#S9}y|BSC*nP^o0w6S4RObO_cR&DGXrA?;b! zhp_r#DW(YQ0-FHMmPBBs1rgc`(KAu;^^VwWK&fwzI4H;8qp+q9BV#J3b-1-Ia-b9M zz)*Y$aN+~DwFnyIWk>aVhzl}yKq)|^v^>lTX*P&$ks`{DsQrN2x;VA9E(L67(bi2| zDWiYle(h{gW^{e@RY+Dr@}3ZJL_8OEfnAZY3lUgVu(5iZ5HWd2*ys2D^hj|G1kLAQ}67~_?qw#;i##YT&YxN6I4oK|^Z};50VA!+HWjg=- zR_w1jcAQ}dFF6(tA|SGZg6u9Kw!;%-geS)Xd6qWC7wD_9#xbqte#WEiJ@(U?9T}&$ z-*4jS>*<{qQK+F#Dc}n3s)82lp*?Yxa4zOj!9%Y|^et~`=`VQeMSaKdEGT7ki= z=8ZY2s_(|H#%76z7NRP{ve{cotA7}^pidA)=#^H-vljgBsPEAclN&WqcbdUZ1mP8% z`4@3W4%7Q&bqw=XJnSG~!{0n&(KvteKd-|ue~xA~(TC9-$B&K$$_`DTeTOw}9+ctg zy2TJA)Z&|IQdTG6)pytSns{A5KApIW@6qASpUE!FhSOL3?Qa7!snh*%tV_@S{3pNe z<>=Qw315@w^8Om^Pxt%FeQ|SG{J>iy?_S1xz-3CK+X-*o{0vWZQ#u6>?)6?c>7APD2~|NmS?a7v5NZFy+0Xh;qKe*qtuJ33>-%G@gL0WwO}d#wUO zk^%>eZ#cVBanbHTug7*T$q^#*wG7gf!Xvf1ntAc=%a~OFB7t-Ku>gzzkiYC7WkX_v z`7^xkKM-(^*L}>BYi`H=<+@5=1V57YEM6qD<0HG~Paq=s2v_gx1BdkKl$cUvT%4Zy zD&Kty@qXkc_cd((1;5z?=d*DXF9DNv6%doK6%&(n6%e!26&e8t@&Et;1t0;E7%_i+ z&DBnWK@bMepJK(KxVuAfihFVQBJckioPSo%sKZIX=Q0^JL@v$pVWk zan3R;T=2yz@2s&-jtw^X=9Mi9C2apQ{{bLG7-)U~000Fb0ssI22mt>B0000000000 z36l^QBtZpSK+Mg6AMgM%F99_}1@HkeKM)I$s80}xg@9O?>MkN5h>)p|5r~<9m>G%9 bj;4kMh&h0m4a#N(Voo3i0N*6DbQr$^9Dt_A diff --git a/card_art/03theempress.aseprite b/card_art/03theempress.aseprite index 9eac8681a5b9ed42b1f75a5c1d1cd70e3f1f32ce..1aa451fd4f2329e7882e72f409ab3dd6caf50607 100644 GIT binary patch delta 2348 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 JV6%i8*#fZ2`$zx) diff --git a/card_art/14temperance.aseprite b/card_art/14temperance.aseprite index fb870de6ce229cb526af65d427b1db77c65435ae..bac38a52d5acb893903f03551df92fdb79e46a96 100644 GIT binary patch delta 1119 zcmV-l1fct(HHS9>hZ~Usehmj3008>&JON|?002C(jl~NOa{~YXBOn6+000I6003K) zVGJaHJOcm#c$~FYi;^QD2o(7Lf4(R*4>`}Gbg9>7cXj=OdVM8$h@?J%Q+KSo% zy`M!5fZdOn%oB6F6FIfR=ljqD-}=BHj9MG!aC}`D!aihbC>^W)=pR%nvQaCFJTq%L z+A+@UTK35@^M5I1Kn7w^fK&U-9z{J8s8g;2V;uamw5~& zb;f*oUe7-U@`4rtX$1NOd`KV|Y{e8j?k3L|QMx+QnVI11;usltY#qgr6_sFeqKVa^ zespv%O_PdKTM>j~3gtMJ&vu869c@#L&k-b9@GI)nFVK_1wT5l^-SEAkza<`WIrCJ1 z#6C>=_&{8Ft4F^8)tOf&oZmd$Ha`BwnYS5m0I@sDrEiFr&00R^x;$rKNvLJ;Gvrp! z<%L;{=foWE5j#O6Yh{?f);sj3$C_fxjKh5D+F58iU$^&|its&2oT1M1%*EQQXTp=j za^T9V7`avfOGP}{&(tZ>mwKB1R< z%7ab^{WDRq25T?eUzU%OF)N>=oWX&?o#>oZxY7z4Aftuko-R)Uc9d zPjf?NBiJ$GC&JOU_n!2pj=mOuQ@w0jd-SZNkv6XXf@EQTn)?$gl;#+ZulqX>ZcLlH z_rI^_BAP$I=Tf08-+=a^&*70;sZ8E(m$ICQmU%y%DX}+EM}3jAs)4vX@o4gWnP0T2 z)R#Q<(cZ?+jc;MwLB29l*wfvbaBG}`DwpvC;Yps_BlxnMWkd`;&ab^j`#54F7WujW zn9P2j>YM$@>uUJ#%c$%7hHvv<@qf$me)>LN)IJ<<-Q4>BB?h&Rx65Bh-rKKZOOK0N zi?8N+$v+k45X+OX0hY6{2m%AMkP_kp8SVf800kfc00;mO0RIC3000000000901uO4 z7a)Jm)lNe}7)H@Sif6abA%sv%9rZNONIv|2O%!OR zg;v^cm?2}9}%}i`&naecuEU?H@ zY?fK!BQ|fWvKIFr>&d+hHra~%HanSpmpwM_*yn&lj(CjCF(;gI#yJ;U@)VmduDIr% l8*X{vnU~DXDsog)$tSPLzssnhoQh=o2E!c@^s`78S_3Q+Er|dC delta 980 zcmV;_11tQ8H=;EHq8gC`ehnfT008>&F#%)%001$ujl~NO6axSNBOn6+000I6002;v zVGJaH-2wmrc$}?RfwJQu2o(7Lf4(XU0%~LWj+xE|Bd9BaX>0#Q7$^Wk-mBK2wxV{1 z{+>k*47(qJ)PcF(iJaQa=l7{k{OZFxS+BLBPRG|}UD&&nhV){!AMXd1iVSK+kt?&% zt=;;$U5h?hD*u;400Ib>vThrh=r|0{WRx`*!b)4w+m55^RuFL<0v zcsa+5<9htDAuos-kj_A#3||sx47OxyJnjaMIA`f{em8t?=x>3Cn9e+Z z6m1`hJ|1jdajVCBF;r)sne6<=?%4SG8)qIP*a5`ufJ@&HPn$V?*1TLJFm3bF`5ki0 z=kmgA_UFJH@6mRGM%2nM|EzcDO^-FrEdz(~)U~rvIbXMROhx#fB#w~BdFNtn)-&Nj zf*82+Dj*jbl2arTGH235C~fj*%4Xqzy;YT+j)a;P>Wdsr3YfbuQQPo5jmSubsgKnX%bZLayk1(t%%FQ042u=ZWusqy23R zk;g&SJ`E7nMC@xyZjm!S2tDDi;slSf^@#_qU*lpus9_}uS92gUE%6%|3#C)JVSHDX z1e!7^dN?#Kq#;Fzd)boj4|j@YYb@&V`}!mvcT0vsycyy_ufrWBq{-XuQkDbJQuo98 zz*mOetPp>U1)({tJTtw&>v8NDtZVP$am%-vA8YXQo!vxrOdFv3LETjsK+_sf*T%q;gc4D9{~grLinvk z5knjaB&DU0Mh02r)a&vnpokkvvX@ao6*XyfG|)r~ZFHn{(UZ4*3}k=$l{Ul(W7#K| zVum@cSYU}2*4SW+9rhnM;E0p_^AG>>ea1z7-Vcm0K>yV=FhL8QYSY408nyiZggdGRB3Ewb9n#&0C=3Gkbw?>AP7W>`~QDVE_H{DwHB2R3^>&6x4FAI z0K$nCB+YQqHs_DFsj+sIM^*Z8l)EtY2V;Oi!Z?WJwFat=XTO-yUbt1}wbj34%4_9k z^HWS?Mpa+?!=HSlSlAywpL=<7CGYykdS49mi_SqH-~SCQ^#W0oQ380gE)PHg0a%l7 v5f_s%5+EQY!-oj~APfMoYF+jJgAEu+#8+OM-E=rzZjTQH-~c$Yw-Lkw_U~nS delta 204 zcmeyY`CEgrdLm;z?{8rShF>4=F{CgsFx=bN`;eEv1;|oXU;&bBK+HPXk4HR?hasRS zGp{7IC?qo{wb%zJUNL8BUm)KB1rBHHs{hvgW*#?$_N_VPyoIY^ZO05wPt`6H-47dQ zm2R-(s_u_ncmC0Nx#m^sR~;@jNK1YXySV?^i<7rX3s!z%TA^#{4F8#d957&FV4D0vP+l-OB_Sb!DJe}MjWLOVA%TH=v%b&~CIDemLze&m diff --git a/main.asm b/main.asm index 5764f54..77104ce 100644 --- a/main.asm +++ b/main.asm @@ -26,7 +26,8 @@ DEF INTERRUPT_LCD EQU SCENE_TEARDOWN + 4 def CARD_INIT equ INTERRUPT_LCD + 4 def CARD_UPDATE equ CARD_INIT + 4 def CARD_DRAW equ CARD_UPDATE + 4 -println "Card Draw is ", SCENE_DRAW +def CARD_PRINT_PREP equ CARD_DRAW + 4 +println "Card Draw is ", CARD_DRAW ; each of these sections is way bgger than it needs to be ; i doubt any of them will hold more than $20 bytes at all @@ -81,8 +82,8 @@ SECTION "Header", ROM0[$100] jp EntryPoint ds $147 - @, 0 ; skip to the mbc byte - db $01 ; MBC1 with no ram or battery :) - db $01 ; 64kb rom :) + db CART_ROM_MBC1 ; MBC1 with no ram or battery :) + db CART_ROM_128KB ds $150 - @, 0 ; Make room for the header EntryPoint: @@ -166,6 +167,8 @@ EntryPoint: ld [hl], a ld hl, CARD_DRAW - 1 ld [hl], a + ld hl, CARD_PRINT_PREP - 1 + ld [hl], a ld hl, Instructions inc hl @@ -187,6 +190,8 @@ EntryPoint: ld [hl], a ld hl, CARD_DRAW ld [hl], a + ld hl, CARD_PRINT_PREP + ld [hl], a ld hl, Instructions inc hl @@ -209,6 +214,8 @@ EntryPoint: ld [hl], a ld hl, CARD_DRAW + 1 ld [hl], a + ld hl, CARD_PRINT_PREP + 1 + ld [hl], a ld hl, Instructions inc hl @@ -232,6 +239,8 @@ EntryPoint: ld [hl], a ld hl, CARD_DRAW + 2 ld [hl], a + ld hl, CARD_PRINT_PREP + 2 + ld [hl], a ; set up our scene handle ld hl, ScreenMainMenu @@ -293,9 +302,8 @@ println "scene update is ", SCENE_UPDATE - 1 call SCENE_UPDATE - 1 ; hope this takes not too many scanlines! di - ld a, [rIE] - or a, IEF_VBLANK - ld [rIE], a + ld hl, rIE + set 0, [hl] ; IEF_VBLANK ei halt diff --git a/source.zip b/source.zip index 3a6ca84934f0709736480a5e1aef20aadd74a403..192378cce5fe95eac283d5bc9f579355135ac34d 100644 GIT binary patch delta 22404 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 YN+H67oM#%;pIvTtrRVAk3*5;5Z%93+-2eap delta 21007 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 mzQ5&VI&+Y>M0C3Dh{EH6?d