diff --git a/cfg/c1p.cfg b/cfg/c1p.cfg index d4c248c4f..46015017b 100644 --- a/cfg/c1p.cfg +++ b/cfg/c1p.cfg @@ -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 index 0c001cf58..000000000 --- a/libsrc/c1p/cputc.c +++ /dev/null @@ -1,71 +0,0 @@ -/* - * cputc.c - * - * void __fastcall__ cputcxy (unsigned char x, unsigned char y, char c); - * void __fastcall__ cputc (char c); - */ - -#include - -/* Implements a 25 by 25 screen in the 1024 bytes video ram (32 by 32) */ -#define LINEWIDTH 0x20 -#define SCREENBASE ((char *) 0xd000) -#define TOP_OFFSET 4 -#define LEFT_OFFSET 3 -#define SCREENVISBASE (SCREENBASE + 4 * LINEWIDTH + LEFT_OFFSET) -#define WIDTH 25 -#define HEIGHT 25 - -static unsigned char xpos = 0; -static unsigned char ypos = 0; - -void __fastcall__ cputc(char c) -{ - char * const cp = SCREENVISBASE + ypos * LINEWIDTH + xpos; - - *cp = c; - - xpos += 1; - if (xpos > WIDTH - 1) { - xpos = 0; - ypos += 1; - - if (ypos > HEIGHT - 1) { - ypos = 0; - } - } -} - -void __fastcall__ cputcxy (unsigned char x, unsigned char y, char c) -{ - xpos = x > WIDTH - 1 ? WIDTH - 1 : x; - ypos = y > HEIGHT - 1 ? HEIGHT - 1 : y; - - cputc(c); -} - -unsigned char wherex (void) -{ - return xpos; -} - -unsigned char wherey (void) -{ - return ypos; -} - -void __fastcall__ gotox (unsigned char x) -{ - xpos = x; -} - -void __fastcall__ gotoy (unsigned char y) -{ - ypos = y; -} - -void __fastcall__ gotoxy (unsigned char x, unsigned char y) -{ - xpos = x; - ypos = y; -} diff --git a/libsrc/c1p/cputc.s b/libsrc/c1p/cputc.s new file mode 100644 index 000000000..192aec097 --- /dev/null +++ b/libsrc/c1p/cputc.s @@ -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 index 000000000..0f9632df2 --- /dev/null +++ b/libsrc/c1p/extzp.inc @@ -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 index 000000000..139feffde --- /dev/null +++ b/libsrc/c1p/extzp.s @@ -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 index 000000000..64c6bd21d --- /dev/null +++ b/libsrc/c1p/gotoxy.s @@ -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 + +