Reduce inline assembly in stdio and conio

This commit is contained in:
drmortalwombat 2024-09-28 12:25:44 +02:00
parent 3dfba389ff
commit bf5f5a807c
6 changed files with 191 additions and 332 deletions

View File

@ -134,7 +134,7 @@ The compiler is command line driven, and creates an executable .prg file.
* -cid : cartridge type ID, used by vice emulator * -cid : cartridge type ID, used by vice emulator
* -pp : compile in C++ mode * -pp : compile in C++ mode
* -psci : use PETSCII encoding for all strings without prefix * -psci : use PETSCII encoding for all strings without prefix
* -rpt : generate error files .error.map, .error.asm when linker fails * -rmp : generate error files .error.map, .error.asm when linker fails
A list of source files can be provided. A list of source files can be provided.

View File

@ -18,6 +18,13 @@ __asm bsin
jsr 0xffe4 jsr 0xffe4
sta 0xff01 sta 0xff01
} }
__asm bsget
{
lda #0
sta 0xff00
jsr 0xffcf
sta 0xff01
}
__asm bsplot __asm bsplot
{ {
lda #0 lda #0
@ -43,6 +50,7 @@ __asm dswap
#define dswap 0xff5f #define dswap 0xff5f
#define bsout 0xffd2 #define bsout 0xffd2
#define bsin 0xffe4 #define bsin 0xffe4
#define bsget 0xffcf
#define bsplot 0xfff0 #define bsplot 0xfff0
#define bsinit 0xff81 #define bsinit 0xff81
#elif defined(__PLUS4__) #elif defined(__PLUS4__)
@ -59,6 +67,12 @@ __asm bsin
jsr 0xffe4 jsr 0xffe4
sta 0xff3f sta 0xff3f
} }
__asm bsget
{
sta 0xff3e
jsr 0xffcf
sta 0xff3f
}
__asm bsplot __asm bsplot
{ {
sta 0xff3e sta 0xff3e
@ -91,6 +105,14 @@ __asm bsin
pha pha
} }
__asm bsget
{
lda 0xe405
pha
lda 0xe404
pha
}
__asm bsplot __asm bsplot
{ {
@ -103,6 +125,7 @@ __asm bsinit
#define bsout 0xffd2 #define bsout 0xffd2
#define bsin 0xffe4 #define bsin 0xffe4
#define bsplot 0xfff0 #define bsplot 0xfff0
#define bsget 0xffcf
__asm bsinit __asm bsinit
{ {
lda #147 lda #147
@ -113,6 +136,7 @@ __asm bsinit
#define bsin 0xffe4 #define bsin 0xffe4
#define bsplot 0xfff0 #define bsplot 0xfff0
#define bsinit 0xff81 #define bsinit 0xff81
#define bsget 0xffcf
#endif #endif
#if defined(__C128__) || defined(__C128B__) || defined(__C128E__) #if defined(__C128__) || defined(__C128B__) || defined(__C128E__)
@ -145,138 +169,13 @@ void iocharmap(IOCharMap chmap)
giocharmap = chmap; giocharmap = chmap;
#if !defined(__ATARI__) #if !defined(__ATARI__)
if (chmap == IOCHM_PETSCII_1) if (chmap == IOCHM_PETSCII_1)
putch(128 + 14); putrch(128 + 14);
else if (chmap == IOCHM_PETSCII_2) else if (chmap == IOCHM_PETSCII_2)
putch(14); putrch(14);
#endif #endif
} }
__asm putpch void putrch(char c)
{
ldx giocharmap
cpx #IOCHM_ASCII
bcc w3
cmp #10
bne w1
lda #13
w1:
cpx #IOCHM_PETSCII_1
bcc w3
cmp #65
bcc w3
cmp #123
bcs w3
#if defined(__CBMPET__)
cmp #97
bcs w4
cmp #91
bcs w3
w2:
eor #$a0
w4:
eor #$20
#else
cmp #97
bcs w2
cmp #91
bcs w3
w2:
eor #$20
#endif
cpx #IOCHM_PETSCII_2
beq w3
and #$df
w3:
jmp bsout
}
__asm getpch
{
jsr bsin
ldx giocharmap
cpx #IOCHM_ASCII
bcc w3
cmp #13
bne w1
lda #10
w1:
cpx #IOCHM_PETSCII_1
bcc w3
cmp #219
bcs w3
cmp #65
bcc w3
cmp #193
bcc w4
eor #$a0
w4:
cmp #123
bcs w3
cmp #97
bcs w2
cmp #91
bcs w3
w2:
eor #$20
w3:
}
char kbhit(void)
{
__asm
{
lda $c6
sta accu
}
}
char getche(void)
{
__asm
{
L1:
jsr getpch
cmp #0
beq L1
sta accu
jsr putpch
}
}
char getch(void)
{
__asm
{
L1:
jsr getpch
cmp #0
beq L1
sta accu
}
}
char getchx(void)
{
__asm
{
jsr getpch
sta accu
}
}
void putch(char c)
{ {
__asm { __asm {
lda c lda c
@ -284,6 +183,144 @@ void putch(char c)
} }
} }
void putpch(char c)
{
#if defined(__ATARI__)
if (c == 10)
c = 0x9b;
#else
if (giocharmap >= IOCHM_ASCII)
{
if (c == '\n')
c = 13;
else if (c == '\t')
{
char n = wherex() & 3;
do {
putrch(' ');
} while (++n < 4);
return;
}
else if (giocharmap >= IOCHM_PETSCII_1)
{
if (c >= 65 && c < 123)
{
if (c >= 97 || c < 91)
{
#if defined(__CBMPET__)
if (c >= 97)
c ^= 0xa0;
c ^= 0x20;
#else
if (c >= 97)
c ^= 0x20;
#endif
if (giocharmap == IOCHM_PETSCII_2)
c &= 0xdf;
}
}
}
}
#endif
putrch(c);
}
static char convch(char ch)
{
#if !defined(__ATARI__)
if (giocharmap >= IOCHM_ASCII)
{
if (ch == 13)
ch = 10;
else if (giocharmap >= IOCHM_PETSCII_1)
{
if (ch >= 65 && ch < 219)
{
if (ch >= 193)
ch ^= 0xa0;
if (ch < 123 && (ch >= 97 || ch < 91))
ch ^= 0x20;
}
}
}
#endif
return ch;
}
char getrch(void)
{
return __asm {
jsr bsget
sta accu
};
}
char getpch(void)
{
return convch(getrch());
}
char kbhit(void)
{
return __asm
{
lda $c6
sta accu
};
}
char getche(void)
{
char ch;
do {
ch = __asm {
jsr bsin
sta accu
};
} while (!ch);
__asm {
lda ch
jsr bsout
}
return convch(ch);
}
char getch(void)
{
char ch;
do {
ch = __asm {
jsr bsin
sta accu
};
} while (!ch);
return convch(ch);
}
char getchx(void)
{
char ch = __asm {
jsr bsin
sta accu
};
return convch(ch);
}
void putch(char c)
{
putpch(c);
}
void clrscr(void) void clrscr(void)
{ {
__asm __asm
@ -294,7 +331,7 @@ void clrscr(void)
void textcursor(bool show) void textcursor(bool show)
{ {
*(char *)0xcc = show ? 0 : 1; *(volatile char *)0xcc = show ? 0 : 1;
} }
void gotoxy(char cx, char cy) void gotoxy(char cx, char cy)
@ -310,27 +347,27 @@ void gotoxy(char cx, char cy)
void textcolor(char c) void textcolor(char c)
{ {
__asm *(volatile char *)0x0286 = c;
{
lda c
sta $0286
}
} }
char wherex(void) char wherex(void)
{ {
__asm #if defined(__C128__) || defined(__C128B__) || defined(__C128E__)
{ return *(volatile char *)0xec;
lda $d3 #elif defined(__PLUS4__)
sta accu return *(volatile char *)0xca;
} #else
return *(volatile char *)0xd3;
#endif
} }
char wherey(void) char wherey(void)
{ {
__asm #if defined(__C128__) || defined(__C128B__) || defined(__C128E__)
{ return *(volatile char *)0xeb;
lda $d6 #elif defined(__PLUS4__)
sta accu return *(volatile char *)0xcd;
} #else
return *(volatile char *)0xd6;
#endif
} }

View File

@ -43,6 +43,19 @@ void dispmode80col(void);
#define PETSCII_F7 0x88 #define PETSCII_F7 0x88
#define PETSCII_F8 0x8c #define PETSCII_F8 0x8c
// Lowlevel console in/out
// using petscii translation
void putpch(char c);
char getpch(void);
// using no translation
inline void putrch(char c);
inline char getrch(void);
// Standard console in/out
char kbhit(void); char kbhit(void);
char getche(void); char getche(void);
@ -59,15 +72,15 @@ void clrscr(void);
void gotoxy(char x, char y); void gotoxy(char x, char y);
void textcolor(char c); inline void textcolor(char c);
char wherex(void); inline char wherex(void);
char wherey(void); inline char wherey(void);
// show or hide the text cursor // show or hide the text cursor
void textcursor(bool show); inline void textcursor(bool show);
#pragma compile("conio.c") #pragma compile("conio.c")

View File

@ -2,237 +2,40 @@
#include "conio.h" #include "conio.h"
#include "stdlib.h" #include "stdlib.h"
#if defined(__C128__)
#pragma code(lowcode)
__asm bsout
{
ldx #0
stx 0xff00
jsr 0xffd2
sta 0xff01
}
__asm bsplot
{
lda #0
sta 0xff00
jsr 0xfff0
sta 0xff01
}
__asm bsin
{
lda #0
sta 0xff00
jsr 0xffcf
sta 0xff01
}
#pragma code(code)
#elif defined(__PLUS4__)
#pragma code(lowcode)
__asm bsout
{
sta 0xff3e
jsr 0xffd2
sta 0xff3f
}
__asm bsin
{
sta 0xff3e
jsr 0xffe4
sta 0xff3f
}
__asm bsplot
{
sta 0xff3e
jsr 0xfff0
sta 0xff3f
}
#pragma code(code)
#elif defined(__ATARI__)
__asm bsout
{
tax
lda 0xe407
pha
lda 0xe406
pha
txa
}
__asm bsin
{
lda 0xe405
pha
lda 0xe404
pha
}
__asm bsplot
{
}
#else
#define bsout 0xffd2
#define bsplot 0xfff0
#define bsin 0xffcf
#endif
__asm putpch
{
#if defined(__ATARI__)
cmp #10
bne w1
lda #0x9b
w1:
jmp bsout
#else
ldx giocharmap
cpx #IOCHM_ASCII
bcc w3
cmp #10
bne w1
lda #13
w1:
cmp #9
beq t1
cpx #IOCHM_PETSCII_1
bcc w3
cmp #65
bcc w3
cmp #123
bcs w3
#if defined(__CBMPET__)
cmp #97
bcs w4
cmp #91
bcs w3
w2:
eor #$a0
w4:
eor #$20
#else
cmp #97
bcs w2
cmp #91
bcs w3
w2:
eor #$20
#endif
cpx #IOCHM_PETSCII_2
beq w3
and #$df
w3:
jmp bsout
t1:
sec
jsr bsplot
tya
and #3
eor #3
tax
lda #$20
l1:
jsr bsout
dex
bpl l1
#endif
}
__asm getpch
{
jsr bsin
#if !defined(__ATARI__)
ldx giocharmap
cpx #IOCHM_ASCII
bcc w3
cmp #13
bne w1
lda #10
w1:
cpx #IOCHM_PETSCII_1
bcc w3
cmp #219
bcs w3
cmp #65
bcc w3
cmp #193
bcc w4
eor #$a0
w4:
cmp #123
bcs w3
cmp #97
bcs w2
cmp #91
bcs w3
w2:
eor #$20
w3:
#endif
}
void putchar(char c) void putchar(char c)
{ {
__asm { putpch(c);
lda c
jsr putpch
}
} }
char getchar(void) char getchar(void)
{ {
__asm { return getpch();
jsr getpch
sta accu
lda #0
sta accu + 1
}
} }
void puts(const char * str) void puts(const char * str)
{ {
__asm { while (char ch = *str++)
ploop: putpch(ch);
ldy #0
lda (str), y
beq pdone
jsr putpch
inc str
bne ploop
inc str + 1
bne ploop
pdone:
}
} }
char * gets(char * str) char * gets(char * str)
{ {
__asm { char i = 0;
gloop: while ((char ch = getpch()) != '\n')
jsr getpch str[i++] = ch;
ldy #0 str[i] = 0;
cmp #10 return str;
beq gdone
sta (str), y
inc str
bne gloop
inc str + 1
bne gloop
gdone:
lda #0
sta (str), y
} }
char * gets_s(char * str, size_t n)
{
char i = 0, t = n - 1;
while ((char ch = getpch()) != '\n')
{
if (i < t)
str[i++] = ch;
}
str[i] = 0;
return str; return str;
} }

View File

@ -2,7 +2,7 @@
#define STDIO_H #define STDIO_H
#include <stdlib.h> #include <stdlib.h>
#include <stddef.h>
void putchar(char c); void putchar(char c);
@ -12,6 +12,8 @@ void puts(const char * str);
char * gets(char * str); char * gets(char * str);
char * gets_s(char * str, size_t n);
void printf(const char * fmt, ...); void printf(const char * fmt, ...);
int sprintf(char * str, const char * fmt, ...); int sprintf(char * str, const char * fmt, ...);

View File

@ -1419,6 +1419,10 @@ bool NativeCodeInstruction::ChangesZeroPage(int address) const
if (address >= BC_REG_TMP && address < BC_REG_TMP + mLinkerObject->mProc->mCallerSavedTemps) if (address >= BC_REG_TMP && address < BC_REG_TMP + mLinkerObject->mProc->mCallerSavedTemps)
return true; return true;
} }
else if (!mLinkerObject)
{
return false;
}
else else
{ {
if (address >= BC_REG_TMP && address < BC_REG_TMP_SAVED) if (address >= BC_REG_TMP && address < BC_REG_TMP_SAVED)