dos33fsprogs/still_alive/display_lyrics.s
Vince Weaver e7dc17a39a sa: weird HIRES/80col corruption issue
real hardware or just the emulator?
2018-06-05 14:30:01 -04:00

291 lines
4.4 KiB
ArmAsm

;========================================================
; display lyrics electric duet
;========================================================
display_lyrics_ed:
;========================
; Check if new lyric ready
;========================
lda FRAME_COUNT ; get current frame count
ldy #0
cmp (LYRICSL),Y ; compare to next-trigger
bne all_done_lyrics_ed ; not same, so skip
; adjust pointer 16-bit
inc LYRICSL
bne lc_sb2_ed
inc LYRICSH
lc_sb2_ed:
;==================================
; Print lyric
;==================================
handle_lyrics_ed:
ldy #0
lda (LYRICSL),Y ; load value
handle_lyrics_loop_ed:
cmp #11 ; check if in range 1-10
bcs lyric_home_ed ; if not, skip ahead
go_draw_ascii_ed:
jsr draw_ascii_art ; draw proper ascii art
jmp lyric_continue_ed ; and continue
lyric_home_ed:
cmp #12 ; check if form feed char
bne lyric_char_ed ; if not skip ahead
jsr HOME ; call HOME
jmp lyric_continue_ed ; continue
lyric_char_ed:
ldy FORTYCOL ; if 40 column, uppercase it
beq just_output_already_ed
; Uppercase it
cmp #'a'+$80
bcc just_output_already_ed
cmp #'z'+$80
bcs just_output_already_ed
and #$DF
just_output_already_ed:
jsr COUT1 ; output the character
lyric_continue_ed:
; adjust pointer 16-bit
inc LYRICSL
bne lc_sb_ed
inc LYRICSH
lc_sb_ed:
ldy #0
lda (LYRICSL),Y ; load value
bne handle_lyrics_loop_ed
; adjust pointer 16-bit
inc LYRICSL
bne lc_sb_ed2
inc LYRICSH
lc_sb_ed2:
; skip MB offset
; adjust pointer 16-bit
inc LYRICSL
bne lc_sb_ed8
inc LYRICSH
lc_sb_ed8:
all_done_lyrics_ed:
rts
;========================================================
; display lyrics mockingboard
;========================================================
display_lyrics:
;=====================
; See if lyrics already printing
;=====================
ldy #0
lda LYRICS_ACTIVE ; see if lyric is ready
bne handle_lyrics ; if so handle it
;========================
; Check if new lyric ready
;========================
lda FRAME_COUNT ; get current frame count
cmp (LYRICSL),Y ; compare to next-trigger
bne all_done_lyrics ; not same, so skip
lda #1 ; matches, set lyrics active
sta LYRICS_ACTIVE
; adjust pointer 16-bit
inc LYRICSL
bne lc_sb2
inc LYRICSH
lc_sb2:
; skip ED data
; adjust pointer 16-bit
inc LYRICSL
bne lc_sb5
inc LYRICSH
lc_sb5:
;==================================
; Lyric active, print current char
;==================================
handle_lyrics:
lda (LYRICSL),Y ; load value
beq done_lyric ; if 0, done lyric
cmp #11 ; check if in range 1-10
bcs lyric_home ; if not, skip ahead
go_draw_ascii:
jsr draw_ascii_art ; draw proper ascii art
jmp lyric_continue ; and continue
lyric_home:
cmp #12 ; check if form feed char
bne lyric_char ; if not skip ahead
jsr HOME ; call HOME
jmp lyric_continue ; continue
lyric_char:
; clear cursor
cursor_clear:
pha
lda #' '+$80
ldy FORTYCOL
beq eightyclear
fortyclear:
ldy CH
sta (BASL),Y
jmp cursor_clear_done
eightyclear:
jsr COUT
lda #$8
jsr COUT
cursor_clear_done:
pla
ldy FORTYCOL ; if 40col, convert to UPPERCASE
beq just_output_already
cmp #'a'+$80
bcc just_output_already
cmp #'z'+$80
bcs just_output_already
and #$DF
just_output_already:
jsr COUT1 ; output the character
lyric_continue:
; adjust pointer 16-bit
inc LYRICSL
bne lc_sb
inc LYRICSH
lc_sb:
jmp all_done_lyrics
done_lyric:
lda #0
sta LYRICS_ACTIVE
jmp lyric_continue
all_done_lyrics:
lda FORTYCOL
beq blink_cursor80
; Blink Cursor
blink_cursor40:
inc CURSOR
lda CURSOR
and #$10
beq cursor_space
cursor_underscore:
lda #'_'+$80
jmp cursor_done
cursor_space:
lda #' '+$80
cursor_done:
ldy CH
sta (BASL),Y
rts
blink_cursor80:
inc CURSOR
lda CURSOR
and #$10
beq cursor_space80
cursor_underscore80:
lda #'_'+$80
jsr COUT
lda #$8 ; BS (backspace)
jsr COUT
rts
cursor_space80:
lda #' '+$80
jsr COUT
lda #$8 ; BS (backspace)
jsr COUT
cursor_done80:
rts
;============================
; Setup Word Bounds
;============================
word_bounds:
lda FORTYCOL
bne fortycol_word_bounds
eightycol_word_bounds:
; on 80 column, words go from 2,1 to 35,21
lda #2
sta WNDLFT
lda #35
sta WNDWDTH
lda #1
sta WNDTOP
lda #21
sta WNDBTM
rts
fortycol_word_bounds:
; on 40 column, words go from 1,0 to 35,4
lda #1
sta WNDLFT
lda #35
sta WNDWDTH
lda #0
sta WNDTOP
lda #4
sta WNDBTM
rts