]> git.sur5r.net Git - cc65/blobdiff - libsrc/c128/cputc.s
poor man's _toascii routine, contributed by Fatih Aygun
[cc65] / libsrc / c128 / cputc.s
index e352282c6e81dfacd63f1f356db198612f564d83..5442e9f571f7dcb9aebd22c4d4343283e3716f9b 100644 (file)
 ;
-; Ullrich von Bassewitz, 06.08.1998
+; Ullrich von Bassewitz, 2000-08-06, 2002-12-21
+; Using lots of code from MagerValp, MagerValp@cling.gu.se
 ;
 ; void cputcxy (unsigned char x, unsigned char y, char c);
 ; void cputc (char c);
 ;
 
-       .export         _cputcxy, _cputc, cputdirect, putchar
-       .export         plot
-       .import         popa, _gotoxy
-       .import         xsize, revers
+       .export         _cputcxy, _cputc, cputdirect, putchar
+       .export         newline, plot
+        .constructor    initcputc
+        .destructor     donecputc
+       .import         popa, _gotoxy
+        .import         PLOT
 
-       .include        "c128.inc"
-       .include        "../cbm/cbm.inc"
+       .include        "c128.inc"
+
+cputdirect      = PRINT
+newline         = NEWLINE
+
+;--------------------------------------------------------------------------
+
+.code
 
 _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?
+               beq     cr              ; Output a cr
 
-L1:    cmp     #$0D            ; LF?
+       cmp     #$0D            ; LF?
                bne     L2
-       ldy     CURS_Y
-       iny
-       bne     newline         ; Recalculate pointers
+               jmp     NEWLINE         ; Update cursor position
 
 ; Printable char of some sort
 
-L2:            cmp     #' '
-       bcc     cputdirect      ; Other control char
+L2:    cmp     #' '
+               bcc     L4              ; Other control char
        tay
-       bmi     L10
+       bmi     L5
        cmp     #$60
        bcc     L3
        and     #$DF
-       bne     cputdirect      ; Branch always
+       bne     L4              ; Branch always
 L3:    and     #$3F
-
-cputdirect:
-       jsr     putchar         ; Write the character to the screen
-
-; Advance cursor position
-
-advance:
-       iny
-       cpy     xsize
-       bne     L9
-newline:
-       ldy     #0              ; new line
-       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
-L9:            sty     CURS_X
-       rts
+L4:     jmp     PRINT                  ; Output character
 
 ; 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
+L5:    and     #$7F
+               cmp     #$7E            ; PI?
+       bne     L6
+       lda     #$5E            ; Load screen code for PI
+       bne     L4
+L6:    ora     #$40
+       bne     L4              ; Branch always
 
+; Carriage return
 
+cr:    lda     #0
+       sta     CURS_X
 
 ; Set cursor position, calculate RAM pointers
 
 plot:  ldy     CURS_X
        ldx     CURS_Y
        clc
-       jmp     PLOT            ; Set the new cursor
-
-
+       jmp     PLOT            ; Set the new cursor
 
 ; 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
-       lda     CHARCOLOR
-       sta     (CRAM_PTR),y    ; Set color
-       rts
+putchar        = $CC2F
+
+;--------------------------------------------------------------------------
+; Module constructor/destructor. Don't move the constructor into the INIT
+; segment, because it shares most of the code with the destructor.
+
+initcputc:
+       lda     #$C0
+        .byte   $2C
+donecputc:
+        lda     #$00
+       sta     SCROLL
+        rts
+