From 2161b198b7b333147c89ef0346d8e9bb6ab9ffd9 Mon Sep 17 00:00:00 2001 From: ggn Date: Fri, 21 Apr 2017 14:49:33 +0300 Subject: [PATCH] 6502 mode: fix clearing of its RAM space with each .6502 invocation. Also fixed chptr resetting with each .6502 invocation. Also in this mode: dc.b strings with single quotes will get encoded to Atari 800 internal encoding (hardcoded mode for now, can be extended). --- 6502.c | 49 ++++++++++++++++++++++++++++++++++++------------- direct.c | 16 +++++++++++++++- direct.h | 1 + docs/rmac.rst | 4 ++-- sect.c | 5 +++++ token.c | 6 ++++++ token.h | 7 +++++++ 7 files changed, 72 insertions(+), 16 deletions(-) diff --git a/6502.c b/6502.c index afc0ba1..099c89d 100644 --- a/6502.c +++ b/6502.c @@ -25,6 +25,7 @@ static uint16_t orgmap[1024][2]; // Mark all 6502 org changes // Exported vars const char in_6502mode[] = "directive illegal in .6502 section"; uint16_t * currentorg = &orgmap[0][0]; // Current org range +char strtoa8[128]; // ASCII to Atari 800 internal conversion table // // 6502 addressing modes; @@ -145,9 +146,24 @@ static int abs2zp[] = -1 // ZPY }; +static char a8internal[] = +{ + ' ', 0, '!', 1, '"', 2, '#', 3, '$', 4, '%', 5, '&', 6, '\'', 7, + '(', 8, ')', 9, '*', 10, '+', 11, ',', 12, '-', 13, '.', 14, '/', 15, + '0', 16, '1', 17, '2', 18, '3', 19, '4', 20, '5', 21, '6', 22, '7', 23, + '8', 24, '9', 25, ':', 26, ';', 27, '<', 28, '=', 29, '>', 30, '?', 31, + '@', 32, 'A', 33, 'B', 34, 'C', 35, 'D', 36, 'E', 37, 'F', 38, 'G', 39, + 'H', 40, 'I', 41, 'J', 42, 'K', 43, 'L', 44, 'M', 45, 'N', 46, 'O', 47, + 'P', 48, 'Q', 49, 'R', 50, 'S', 51, 'T', 52, 'U', 53, 'V', 54, 'W', 55, + 'X', 56, 'Y', 57, 'Z', 58, '[', 59, '\\', 60, ']', 61, '^', 62, '_', 63, + 'a', 97, 'b', 98, 'c', 99, 'd', 100, 'e', 101, 'f', 102, 'g', 103, 'h', 104, + 'i', 105, 'j', 106, 'k', 107, 'l', 108, 'm', 109, 'n', 110, 'o', 111, 'p', 112, + 'q', 113, 'r', 114, 's', 115, 't', 116, 'u', 117, 'v', 118, 'w', 119, 'x', 120, + 'y', 121, 'z', 122 +}; // -// Initialize 6502 assembler +// initialize 6502 assembler // void Init6502() { @@ -186,8 +202,26 @@ void Init6502() // Set up first org section (set to zero) orgmap[0][0] = 0; -} + SwitchSection(M6502); // Switch to 6502 section + // + // Initialise string conversion table(s) + // + + char *p = a8internal; + memset(strtoa8, 31, 128); // 31=fallback value ("?") + for (; p < a8internal + sizeof(a8internal); p += 2) + { + strtoa8[p[0]] = p[1]; + } + + if (challoc == 0) { + // Allocate and clear 64K of space for the 6502 section + chcheck(UPSEG_SIZE); + memset(sect[M6502].scode->chptr, 0, UPSEG_SIZE); + } + SwitchSection(TEXT); // Go back to TEXT +} // // .6502 --- enter 6502 mode @@ -197,13 +231,6 @@ int d_6502() SaveSection(); // Save curent section SwitchSection(M6502); // Switch to 6502 section - if (challoc == 0) - { - // Allocate and clear 64K of space for the 6502 section - chcheck(UPSEG_SIZE); - memset(sect[M6502].scode->chptr, 0, UPSEG_SIZE); - } - return 0; } @@ -556,10 +583,6 @@ badmode: // Generate 6502 object output file. // // ggn: converted into a com/exe/xex output format -// Notes: 1. The $FFFF is only mandatory for the first segment, but let's -// dump it everywhere for now -// 2. It's still dumping pages instead of more fine grained stuff. -// Should look into this - a8 people don't like waste so much ;) void m6502obj(int ofd) { uint16_t exeheader[3]; diff --git a/direct.c b/direct.c index 6a41e82..b7dfb85 100644 --- a/direct.c +++ b/direct.c @@ -27,6 +27,7 @@ TOKEN exprbuf[128]; // Expression buffer SYM * symbolPtr[1000000]; // Symbol pointers table static long unused; // For supressing 'write' warnings char buffer[256]; // Scratch buffer for messages +int stringtype; // Non-zero if we need any special string conversions // Function prototypes int d_unimpl(void); @@ -989,8 +990,21 @@ int d_dc(WORD siz) if ((challoc - ch_size) < i) chcheck(i); - for(p=string[tok[1]]; *p!=EOS; p++) + if (stringtype == NORMAL) + { + for (p = string[tok[1]]; *p != EOS; p++) D_byte(*p); + } + else if(stringtype == A8INT) + { + for (p = string[tok[1]]; *p != EOS; p++) + D_byte(strtoa8[*p]); + } + else + { + error("String format not supported yet"); + } + tok += 2; goto comma; diff --git a/direct.h b/direct.h index 27219e5..7b4625a 100644 --- a/direct.h +++ b/direct.h @@ -15,6 +15,7 @@ extern TOKEN exprbuf[]; extern SYM * symbolPtr[]; extern int (* dirtab[])(); +extern char strtoa8[]; // Exported functions void auto_even(void); diff --git a/docs/rmac.rst b/docs/rmac.rst index f6f445e..a463ba4 100644 --- a/docs/rmac.rst +++ b/docs/rmac.rst @@ -1591,8 +1591,8 @@ common in bitmap-graphics routines). For example: ====================== RMAC will generate code for the Atari jaguar GPU and DSP custom RISC (Reduced -Instruction Set Computer) processors. See the Atari Jaguar Software reference Manual – Tom -& Jerry for a complete listing of Jaguar GPU and DSP assembler mnemonics and addressing +Instruction Set Computer) processors. See the Atari Jaguar Software reference Manual "Tom +& Jerry" for a complete listing of Jaguar GPU and DSP assembler mnemonics and addressing modes. `Condition Codes`_ diff --git a/sect.c b/sect.c index 7a88a56..cbb1518 100644 --- a/sect.c +++ b/sect.c @@ -130,6 +130,11 @@ void SwitchSection(int sno) challoc = cp->challoc; ch_size = cp->ch_size; chptr = cp->chptr + ch_size; + if (m6502) + { + // For 6502 mode, add the last org'd address + chptr = cp->chptr + orgaddr; + } } else challoc = ch_size = 0; diff --git a/token.c b/token.c index 9083c99..1ef99cf 100644 --- a/token.c +++ b/token.c @@ -1161,6 +1161,7 @@ if (debug) printf("TokenizeLine: Calling fpop() from SRC_IREPT...\n"); // Handle multiple-character tokens if (c & MULTX) { + stringtype = 0; switch (*ln++) { case '!': // ! or != @@ -1174,6 +1175,11 @@ if (debug) printf("TokenizeLine: Calling fpop() from SRC_IREPT...\n"); continue; case '\'': // 'string' + if (m6502) + { + stringtype = A8INT; // hardcoded for now, maybe this will change in the future + } + // Fall through case '\"': // "string" c1 = ln[-1]; *tk++ = STRING; diff --git a/token.h b/token.h index 91230e5..aaa4fd6 100644 --- a/token.h +++ b/token.h @@ -75,6 +75,12 @@ #define MULTX 64 // Multiple-character tokens #define DOT 128 // [bwlsBWSL] for what follows a `.' +// "special" string types +#define NORMAL 0 // Standard for PC/ST/whatever +#define A8INT 1 // Atari 800 ATASCII translation +#define PETSCII 2 // lol +#define ORICSCII 3 // lolol + // Conditional assembly structures IFENT { IFENT * if_prev; // Ptr prev .if state block (or NULL) @@ -148,6 +154,7 @@ extern char tolowertab[]; extern INOBJ * cur_inobj; extern int mjump_align; extern char * string[]; +extern int stringtype; // Exported functions int include(int, char *); -- 2.37.2