1
0
mirror of https://github.com/cc65/cc65.git synced 2024-06-08 15:29:37 +00:00

Switch to assembler for cputc implementation.

This commit is contained in:
Stephan Mühlstrasser 2014-11-22 01:07:55 +01:00
parent 5c8cd00dd5
commit 0a6afb59c0
6 changed files with 166 additions and 72 deletions

View 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;
}

View File

@ -1,71 +0,0 @@
/*
* cputc.c
*
* void __fastcall__ cputcxy (unsigned char x, unsigned char y, char c);
* void __fastcall__ cputc (char c);
*/
#include <conio.h>
/* 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;
}

117
libsrc/c1p/cputc.s Normal file
View File

@ -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

7
libsrc/c1p/extzp.inc Normal file
View File

@ -0,0 +1,7 @@
;
; Additional zero page locations for the Challenger 1P.
;
; ------------------------------------------------------------------------
.globalzp CURS_X, CURS_Y, SCR_LINELEN, SCREEN_PTR

23
libsrc/c1p/extzp.s Normal file
View File

@ -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

17
libsrc/c1p/gotoxy.s Normal file
View File

@ -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