From 36cf2fdc0a42749f149fc871643ba1f08369cd3a Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Thu, 4 Oct 2018 00:33:04 -0400 Subject: [PATCH] megademo: initial takeoff code --- megademo/Makefile | 11 +++ megademo/TODO | 29 +++--- megademo/fireworks.s | 12 +-- megademo/landing.png | Bin 3856 -> 0 bytes megademo/megademo.s | 10 +- megademo/takeoff.png | Bin 0 -> 3599 bytes megademo/takeoff.s | 200 +++++++++++++++++++++++++++++++++++++++ megademo/takeoff_hgr.png | Bin 0 -> 1542 bytes 8 files changed, 240 insertions(+), 22 deletions(-) delete mode 100644 megademo/landing.png create mode 100644 megademo/takeoff.png create mode 100644 megademo/takeoff.s create mode 100644 megademo/takeoff_hgr.png diff --git a/megademo/Makefile b/megademo/Makefile index 32cd4d8d..10433dc1 100644 --- a/megademo/Makefile +++ b/megademo/Makefile @@ -30,6 +30,7 @@ megademo.o: megademo.s \ starring_people.s fs.inc FS_HGRC.BIN.lz4 deater.inc DEATER_HGRC.BIN.lz4\ check_email.s email_40_96.inc \ bird_mountain.s \ + takeoff.s takeoff.inc takeoff.img.lz4 \ mode7.s \ fireworks.s fw_background.inc fw_state_machine.s fw.s \ hgr.s random16.s move_letters.s @@ -62,6 +63,16 @@ starring3.img: ./starring_3_hgr.png ../hgr-utils/png2hgr starring_3_hgr.png > starring3.img +#### +takeoff.inc: ./takeoff.png + $(PNG_TO_RLE) asm ./takeoff.png takeoff > takeoff.inc + +takeoff.img.lz4: takeoff.img + lz4 -f -16 takeoff.img + +takeoff.img: takeoff_hgr.png + ../hgr-utils/png2hgr takeoff_hgr.png > takeoff.img + #### fs.inc: ./fs.png diff --git a/megademo/TODO b/megademo/TODO index 6c2436de..8cd11878 100644 --- a/megademo/TODO +++ b/megademo/TODO @@ -1,65 +1,70 @@ Overall: fix off-by-one line vaporlock disk loader? + Load with HGR C64 at offset 0x2000 and then straight to 0x4000 + Trim the last 8 bytes off of all the lz4 files Music: compose music fit in RAM -c64_opener: +Timing: + Except for fireworks, 15s for each? 150s = 2min 30s + +0: c64_opener: get curtain-opening effect working add text to background -falling_apple: +1: falling_apple: make it fall? some sort of wipe? -starring: +2: starring: complete graphics figure out png2hgr off-by-one error? add wipe effect with tengwar: just draw 4 bytes yellow, 4 bytes from scroll buffer Add Susie starring role? -e-mail: +3: e-mail: Update to proper text Add susie? -leave house: +4: leave house: Green, a house on left? fence, bird? have mountain in background? -running bird: +5: running bird: run to middle of screen, then have everything start moving? update text -waterfall: +6: waterfall: finish packing down a bit -arrival at ship +7: arrival at ship top HGR, bottom gr close door flames going tree goes from big to small, horizon drops? -mode7: +8: mode7: change path change ground to night-time darkness. grey water -spacegame: +9: spacegame: saturn-like planet? raster bars? score at top? when done, blue horiz line? -arrive at frogysue: +10: arrive at frogysue: park ship on left amethys crystals? sky text/ground lgr? susie follow? haert when meet at center? -fireworks: +11: fireworks: update text diff --git a/megademo/fireworks.s b/megademo/fireworks.s index 2141e649..7646690e 100644 --- a/megademo/fireworks.s +++ b/megademo/fireworks.s @@ -3,7 +3,7 @@ ; HGR plus 40x48d page1/page2 every-1-scanline pageflip mode ; Zero Page -FRAMEBUFFER = $00 ; $00 - $0F +;FRAMEBUFFER = $00 ; $00 - $0F ;YPOS = $10 ;FRAME = $60 ;WAITING = $62 @@ -13,12 +13,12 @@ FRAMEBUFFER = $00 ; $00 - $0F ;LETTERY = $66 ;LETTERD = $67 ;LETTER = $68 -BLARGH = $69 -HGR_COLOR = $E4 -STATE = $ED +;BLARGH = $69 +;HGR_COLOR = $E4 +;STATE = $ED ;DRAW_PAGE = $EE -LASTKEY = $F1 -PADDLE_STATUS = $F2 +;LASTKEY = $F1 +;PADDLE_STATUS = $F2 ;================================== diff --git a/megademo/landing.png b/megademo/landing.png deleted file mode 100644 index ed0f20a05c75131c791766298cc49f890acef5d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3856 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 SEqjar0000 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 VHUp7n%(T%K literal 0 HcmV?d00001 diff --git a/megademo/takeoff.s b/megademo/takeoff.s new file mode 100644 index 00000000..fd42c938 --- /dev/null +++ b/megademo/takeoff.s @@ -0,0 +1,200 @@ +; Rocket Takeoff + +; Simple HGR/GR split + + +; STATE1 = RIDE IN ON BIRD +; STATE2 = OFF BIRD +; STATE3 = BIRD RUNS AWAY +; STATE4 = WALK INTO SHIP +; STATE5 = PAUSE +; STATE6 = SMOKE OUT BACK +; STATE7 = ROTATING FLAME SPRITES + TREES MOVING/SPEED UP +; also horizon drop away? + + + ; 5 4 3 2 1 blastoff, another rocketship run + ; o/~ Take me to the moon o/~ +rocket_takeoff: + + + ;=================== + ; init screen + bit KEYRESET + +setup_rocket: + + + ;=================== + ; init vars + + lda #0 + sta DRAW_PAGE + + + ;============================= + ; Load graphic hgr + + lda #takeoff_hgr + sta LZ4_SRC+1 + + lda #<(takeoff_hgr_end-8) ; skip checksum at end + sta LZ4_END + lda #>(takeoff_hgr_end-8) ; skip checksum at end + sta LZ4_END+1 + + lda #<$2000 + sta LZ4_DST + lda #>$2000 + sta LZ4_DST+1 + sta HGR_PAGE + + jsr lz4_decode + + jsr draw_stars + + ;============================= + ; Load graphic page0 + + lda #$0c + sta BASH + lda #$00 + sta BASL ; load image to $c00 + + + lda #takeoff + sta GBASH + + jsr load_rle_gr + + lda #4 + sta DRAW_PAGE + + jsr gr_copy_to_current ; copy to page1 + + ; GR part + bit PAGE1 + bit LORES ; 4 + bit SET_GR ; 4 + bit FULLGR ; 4 + + bit PAGE0 + + ;============================== + ; setup graphics for vapor lock + ;============================== + + jsr vapor_lock ; 6 + + ; vapor lock returns with us at beginning of hsync in line + ; 114 (7410 cycles), so with 5070 lines to go + + jsr gr_copy_to_current ; 6+ 9292 + + ; now we have 322 left + + ; GR part + bit LORES ; 4 + bit SET_GR ; 4 + bit FULLGR ; 4 + + ; 322 - 12 = 310 + ; - 3 for jmp + ; 307 + + ; Try X=9 Y=6 cycles=307 + + ldy #6 ; 2 +toloopA:ldx #9 ; 2 +toloopB:dex ; 2 + bne toloopB ; 2nt/3 + dey ; 2 + bne toloopA ; 2nt/3 + + jmp to_begin_loop +.align $100 + + + ;================================================ + ; Starring People Loop + ;================================================ + ; each scan line 65 cycles + ; 1 cycle each byte (40cycles) + 25 for horizontal + ; Total of 12480 cycles to draw screen + ; Vertical blank = 4550 cycles (70 scan lines) + ; Total of 17030 cycles to get back to where was + + ; want 12*4 = 48 lines of HIRES = 3120-4=3116 + ; want 192-48=144 lines of LORES = 9360-4=9356 + + + +to_begin_loop: + + bit HIRES ; 4 + + ; Try X=11 Y=51 cycles=3112 R4 + + nop + nop + ldy #51 ; 2 +toloop8:ldx #11 ; 2 +toloop9:dex ; 2 + bne toloop9 ; 2nt/3 + dey ; 2 + bne toloop8 ; 2nt/3 + + bit LORES ; 4 + + ; Try X=10 Y=167 cycles=9353 R3 + + lda $0 + + ldy #167 ; 2 +toloop6:ldx #10 ; 2 +toloop7:dex ; 2 + bne toloop7 ; 2nt/3 + dey ; 2 + bne toloop6 ; 2nt/3 + + + ;====================================================== + ; We have 4550 cycles in the vblank, use them wisely + ;====================================================== + + ; do_nothing should be 4550 + ; -10 keypress + ; =========== + ; 4540 + + ; Try X=9 Y=89 cycles=4540 + + ldy #89 ; 2 +toloop1:ldx #9 ; 2 +toloop2:dex ; 2 + bne toloop2 ; 2nt/3 + dey ; 2 + bne toloop1 ; 2nt/3 + + lda KEYPRESS ; 4 + bpl to_no_keypress ; 3 + jmp to_start_over +to_no_keypress: + + jmp to_begin_loop ; 3 + +to_start_over: + bit KEYRESET ; clear keypress ; 4 + rts ; 6 + + +.include "takeoff.inc" +takeoff_hgr: +.incbin "takeoff.img.lz4",11 +takeoff_hgr_end: + + diff --git a/megademo/takeoff_hgr.png b/megademo/takeoff_hgr.png new file mode 100644 index 0000000000000000000000000000000000000000..c4f6cf11abbf3dc0f06eb1c04b3d9364ea776647 GIT binary patch literal 1542 zcma)+`#aMM9LK-2X$+kymzmorbI3W!Az|ek5bduzauFaQ8F@Ho!^ z001ErzFh^ZxbuX38~{LS(uskLfbbMlB0V9B7Dq)f(h{jCYAP)X08+<4911DgZlNMe z(Qbl(G|4RMC&h-MPjg7U%Ok7vJwBhKv&=ofnyX>1b{|fEXRYWO#YpRF)8bpAT&gd3 z8)}FP=KehJ`{>5UHz|1&eM5qtznD1x{^=&^2}(BkFf{Pq%ygs6^Y|Q@10zL%D73S? zmh}EhJZ|0O`i67M39|L;xVi5+q3El9ix2Za`PFck`GotWkF$1p6y>SG0`)~JWx|)3 zAz6)>zfU~typ(>D6)L^U6l9ssr0*C`LA;_5iurBuug9?~gKzH|p4xkTJtMU1(|Org zsI@k3gppwR8qL$uf|eJ?24Zc$X~nk@Jd)y)lvb1-pnX2W=g&m?S75nk*ADuX1V+3W zV3wraChydp?p`*n=D0sX`;wHrt+qC(c6}qOg)ZNT6{;qLrD^_AOv$&I^1zp=%Kg%i zxsJSjjCRQC3W{9-j?l}#x6IU0sc5wwQF~oqW!`vGY(i=;53_N07+X$dBM3KzX1Zb} z%z)WUcH2LVF91}>%iPE9d1^C+N}`2+lP1U;y4P?=bgK*iSM}uuWawXn(K+Imh)Bk} z+n+r0hm}l;HxRY7K{t{GOwONLs^C?c)x{h++=%R>{f$QlSq{JpdWf=*nza*`hE*NXzU7hSn!Hf#Q`I4p;(it(|shI zV>o8~{J;*hMhGXJ7OCSp&h$+bmOKiF>m7^I2YamTv6-z6;Z&|Woe8+S(G{H3t2@3V zE~HK`C|%8t=MWsXl@x-GW+L8q)iH;%XE$|&z0{pc!)sbq3?6E{)mZPHun@>J1w+=B z!YP@jK7QuR=d9!O@&`@~uY7mqJ()|Mut1KO3s*IE6NKD(7F#IP+~%&qM;je;{@X2X zd90Oh_yRFlVnS>#T*e$DTRpiiiq@x?6{uhLOB zcunYrkz^%x(*wCJ@L_5}^SL};nP_|xl4!QaJ0f-WXdCbWfXPn0IZL3;k+i;aV-lbI z>mSlG%Gc?nGLjDCtf;GD-Mp9CdgL`9r6v3uOO*}}d^+vhQ5ki0a zIf_!5|Qrnxk+NND(#TJ>7^3 z0!mCk?XGYL-ziXjw4Tz=hvu9+X}pwSaUNl(9a$40BIXz8+8(ftvh4PG%&z;nP$V*l lM0bm9qauFFD8Bib5xj>Q*SgeT4pE3d>UivaPo6vF?EiIf!J+^F literal 0 HcmV?d00001