mirror of
https://github.com/cc65/cc65.git
synced 2024-12-26 08:32:00 +00:00
13482984ca
About all CONIO functions offering a <...>xy variant call popa _gotoxy By providing an internal gotoxy variant that starts with a popa all those CONIO function can be shortened by 3 bytes. As soon as program calls more than one CONIO function this means an overall code size reduction.
90 lines
2.2 KiB
ArmAsm
90 lines
2.2 KiB
ArmAsm
;
|
|
; Maciej 'YTM/Elysium' Witkowiak
|
|
;
|
|
; 27.10.2001
|
|
; 06.03.2002
|
|
; 25.07.2005
|
|
|
|
; void cputcxy (unsigned char x, unsigned char y, char c);
|
|
; void cputc (char c);
|
|
|
|
; TODO:
|
|
; TAB (should be implemented)
|
|
; other special characters directly from keyboard are unsafe, though some might be
|
|
; implemented:
|
|
; HOME, UPLINE, ULINEON, ULINEOFF, REV_ON, REV_OFF, BOLDON, ITALICON, OUTLINEON, PLAINTEXT
|
|
; and cursor movement, maybe stuff like INSERT too
|
|
;
|
|
; these must be ignored:
|
|
; ESC_GRAPHICS, ESC_RULER, GOTOX, GOTOY, GOTOXY, NEWCARDSET, all 1..8
|
|
;
|
|
; note that there are conflicts between control characters and keyboard:
|
|
; HOME = KEY_ENTER, KEY_HOME = REV_ON,
|
|
; UPLINE = ?, KEY_UPARROW = GOTOY, ...
|
|
|
|
.export _cputcxy, _cputc
|
|
.import gotoxy, fixcursor
|
|
.import xsize,ysize
|
|
.importzp cursor_x, cursor_y, cursor_c, cursor_r
|
|
|
|
.include "const.inc"
|
|
.include "geossym.inc"
|
|
.include "jumptab.inc"
|
|
|
|
_cputcxy:
|
|
pha ; Save C
|
|
jsr gotoxy ; Set cursor, drop x and y
|
|
pla ; Restore C
|
|
|
|
; Plot a character - also used as internal function
|
|
|
|
_cputc:
|
|
tax ; save character
|
|
; some characters 0-31 are not safe for PutChar
|
|
cmp #$20
|
|
bcs L1
|
|
cmp #CR
|
|
beq do_cr
|
|
cmp #LF
|
|
beq do_lf
|
|
cmp #KEY_DELETE
|
|
bne L0
|
|
ldx #BACKSPACE
|
|
sec
|
|
bcs L2
|
|
L0: rts
|
|
|
|
L1: clc
|
|
L2: php
|
|
lda cursor_x
|
|
sta r11L
|
|
lda cursor_x+1
|
|
sta r11H
|
|
lda cursor_y
|
|
clc
|
|
adc #6 ; 6 pixels down to the baseline
|
|
sta r1H
|
|
txa
|
|
jsr PutChar
|
|
plp
|
|
bcs fix_cursor
|
|
|
|
inc cursor_c
|
|
lda cursor_c
|
|
cmp xsize ; hit right margin?
|
|
bne fix_cursor
|
|
lda #0 ; yes - do cr+lf
|
|
sta cursor_c
|
|
do_lf: inc cursor_r
|
|
lda cursor_r
|
|
cmp ysize ; hit bottom margin?
|
|
bne fix_cursor
|
|
dec cursor_r ; yes - stay in the last line
|
|
|
|
fix_cursor:
|
|
jmp fixcursor
|
|
|
|
do_cr: lda #0
|
|
sta cursor_c
|
|
beq fix_cursor
|