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
* -pp : compile in C++ mode
* -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.

View File

@ -18,6 +18,13 @@ __asm bsin
jsr 0xffe4
sta 0xff01
}
__asm bsget
{
lda #0
sta 0xff00
jsr 0xffcf
sta 0xff01
}
__asm bsplot
{
lda #0
@ -43,6 +50,7 @@ __asm dswap
#define dswap 0xff5f
#define bsout 0xffd2
#define bsin 0xffe4
#define bsget 0xffcf
#define bsplot 0xfff0
#define bsinit 0xff81
#elif defined(__PLUS4__)
@ -59,6 +67,12 @@ __asm bsin
jsr 0xffe4
sta 0xff3f
}
__asm bsget
{
sta 0xff3e
jsr 0xffcf
sta 0xff3f
}
__asm bsplot
{
sta 0xff3e
@ -91,6 +105,14 @@ __asm bsin
pha
}
__asm bsget
{
lda 0xe405
pha
lda 0xe404
pha
}
__asm bsplot
{
@ -103,6 +125,7 @@ __asm bsinit
#define bsout 0xffd2
#define bsin 0xffe4
#define bsplot 0xfff0
#define bsget 0xffcf
__asm bsinit
{
lda #147
@ -113,6 +136,7 @@ __asm bsinit
#define bsin 0xffe4
#define bsplot 0xfff0
#define bsinit 0xff81
#define bsget 0xffcf
#endif
#if defined(__C128__) || defined(__C128B__) || defined(__C128E__)
@ -145,138 +169,13 @@ void iocharmap(IOCharMap chmap)
giocharmap = chmap;
#if !defined(__ATARI__)
if (chmap == IOCHM_PETSCII_1)
putch(128 + 14);
putrch(128 + 14);
else if (chmap == IOCHM_PETSCII_2)
putch(14);
putrch(14);
#endif
}
__asm putpch
{
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)
void putrch(char c)
{
__asm {
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)
{
__asm
@ -294,7 +331,7 @@ void clrscr(void)
void textcursor(bool show)
{
*(char *)0xcc = show ? 0 : 1;
*(volatile char *)0xcc = show ? 0 : 1;
}
void gotoxy(char cx, char cy)
@ -310,27 +347,27 @@ void gotoxy(char cx, char cy)
void textcolor(char c)
{
__asm
{
lda c
sta $0286
}
*(volatile char *)0x0286 = c;
}
char wherex(void)
{
__asm
{
lda $d3
sta accu
}
#if defined(__C128__) || defined(__C128B__) || defined(__C128E__)
return *(volatile char *)0xec;
#elif defined(__PLUS4__)
return *(volatile char *)0xca;
#else
return *(volatile char *)0xd3;
#endif
}
char wherey(void)
{
__asm
{
lda $d6
sta accu
}
#if defined(__C128__) || defined(__C128B__) || defined(__C128E__)
return *(volatile char *)0xeb;
#elif defined(__PLUS4__)
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_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 getche(void);
@ -59,15 +72,15 @@ void clrscr(void);
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
void textcursor(bool show);
inline void textcursor(bool show);
#pragma compile("conio.c")

View File

@ -2,237 +2,40 @@
#include "conio.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)
{
__asm {
lda c
jsr putpch
}
putpch(c);
}
char getchar(void)
{
__asm {
jsr getpch
sta accu
lda #0
sta accu + 1
}
return getpch();
}
void puts(const char * str)
{
__asm {
ploop:
ldy #0
lda (str), y
beq pdone
jsr putpch
inc str
bne ploop
inc str + 1
bne ploop
pdone:
}
while (char ch = *str++)
putpch(ch);
}
char * gets(char * str)
{
__asm {
gloop:
jsr getpch
ldy #0
cmp #10
beq gdone
sta (str), y
inc str
bne gloop
inc str + 1
bne gloop
gdone:
lda #0
sta (str), y
char i = 0;
while ((char ch = getpch()) != '\n')
str[i++] = ch;
str[i] = 0;
return str;
}
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;
}

View File

@ -2,7 +2,7 @@
#define STDIO_H
#include <stdlib.h>
#include <stddef.h>
void putchar(char c);
@ -12,6 +12,8 @@ void puts(const char * str);
char * gets(char * str);
char * gets_s(char * str, size_t n);
void printf(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)
return true;
}
else if (!mLinkerObject)
{
return false;
}
else
{
if (address >= BC_REG_TMP && address < BC_REG_TMP_SAVED)