__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 {
DATA: load = RAM, type = rw;
BSS: load = RAM, type = bss, define = yes;
ZEROPAGE: load = ZP, type = zp;
+ EXTZP: load = ZP, type = rw, define = yes;
}
+++ /dev/null
-/*\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
--- /dev/null
+;
+; 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
--- /dev/null
+;
+; Additional zero page locations for the Challenger 1P.
+;
+
+; ------------------------------------------------------------------------
+
+ .globalzp CURS_X, CURS_Y, SCR_LINELEN, SCREEN_PTR
--- /dev/null
+;
+; 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
--- /dev/null
+;
+; 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
+
+