mirror of
https://github.com/cc65/cc65.git
synced 2024-10-20 23:24:14 +00:00
0c62ddf123
Fix handling of newlines. Wrap around to top of screen when newline occurs in last line. Initialize screen width in crt0.s.
82 lines
2.1 KiB
ArmAsm
82 lines
2.1 KiB
ArmAsm
;
|
|
; cputc/cputcxy for Challenger 1P
|
|
; Based on PET/CBM implementation
|
|
;
|
|
; void cputcxy (unsigned char x, unsigned char y, char c);
|
|
; void cputc (char c);
|
|
;
|
|
.export _cputcxy, _cputc, cputdirect, putchar
|
|
.export newline, plot
|
|
.import popa, _gotoxy
|
|
|
|
.include "c1p.inc"
|
|
.include "extzp.inc"
|
|
|
|
_cputcxy:
|
|
pha ; Save C
|
|
jsr popa ; Get Y
|
|
jsr _gotoxy ; Set cursor, drop x
|
|
pla ; Restore C
|
|
|
|
; Plot a character - also used as internal function
|
|
|
|
_cputc: cmp #$0A ; CR?
|
|
bne L1
|
|
lda #0
|
|
sta CURS_X
|
|
beq plot ; Recalculate pointers
|
|
|
|
L1: cmp #$0D ; LF?
|
|
beq newline ; Recalculate pointers
|
|
|
|
cputdirect:
|
|
jsr putchar ; Write the character to the screen
|
|
|
|
; Advance cursor position
|
|
|
|
advance:
|
|
cpy SCR_LINELEN ; xsize-1
|
|
bne L3
|
|
jsr newline ; new line
|
|
ldy #$FF ; + cr
|
|
L3: iny
|
|
sty CURS_X
|
|
rts
|
|
|
|
newline:
|
|
inc CURS_Y
|
|
lda CURS_Y
|
|
cmp #24 ; screen height 25 lines hardcoded
|
|
bne plot
|
|
lda #0 ; wrap around to line 0
|
|
sta CURS_Y
|
|
|
|
plot: ldy CURS_Y
|
|
lda ScrLo,y
|
|
sta SCREEN_PTR
|
|
lda ScrHi,y
|
|
sta SCREEN_PTR+1
|
|
rts
|
|
|
|
; Write one character to the screen without doing anything else, return X
|
|
; position in Y
|
|
|
|
putchar:
|
|
ldy CURS_X
|
|
sta (SCREEN_PTR),y ; Set char
|
|
rts
|
|
|
|
; Screen address tables - offset to real screen
|
|
|
|
.rodata
|
|
|
|
ScrLo: .byte $83, $A3, $C3, $E3, $03, $23, $43, $63
|
|
.byte $83, $A3, $C3, $E3, $03, $23, $43, $63
|
|
.byte $83, $A3, $C3, $E3, $03, $23, $43, $63
|
|
.byte $83
|
|
|
|
ScrHi: .byte $D0, $D0, $D0, $D0, $D1, $D1, $D1, $D1
|
|
.byte $D1, $D1, $D1, $D1, $D2, $D2, $D2, $D2
|
|
.byte $D2, $D2, $D2, $D2, $D3, $D3, $D3, $D3
|
|
.byte $D3
|