X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libsrc%2Fcbm510%2Fcputc.s;h=bd8c364e880d092b03e06b8ca4cf141277c1f47d;hb=934a78731fe1b7fc8d08814fa2321534c20fbc62;hp=c7d694042c5d505864ec8a41fcc8a8caa72c8bb4;hpb=e1a9115fd45ff0e6c437dec9058de642d6e73540;p=cc65 diff --git a/libsrc/cbm510/cputc.s b/libsrc/cbm510/cputc.s index c7d694042..bd8c364e8 100644 --- a/libsrc/cbm510/cputc.s +++ b/libsrc/cbm510/cputc.s @@ -5,105 +5,120 @@ ; void cputc (char c); ; - .export _cputcxy, _cputc, cputdirect, putchar - .export newline, plot - .import popa, _gotoxy - .import xsize, revers + .export _cputcxy, _cputc, cputdirect, putchar + .export newline, plot - .include "zeropage.inc" - .include "../cbm/cbm.inc" + .import popa, _gotoxy + .import __VIDRAM_START__ + .import CURS_X: zp, CURS_Y: zp, CHARCOLOR: zp, RVS: zp + .import SCREEN_PTR: zp, CRAM_PTR: zp + + .include "cbm510.inc" + + .macpack generic ; ------------------------------------------------------------------------ ; _cputcxy: - pha ; Save C - jsr popa ; Get Y - jsr _gotoxy ; Set cursor, drop x - pla ; Restore C + 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 +_cputc: cmp #$0A ; CR? + bne L1 + lda #0 + sta CURS_X + beq plot ; Recalculate pointers -L1: cmp #$0D ; LF? - beq newline ; Recalculate pointers +L1: cmp #$0D ; LF? + beq newline ; Recalculate pointers ; Printable char of some sort - cmp #' ' - bcc cputdirect ; Other control char - tay - bmi L10 - cmp #$60 - bcc L2 - and #$DF - bne cputdirect ; Branch always -L2: and #$3F + cmp #' ' + bcc cputdirect ; Other control char + tay + bmi L10 + cmp #$60 + bcc L2 + and #$DF + bne cputdirect ; Branch always +L2: and #$3F cputdirect: - jsr putchar ; Write the character to the screen + jsr putchar ; Write the character to the screen ; Advance cursor position advance: - iny - cpy xsize - bne L3 - jsr newline ; new line - ldy #0 ; + cr -L3: sty CURS_X - rts - -newline: - clc - lda xsize - adc SCREEN_PTR - sta SCREEN_PTR - bcc L4 - inc SCREEN_PTR+1 - clc -L4: lda xsize - adc CRAM_PTR - sta CRAM_PTR - bcc L5 - inc CRAM_PTR+1 -L5: inc CURS_Y - rts + iny + cpy #XSIZE + bne L3 + jsr newline ; new line + ldy #0 ; + cr +L3: sty CURS_X + rts ; Handle character if high bit set -L10: and #$7F - cmp #$7E ; PI? - bne L11 - lda #$5E ; Load screen code for PI - bne cputdirect -L11: ora #$40 - bne cputdirect +L10: and #$7F + cmp #$7E ; PI? + bne L11 + lda #$5E ; Load screen code for PI + bne cputdirect +L11: ora #$40 + bne cputdirect ; Branch always + +; Move the cursor into the next line + +newline: + inc CURS_Y ; Set cursor position, calculate RAM pointers -plot: ldy CURS_X - ldx CURS_Y - clc - jmp PLOT ; Set the new cursor +plot: ldx CURS_Y + lda LineLSBTab,x + sta SCREEN_PTR + sta CRAM_PTR + lda LineMSBTab,x + sta SCREEN_PTR+1 + add #.hibyte(COLOR_RAM - __VIDRAM_START__) + sta CRAM_PTR+1 + rts ; Write one character to the screen without doing anything else, return X ; position in Y putchar: - ora revers ; Set revers bit - ldy CURS_X - sta (SCREEN_PTR),y ; Set char - ldx IndReg - lda #$0F - sta IndReg - lda CHARCOLOR - sta (CRAM_PTR),y ; Set color - stx IndReg - rts - + ora RVS ; Set revers bit + ldy CURS_X + sta (SCREEN_PTR),y ; Set char + ldx IndReg + lda #$0F + sta IndReg + lda CHARCOLOR + sta (CRAM_PTR),y ; Set color + stx IndReg + rts + +; ------------------------------------------------------------------------- +; Low bytes of the start address of the screen lines + +.rodata + +LineLSBTab: + .repeat 25, I + .byte .lobyte(__VIDRAM_START__ + I * 40) + .endrep + +; ------------------------------------------------------------------------- +; High bytes of the start address of the screen lines + +LineMSBTab: + .repeat 25, I + .byte .hibyte(__VIDRAM_START__ + I * 40) + .endrep