diff --git a/README.md b/README.md index ee3e79d..284356f 100644 --- a/README.md +++ b/README.md @@ -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. diff --git a/include/conio.c b/include/conio.c index 4acd1ca..a99ad3d 100644 --- a/include/conio.c +++ b/include/conio.c @@ -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,143 +169,156 @@ 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 +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 + __asm { + lda c + jsr bsout + } +} +void putpch(char c) +{ +#if defined(__ATARI__) + if (c == 10) + c = 0x9b; #else - cmp #97 - bcs w2 - cmp #91 - bcs w3 - w2: - eor #$20 + 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 - cpx #IOCHM_PETSCII_2 - beq w3 - and #$df - w3: - jmp bsout + + putrch(c); } -__asm getpch +static char convch(char ch) { - jsr bsin +#if !defined(__ATARI__) - ldx giocharmap - cpx #IOCHM_ASCII - bcc w3 + 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; + } + } + } - cmp #13 - bne w1 - lda #10 - w1: - cpx #IOCHM_PETSCII_1 - bcc w3 +#endif + return ch; +} - cmp #219 - bcs w3 - cmp #65 - bcc w3 +char getrch(void) +{ + return __asm { + jsr bsget + sta accu + }; +} - cmp #193 - bcc w4 - eor #$a0 - w4: - cmp #123 - bcs w3 - cmp #97 - bcs w2 - cmp #91 - bcs w3 - w2: - eor #$20 - w3: +char getpch(void) +{ + return convch(getrch()); } char kbhit(void) { - __asm + return __asm { lda $c6 sta accu - } + }; } char getche(void) { - __asm - { - L1: - jsr getpch - cmp #0 - beq L1 + char ch; + do { + ch = __asm { + jsr bsin + sta accu + }; + } while (!ch); - sta accu - jsr putpch + __asm { + lda ch + jsr bsout } + return convch(ch); } char getch(void) { - __asm - { - L1: - jsr getpch - cmp #0 - beq L1 + char ch; + do { + ch = __asm { + jsr bsin + sta accu + }; + } while (!ch); - sta accu - } + return convch(ch); } char getchx(void) { - __asm - { - jsr getpch - sta accu - } + char ch = __asm { + jsr bsin + sta accu + }; + + return convch(ch); } void putch(char c) { - __asm { - lda c - jsr bsout - } + putpch(c); } void clrscr(void) @@ -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 } diff --git a/include/conio.h b/include/conio.h index e4ae91f..a401398 100644 --- a/include/conio.h +++ b/include/conio.h @@ -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") diff --git a/include/stdio.c b/include/stdio.c index 60f995e..84bcce0 100644 --- a/include/stdio.c +++ b/include/stdio.c @@ -3,237 +3,40 @@ #include "stdlib.h" #include "stdbool.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; } diff --git a/include/stdio.h b/include/stdio.h index a994351..431c8b9 100644 --- a/include/stdio.h +++ b/include/stdio.h @@ -3,7 +3,7 @@ #include #include - +#include void putchar(char c); @@ -14,6 +14,8 @@ void puts(const char * str); char * gets(char * str); char* gets_s(char* str, size_t n); +char * gets_s(char * str, size_t n); + void printf(const char * fmt, ...); int sprintf(char * str, const char * fmt, ...); diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index 270c881..c308056 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -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)