116 lines
1.8 KiB
ArmAsm
116 lines
1.8 KiB
ArmAsm
|
|
//
|
|
// CHROUT routine - screen support (character output)
|
|
//
|
|
|
|
|
|
chrout_screen:
|
|
|
|
jsr cursor_hide_if_visible
|
|
|
|
lda SCHAR
|
|
tax
|
|
|
|
// All the PETSCII control codes are within $0x, $1x, $8x, $9x, remaining
|
|
// ones are always printable characters; separate away control codes
|
|
|
|
and #$60
|
|
bne !+
|
|
jmp chrout_screen_control
|
|
!:
|
|
txa
|
|
|
|
// Literals - first convert PETSCII to screen code
|
|
|
|
// Codes $C0-$DF become $40-$5F
|
|
cmp #$E0
|
|
bcs !+
|
|
cmp #$C0
|
|
bcc !+
|
|
|
|
and #$7F
|
|
jmp output_literal_char // not high char
|
|
|
|
!:
|
|
// Range $20-$3F is unchanged
|
|
cmp #$40
|
|
bcc output_literal_char // not high char
|
|
|
|
// Unshifted letters and symbols from $40-$5F
|
|
// all end up being -$40
|
|
// (C64 PRG p376)
|
|
|
|
// But anything >= $80 needs to be -$40
|
|
// (C64 PRG p380-381)
|
|
// And bit 7 should be cleared, only to be
|
|
// set by reverse video
|
|
sec
|
|
sbc #$40
|
|
|
|
// Fix shifted chars by adding $20 again
|
|
cmp #$20
|
|
bcc output_literal_char // not high char
|
|
cmp #$40
|
|
bcs output_literal_char // not high char
|
|
clc
|
|
adc #$20
|
|
|
|
output_literal_char:
|
|
|
|
// Write normal character on the screen
|
|
|
|
pha
|
|
|
|
ldy PNTR
|
|
ora RVS // Compute's Mapping the 64 p38
|
|
sta (PNT),y
|
|
|
|
// Decrement number of chars waiting to be inserted
|
|
lda INSRT
|
|
beq !+
|
|
dec INSRT
|
|
!:
|
|
pla
|
|
cmp #$22
|
|
bne not_quote
|
|
|
|
// Toggle quote flag if required
|
|
lda QTSW
|
|
eor #$80
|
|
sta QTSW
|
|
|
|
not_quote:
|
|
|
|
// Set colour
|
|
lda COLOR
|
|
sta (USER),y
|
|
|
|
// Advance the column, and scroll screen down if we need
|
|
// to insert a 2nd line in this logical line.
|
|
// (eg Compute's Mapping the 64 p41)
|
|
ldx TBLX
|
|
iny
|
|
sty PNTR
|
|
cpy #40
|
|
bne !+
|
|
jsr screen_grow_logical_line
|
|
ldy PNTR
|
|
!:
|
|
cpy #80
|
|
bcc chrout_screen_done
|
|
lda #0
|
|
sta PNTR
|
|
jmp chrout_screen_advance_to_next_line
|
|
|
|
|
|
chrout_screen_calc_lptr_done:
|
|
|
|
jsr screen_calculate_line_pointer
|
|
|
|
// FALLTROUGH
|
|
|
|
chrout_screen_done:
|
|
|
|
jsr cursor_show_if_enabled
|
|
jmp chrout_done_success
|