From 31a4e2b107bb7fcb86a9065752329056f7209f56 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Thu, 21 Dec 2017 15:14:46 -0500 Subject: [PATCH] mode7_demo: initial scriptable flying --- mode7/mode7.dsk | Bin 143360 -> 143360 bytes mode7_demo/checkerboard_lookup.s | 21 +++++++++++ mode7_demo/island_lookup.s | 63 +++++++++++++++++++++++++++++++ mode7_demo/mode7.s | 19 ++++------ mode7_demo/mode7_demo.dsk | Bin 143360 -> 143360 bytes 5 files changed, 91 insertions(+), 12 deletions(-) create mode 100644 mode7_demo/checkerboard_lookup.s create mode 100644 mode7_demo/island_lookup.s diff --git a/mode7/mode7.dsk b/mode7/mode7.dsk index 600fe447c43d27e1ed0c01bcee60d70bdfb38382..d1b6200c76253c3f06416d8ccb8ea86ba08f631e 100644 GIT binary patch delta 661 zcmX|+PiPZC6vp>$Hvcx8WOiap!JXMjYqgP9D=HKZTA{R1B2@%0Qb-$85%mxS(L=EZ z7evU#B@EhwRT}NaW2GVDp%)=1K}32fwLMs*=vsSFvHzS6ro#-sZ{GLjG2g^;XhQ7Q z(2c<4#}HiO83bBP+LiX!?)+@NZ4l-#9Er+Ch@-8lXWMqG77ih_F{GumqYKh|(C1o1);(LVrXFnzHFL6_Y2Qz_N|h*gf>u z$BrTv$Btxu7pL9IItgpr!PXYzI(vngt1|ij?z$>|3yb) zpBm-5&fMResji`x+@^J~CPdD)4rSOd>M3=7*(`sZ;?59g@-X7h7T~m;M|@=gnjmj~ z=s(lT_2<%b`=EGL7}KlYP~o~>by4A_UR_6pJ9@39KCf`a^Kx$ChUW_2@_fO&_W6O< z4p(=^+00f;Y4mExyODMO>S#KtXQm{!s9PiA*E`NbYgb%scBwhAsF#K0y={=Pf22=n z$8qP#Jn}nJ=^`%X;jmuB2R6{j)s50d%D3)I+t^;|ZOaw0b5?YSX+JyBd`5~iw|4dP z4P73~k3X=VmZ!7TNo!m(zV0qT+{D-HB8r2Lg1EU^AB)ZoU93aKfDj=%2th2^ zL6;OuM9@(b{{a_u5-Al2-K;Tj@c8}s!0&sNXQh%(9YzWC2V(>_HIxYdF9{|I^hG-Z z6L4X|u$Jq=!6*kO*DD80nSChO{!&MU4gXy<_<_%{Ulsdyr~m)} diff --git a/mode7_demo/checkerboard_lookup.s b/mode7_demo/checkerboard_lookup.s new file mode 100644 index 00000000..4fbc76bf --- /dev/null +++ b/mode7_demo/checkerboard_lookup.s @@ -0,0 +1,21 @@ + ;==================== + ; lookup_map + ;==================== + ; finds value in space_x.i,space_y.i + ; returns color in A + ; CLOBBERS: A,Y + + lda SPACEX_I ; 3 + sta spacex_label+1 ; self modifying code, LAST_SPACEX_I ; 4 + + lda SPACEY_I ; 3 + sta spacey_label+1 ; self modifying code, LAST_SPACEY_I ; 4 + + lda SPACEY_I + eor SPACEX_I + and #$1 + beq @black +@white: + lda #$ff +@black: + sta map_color_label+1 ; self-modifying diff --git a/mode7_demo/island_lookup.s b/mode7_demo/island_lookup.s new file mode 100644 index 00000000..01d4df67 --- /dev/null +++ b/mode7_demo/island_lookup.s @@ -0,0 +1,63 @@ + + ;==================================== + ; do a full lookup, takes much longer + ; used to be a separate function but we inlined it here + + ;==================== + ; lookup_map + ;==================== + ; finds value in space_x.i,space_y.i + ; returns color in A + ; CLOBBERS: A,Y + + lda SPACEX_I ; 3 + sta spacex_label+1 ; self modifying code, LAST_SPACEX_I ; 4 + and #CONST_MAP_MASK_X ; wrap at 64 ; 2 + sta SPACEX_I ; store i patch out ; 3 + tay ; copy to Y for later ; 2 + + lda SPACEY_I ; 3 + sta spacey_label+1 ; self modifying code, LAST_SPACEY_I ; 4 + and #CONST_MAP_MASK_Y ; wrap to 64x64 grid ; 2 + sta SPACEY_I ; 3 + + asl ; 2 + asl ; 2 + asl ; multiply by 8 ; 2 + clc ; 2 + adc SPACEX_I ; add in X value ; 3 + ; only valid if x<8 and y<8 + + ; SPACEX_I is also in y + cpy #$8 ; 2 + ;============ + ; 39 + + bcs @ocean_color ; bgt 8 ; 2nt/3 + ldy SPACEY_I ; 3 + cpy #$8 ; 2 + ;============= + ; 7 + + bcs @ocean_color ; bgt 8 ; 2nt/3 + + tay ; 2 + lda flying_map,Y ; load from array ; 4 + + bcc @update_cache ; 3 + ;============ + ; 11 +@ocean_color: + and #$1f ; 2 + tay ; 2 + lda water_map,Y ; the color of the sea ; 4 + ;=========== + ; 8 + +@update_cache: + sta map_color_label+1 ; self-modifying ; 4 + + ;=========== + ; 4 + +; rts ; 6 diff --git a/mode7_demo/mode7.s b/mode7_demo/mode7.s index ecbe74bd..0b9be779 100644 --- a/mode7_demo/mode7.s +++ b/mode7_demo/mode7.s @@ -303,7 +303,7 @@ check_over_water: lda CY_I ; 3 sta SPACEY_I ; 3 - jsr lookup_map ; 6 + jsr lookup_island_map ; 6 sec ; 2 sbc #COLOR_BOTH_DARKBLUE ; 2 @@ -914,11 +914,8 @@ screenx_loop: nomatch: ; Get color to draw in A -.if .def(ISLAND_MAP) .include "island_lookup.s" -.elseif .def(CHECKERBOARD_MAP) - .include "checkerboard_lookup.s" -.endif +; .include "checkerboard_lookup.s" match: @@ -1009,15 +1006,13 @@ done_screeny: ; CLOBBERS: A,Y ; this is used to check if above water or grass ; the high-performance per-pixel version has been inlined -lookup_map: - -.if .def(ISLAND_MAP) +lookup_island_map: .include "island_lookup.s" -.elseif .def(CHECKERBOARD_MAP) + + rts ; 6 + +lookup_checkerboard_map: .include "checkerboard_lookup.s" -.elseif .def(RAINBOW_MAP) - .include "rainbow_lookup.s" -.endif rts ; 6 diff --git a/mode7_demo/mode7_demo.dsk b/mode7_demo/mode7_demo.dsk index 766c66b5d458377632488087f38ffd9a4be59ee8..9fb4c016cbb5a8fc23a4dc99d1e6eddeda65f725 100644 GIT binary patch delta 1929 zcmZ|Pe@q)?7zglskHSj%(Yg?3~jIkmclYv4(&)l0EsA$hUQve)pj_KbPGwsAqDP) z@IDA72r=xoLA`;j>7!&7-mHcPYP|g8#fQIvD^MR%TVvpUM;}?$B~lCh)p|3V6(;?E zg6kIN2qt|q3AP5bBeLB#!FP|cg6evKUG4GT!NJJ0Ea@P(o!VlcSiVF4fp18<%ntDm zt8eG^p@1v5evzzt2DR6gD~zd-nbvEv$@pE8zmU}*yq-Oo?CU)H2s=e?_>(Qd{MQ4r zddsWZ$!%?spGh6K25P{x>U|OHP(S(+DC&)C06u;RlVM#T5xs)M*f!b%rVdrSH2oN#*X@8o+*GNv}407~Rvg{~-c2d35d&^rB3p?4Je0H$?Vi_k($%Q4-_ z8&*v3!L$jFM_ZuVjdk*m zcfnP$nKMkk3{C~ef(lU)+J>yC7}-z>Dn(_e9NFE18@NSxikm0H?b4RqzT1-9REpcj z>?zIR_Mpja%HYPJdDd{rR_2oR@?7TiQZBQltjnd%E_22*E|(O;W#_|^7NEN% z{wKkcc{=x}bnaz3d9R=JkNCqRJSH)Go(#_}gJ-GFHj%l6q5h| delta 351 zcmW-cze~el5QcMK(=;YANmDBY!QOp?Qv6XnS`a6}$<|FMiXavL0dZ9%i;KfIWO1-= z=_D!yM~7nF+#DMhH){q#K{S4Pybs**yvrTN`k~AXEVzI{&4puIk&}K((mw==$H`lNfI` zpdfZzlk+{-f061ZJn>WPxeuMBwpvLZ&Xerk1w1-?6(`AbA62Qkk|4hiMd(MpS+)#L z;Nhhgs{RoFH*s2@5c3Cl@7^o5zx=8G?Y-9?`qSH37wZQ_s0T+4ScbLWt^wn0%@duK zMe)7qloSOGG||FQw9z4jfEZ;+l@AQAL73(kX_O