.include "atari.inc" .export _clrtobot, _clrtoeol, _clrtoline, _cspaces, _cblank, _backspace .import mul40 ; from cc65's runtime .importzp tmp3 ; ditto .import bump_destptr ; these two are .importzp destptr ; from draw_lorcha.s .import _cspace .ifdef CART_TARGET .segment "HIGHCODE" .else .code .endif ; void clrtobot(void); ; void clrtoeol(void); ; void clrtoline(unsigned char line); ; this stuff doesn't disturb conio's (and the OS's) idea of the ; current cursor position. It's *way* faster than writing them in ; C in terms of cclear() (which uses one cputc() call per blank). _clrtobot: ; same as clrtoline(24); lda #24 bne _clrtoline _clrtoeol: lda ROWCRS ; fall through to _clrtoline _clrtoline: sta tmp3 ; stash our arg lda #0 sta OLDCHR ; stop conio from redrawing stuff after we clear it ; setup destptr to start of current line, NOT ; current cursor position. lda ROWCRS jsr mul40 ; AX = A*40 (addr of start-of-row) clc adc SAVMSC ; add to screen pointer sta destptr txa adc SAVMSC+1 sta destptr+1 ; X = current row, Y = current column. Stop clearing a line when Y == 40, ; we're done when X == 24. Apologies, the names X and Y are backwards ; compared to proper Cartesian coordinates. ldx ROWCRS ldy COLCRS lda #0 clrloop: sta (destptr),y ; blank a character (A == 0, screen code for a space) iny cpy #40 bne clrloop ldy #0 inx cpx tmp3 bcs done jsr bump_destptr lda #0 tay beq clrloop done: rts _cspaces: sta tmp3 @lp: jsr _cspace dec tmp3 bne @lp rts _cblank: tax lda COLCRS pha lda ROWCRS pha txa jsr _cspaces pla sta ROWCRS pla sta COLCRS rts _backspace: dec COLCRS lda #1 bne _cblank