diff --git a/megademo/Makefile b/megademo/Makefile index 10433dc1..e059ce41 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 \ + waterfall.s gr_unrolled_copy.s waterfall_page1.inc waterfall_page2.inc \ takeoff.s takeoff.inc takeoff.img.lz4 \ mode7.s \ fireworks.s fw_background.inc fw_state_machine.s fw.s \ diff --git a/megademo/bird_mountain.s b/megademo/bird_mountain.s index 5d7dbfd0..32d63a3d 100644 --- a/megademo/bird_mountain.s +++ b/megademo/bird_mountain.s @@ -495,8 +495,8 @@ letters_bm: .byte 3,16,"IS HARD!" .byte 255 -.align $100 -.include "tfv_sprites.inc" +;.align $100 +;.include "tfv_sprites.inc" katahdin: .incbin "KATC.BIN.lz4",11 ; skip the header diff --git a/megademo/gr_unrolled_copy.s b/megademo/gr_unrolled_copy.s new file mode 100644 index 00000000..4c89fc95 --- /dev/null +++ b/megademo/gr_unrolled_copy.s @@ -0,0 +1,648 @@ + ;========================================================= + ; fast copy rows 22-36 from $C00 to $400 + ;========================================================= + ; + ; 6 + 7*8*40 = 2246 cycles + ; 6*7*40 = 1680 bytes of code? + +gr_copy_row22: + +;= y = 22 $5a8 $da8/$9a8 ========================= + ; x=0,y=22 + lda $da8 + sta $5a8 + lda $da9 + sta $5a9 + lda $daa + sta $5aa + lda $dab + sta $5ab + lda $dac + sta $5ac + lda $dad + sta $5ad + lda $dae + sta $5ae + lda $daf + sta $5af + + ; x=8,y=22 + lda $db0 + sta $5b0 + lda $db1 + sta $5b1 + lda $db2 + sta $5b2 + lda $db3 + sta $5b3 + lda $db4 + sta $5b4 + lda $db5 + sta $5b5 + lda $db6 + sta $5b6 + lda $db7 + sta $5b7 + + ; x=16,y=22 + lda $db8 + sta $5b8 + lda $db9 + sta $5b9 + lda $dba + sta $5ba + lda $dbb + sta $5bb + lda $dbc + sta $5bc + lda $dbd + sta $5bd + lda $dbe + sta $5be + lda $dbf + sta $5bf + + ; x=24,y=22 + lda $dc0 + sta $5c0 + lda $dc1 + sta $5c1 + lda $dc2 + sta $5c2 + lda $dc3 + sta $5c3 + lda $dc4 + sta $5c4 + lda $dc5 + sta $5c5 + lda $dc6 + sta $5c6 + lda $dc7 + sta $5c7 + + ; x=32,y=22 + lda $dc8 + sta $5c8 + lda $dc9 + sta $5c9 + lda $dca + sta $5ca + lda $dcb + sta $5cb + lda $dcc + sta $5cc + lda $dcd + sta $5cd + lda $dce + sta $5ce + lda $dcf + sta $5cf + +;= y = 24 $628 $e28/$a28 ========================= + ; x=0,y=24 + lda $e28 + sta $628 + lda $e29 + sta $629 + lda $e2a + sta $62a + lda $e2b + sta $62b + lda $e2c + sta $62c + lda $e2d + sta $62d + lda $e2e + sta $62e + lda $e2f + sta $62f + + ; x=8,y=24 + lda $e30 + sta $630 + lda $e31 + sta $631 + lda $e32 + sta $632 + lda $e33 + sta $633 + lda $e34 + sta $634 + lda $e35 + sta $635 + lda $e36 + sta $636 + lda $e37 + sta $637 + + ; x=16,y=24 + lda $e38 + sta $638 + lda $e39 + sta $639 + lda $e3a + sta $63a + lda $e3b + sta $63b + lda $e3c + sta $63c + lda $e3d + sta $63d + lda $e3e + sta $63e + lda $e3f + sta $63f + + ; x=24,y=24 + lda $e40 + sta $640 + lda $e41 + sta $641 + lda $e42 + sta $642 + lda $e43 + sta $643 + lda $e44 + sta $644 + lda $e45 + sta $645 + lda $e46 + sta $646 + lda $e47 + sta $647 + + ; x=32,y=24 + lda $e48 + sta $648 + lda $e49 + sta $649 + lda $e4a + sta $64a + lda $e4b + sta $64b + lda $e4c + sta $64c + lda $e4d + sta $64d + lda $e4e + sta $64e + lda $e4f + sta $64f + +;= y = 26 $6a8 $ea8/$aa8 ========================= + ; x=0,y=26 + lda $ea8 + sta $6a8 + lda $ea9 + sta $6a9 + lda $eaa + sta $6aa + lda $eab + sta $6ab + lda $eac + sta $6ac + lda $ead + sta $6ad + lda $eae + sta $6ae + lda $eaf + sta $6af + + ; x=8,y=26 + lda $eb0 + sta $6b0 + lda $eb1 + sta $6b1 + lda $eb2 + sta $6b2 + lda $eb3 + sta $6b3 + lda $eb4 + sta $6b4 + lda $eb5 + sta $6b5 + lda $eb6 + sta $6b6 + lda $eb7 + sta $6b7 + + ; x=16,y=26 + lda $eb8 + sta $6b8 + lda $eb9 + sta $6b9 + lda $eba + sta $6ba + lda $ebb + sta $6bb + lda $ebc + sta $6bc + lda $ebd + sta $6bd + lda $ebe + sta $6be + lda $ebf + sta $6bf + + ; x=24,y=26 + lda $ec0 + sta $6c0 + lda $ec1 + sta $6c1 + lda $ec2 + sta $6c2 + lda $ec3 + sta $6c3 + lda $ec4 + sta $6c4 + lda $ec5 + sta $6c5 + lda $ec6 + sta $6c6 + lda $ec7 + sta $6c7 + + ; x=32,y=26 + lda $ec8 + sta $6c8 + lda $ec9 + sta $6c9 + lda $eca + sta $6ca + lda $ecb + sta $6cb + lda $ecc + sta $6cc + lda $ecd + sta $6cd + lda $ece + sta $6ce + lda $ecf + sta $6cf + +;= y = 28 $728 $f28/$b28 ========================= + ; x=0,y=28 + lda $f28 + sta $728 + lda $f29 + sta $729 + lda $f2a + sta $72a + lda $f2b + sta $72b + lda $f2c + sta $72c + lda $f2d + sta $72d + lda $f2e + sta $72e + lda $f2f + sta $72f + + ; x=8,y=28 + lda $f30 + sta $730 + lda $f31 + sta $731 + lda $f32 + sta $732 + lda $f33 + sta $733 + lda $f34 + sta $734 + lda $f35 + sta $735 + lda $f36 + sta $736 + lda $f37 + sta $737 + + ; x=16,y=28 + lda $f38 + sta $738 + lda $f39 + sta $739 + lda $f3a + sta $73a + lda $f3b + sta $73b + lda $f3c + sta $73c + lda $f3d + sta $73d + lda $f3e + sta $73e + lda $f3f + sta $73f + + ; x=24,y=28 + lda $f40 + sta $740 + lda $f41 + sta $741 + lda $f42 + sta $742 + lda $f43 + sta $743 + lda $f44 + sta $744 + lda $f45 + sta $745 + lda $f46 + sta $746 + lda $f47 + sta $747 + + ; x=32,y=28 + lda $f48 + sta $748 + lda $f49 + sta $749 + lda $f4a + sta $74a + lda $f4b + sta $74b + lda $f4c + sta $74c + lda $f4d + sta $74d + lda $f4e + sta $74e + lda $f4f + sta $74f + +;= y = 30 $7a8 $fa8/$ba8 ========================= + ; x=0,y=30 + lda $fa8 + sta $7a8 + lda $fa9 + sta $7a9 + lda $faa + sta $7aa + lda $fab + sta $7ab + lda $fac + sta $7ac + lda $fad + sta $7ad + lda $fae + sta $7ae + lda $faf + sta $7af + + ; x=8,y=30 + lda $fb0 + sta $7b0 + lda $fb1 + sta $7b1 + lda $fb2 + sta $7b2 + lda $fb3 + sta $7b3 + lda $fb4 + sta $7b4 + lda $fb5 + sta $7b5 + lda $fb6 + sta $7b6 + lda $fb7 + sta $7b7 + + ; x=16,y=30 + lda $fb8 + sta $7b8 + lda $fb9 + sta $7b9 + lda $fba + sta $7ba + lda $fbb + sta $7bb + lda $fbc + sta $7bc + lda $fbd + sta $7bd + lda $fbe + sta $7be + lda $fbf + sta $7bf + + ; x=24,y=30 + lda $fc0 + sta $7c0 + lda $fc1 + sta $7c1 + lda $fc2 + sta $7c2 + lda $fc3 + sta $7c3 + lda $fc4 + sta $7c4 + lda $fc5 + sta $7c5 + lda $fc6 + sta $7c6 + lda $fc7 + sta $7c7 + + ; x=32,y=30 + lda $fc8 + sta $7c8 + lda $fc9 + sta $7c9 + lda $fca + sta $7ca + lda $fcb + sta $7cb + lda $fcc + sta $7cc + lda $fcd + sta $7cd + lda $fce + sta $7ce + lda $fcf + sta $7cf + +;= y = 32 $450 $c50/$850 ========================= + ; x=0,y=32 + lda $c50 + sta $450 + lda $c51 + sta $451 + lda $c52 + sta $452 + lda $c53 + sta $453 + lda $c54 + sta $454 + lda $c55 + sta $455 + lda $c56 + sta $456 + lda $c57 + sta $457 + + ; x=8,y=32 + lda $c58 + sta $458 + lda $c59 + sta $459 + lda $c5a + sta $45a + lda $c5b + sta $45b + lda $c5c + sta $45c + lda $c5d + sta $45d + lda $c5e + sta $45e + lda $c5f + sta $45f + + ; x=16,y=32 + lda $c60 + sta $460 + lda $c61 + sta $461 + lda $c62 + sta $462 + lda $c63 + sta $463 + lda $c64 + sta $464 + lda $c65 + sta $465 + lda $c66 + sta $466 + lda $c67 + sta $467 + + ; x=24,y=32 + lda $c68 + sta $468 + lda $c69 + sta $469 + lda $c6a + sta $46a + lda $c6b + sta $46b + lda $c6c + sta $46c + lda $c6d + sta $46d + lda $c6e + sta $46e + lda $c6f + sta $46f + + ; x=32,y=32 + lda $c70 + sta $470 + lda $c71 + sta $471 + lda $c72 + sta $472 + lda $c73 + sta $473 + lda $c74 + sta $474 + lda $c75 + sta $475 + lda $c76 + sta $476 + lda $c77 + sta $477 + +;= y = 34 $4d0 $cd0/$8d0 ========================= + ; x=0,y=34 + lda $cd0 + sta $4d0 + lda $cd1 + sta $4d1 + lda $cd2 + sta $4d2 + lda $cd3 + sta $4d3 + lda $cd4 + sta $4d4 + lda $cd5 + sta $4d5 + lda $cd6 + sta $4d6 + lda $cd7 + sta $4d7 + + ; x=8,y=34 + lda $cd8 + sta $4d8 + lda $cd9 + sta $4d9 + lda $cda + sta $4da + lda $cdb + sta $4db + lda $cdc + sta $4dc + lda $cdd + sta $4dd + lda $cde + sta $4de + lda $cdf + sta $4df + + ; x=16,y=34 + lda $ce0 + sta $4e0 + lda $ce1 + sta $4e1 + lda $ce2 + sta $4e2 + lda $ce3 + sta $4e3 + lda $ce4 + sta $4e4 + lda $ce5 + sta $4e5 + lda $ce6 + sta $4e6 + lda $ce7 + sta $4e7 + + ; x=24,y=34 + lda $ce8 + sta $4e8 + lda $ce9 + sta $4e9 + lda $cea + sta $4ea + lda $ceb + sta $4eb + lda $cec + sta $4ec + lda $ced + sta $4ed + lda $cee + sta $4ee + lda $cef + sta $4ef + + ; x=32,y=34 + lda $cf0 + sta $4f0 + lda $cf1 + sta $4f1 + lda $cf2 + sta $4f2 + lda $cf3 + sta $4f3 + lda $cf4 + sta $4f4 + lda $cf5 + sta $4f5 + lda $cf6 + sta $4f6 + lda $cf7 + sta $4f7 + + rts ; 6 + diff --git a/megademo/megademo.s b/megademo/megademo.s index 49ddc8c6..b5b68853 100644 --- a/megademo/megademo.s +++ b/megademo/megademo.s @@ -25,7 +25,7 @@ apple_iie: ;=================== jsr HOME - jsr rocket_takeoff + jsr waterfall ; C64 Opening Sequence @@ -49,9 +49,10 @@ apple_iie: ; Leaving house ; Riding bird - jsr bird_mountain +; jsr bird_mountain ; Waterfall + jsr waterfall ; Enter ship jsr rocket_takeoff @@ -94,9 +95,23 @@ loop_forever: .align $100 .include "fireworks.s" .include "hgr.s" - .include "bird_mountain.s" +; .include "bird_mountain.s" .include "move_letters.s" .align $100 .include "gr_putsprite.s" ; .include "mode7.s" .include "takeoff.s" + .include "waterfall.s" + + +;============================ +; Include Sprites +;============================ +.align $100 + .include "tfv_sprites.inc" + +;============================ +; Include Graphics +;============================ + + diff --git a/megademo/tfv_sprites.inc b/megademo/tfv_sprites.inc index dee1657f..80c14893 100644 --- a/megademo/tfv_sprites.inc +++ b/megademo/tfv_sprites.inc @@ -45,3 +45,32 @@ big_tree: ; 00=12 0X=0 X0=4 XX=9 ; = 33 + Y*(52)+ [30A + 64B + 69C + 54D]-Y ; = 33 + 5*52 + 30*12 + 69*4 + 54*9 - 5 = 1410 + +bird_rider_stand_left: + .byte $6,$7 + .byte $00,$00,$00,$bd,$dd,$00 + .byte $90,$dd,$00,$db,$dd,$00 + .byte $00,$dd,$02,$22,$00,$00 + .byte $00,$dd,$22,$d2,$dd,$0d + .byte $00,$8d,$82,$0d,$00,$00 + .byte $00,$00,$99,$00,$00,$00 + .byte $00,$90,$99,$00,$00,$00 + ; 00=22 0X=3 X0=2 XX=15 + ; = 33 + Y*(52)+ [30A + 64B + 69C + 54D]-Y + ; = 33 + 7*52 + 30*22 + 64*3 + 69*2 + 54*15 - 7 + ; = 2190 + +bird_rider_walk_left: + .byte $6,$7 + .byte $00,$00,$00,$bd,$dd,$00 + .byte $90,$dd,$00,$db,$dd,$00 + .byte $00,$dd,$02,$22,$00,$00 + .byte $00,$dd,$22,$d2,$dd,$0d + .byte $00,$8d,$82,$0d,$00,$00 + .byte $00,$00,$99,$00,$00,$00 + .byte $00,$99,$00,$99,$00,$00 + ; 00=22 0X=3 X0=1 XX=16 + ; = 33 + Y*(52)+ [30A + 64B + 69C + 54D]-Y + ; = 33 + 7*52 + 30*22 + 64*3 + 69*1 + 54*16 - 7 + ; = 2175 + diff --git a/megademo/waterfall.s b/megademo/waterfall.s new file mode 100644 index 00000000..0f19bcb3 --- /dev/null +++ b/megademo/waterfall.s @@ -0,0 +1,1047 @@ +; Lo-res cycle-counting water transparency hack + +; by deater (Vince Weaver) + +; Zero Page +;FRAMEBUFFER = $00 ; $00 - $0F +;YPOS = $10 +YPOS_SIN = $11 +BIRD_STATE = $E0 +BIRD_DIR = $E1 +OLD_XPOS = $F4 + +; location we don't care about + +DUMMY = $300 + +waterfall: + + ;=================== + ; init screen + jsr TEXT + jsr HOME + bit PAGE0 + + ;=================== + ; init vars + lda #0 + sta BIRD_DIR + sta BIRD_STATE + sta FRAME + sta OLD_XPOS + + lda #4 + sta DRAW_PAGE + sta XPOS + + ;============================= + ; Load foreground to graphic page1 (apple page2) + + lda #$0c + sta BASH + lda #$00 + sta BASL ; load image to $c00 + + lda #waterfall_page1 + sta GBASH + jsr load_rle_gr + + jsr gr_copy_to_current ; copy to page1 + + ;============================= + ; Load bg to memory + + lda #$0c + sta BASH + lda #$00 + sta BASL ; load image to $c00 + + lda #waterfall_page2 + sta GBASH + jsr load_rle_gr + + ;============================== + ; 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 +wfloopA:ldx #9 ; 2 +wfloopB:dex ; 2 + bne wfloopB ; 2nt/3 + dey ; 2 + bne wfloopA ; 2nt/3 + + jmp wf_display_loop + +wf_jump_table: + .word (display_even-1) + .word (display_odd-1) + .word (display_three-1) + .word (display_four-1) + +.align $100 + + + ;================================================ + ; Display 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 + + ; jump_table + ; 38 + display_odd + + ; we have 3 (the jmp back) + ; = 3 cycles that need to be eaten by the vblank + +wf_display_loop: + inc FRAME ; 5 + lda FRAME ; 3 + and #$30 ; 2 + + ; 0011 0000, so more or less div by 16, 3.75Hz + + lsr ; 2 + lsr ; 2 + lsr ; 2 + tay ; 2 ; 18 + + lda wf_jump_table+1,y ; 4 + pha ; 3 + lda wf_jump_table,y ; 4 + pha ; 3 + rts ; 6 ; 38 + +wf_display_loop_return: + +vblank: + ;====================================================== + ; We have 4550 cycles in the vblank, use them wisely + ;====================================================== + ; do_nothing should be 4550 + ; -3 letfover from HBLANK code + ; ** -9 + ; -49 check for keypress + ; -2252 copy screen + ; -2231 draw sprite + ; ============= + ; 15 cycles + + ; 15 cycles + inc YPOS ; 5 + nop ; 2 + nop ; 2 + lda YPOS ; 3 + lda YPOS ; 3 + + + + ;========================= + ; Clear background + ;========================= + + jsr gr_copy_row22 ; 6+ 2246 + ;========= + ; 2252 + + + ;========================== + ; draw bird sprite + ;========================== + ; 8 prefix + ; bird_walk_right= 14 + 2175 2206 (need 17) + ; bird_stand_right= 13 + 2190 2206 (need 3) + ; bird_walk_left= 15 + 2175 2206 (need 16) + ; bird_stand_left= 14 + 2190 2206 (need 2) + ; call to sprite 17 postfix + ;==================================================== + ; 2231 + + lda BIRD_STATE ; 3 + and #1 ; 2 + ldx BIRD_DIR ; 3 + bne bird_left + +bird_right: + ; 2 + cmp #1 ; 2 + beq bird_walk_right + ; 2 +bird_stand_right: + ldx #>bird_rider_stand_right ; 2 + ldy #bird_rider_walk_right ; 2 + ldy #bird_rider_stand_left ; 2 + ldy #bird_rider_walk_left ; 2 + ldy #