; ; void cputcxy (unsigned char x, unsigned char y, char c); ; void cputc (char c); ; .export _cputcxy, _cputc, cputdirect, putchar .export newline, plot .import gotoxy .import PLOT .import xsize .import fontdata .import _plotlo .importzp tmp3,tmp4 .importzp ptr3 .include "gamate.inc" .include "extzp.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: cmp #$0d ; CR? bne L1 lda #0 sta CURS_X beq plot ; Recalculate pointers L1: cmp #$0a ; LF? beq newline ; Recalculate pointers ; Printable char of some sort cputdirect: jsr putchar ; Write the character to the screen ; Advance cursor position advance: ldy CURS_X iny cpy xsize bne L3 jsr newline ; new line ldy #0 ; + cr L3: sty CURS_X jmp plot newline: inc CURS_Y ; Set cursor position, calculate RAM pointers plot: ldy CURS_X ldx CURS_Y clc jmp PLOT ; Set the new cursor ; Write one character to the screen without doing anything else, return X ; position in Y putchar: sta ptr3 txa pha lda #0 sta ptr3+1 ; char index * 8 asl ptr3 rol ptr3+1 asl ptr3 rol ptr3+1 asl ptr3 rol ptr3+1 ; plus fontdata base address lda ptr3 clc adc #<(fontdata-$f8) sta ptr3 lda ptr3+1 adc #>(fontdata-$f8) sta ptr3+1 lda #LCD_XPOS_PLANE1 clc adc CURS_X sta LCD_X ldy #$F8 lda CHARCOLOR lsr bcc @delete1 @copylp1: lda (ptr3),y eor RVS sta LCD_DATA iny bne @copylp1 beq @skip_delete1 @delete1: lda #$00 @del1: sta LCD_DATA iny bne @del1 @skip_delete1: lda #LCD_XPOS_PLANE2 clc adc CURS_X sta LCD_X ldx CURS_Y lda _plotlo,x sta LCD_Y ldy #$F8 lda CHARCOLOR and #2 beq @delete2 @copylp2: lda (ptr3),y eor RVS sta LCD_DATA iny bne @copylp2 beq @skip_delete2 @delete2: lda #$00 @del2: sta LCD_DATA iny bne @del2 @skip_delete2: pla tax ldy CURS_X rts ;------------------------------------------------------------------------------- ; force the init constructor to be imported .import initconio conio_init = initconio