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

97 lines
2.0 KiB
ArmAsm

// #LAYOUT# STD * #TAKE
// #LAYOUT# * KERNAL_0 #TAKE
// #LAYOUT# * * #IGNORE
//
// CHROUT routine - screen support, INS key handling
//
chrout_screen_INS:
// First check if last character of the logical line is space
jsr screen_check_space_ends_line
beq chrout_screen_ins_possible
// Not space, we cannot insert anything
bne_16 chrout_screen_done
chrout_screen_ins_possible:
// Move chars towards end of the line
jsr screen_get_logical_line_end_ptr
// Special handling for cursor in second line
ldx TBLX
lda LDTBL+0, x
bpl chrout_screen_ins_second_line
// Perform character copy
jsr chrout_screen_ins_copy_loop
// Put space in the inserted gap
lda #$20
sta (PNT), y
// If line does not end with space now, try to grow the logical line
jsr screen_check_space_ends_line
beq chrout_screen_ins_done
jsr screen_grow_logical_line
// FALLTROUGH
chrout_screen_ins_done:
// End of processing
jmp chrout_screen_calc_lptr_done
chrout_screen_ins_second_line:
// Adapt PNTR for copying
lda PNTR
sec
sbc #40
sta PNTR
// Perform character copy
jsr chrout_screen_ins_copy_loop
// Put space in the inserted gap
lda #$20
sta (PNT), y
// End of processing
bne chrout_screen_ins_done // branch always
chrout_screen_ins_copy_loop:
// Note: While the following routine is obvious to any skilled
// in the art as the most obvious simple and efficient solution,
// if the screen writes are before the colour writes, it results
// in a relatively long verbatim stretch of bytes when compared to
// the C64 KERNAL. Thus we have swapped the order, just to reduce
// the potential for any argument of copyright infringement, even
// though we really do not believe that the routine can be copyrighted
// due to the lack of creativity.
dey
lda (USER),y
iny
sta (USER),y
dey
lda (PNT),y
iny
sta (PNT),y
dey
cpy PNTR
bne chrout_screen_ins_copy_loop
// Increase insert mode count (which causes quote-mode like behaviour)
inc INSRT
// Return from loop
rts