.export _cputcxy, _cputc
.export plot, cputdirect, putchar
- .import popa, _gotoxy
+ .import popa, _gotoxy, mul40
+ .importzp tmp4,ptr4
+ .import _revflag,setcursor
.include "atari.inc"
jsr _gotoxy ; Set cursor, drop x
pla ; Restore C
-.ifdef DIRECT_SCREEN
-
- .importzp tmp4,ptr4
- .import _revflag
-
_cputc:
cmp #$0D ; CR
bne L4
lda #0
sta COLCRS
beq plot ; return
-
+
L4: cmp #$0A ; LF
beq newline
cmp #ATEOL ; Atari-EOL?
cputdirect: ; accepts screen code
jsr putchar
-
+
; advance cursor
inc COLCRS
lda COLCRS
bne plot
lda #0
sta ROWCRS
-plot: ldy COLCRS
+plot: jsr setcursor
+ ldy COLCRS
ldx ROWCRS
rts
+; turn off cursor, update screen, turn on cursor
putchar:
pha ; save char
- lda #0
- sta tmp4
+
+ ldy #0
+ lda OLDCHR
+ sta (OLDADR),y
+
lda ROWCRS
- asl a
- rol tmp4
- asl a
- rol tmp4 ; row * 4
- adc ROWCRS
- bcc L1
- inc tmp4 ; row * 5
-L1: asl a
- rol tmp4 ; row * 10
- asl a
- rol tmp4
- asl a
- rol tmp4 ; row * 40
-L3: clc
+ jsr mul40 ; destroys tmp4
+ clc
adc SAVMSC ; add start of screen memory
sta ptr4
- lda tmp4
+ txa
adc SAVMSC+1
sta ptr4+1
pla ; get char again
+
ora _revflag
+ sta OLDCHR
+
ldy COLCRS
sta (ptr4),y
- rts
+ jmp setcursor
.rodata
ataint: .byte 64,0,32,96
-
-;****************************************************************
-.else ;***** above DIRECT_SCREEN, below thru OS ***************
-;****************************************************************
-
- .import __do_oserror,cursor,__oserror
-
-
-; Plot a character - also used as internal function
-
-_cputc: cmp #$0D ; CR?
- bne L1
- lda #0
- sta COLCRS
- beq plot ; Recalculate pointers
-
-; don't know whether this is needed. the compiler generates
-; already ATEOL chars for \n
-
-L1: cmp #$0A ; LF?
- bne L2
- lda #ATEOL
-
-; Printable char of some sort
-
-L2:
-cputdirect:
- pha
- and #$7f
- cmp #32 ; control char?
- bcs goon
- lda #$1b
- jsr putchar
-goon: pla
- jsr putchar ; Write the character to the screen
-
-plot: ldy COLCRS
- ldx ROWCRS
- rts
-
-; Write one character to the screen without doing anything else, return X
-; position in Y
-
-putchar:
-.if 0
- tax
- lda #>(retr-1)
- pha
- lda #<(retr-1)
- pha
- lda ICPTH
- pha
- lda ICPTL
- pha
- lda #0
- sta LOGCOL
- txa
- rts
-retr:
-.endif
-.if 1
- pha
- ldx #0 ; iocb #0 (screen editor)
- txa
- sta ICBLL,x
- sta ICBLH,x
- sta ICBAL,x
- sta ICBAH,x
- lda #PUTCHR
- sta ICCOM,x
- lda cursor
- beq putc7
- lda #0
- beq putc8
-putc7: lda #1
-putc8: sta CRSINH
- pla
- jsr CIOV
- bpl putc9
- jmp __do_oserror ; update system specific error code
-
-putc9: tya
- ldx #0
- stx __oserror
- ldy COLCRS
-.endif
- rts
-
-.endif ; not defined DIRECT_SCREEN