Files
open-roms/c64/kernal/screen/chrout_screen.s
T

129 lines
2.2 KiB
ArmAsm

// #LAYOUT# STD * #TAKE
// #LAYOUT# X16 * #IGNORE
// #LAYOUT# * KERNAL_0 #TAKE
// #LAYOUT# * * #IGNORE
//
// 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 chrout_screen_literal // not high char
!:
// Range $20-$3F is unchanged
cmp #$40
bcc chrout_screen_literal // 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 chrout_screen_literal // not high char
cmp #$40
bcs chrout_screen_literal // not high char
clc
adc #$20
// FALLTROUGH
chrout_screen_literal:
// Write normal character on the screen
tax // store screen code, we need .A for calculations
// First we need offset from PNT in .Y, we can take it from PNTR
jsr screen_get_clipped_PNTR
// Put the character on the screen
txa
ora RVS // Computes Mapping the 64, page 38
sta (PNT),y
// Decrement number of chars waiting to be inserted
lda INSRT
beq !+
dec INSRT
!:
// Toggle quote flag if required
txa
jsr screen_check_toggle_quote
// Set colour of the newly printed character
lda COLOR
sta (USER),y
// Advance the column
ldy PNTR
iny
sty PNTR
// Scroll down (extend logical line) if needed
cpy #40
bne !+
jsr screen_grow_logical_line
inc TBLX
ldy PNTR
!:
// If not the 80th character of the logical row, we are done
cpy #80
bcc chrout_screen_calc_lptr_done
// Advance to the next line
jmp screen_advance_to_next_line
chrout_screen_calc_lptr_done:
jsr screen_calculate_pointers
// FALLTROUGH
chrout_screen_done:
jsr cursor_show_if_enabled
jmp chrout_done_success