megademo: c64 cursor

This commit is contained in:
Vince Weaver 2018-09-22 23:07:59 -04:00
parent 3029d4220b
commit 8b25cefe04
4 changed files with 167 additions and 3 deletions

View File

@ -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

View File

@ -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

View File

@ -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"

5
megademo/wait_keypress.s Normal file
View File

@ -0,0 +1,5 @@
wait_until_keypress:
lda KEYPRESS ; 4
bpl wait_until_keypress ; 3
bit KEYRESET ; clear the keyboard buffer
rts ; 6