From eda94e147b0d8df2c9ee11f8b94171eefde79169 Mon Sep 17 00:00:00 2001 From: Natt Akuma Date: Sun, 23 Nov 2025 00:09:53 +0700 Subject: [PATCH] WIP sky scroller --- .gitignore | 3 +- assets/tileset_c64.png | Bin 6142 -> 6055 bytes loader/samples/minexample/Makefile | 34 +-- loader/samples/minexample/minexample.s | 234 ++++++++++++------- loader/samples/minexample/sky_scroll.bin | Bin 0 -> 2560 bytes loader/samples/minexample/sky_scroll_map.bin | Bin 0 -> 5784 bytes loader/samples/minexample/tilemap.bin | Bin 5784 -> 0 bytes loader/samples/minexample/tilemap.bin.lz | Bin 3084 -> 0 bytes 8 files changed, 165 insertions(+), 106 deletions(-) create mode 100644 loader/samples/minexample/sky_scroll.bin create mode 100644 loader/samples/minexample/sky_scroll_map.bin delete mode 100644 loader/samples/minexample/tilemap.bin delete mode 100644 loader/samples/minexample/tilemap.bin.lz diff --git a/.gitignore b/.gitignore index dcc1bf5..32b1aee 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,6 @@ loader/tools/cc1541/cc1541 loader/samples/minexample/*.bak loader/samples/minexample/*.o -loader/samples/minexample/*.zx0 loader/samples/minexample/*.zx0.prg +loader/samples/minexample/*.lz.prg +loader/samples/minexample/*.tmp diff --git a/assets/tileset_c64.png b/assets/tileset_c64.png index 1a3137e67dcaafb03bbb2df9aca5ff252911ab6e..0612bd1193744950f2e9e59b989c8e6f60ef68ca 100644 GIT binary patch delta 5746 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 delta 5834 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 U9jRNj#{d8T07*qoM6N<$f^I+oz5oCK diff --git a/loader/samples/minexample/Makefile b/loader/samples/minexample/Makefile index e147bf6..4356bd0 100644 --- a/loader/samples/minexample/Makefile +++ b/loader/samples/minexample/Makefile @@ -137,10 +137,11 @@ ZX0PRGS = \ field.zx0.prg \ falling_star.zx0.prg \ lilia.zx0.prg \ - lilia_hero.zx0.prg + lilia_hero.zx0.prg \ + sky_scroll.zx0.prg -LZS = \ - tilemap.bin.lz +LZPRGS = \ + sky_scroll_map.lz.prg default: diskimage @@ -153,12 +154,12 @@ tellarch: loader: $(LOADER) $(LOADER): $(LOADERCFG) - make -C $(LOADER_SRC) EXTCONFIGPATH=../samples/$(NAME) PLATFORM=$(_PLATFORM_) INSTALL=1800 RESIDENT=0F00 ZP=02 prg + make -C $(LOADER_SRC) EXTCONFIGPATH=../samples/$(NAME) PLATFORM=$(_PLATFORM_) INSTALL=0a00 RESIDENT=0900 ZP=02 prg assemble: $(ASSEMBLE) -$(ASSEMBLE): $(SOURCE) $(LOADER) $(LOADERCFG) $(ZX0PRGS) $(LZS) +$(ASSEMBLE): $(SOURCE) $(LOADER) $(LOADERCFG) $(MKDIR) $(BUILDDIR) $(MKDIR) $(INTERMDIR) ifeq ($(_PLATFORM_),c64) @@ -172,14 +173,13 @@ endif diskimage: $(DISKIMAGE) -$(DISKIMAGE): $(ASSEMBLE) $(CC1541) +$(DISKIMAGE): $(ASSEMBLE) $(CC1541) $(ZX0PRGS) $(LZPRGS) $(RM) $@ - $(CC1541) -n "ys2 intro" -i otomata \ - -f "ys2" -w $< \ + $(CC1541) -n "otomata labs" -i " 2025" \ + -f "ys2intro" -w $< \ -f "sid" -w use_this_sid.bin \ -f "badguy" -w badguy.zx0.prg \ -f "font" -w font.bin \ - -f "scrmap" -w tilemap.bin.lz \ -f "intrbmp" -w title_320-prepared.zx0.prg \ -f "tower" -w tower.zx0.prg \ -f "towerbm" -w tower_beam.zx0.prg \ @@ -187,6 +187,8 @@ $(DISKIMAGE): $(ASSEMBLE) $(CC1541) -f "fallstar" -w falling_star.zx0.prg \ -f "lilia" -w lilia.zx0.prg \ -f "lilhero" -w lilia_hero.zx0.prg \ + -f "skyscr" -w sky_scroll.zx0.prg \ + -f "skyscrmap" -w sky_scroll_map.lz.prg \ $@ @@ -211,15 +213,17 @@ $(ZX02): make -C $(ZX02_SRC) build/zx02 %.zx0.prg: %.bin $(ZX02) - $(ZX02) $< $<.zx0 - $(PRINTF) "\x00\x80" | cat - $<.zx0 > $@ - $(RM) $<.zx0 + $(ZX02) $< $@.tmp + $(PRINTF) "\x00\x80" | cat - $@.tmp > $@ + $(RM) $@.tmp -%.lz: % - $(PYTHON) aart_lz.py $< $@ +%.lz.prg: %.bin + $(PYTHON) aart_lz.py $< $@.tmp + $(PRINTF) "\x00\x90" | cat - $@.tmp > $@ + $(RM) $@.tmp clean: - -$(RM) $(ZX0PRGS) $(LZS) + -$(RM) $(ZX0PRGS) $(LZPRGS) -$(RM) *.o $(ASSEMBLE) $(DISKIMAGE) -$(RM) -rf $(INTERMDIR) -$(RM) $(BUILDDIR)/loader-c64.prg diff --git a/loader/samples/minexample/minexample.s b/loader/samples/minexample/minexample.s index f0369ad..1296114 100644 --- a/loader/samples/minexample/minexample.s +++ b/loader/samples/minexample/minexample.s @@ -43,10 +43,6 @@ copy_start: sei lda #$35 sta $01 - lda #>(code_end-CODE_START_ADDR) - sta $ff - lda #<(code_end-CODE_START_ADDR) - sta $fe lda #code_start sta $fb -@copy_loop: ldy #0 + ldx #>(code_end-CODE_START_ADDR) + beq :+++ +: lda ($fa), y sta ($fc), y - inc $fc - bne :+ - inc $fd -: - inc $fa - bne :+ + iny + bne :- inc $fb + inc $fd + dex + bne :- + beq :+ : - lda $fe - bne :+ - dec $ff + lda ($fa), y + sta ($fc), y + iny : - dec $fe - lda $fe - ora $ff - bne @copy_loop + cpy #<(code_end-CODE_START_ADDR) + bne :-- lda #$36 sta $01 @@ -86,7 +82,7 @@ copy_start: sei lda #$35 sta $01 - jmp CODE_START_ADDR + jmp part_9 .res loadraw - * .incbin "../../build/loader-c64.prg", 2 @@ -137,16 +133,7 @@ code_start: ldx #badguy - jsr loadraw - - lda #0 - sta ZX0_src - lda #$80 - sta ZX0_src+1 - lda #0 - sta ZX0_dst - lda #$20 - jsr zx02 + jsr load_8000_zx02_2000 lda #127 sta $dc0d @@ -189,16 +176,8 @@ code_start: sei ldx #introname - jsr loadraw - - lda #0 - sta ZX0_src - lda #$80 - sta ZX0_src+1 - lda #0 - sta ZX0_dst lda #$10 - jsr zx02 + jsr load_8000_zx02 ldx #sidname @@ -232,14 +211,8 @@ code_start: lda #1 sta timer_mode - lda #0 - sta ZX0_src - lda #$80 - sta ZX0_src+1 - lda #0 - sta ZX0_dst lda #$20 - jsr zx02 + jsr zx02_8000 : lda timer_reached @@ -285,15 +258,7 @@ code_start: ldx #towerbeamname - jsr loadraw - lda #0 - sta ZX0_src - lda #$80 - sta ZX0_src+1 - lda #0 - sta ZX0_dst - lda #$20 - jsr zx02 + jsr load_8000_zx02_2000 : lda timer_reached @@ -356,15 +321,7 @@ code_start: ldx #fieldname - jsr loadraw - lda #0 - sta ZX0_src - lda #$80 - sta ZX0_src+1 - lda #0 - sta ZX0_dst - lda #$20 - jsr zx02 + jsr load_8000_zx02_2000 : lda timer_reached @@ -441,15 +398,7 @@ code_start: ldx #fallingstarname - jsr loadraw - lda #0 - sta ZX0_src - lda #$80 - sta ZX0_src+1 - lda #0 - sta ZX0_dst - lda #$20 - jsr zx02 + jsr load_8000_zx02_2000 : lda timer_reached @@ -492,15 +441,7 @@ code_start: ldx #lilianame - jsr loadraw - lda #0 - sta ZX0_src - lda #$80 - sta ZX0_src+1 - lda #0 - sta ZX0_dst - lda #$20 - jsr zx02 + jsr load_8000_zx02_2000 : lda timer_reached @@ -547,15 +488,7 @@ code_start: ldx #liliaheroname - jsr loadraw - lda #0 - sta ZX0_src - lda #$80 - sta ZX0_src+1 - lda #0 - sta ZX0_dst - lda #$20 - jsr zx02 + jsr load_8000_zx02_2000 : lda timer_reached @@ -571,9 +504,110 @@ code_start: lda timer_reached beq :- +part_9: jsr init_bmp + + ldx #skyscrname + lda #$70 + jsr load_8000_zx02 + ldx #skyscrmapname + jsr loadraw + ldx #0 + ldy #$90 + jsr LZ_init_decomp + + ; $0c00-$0fff buffer 0 tilemap + ; $2000-$3fff buffer 0 bitmap + ; $4000-$5fff buffer 1 bitmap + ; $6000-$63ff buffer 1 tilemap + ; $6400-$67ff next buffer CRAM + ; $7000-$77ff tileset bitmap + ; $7800-$78ff tileset tile colors + ; $7900-$79ff tileset CRAM colors + ; $9000- compressed tilemap + + lda #$38 + sta $d018 + lda #<((17+4)*40+$c08) + sta text_ptr + lda #>((17+4)*40+$c08) + sta text_ptr+1 + ldx #16 +: + lda #0 + lda text_ptr + sec + sbc #40 + sta text_ptr + sta scr_ptr + sta cram_ptr + sta bmp_ptr + lda text_ptr+1 + sbc #0 + sta text_ptr+1 + sta scr_ptr+1 + ; carry is always set here + adc #$d8-$0c-1 + sta cram_ptr+1 + adc #<(($20>>3)-$d8) + asl bmp_ptr + rol a + asl bmp_ptr + rol a + asl bmp_ptr + rol a + sta bmp_ptr+1 + stx temp+1 + jsr drawrow + ldx temp+1 + dex + bpl :- + +: + stx $d020 + inx + jmp :- jmp * +drawrow: + ldy #0 +charloop: + sty temp + lda #$70>>3 + sta bmp_addr+1 + jsr LZ_get_byte + tax + asl a + rol bmp_addr+1 + asl a + rol bmp_addr+1 + asl a + rol bmp_addr+1 + sta bmp_addr + ldy #0 + .repeat 8, I + lda (bmp_addr),y + sta (bmp_ptr),y + iny + .endrepeat + clc + lda bmp_ptr + adc #8 + sta bmp_ptr + bne :+ + inc bmp_ptr+1 +: + ldy temp + lda $7800,x + sta (scr_ptr),y + lda $7900,x + sta (cram_ptr),y + iny + cpy #24 + bne charloop + rts intro: lda #0 @@ -1116,6 +1150,8 @@ fieldname: .byte "field", 0 fallingstarname: .byte "fallstar", 0 lilianame: .byte "lilia", 0 liliaheroname: .byte "lilhero", 0 +skyscrname: .byte "skyscr", 0 +skyscrmapname: .byte "skyscrmap", 0 darmtower_txt: @@ -1256,6 +1292,24 @@ run_nufli_bmp: .include "zx02.asm" .include "thcmod_lz.asm" +zx02_8000: + pha + jmp :+ + +load_8000_zx02_2000: + lda #$20 +load_8000_zx02: + pha + jsr loadraw +: + lda #0 + sta ZX0_src + sta ZX0_dst + lda #$80 + sta ZX0_src+1 + pla + jmp zx02 + story_writ: .res 11, ' ' .byte "story written by" diff --git a/loader/samples/minexample/sky_scroll.bin b/loader/samples/minexample/sky_scroll.bin new file mode 100644 index 0000000000000000000000000000000000000000..3594c01e48d7dc82a54c7f947bf29f000b435c92 GIT binary patch literal 2560 zcmaJ@4NP0t6~4A{2M-43$4$mIjfPA%P7FjO>O{TSG+2p}OtXWpUH)W8gq8fVDq~Wk zIW}xmRTZ^?La0y^LaAGPjWKP7x~7C@g)mhKnTs+Ltt|=+p$>NeGRH08pSyFPp{gov zpZw0f=iGD8&%NiJXN;4W+$-Ok{rs^Vgm~OTqtloS>@gbk*ywY;_xhDtjEUO|@~$oz zM|+G$)Ain~FI_&M$HlxN%?!;tqh_Pix7YS zRNNDYsCMKq{y`ZMqYQ-Z2EzZoScXtwBK!>v#I#{QDn)1&A&FChP!3*eNb!pgBe%fw^|(zO0gO1_4D)n z$Bx;ChQ@qju^9h;XJ=a{4R?03T!Qx_>+uBW;b0`PcpsNYG9X@rq8I(Eei$JSz$#@F zp>%B^{><)G|A>F;Rzay>h7iU^W4-b8>Dp6Gy8X6>W(t|zyLXRroLDS|^GmLt*4cEr zBh7V&y4q8x4j(>z@D8Q4tnBHhDX5i~bLE_{2CH!xM=#h) zHKk}xQ!#xcMaPa3rM&0=n?zPofpHIRF;lvdptC_!uQ@&$@IhjiZ;bLoghcFpmPTBU zadm_`Fs^TGY>ZPYu-M!UM`mro78(y?T+1`6$2J{8I>T}7v^{qj!{M>4b)TB**%*d8 z0)1?L&gNtflNseAS*tVk6`2&vTHAKCi9|9a#ZM_stSpW4mw}qF(Qwe96G>a!+ofi? zzM{n>$GAdTiL2!m{?)a$xob{TsRLuOy>lDN4sK0>;M1UaT|zRIkT+bn6R?UY}Qq8(VJN z*t2JkArI&6Yq3*{P#u(ZFFsyhPb4VH(!!Ncikx$6Ym6755o9!a{e&b-TauM7Ml9Zc zLA)B8powv!^!Rw5DRsL(y0IbD5lj3za5(Vg#ieDs0y|0wC&S>Mr%@;t)9-_iC-2wSW1<=+AFo8ALlAO( zCCY5}_I4gcew}Fl59N4Te_$VOJZ^)2aOhCxv+(}A-Coyd2l04(zJY!(359Oo{*23S z?eA{?bb30Hlb`c!PF3!<`T3>WbN`%Q&&}QSr^45>e|*djT+oOml3fGaut^r6F}gvB zivk_&m&<{6WXrLfk3I9t_}xh4bHJS^|9Z2|(%pZOyhCDBj=G-bUG6_x`+EA`?RmF- zr~LS|d6s@X^I6S54mF*mF>L^Mn{k-ZMQqWA5tNUv@<0H|ax-(&v$O_Xl}>U5F8M*# z{;DcVte`--UD;%7Lf1&Se49xQ*X?v(v)Q1MsLyli0Q4Gyv$HXcKZ;CF%H@=Q%{S1{ z)D-<{z~j@#9=z0Ed2oAPwS421(4CFXqfuy47x|%)A>>5Pmu+thf;m)BaH#-^IdNLr zj?{vJRHbq|g3*a&EI6?krKYAJhojkA`=q&XeQAAhu^VGwAMarI%eqpshD1)leLNR-VIiDZ34$+9{l;|Y3o{Oa)VFd@*B z+uGh5ek(X@nlT^E??oA@Dozz5;F84?y26qgBn13sa;kC_wrm@Pbl+j$r=2?scBZ8j zrKyTktwo0!zB|m7bMFw$VN0#%}OAw?Q-=GGJ66BJ7hjy%R_{8 zm>v)V<-fhVT4JDP~PYBcz|bEf%G;H zz{kT22Vm+UI2^%W@?zP+Fnu@`u;lT0$3~_k9$)Oyo>GLM2#FgT5nFR%gYeyDdzmc( zu=%TD4_PWI7NAy-j~9=RkK65M1lR#*&Zt!ObLU{DPzVD^9zHyC_Mt$E?J9M#+OAe8 z?Dq4*kL|f2z-~WRSXii57Zrg>t$tWvUj)luB{_yh^PGCkn;FId~cx&I+iiiZGKG*cJf9mxMx*6nvK|6l!pM_H0ALrav}p zGD4k7IZpaNAOf(ZB>lb;Cl&pG>yR fZer8mw;qKcnUPIjg2`_Kf(6)+`Q0coliYs+FQbda literal 0 HcmV?d00001 diff --git a/loader/samples/minexample/sky_scroll_map.bin b/loader/samples/minexample/sky_scroll_map.bin new file mode 100644 index 0000000000000000000000000000000000000000..97d15f745371037384362a7ca423df178785610a GIT binary patch literal 5784 zcmd^BdvH`&8Q+XW&@whsn!U?D?pk;6jp&N+ccmqjw$^I3lqtJ;XwWn$IE45hf$qJv zV>bZ>-%@-khKJcr*riOeOG9Ox!QXezeVl#F)IU1@ z<43snoZs(zpKtHI@wg!0{05g_WU~Sq=kU+7Bm({bDgTVaA|5Y1V4)@YF#R*Rc(MTb zli(=+*FO@*kZjgw27mvTKiC`C@pbOuzMe;a{Tqwu>*?vidax(6_qoS@o67X{oMV0f zL$cYPsi{XZnN((~=iw)bc<#YH`}X}Ro87l(-{X((+4Ioe$1=>-Q#>)cG5N_udwIaZ zQ_PNXX4z+dneDTqvrzFkF?~NpESL;hnSmS3_GKSTB!2YcL?ZFGM-rSFOgxfE{0>Os z2R}?CCdPO4_MRX=6B85Ty}di|?|a|x-BH~A?QiYcd65Mu?%uVNw%_^g&fU7cdzY^3 z7mF8*^SGN^T`v?~X4{g>CDv4;u(A~{@lKO#zA`x;j74-VWHn!%ftjOcuZoq*#d!#F zwso)|%*xgAZ`NcH`X$o@p@j6y;xbAoN(fV?DKP(oB}yzQnTO;hRuDzA=F+^Jew5K$of0(rs2%+2!XOw(=yDbDJ2 zj#a86vw2%p%mR$K71m|yW5)%~UXD%bIuT{;7|Z`Sv6F%whj}~fGZ~wNmMG+IvK)j$ zg`#NmDy%0a?l1Ln1{6(<{;>H^Tudp9y(^@idBBKIk33@ll$0Y^+G4c ztK(zUpFe1PRehXaHJqlS66Z5hfy4I+>+}Q?KiDeg$9$NhiJ`aV-kcXU(pZ}hI$=nm zYE9U2dqv1`3ugBbTqzky34WM%{0AfAX@=A9LI?$g^bu35>{&W|)O21p_e00<+d)<2 z#d)~t`cR4jOfn<123hgn%OQqa8G$iNI%VP}V({@r#8<`{$O;gc$p5y=X zY&C2c$)o9!p|dC17MH)X#Srjg>BG;QNu9wSR?olS;KN6rKAp;pjOfoo{b`0Dg1&L+ zSSFQ9ojFYS3sWrAGbtna;=j+IKRrax{H1W90wg zJe~PlSU-}^3>d~y;jxXE=3HU+=qbWex;~uG^DlWCrrfz>nIz#O`YB`o0Z!%edF1p2 z!=KfsGW!oCjf44oexTp5@zHdK<3_*nia6{>hfDO~2>uBlD#NMl3LF5HeF6H1M177= zlYS*W&HPv5+_9)};aog7u%F}1>xI-A!uykX!@{ZFX#+UvB@YTXi+j2p&*cwN z+$Z2h)X!n+31{vFKSs)6`rM7<-^6)1%%>IC!O6XY<7j3sCk?2fN&#mb2Q|pO*ll(?@0=H7*ac@{KFj?CkDtYisj(!XEXLpVG8VKsq;a z4`ELz6jD8*;Pp1d2qmNjuipsaYW6j(gx_RugoP4TgKrl0)>2X=MZMSBId@bEX{%sR zJ9VIfA#I5f6XUAZkoFc;n5hLk+=Ix7^&Y3eJ@< z4GfHeH{EjUt+zFNY&AS%3`4josu$Cz1{+r0NIQ?m>j|k|T1!UPB@XB7sL|fzlLw&w&_jPys0s-$fyz<#wpKhJq+hzBL zFM`EafGAsKx2Cl;`sA;dpk3Z|T1$%@YiyFcEM{w0mk%*pqH-YG97A|w0D8TE>sq39 zb#A#P+US=dT{VpX$YOV`ysoxR^9SUbMt`)aMsAKp-@0_E7Fn{c4uQ2uWQiY9nrmvJ z+c0C>S7`1{xW8dR;O#3GH#J3@YnoYRR00yDIo!U|FE_=SW3s=?PK|QEZ@cW5qcO07 zMeYq-H<Df8(Ujqi#7l2kV?zdo8w!yxLmG< zt*?<|t+AM<)d7C}LYHd`1{{%Fzxvwd8=|ompqh3yG+iu4#}{0#t56paE!Pn2+8mE} zkSo`Mn&$PNU$0#QCrmbXn2UuqpZ#2`W^TmWhd%s~8$Jr)D_=uIfq3ux-v5CQvOSy& X_&eVDu6MtO@3(9gaF+{dz1s30F)D>4 literal 0 HcmV?d00001 diff --git a/loader/samples/minexample/tilemap.bin b/loader/samples/minexample/tilemap.bin deleted file mode 100644 index b713b021778ed8616dee39c0e94e0efc332352d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5784 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 diff --git a/loader/samples/minexample/tilemap.bin.lz b/loader/samples/minexample/tilemap.bin.lz deleted file mode 100644 index 3c260516ea9fd1c2ce66b001e6bbbfc5a4a5eb51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3084 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