cc65/libsrc/cx16/cputc.s

103 lines
2.5 KiB
ArmAsm

;
; 2020-10-13, Greg King
;
; void __fastcall__ cputcxy (unsigned char x, unsigned char y, char c);
; void __fastcall__ cputc (char c);
;
.export _cputcxy, _cputc, cputdirect, putchar
.export newline, plot
.import gotoxy, PLOT
.include "cx16.inc"
.macpack generic
screen_addr := $1B000 ; VRAM address of text screen
; Move to a cursor position, then print a character.
_cputcxy:
pha ; Save C
jsr gotoxy ; Set cursor, drop x and y
pla
; Print a character -- also used as an internal function.
_cputc: cmp #$0D ; X16 '\n'?
beq newline
cmp #$0A ; X16 '\r'?
beq cr
; Printable char. of some sort.
; Convert it from PetSCII into a screen-code.
convert:
tay
lsr a ; Divide by 256/8
lsr a
lsr a
lsr a
lsr a
tax ; .X = %00000xxx
tya
eor pet_to_screen,x
cputdirect:
jsr putchar ; Write character to screen, return .Y
; Advance the cursor position.
iny
cpy LLEN ; Reached end of line?
bne L3
jsr newline ; Wrap around
cr: ldy #$00
L3: sty CURS_X
rts
; Move down.
newline:
inc SCREEN_PTR+1
inc CURS_Y
rts
; Set the cursor's position, calculate RAM pointer.
plot: ldy CURS_X
ldx CURS_Y
clc
jmp PLOT ; Set the new cursor
; Write one screen-code and color to the video RAM without doing anything else.
; Return the x position in .Y .
putchar:
ora RVS ; Set revers bit
tax
stz VERA::CTRL ; Use port 0
lda CURS_Y
add #<(>screen_addr)
sta VERA::ADDR+1 ; Set row number
lda #VERA::INC1 | ^screen_addr ; Address increments by one
sta VERA::ADDR+2
ldy CURS_X ; Get character column into .Y
tya
asl a ; Each character has two bytes
sta VERA::ADDR
stx VERA::DATA0 ; Put the character
lda CHARCOLOR
sta VERA::DATA0 ; Put its colors
rts
.rodata
pet_to_screen:
.byte %10000000,%00000000,%01000000,%00100000 ; PetSCII -> screen-code
.byte %01000000,%11000000,%10000000,%10000000