76 lines
1.0 KiB
ArmAsm
76 lines
1.0 KiB
ArmAsm
|
|
//
|
|
// Official Kernal routine, described in:
|
|
//
|
|
// - [RG64] C64 Programmer's Reference Guide - page 278/279
|
|
// - [CM64] Compute's Mapping the Commodore 64 - page 228
|
|
//
|
|
// CPU registers that has to be preserved (see [RG64]): .Y
|
|
//
|
|
|
|
CHROUT:
|
|
|
|
sta SCHAR
|
|
|
|
// 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)
|
|
|
|
phx_trash_a
|
|
phy_trash_a
|
|
|
|
php
|
|
|
|
// Determine the device number
|
|
lda DFLTO
|
|
|
|
cmp #$03 // screen
|
|
bne !+
|
|
jmp chrout_screen
|
|
!:
|
|
jsr iec_check_devnum
|
|
bcs chrout_done_unknown_device // not a supported device
|
|
|
|
chrout_iec:
|
|
|
|
lda SCHAR
|
|
jsr JCIOUT
|
|
bcc chrout_done_success
|
|
|
|
// FALLTROUGH
|
|
|
|
chrout_done_fail:
|
|
|
|
plp
|
|
|
|
// Restore X and Y
|
|
ply_trash_a
|
|
plx_trash_a
|
|
|
|
sec // indicate failure
|
|
rts
|
|
|
|
chrout_done_unknown_device:
|
|
|
|
plp
|
|
|
|
// Restore X and Y
|
|
ply_trash_a
|
|
plx_trash_a
|
|
|
|
// End wioth error
|
|
jmp lvs_device_not_found_error
|
|
|
|
chrout_done_success:
|
|
|
|
plp
|
|
|
|
// Restore X and Y
|
|
ply_trash_a
|
|
plx_trash_a
|
|
|
|
lda SCHAR
|
|
clc // indicate success
|
|
rts
|