X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=6502.c;h=131c6d8c106982d4cd70825ea5e8db5c875b2d52;hb=45c9dc23612600f6156009e2e9c0039a61b64ea2;hp=4397b0748bf446531317d3413908c4c6afb9bae5;hpb=d62ea9ab9323ed83b9feb96bd1d7df21c1bf6a63;p=rmac diff --git a/6502.c b/6502.c index 4397b07..131c6d8 100644 --- a/6502.c +++ b/6502.c @@ -1,7 +1,7 @@ // -// RMAC - Reboot's Macro Assembler for all Atari computers +// RMAC - Renamed Macro Assembler for all Atari computers // 6502.C - 6502 Assembler -// Copyright (C) 199x Landon Dyer, 2011-2020 Reboot and Friends +// Copyright (C) 199x Landon Dyer, 2011-2021 Reboot and Friends // RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986 // Source utilised with the kind permission of Landon Dyer // @@ -21,8 +21,9 @@ #include "sect.h" #include "token.h" -#define DEF_KW -#include "kwtab.h" +#define DEF_REG65 +#define DECL_REG65 +#include "6502regs.h" #define UPSEG_SIZE 0x10010L // size of 6502 code buffer, 64K+16bytes @@ -238,6 +239,10 @@ int d_6502() { SaveSection(); // Save curent section SwitchSection(M6502); // Switch to 6502 section + regbase = reg65base; // Update register DFA tables + regtab = reg65tab; + regcheck = reg65check; + regaccept = reg65accept; return 0; } @@ -263,7 +268,7 @@ void m6502cg(int op) amode = A65_IMPL; break; - case KW_A: + case REG65_A: if (tok[1] != EOL) goto badmode; @@ -307,7 +312,7 @@ void m6502cg(int op) tok++; amode = A65_INDY; - if (tok[0] != KW_Y) + if (tok[0] != REG65_Y) goto badmode; tok++; @@ -315,7 +320,7 @@ void m6502cg(int op) else amode = A65_IND; } - else if ((tok[0] == ',') && (tok[1] == KW_X) && (tok[2] == ')')) + else if ((tok[0] == ',') && (tok[1] == REG65_X) && (tok[2] == ')')) { // (foo,x) tok += 3; @@ -341,9 +346,9 @@ void m6502cg(int op) if ((tok[1] != ')') || (tok[2] != EOL)) goto badmode; - if (tok[0] == KW_X) + if (tok[0] == REG65_X) amode = A65_INDX; - else if (tok[0] == KW_Y) + else if (tok[0] == REG65_Y) amode = A65_INDY; else goto badmode; @@ -373,12 +378,12 @@ void m6502cg(int op) { tok++; - if (tok[0] == KW_X) + if (tok[0] == REG65_X) { tok++; amode = A65_ABSX; } - else if (tok[0] == KW_Y) + else if (tok[0] == REG65_Y) { tok++; amode = A65_ABSY; @@ -418,6 +423,8 @@ badmode: DEBUG printf("inf[op][amode]=%d\n", (int)inf[op][amode]); #endif + GENLINENOSYM(); + switch (inf[op][amode]) { case A65_IMPL: // Just leave the instruction @@ -562,3 +569,32 @@ void m6502obj(int ofd) } } + +// +// Generate a C64 .PRG output file +// +void m6502c64(int ofd) +{ + uint8_t header[2]; + + CHUNK * ch = sect[M6502].scode; + + // If no 6502 code was generated, bail out + if ((ch == NULL) || (ch->challoc == 0)) + return; + + if (currentorg != &orgmap[1][0]) + { + // More than one 6502 section created, this is not allowed + error("when generating C64 .PRG files only one org section is allowed - aborting"); + return; + } + + SETLE16(header, 0, orgmap[0][0]); + register uint8_t * p = ch->chptr; + + // Write header + uint32_t unused = write(ofd, header, 2); + // Write the data + unused = write(ofd, p + orgmap[0][0], orgmap[0][1] - orgmap[0][0]); +}