]> git.sur5r.net Git - cc65/commitdiff
Switch to assembler for cputc implementation.
authorStephan Mühlstrasser <stephan.muehlstrasser@web.de>
Sat, 22 Nov 2014 00:07:55 +0000 (01:07 +0100)
committerStephan Mühlstrasser <stephan.muehlstrasser@web.de>
Sat, 22 Nov 2014 00:07:55 +0000 (01:07 +0100)
cfg/c1p.cfg
libsrc/c1p/cputc.c [deleted file]
libsrc/c1p/cputc.s [new file with mode: 0644]
libsrc/c1p/extzp.inc [new file with mode: 0644]
libsrc/c1p/extzp.s [new file with mode: 0644]
libsrc/c1p/gotoxy.s [new file with mode: 0644]

index d4c248c4f895cf59f99868cd91cec058c19eae64..46015017b367883ca0130e8ad51508409dcb47b5 100644 (file)
@@ -14,7 +14,7 @@ SYMBOLS {
     __HIMEM__:     type = weak, value = $2000; # Presumed RAM end
 }
 MEMORY {
-    ZP:       file = "", define = yes, start = $0002, size = $001A;
+    ZP:       file = "", define = yes, start = $0002, size = $001A + $0005;
     RAM:      file = %O, define = yes, start = %S, size = __HIMEM__ - __STACKSIZE__ - %S;
 }
 SEGMENTS {
@@ -26,4 +26,5 @@ SEGMENTS {
     DATA:     load = RAM, type = rw;
     BSS:      load = RAM, type = bss, define = yes;
     ZEROPAGE: load = ZP,  type = zp;
+    EXTZP:    load = ZP,  type = rw,  define = yes;
 }
diff --git a/libsrc/c1p/cputc.c b/libsrc/c1p/cputc.c
deleted file mode 100644 (file)
index 0c001cf..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-/*\r
- * cputc.c\r
- *\r
- * void __fastcall__ cputcxy (unsigned char x, unsigned char y, char c);\r
- * void __fastcall__ cputc (char c);\r
- */\r
-\r
-#include <conio.h>\r
-\r
-/* Implements a 25 by 25 screen in the 1024 bytes video ram (32 by 32) */\r
-#define LINEWIDTH 0x20\r
-#define SCREENBASE ((char *) 0xd000)\r
-#define TOP_OFFSET 4\r
-#define LEFT_OFFSET 3\r
-#define SCREENVISBASE (SCREENBASE + 4 * LINEWIDTH + LEFT_OFFSET)\r
-#define WIDTH 25\r
-#define HEIGHT 25\r
-\r
-static unsigned char xpos = 0;\r
-static unsigned char ypos = 0;\r
-\r
-void __fastcall__ cputc(char c)\r
-{\r
-    char * const cp = SCREENVISBASE + ypos * LINEWIDTH + xpos;\r
-\r
-    *cp = c;\r
-\r
-    xpos += 1;\r
-    if (xpos > WIDTH - 1) {\r
-        xpos = 0;\r
-        ypos += 1;\r
-\r
-        if (ypos > HEIGHT - 1) {\r
-            ypos = 0;\r
-        }\r
-    }\r
-}\r
-\r
-void __fastcall__ cputcxy (unsigned char x, unsigned char y, char c)\r
-{\r
-    xpos = x > WIDTH - 1 ? WIDTH - 1 : x;\r
-    ypos = y > HEIGHT - 1 ? HEIGHT - 1 : y;\r
-\r
-    cputc(c);\r
-}\r
-\r
-unsigned char wherex (void)\r
-{\r
-    return xpos;\r
-}\r
-\r
-unsigned char wherey (void)\r
-{\r
-    return ypos;\r
-}\r
-\r
-void __fastcall__ gotox (unsigned char x)\r
-{\r
-    xpos = x;\r
-}\r
-\r
-void __fastcall__ gotoy (unsigned char y)\r
-{\r
-    ypos = y;\r
-}\r
-\r
-void __fastcall__ gotoxy (unsigned char x, unsigned char y)\r
-{\r
-    xpos = x;\r
-    ypos = y;\r
-}\r
diff --git a/libsrc/c1p/cputc.s b/libsrc/c1p/cputc.s
new file mode 100644 (file)
index 0000000..192aec0
--- /dev/null
@@ -0,0 +1,117 @@
+;
+; 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
+        .import         popa, _gotoxy
+
+        .include        "c1p.inc"
+        .include        "extzp.inc"
+
+_cputcxy:
+        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
+
+L1:     cmp     #$0D            ; LF?
+        beq     newline         ; Recalculate pointers
+
+; Printable char of some sort
+
+;        cmp     #' '
+;        bcc     cputdirect      ; Other control char < 0x20
+;        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:
+        cpy     SCR_LINELEN     ; xsize-1
+        bne     L3
+        jsr     newline         ; new line
+        ldy     #$FF            ; + cr
+L3:     iny
+        sty     CURS_X
+        rts
+
+newline:
+        lda     SCR_LINELEN     ; xsize-1
+        sec                     ; Account for -1 above
+        adc     SCREEN_PTR
+        sta     SCREEN_PTR
+        bcc     L4
+        inc     SCREEN_PTR+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
+
+
+
+; Set cursor position, calculate RAM pointers
+
+plot:   ldy     CURS_Y
+        lda     ScrLo,y
+        sta     SCREEN_PTR
+        lda     ScrHi,y
+;        ldy     SCR_LINELEN
+;        cpy     #40+1
+;        bcc     @L1
+;        asl     SCREEN_PTR              ; 80 column mode
+;        rol     a
+;@L1:    ora     #$80                    ; Screen at $8000
+        sta     SCREEN_PTR+1
+        rts
+
+
+; Write one character to the screen without doing anything else, return X
+; position in Y
+
+putchar:
+;        ora     RVS             ; Set revers bit
+        ldy     CURS_X
+        sta     (SCREEN_PTR),y  ; Set char
+        rts
+
+; Screen address tables - offset to real screen
+
+.rodata
+
+ScrLo:  .byte   $83, $A3, $C3, $E3, $03, $23, $43, $63
+        .byte   $83, $A3, $C3, $E3, $03, $23, $43, $63
+        .byte   $83, $A3, $C3, $E3, $03, $23, $43, $63
+        .byte   $83
+
+ScrHi:  .byte   $D0, $D0, $D0, $D0, $D1, $D1, $D1, $D1
+        .byte   $D1, $D1, $D1, $D1, $D2, $D2, $D2, $D2
+        .byte   $D2, $D2, $D2, $D2, $D3, $D3, $D3, $D3
+        .byte   $D3
diff --git a/libsrc/c1p/extzp.inc b/libsrc/c1p/extzp.inc
new file mode 100644 (file)
index 0000000..0f9632d
--- /dev/null
@@ -0,0 +1,7 @@
+;
+; Additional zero page locations for the Challenger 1P.
+;
+
+; ------------------------------------------------------------------------
+
+        .globalzp       CURS_X, CURS_Y, SCR_LINELEN, SCREEN_PTR
diff --git a/libsrc/c1p/extzp.s b/libsrc/c1p/extzp.s
new file mode 100644 (file)
index 0000000..139feff
--- /dev/null
@@ -0,0 +1,23 @@
+;
+; Additional zero page locations for the Challenger 1P.
+; NOTE: The zeropage locations contained in this file get initialized
+; in the startup code, so if you change anything here, be sure to check
+; not only the linker config, but also the startup file.
+;
+
+; ------------------------------------------------------------------------
+
+        .include        "extzp.inc"
+
+.segment        "EXTZP" : zeropage
+
+; The following values get initialized from a table in the startup code.
+; While this sounds crazy, it has reasons that have to do with modules (and
+; we have the space anyway). So when changing anything, be sure to adjust the
+; initializer table
+CURS_X:         .byte   0
+CURS_Y:         .byte   0
+SCR_LINELEN:    .byte   24
+SCREEN_PTR:     .res    2
+
+; size 5
diff --git a/libsrc/c1p/gotoxy.s b/libsrc/c1p/gotoxy.s
new file mode 100644 (file)
index 0000000..64c6bd2
--- /dev/null
@@ -0,0 +1,17 @@
+;
+; Ullrich von Bassewitz, 06.08.1998
+;
+; void gotoxy (unsigned char x, unsigned char y);
+;
+
+        .export         _gotoxy
+        .import         popa, plot
+        .importzp       CURS_X, CURS_Y
+
+_gotoxy:
+        sta     CURS_Y          ; Set Y
+        jsr     popa            ; Get X
+        sta     CURS_X          ; Set X
+        jmp     plot            ; Set the cursor position
+
+