1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
|
;
; Ullrich von Bassewitz, 06.08.1998
;
; void cputcxy (unsigned char x, unsigned char y, char c);
; void cputc (char c);
;
.export _cputcxy, _cputc, cputdirect, putchar
.export newline, plot
.destructor setsyscursor
.import gotoxy
.import PLOT
.import ktmp: zp, crtc: zp, CURS_X: zp, CURS_Y: zp, RVS: zp
.import CharPtr: zp
.include "cbm610.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 #$0A ; CR?
bne L1
lda #0
sta CURS_X
beq plot ; 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
cputdirect:
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 CharPtr
sta CharPtr
bcc L4
inc CharPtr+1
L4: inc CURS_Y
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 ; Branch always
; Write one character to the screen without doing anything else, return X
; position in Y
putchar:
ldx IndReg
ldy #$0F
sty IndReg
ora RVS ; Set revers bit
ldy CURS_X
sta (CharPtr),y ; Set char
stx IndReg
rts
; Set cursor position, calculate RAM pointers
plot: ldx CURS_Y
lda LineLSBTab,x
sta CharPtr
lda LineMSBTab,x
sta CharPtr+1
lda IndReg
pha
lda #$0F
sta IndReg
ldy #$00
clc
sei
sta (crtc),y
lda CharPtr
adc CURS_X
iny
sta (crtc),y
dey
lda #$0E
sta (crtc),y
iny
lda (crtc),y
and #$F8
sta ktmp
lda CharPtr+1
adc #$00
and #$07
ora ktmp
sta (crtc),y
cli
pla
sta IndReg
rts
; -------------------------------------------------------------------------
; Cleanup routine that sets the kernal cursor position to ours
.segment "PAGE2"
setsyscursor:
ldy CURS_X
ldx CURS_Y
clc
jmp PLOT ; Set the new cursor
; -------------------------------------------------------------------------
; Low bytes of the start address of the screen lines
.rodata
LineLSBTab:
.byte $00,$50,$A0,$F0,$40,$90,$E0,$30
.byte $80,$D0,$20,$70,$C0,$10,$60,$B0
.byte $00,$50,$A0,$F0,$40,$90,$E0,$30
.byte $80
; -------------------------------------------------------------------------
; High bytes of the start address of the screen lines
LineMSBTab:
.byte $D0,$D0,$D0,$D0,$D1,$D1,$D1,$D2
.byte $D2,$D2,$D3,$D3,$D3,$D4,$D4,$D4
.byte $D5,$D5,$D5,$D5,$D6,$D6,$D6,$D7
.byte $D7
|