115 lines
2.2 KiB
ArmAsm
115 lines
2.2 KiB
ArmAsm
; Function defined on pp272-273 of C64 Programmers Reference Guide
|
|
chrout:
|
|
;; Crude implementation of character output
|
|
|
|
;; Save X and Y values
|
|
;; (Confirmed by writing a test program that X and Y
|
|
;; don't get modified, in agreement with C64 PRG's
|
|
;; description of CHROUT)
|
|
sta last_printed_character_ascii
|
|
txa
|
|
pha
|
|
tya
|
|
pha
|
|
|
|
jsr hide_cursor_if_visible
|
|
|
|
lda last_printed_character_ascii
|
|
tax
|
|
|
|
;; Check for special characters
|
|
|
|
;; Linefeed (simply ignored)
|
|
;; Trivia: BASIC does CRLF with READY. prompt
|
|
cmp #$0a
|
|
bne not_0a
|
|
jmp chrout_done
|
|
not_0a:
|
|
|
|
;; Carriage return
|
|
cmp #$0d
|
|
beq screen_advance_to_next_line
|
|
|
|
;; Clear screen
|
|
cmp #$93
|
|
bne not_clearscreen
|
|
jsr clear_screen
|
|
jmp chrout_done
|
|
|
|
not_clearscreen:
|
|
|
|
;; Convert PETSCII to screen code
|
|
cmp #$40
|
|
bcc chrout_l1
|
|
cmp #$41+26
|
|
bcs chrout_l1
|
|
and #$1f
|
|
|
|
chrout_l1:
|
|
;; Write normal character on the screen
|
|
ldy current_screen_x
|
|
sta (current_screen_line_ptr),y
|
|
|
|
;; XXX - Update colour RAM also
|
|
|
|
;; 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 current_screen_y
|
|
iny
|
|
sty current_screen_x
|
|
cpy #40
|
|
bne no_screen_advance_to_next_line
|
|
jsr screen_grow_logical_line
|
|
cpy #79
|
|
bcc no_screen_advance_to_next_line
|
|
jmp screen_advance_to_next_line
|
|
no_screen_advance_to_next_line:
|
|
chrout_done:
|
|
;; Restore X and Y, set carry to mark success on exit
|
|
pla
|
|
tay
|
|
pla
|
|
tax
|
|
lda last_printed_character_ascii
|
|
clc ; indicate success
|
|
rts
|
|
|
|
screen_grow_logical_line:
|
|
;; XXX - Scroll screen down to make space
|
|
|
|
rts
|
|
|
|
screen_advance_to_next_line:
|
|
;; Go to start of line
|
|
lda #0
|
|
sta current_screen_x
|
|
;; Advance line number
|
|
ldy current_screen_y
|
|
inc current_screen_y
|
|
|
|
;; Advance screen pointer to next line
|
|
lda screen_line_link_table,y
|
|
bpl line_not_linked
|
|
jsr advance_screen_pointer_40_bytes
|
|
|
|
line_not_linked:
|
|
jsr advance_screen_pointer_40_bytes
|
|
|
|
;; Work out if we have gone off the bottom of the screen?
|
|
|
|
;; XXX -- implement this check and scrolling of the screen
|
|
;; and updating the screen line links.
|
|
|
|
jmp chrout_done
|
|
|
|
advance_screen_pointer_40_bytes:
|
|
lda current_screen_line_ptr+0
|
|
clc
|
|
adc #<40
|
|
sta current_screen_line_ptr+0
|
|
lda current_screen_line_ptr+1
|
|
adc #>40
|
|
sta current_screen_line_ptr+1
|
|
rts
|