diff --git a/megademo/Makefile b/megademo/Makefile index 9077e0a4..7fc3bd1d 100644 --- a/megademo/Makefile +++ b/megademo/Makefile @@ -21,7 +21,7 @@ MEGADEMO: megademo.o megademo.o: megademo.s \ zp.inc hardware.inc \ - gr_hline.s gr_offsets.s vapor_lock.s delay_a.s \ + gr_hline.s gr_offsets.s vapor_lock.s delay_a.s wait_keypress.s \ c64_opener.s c64.img.lz4 \ falling_apple.s apple_40_96.inc ca65 -o megademo.o megademo.s -l megademo.lst diff --git a/megademo/c64_opener.s b/megademo/c64_opener.s index bb4fc504..75b27202 100644 --- a/megademo/c64_opener.s +++ b/megademo/c64_opener.s @@ -4,7 +4,16 @@ ; Apple II has a lot of trouble making clear text with bluish background ; would be a lot clearer if I used black and white +TOP = $F0 +BOTTOM = $F1 + c64_opener: + ;=================== + ; init vars + ;=================== + lda #0 + sta TOP + sta BOTTOM ;=================== ; set graphics mode @@ -34,7 +43,156 @@ c64_opener: jsr lz4_decode - rts + jsr wait_until_keypress + + + ;============================== + ; setup graphics for vapor lock + ;============================== + + jsr vapor_lock ; 6 + + bit PAGE0 ; first graphics page ; 4 + bit FULLGR ; full screen graphics ; 4 + bit HIRES ; hires mode !!! ; 4 + bit SET_GR ; graphics mode ; 4 + + ; vapor lock returns with us at beginning of hsync in line + ; 114 (7410 cycles), so with 5070 + 4550 lines to go (9620) + ; - 16 = 9604 + + ; Try X=57 Y=33 cycles=9604 + + ldy #33 ; 2 +loopcoA:ldx #57 ; 2 +loopcoB:dex ; 2 + bne loopcoB ; 2nt/3 + dey ; 2 + bne loopcoA ; 2nt/3 + + jmp c64_split +.align $100 + + + ;================================================ + ; c64_split + ;================================================ + ; We want to: + ; Wait 3s, just flashing cursor@1Hz + ; Then slowly open to text page0 + ; Count to 480? + ; Width = 0 - 40, 10 steps + +c64_split: + + ; kill 65*192 = 12480 + + ; Try X=24 Y=99 cycles=12475 R5 + + nop + lda $0 + + ldy #99 ; 2 +loopcoC:ldx #24 ; 2 +loopcoD:dex ; 2 + bne loopcoD ; 2nt/3 + dey ; 2 + bne loopcoC ; 2nt/3 + + + + ;====================================================== + ; We have 4550 cycles in the vblank, use them wisely + ;====================================================== + ; do_nothing should be 4550 + ; -10 keyboard handling + ; = 4540 + + clc ; 2 + lda BOTTOM ; 3 + adc #1 ; 2 + sta BOTTOM ; 3 + cmp #30 ; 2 + bne not_thirty ; 3/2 +thirty: + lda #0 ; 2 + sta BOTTOM ; 3 + lda TOP ; 3 + clc ; 2 + adc #1 ; 2 + sta TOP ; 3 +not_thirty: + + + + ; handle the cursor + ; FIXME: not aligned well. Do we care? + + lda TOP ; 3 + and #$1 ; 2 + beq cursor_off ; 3/2 +cursor_on: + ; it's lSB first + ; blue is 6 + ; 1 1111110 + lda #$fE ; blue ; 2 + sta $3300 ; 52 ; 4 + sta $3B00 ; 54 ; 4 + sta $2380 ; 56 ; 4 + sta $2B80 ; 58 ; 4 + ; purple is 2 + ; 0 1111110 + lda #$7E ; purple ; 2 + sta $3700 ; 53 ; 4 + sta $3F00 ; 55 ; 4 + sta $2780 ; 57 ; 4 + sta $2F80 ; 59 ; 4 + + jmp cursor_done ; 3 +cursor_off: + ; blue is 6 + ; 1 1010101 + lda #$d5 ; blue ; 2 + sta $3300 ; 52 ; 4 + sta $3B00 ; 54 ; 4 + sta $2380 ; 56 ; 4 + sta $2B80 ; 58 ; 4 + ; purple is 2 + ; 0 1010101 + lda #$55 ; purple ; 2 + sta $3700 ; 53 ; 4 + sta $3F00 ; 55 ; 4 + sta $2780 ; 57 ; 4 + sta $2F80 ; 59 ; 4 + + + +cursor_done: + + + + ; Try X=9 Y=89 cycles=4540 + + nop + lda $0 + + ldy #89 ; 2 +loopcoE:ldx #9 ; 2 +loopcoF:dex ; 2 + bne loopcoF ; 2nt/3 + dey ; 2 + bne loopcoE ; 2nt/3 + + + lda KEYPRESS ; 4 + bpl no_c64_keypress ; 3 + jmp done_c64 +no_c64_keypress: + + jmp c64_split ; 3 + +done_c64: + rts ; 6 ;=================== ; graphics diff --git a/megademo/megademo.s b/megademo/megademo.s index 8840427c..fc7722c6 100644 --- a/megademo/megademo.s +++ b/megademo/megademo.s @@ -14,7 +14,7 @@ ; C64 Opening Sequence -; jsr c64_opener + jsr c64_opener ; Falling Apple II @@ -39,3 +39,4 @@ loop_forever: .include "gr_hline.s" .include "vapor_lock.s" .include "delay_a.s" + .include "wait_keypress.s" diff --git a/megademo/wait_keypress.s b/megademo/wait_keypress.s new file mode 100644 index 00000000..444d2074 --- /dev/null +++ b/megademo/wait_keypress.s @@ -0,0 +1,5 @@ +wait_until_keypress: + lda KEYPRESS ; 4 + bpl wait_until_keypress ; 3 + bit KEYRESET ; clear the keyboard buffer + rts ; 6