| ... | ... |
@@ -104,78 +104,75 @@ Uint16 wspeek16(Uint8 o) { return bytes2short(cpu.wst.dat[cpu.wst.ptr - o], cpu.
|
| 104 | 104 |
Uint16 rspop16(void) { return cpu.rst.dat[--cpu.rst.ptr]; }
|
| 105 | 105 |
void rspush16(Uint16 a) { cpu.rst.dat[cpu.rst.ptr++] = a; }
|
| 106 | 106 |
|
| 107 |
-/* new flexy pop/push */ |
|
| 108 |
- |
|
| 107 |
+/* I/O */ |
|
| 109 | 108 |
void op_brk() { setflag(FLAG_HALT, 1); }
|
| 110 |
-void op_rts() { cpu.rom.ptr = rspop16(); }
|
|
| 111 | 109 |
void op_lit() { cpu.literal += cpu.rom.dat[cpu.rom.ptr++]; }
|
| 112 |
- |
|
| 113 |
-void op_drp() { wspop8(); }
|
|
| 110 |
+void op_nop() { }
|
|
| 111 |
+void op_ldr() { wspush8(cpu.ram.dat[wspop16()]); }
|
|
| 112 |
+void op_str() { cpu.ram.dat[wspop16()] = wspop8(); }
|
|
| 113 |
+/* Logic */ |
|
| 114 |
+void op_jmu() { cpu.rom.ptr = wspop16(); }
|
|
| 115 |
+void op_jmc() { Uint8 a = wspop8(); if(a) op_jmu(); }
|
|
| 116 |
+void op_jsu() { rspush16(cpu.rom.ptr); cpu.rom.ptr = wspop16(); }
|
|
| 117 |
+void op_jsc() { Uint8 a = wspop8(); if(a) op_jsu(); }
|
|
| 118 |
+void op_rtu() { cpu.rom.ptr = rspop16(); }
|
|
| 119 |
+void op_rtc() { /* TODO */ }
|
|
| 120 |
+/* Stack */ |
|
| 121 |
+void op_pop() { wspop8(); }
|
|
| 114 | 122 |
void op_dup() { wspush8(wspeek8(1)); }
|
| 115 | 123 |
void op_swp() { Uint8 b = wspop8(), a = wspop8(); wspush8(b); wspush8(a); }
|
| 116 | 124 |
void op_ovr() { Uint8 a = wspeek8(2); wspush8(a); }
|
| 117 | 125 |
void op_rot() { Uint8 c = wspop8(),b = wspop8(),a = wspop8(); wspush8(b); wspush8(c); wspush8(a); }
|
| 118 |
- |
|
| 119 |
-void op_jmu() { cpu.rom.ptr = wspop16(); }
|
|
| 120 |
-void op_jsu() { rspush16(cpu.rom.ptr); cpu.rom.ptr = wspop16(); }
|
|
| 121 |
-void op_jmc() { Uint8 a = wspop8(); if(a) op_jmu(); }
|
|
| 122 |
-void op_jsc() { Uint8 a = wspop8(); if(a) op_jsu(); }
|
|
| 123 |
- |
|
| 124 |
-void op_equ() { Uint8 a = wspop8(), b = wspop8(); wspush8(a == b); }
|
|
| 125 |
-void op_neq() { Uint8 a = wspop8(), b = wspop8(); wspush8(a != b); }
|
|
| 126 |
-void op_gth() { Uint8 a = wspop8(), b = wspop8(); wspush8(a < b); }
|
|
| 127 |
-void op_lth() { Uint8 a = wspop8(), b = wspop8(); wspush8(a > b); }
|
|
| 128 | 126 |
void op_and() { Uint8 a = wspop8(), b = wspop8(); wspush8(a & b); }
|
| 129 | 127 |
void op_ora() { Uint8 a = wspop8(), b = wspop8(); wspush8(a | b); }
|
| 130 | 128 |
void op_rol() { Uint8 a = wspop8(), b = wspop8(); wspush8(a << b); }
|
| 131 |
-void op_ror() { Uint8 a = wspop8(), b = wspop8(); wspush8(a >> b); }
|
|
| 129 |
+/* Arithmetic */ |
|
| 132 | 130 |
void op_add() { Uint8 a = wspop8(), b = wspop8(); wspush8(a + b); }
|
| 133 | 131 |
void op_sub() { Uint8 a = wspop8(), b = wspop8(); wspush8(a - b); }
|
| 134 | 132 |
void op_mul() { Uint8 a = wspop8(), b = wspop8(); wspush8(a * b); }
|
| 135 | 133 |
void op_div() { Uint8 a = wspop8(), b = wspop8(); wspush8(a / b); }
|
| 136 |
-void op_ldr() { wspush8(cpu.ram.dat[wspop16()]); }
|
|
| 137 |
-void op_str() { cpu.ram.dat[wspop16()] = wspop8(); }
|
|
| 138 |
-void op_pek() { wspush8(cpu.rom.dat[wspop16()]); }
|
|
| 139 |
-void op_pok() { printf("TODO:\n");}
|
|
| 140 |
- |
|
| 141 |
-void op_drp16() { wspop16(); }
|
|
| 134 |
+void op_equ() { Uint8 a = wspop8(), b = wspop8(); wspush8(a == b); }
|
|
| 135 |
+void op_neq() { Uint8 a = wspop8(), b = wspop8(); wspush8(a != b); }
|
|
| 136 |
+void op_gth() { Uint8 a = wspop8(), b = wspop8(); wspush8(a < b); }
|
|
| 137 |
+void op_lth() { Uint8 a = wspop8(), b = wspop8(); wspush8(a > b); }
|
|
| 138 |
+/* Stack(16-bits) */ |
|
| 139 |
+void op_pop16() { wspop16(); }
|
|
| 142 | 140 |
void op_dup16() { wspush16(wspeek16(2)); }
|
| 143 | 141 |
void op_swp16() { Uint16 b = wspop16(), a = wspop16(); wspush16(b); wspush16(a); }
|
| 144 | 142 |
void op_ovr16() { Uint16 a = wspeek16(4); wspush16(a); }
|
| 145 | 143 |
void op_rot16() { Uint16 c = wspop16(), b = wspop16(), a = wspop16(); wspush16(b); wspush16(c); wspush16(a); }
|
| 146 |
- |
|
| 147 |
-void op_equ16() { Uint16 a = wspop16(), b = wspop16(); wspush16(a == b); }
|
|
| 148 |
-void op_neq16() { Uint16 a = wspop16(), b = wspop16(); wspush16(a != b); }
|
|
| 149 |
-void op_gth16() { Uint16 a = wspop16(), b = wspop16(); wspush16(a < b); }
|
|
| 150 |
-void op_lth16() { Uint16 a = wspop16(), b = wspop16(); wspush16(a > b); }
|
|
| 151 | 144 |
void op_and16() { Uint16 a = wspop16(), b = wspop16(); wspush16(a & b); }
|
| 152 | 145 |
void op_ora16() { Uint16 a = wspop16(), b = wspop16(); wspush16(a | b); }
|
| 153 | 146 |
void op_rol16() { Uint16 a = wspop16(), b = wspop16(); wspush16(a << b); }
|
| 154 |
-void op_ror16() { Uint16 a = wspop16(), b = wspop16(); wspush16(a >> b); }
|
|
| 147 |
+/* Arithmetic(16-bits) */ |
|
| 155 | 148 |
void op_add16() { Uint16 a = wspop16(), b = wspop16(); wspush16(a + b); }
|
| 156 | 149 |
void op_sub16() { Uint16 a = wspop16(), b = wspop16(); wspush16(a - b); }
|
| 157 | 150 |
void op_mul16() { Uint16 a = wspop16(), b = wspop16(); wspush16(a * b); }
|
| 158 | 151 |
void op_div16() { Uint16 a = wspop16(), b = wspop16(); wspush16(a / b); }
|
| 152 |
+void op_equ16() { Uint16 a = wspop16(), b = wspop16(); wspush16(a == b); }
|
|
| 153 |
+void op_neq16() { Uint16 a = wspop16(), b = wspop16(); wspush16(a != b); }
|
|
| 154 |
+void op_gth16() { Uint16 a = wspop16(), b = wspop16(); wspush16(a < b); }
|
|
| 155 |
+void op_lth16() { Uint16 a = wspop16(), b = wspop16(); wspush16(a > b); }
|
|
| 156 |
+/* remove */ |
|
| 157 |
+void op_pek() { wspush8(cpu.rom.dat[wspop16()]); }
|
|
| 158 |
+void op_pok() { printf("TODO:\n");}
|
|
| 159 | 159 |
|
| 160 |
-void (*ops8[])() = {
|
|
| 161 |
- op_brk, op_rts, op_lit, op_drp, op_dup, op_swp, op_ovr, op_rot, |
|
| 162 |
- op_jmu, op_jsu, op_jmc, op_jsc, op_equ, op_neq, op_gth, op_lth, |
|
| 163 |
- op_and, op_ora, op_rol, op_ror, op_add, op_sub, op_mul, op_div, |
|
| 164 |
- op_ldr, op_str, op_pek, op_pok, op_brk, op_brk, op_brk, op_brk |
|
| 165 |
-}; |
|
| 166 |
- |
|
| 167 |
-void (*ops16[])() = {
|
|
| 168 |
- op_brk, op_rts, op_lit, op_drp16, op_dup16, op_swp16, op_ovr16, op_rot16, |
|
| 169 |
- op_jmu, op_jsu, op_jmc, op_jsc, op_equ, op_neq, op_gth, op_lth, |
|
| 170 |
- op_and16, op_ora16, op_rol16, op_ror16, op_add16, op_sub16, op_mul16, op_div16, |
|
| 171 |
- op_ldr, op_str, op_pek, op_pok, op_brk, op_brk, op_brk, op_brk |
|
| 160 |
+void (*ops[])() = {
|
|
| 161 |
+ op_brk, op_lit, op_nop, op_nop, op_pek, op_pok, op_ldr, op_str, |
|
| 162 |
+ op_jmu, op_jmc, op_jsu, op_jsc, op_rtu, op_rtc, op_nop, op_nop, |
|
| 163 |
+ op_pop, op_dup, op_swp, op_ovr, op_rot, op_and, op_ora, op_rol, |
|
| 164 |
+ op_add, op_sub, op_mul, op_div, op_equ, op_neq, op_gth, op_lth, |
|
| 165 |
+ op_pop16, op_dup16, op_swp16, op_ovr16, op_rot16, op_and16, op_ora16, op_rol16, |
|
| 166 |
+ op_add16, op_sub16, op_mul16, op_div16, op_equ16, op_neq16, op_gth16, op_lth16 |
|
| 172 | 167 |
}; |
| 173 | 168 |
|
| 174 | 169 |
Uint8 opr[][2] = { /* todo: 16 bits mode */
|
| 175 |
- {0,0}, {0,0}, {0,0}, {1,0}, {0,1}, {1,1}, {0,1}, {3,3},
|
|
| 176 |
- {2,0}, {2,0}, {2,0}, {2,0}, {2,1}, {2,1}, {2,1}, {2,1},
|
|
| 177 |
- {1,0}, {1,0}, {1,0}, {1,0}, {2,1}, {0,0}, {0,0}, {0,0},
|
|
| 178 |
- {2,1}, {3,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}
|
|
| 170 |
+ {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0},
|
|
| 171 |
+ {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0},
|
|
| 172 |
+ {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0},
|
|
| 173 |
+ {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0},
|
|
| 174 |
+ {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0},
|
|
| 175 |
+ {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}
|
|
| 179 | 176 |
}; |
| 180 | 177 |
|
| 181 | 178 |
/* clang-format on */ |
| ... | ... |
@@ -231,14 +228,11 @@ eval(void) |
| 231 | 228 |
setflag(FLAG_SIGN, (instr >> 6) & 1); |
| 232 | 229 |
if((instr >> 7) & 1) |
| 233 | 230 |
printf("Unused flag: %02x\n", instr);
|
| 234 |
- /* TODO: setflag(FLAG_B, (instr >> 6) & 1); */ |
|
| 235 |
- /* TODO: setflag(FLAG_C, (instr >> 7) & 1); */ |
|
| 236 | 231 |
if(cpu.wst.ptr < opr[op][0]) |
| 237 | 232 |
return error("Stack underflow", op);
|
| 238 | 233 |
if(getflag(FLAG_SHORT)) |
| 239 |
- (*ops16[op])(); |
|
| 240 |
- else |
|
| 241 |
- (*ops8[op])(); |
|
| 234 |
+ op += 16; |
|
| 235 |
+ (*ops[op])(); |
|
| 242 | 236 |
cpu.counter++; |
| 243 | 237 |
return 1; |
| 244 | 238 |
} |
| ... | ... |
@@ -26,98 +26,27 @@ typedef struct {
|
| 26 | 26 |
|
| 27 | 27 |
int labelslen; |
| 28 | 28 |
Label labels[256]; |
| 29 |
+Program p; |
|
| 29 | 30 |
|
| 30 | 31 |
/* clang-format off */ |
| 31 | 32 |
|
| 32 | 33 |
char ops[][4] = {
|
| 33 |
- "BRK", "RTS", "LIT", "POP", "DUP", "SWP", "OVR", "ROT", |
|
| 34 |
- "JMU", "JSU", "JMC", "JSC", "EQU", "NEQ", "GTH", "LTH", |
|
| 35 |
- "AND", "ORA", "ROL", "ROR", "ADD", "SUB", "MUL", "DIV", |
|
| 36 |
- "LDR", "STR", "PEK", "POK", "---", "---", "---", "---" |
|
| 34 |
+ "BRK", "LIT", "---", "---", "PEK", "POK", "LDR", "STR", |
|
| 35 |
+ "JMU", "JMC", "JSU", "JSC", "RTU", "RTC", "---", "---", |
|
| 36 |
+ "POP", "DUP", "SWP", "OVR", "ROT", "AND", "ORA", "ROL", |
|
| 37 |
+ "ADD", "SUB", "MUL", "DIV", "EQU", "NEQ", "GTH", "LTH" |
|
| 37 | 38 |
}; |
| 38 | 39 |
|
| 39 |
-/* clang-format on */ |
|
| 40 |
- |
|
| 41 |
-Program p; |
|
| 40 |
+int scmp(char *a, char *b) { int i = 0; while(a[i] == b[i]) if(!a[i++]) return 1; return 0; } /* string compare */
|
|
| 41 |
+int slen(char *s) { int i = 0; while(s[i] && s[++i]) ; return i; } /* string length */
|
|
| 42 |
+int sihx(char *s) { int i = 0; char c; while((c = s[i++])) if(!(c >= '0' && c <= '9') && !(c >= 'a' && c <= 'f') && !(c >= 'A' && c <= 'F')) return 0; return 1; } /* string is hexadecimal */
|
|
| 43 |
+int shex(char *s) { int n = 0, i = 0; char c; while((c = s[i++])) if(c >= '0' && c <= '9') n = n * 16 + (c - '0'); else if(c >= 'A' && c <= 'F') n = n * 16 + 10 + (c - 'A'); else if(c >= 'a' && c <= 'f') n = n * 16 + 10 + (c - 'a'); return n; } /* string to num */
|
|
| 44 |
+int cmnt(char *w, int *skip) { if(w[0] == ')') { *skip = 0; return 1; } if(w[0] == '(') *skip = 1; if(*skip) return 1; return 0; } /* comment helper */
|
|
| 45 |
+char *scpy(char *src, char *dst, int len) { int i = 0; while((dst[i] = src[i]) && i < len - 2) i++; dst[i + 1] = '\0'; return dst; } /* string copy */
|
|
| 42 | 46 |
|
| 43 | 47 |
#pragma mark - Helpers |
| 44 | 48 |
|
| 45 |
-int |
|
| 46 |
-scmp(char *a, char *b) /* string compare */ |
|
| 47 |
-{
|
|
| 48 |
- int i = 0; |
|
| 49 |
- while(a[i] == b[i]) |
|
| 50 |
- if(!a[i++]) |
|
| 51 |
- return 1; |
|
| 52 |
- return 0; |
|
| 53 |
-} |
|
| 54 |
- |
|
| 55 |
-char * |
|
| 56 |
-scpy(char *src, char *dst, int len) /* string copy */ |
|
| 57 |
-{
|
|
| 58 |
- int i = 0; |
|
| 59 |
- while((dst[i] = src[i]) && i < len - 2) |
|
| 60 |
- i++; |
|
| 61 |
- dst[i + 1] = '\0'; |
|
| 62 |
- return dst; |
|
| 63 |
-} |
|
| 64 |
- |
|
| 65 |
-int |
|
| 66 |
-slen(char *s) /* string length */ |
|
| 67 |
-{
|
|
| 68 |
- int i = 0; |
|
| 69 |
- while(s[i] && s[++i]) |
|
| 70 |
- ; |
|
| 71 |
- return i; |
|
| 72 |
-} |
|
| 73 |
- |
|
| 74 |
-char * |
|
| 75 |
-suca(char *s) /* string to uppercase */ |
|
| 76 |
-{
|
|
| 77 |
- int i = 0; |
|
| 78 |
- char c; |
|
| 79 |
- while((c = s[i])) |
|
| 80 |
- s[i++] = c >= 'a' && c <= 'z' ? c - ('a' - 'A') : c;
|
|
| 81 |
- return s; |
|
| 82 |
-} |
|
| 83 |
- |
|
| 84 |
-int |
|
| 85 |
-sihx(char *s) /* string is hexadecimal */ |
|
| 86 |
-{
|
|
| 87 |
- int i = 0; |
|
| 88 |
- char c; |
|
| 89 |
- while((c = s[i++])) |
|
| 90 |
- if(!(c >= '0' && c <= '9') && !(c >= 'a' && c <= 'f') && !(c >= 'A' && c <= 'F')) |
|
| 91 |
- return 0; |
|
| 92 |
- return 1; |
|
| 93 |
-} |
|
| 94 |
- |
|
| 95 |
-int |
|
| 96 |
-shex(char *s) /* string to num */ |
|
| 97 |
-{
|
|
| 98 |
- int n = 0, i = 0; |
|
| 99 |
- char c; |
|
| 100 |
- while((c = s[i++])) |
|
| 101 |
- if(c >= '0' && c <= '9') |
|
| 102 |
- n = n * 16 + (c - '0'); |
|
| 103 |
- else if(c >= 'A' && c <= 'F') |
|
| 104 |
- n = n * 16 + 10 + (c - 'A'); |
|
| 105 |
- else if(c >= 'a' && c <= 'f') |
|
| 106 |
- n = n * 16 + 10 + (c - 'a'); |
|
| 107 |
- return n; |
|
| 108 |
-} |
|
| 109 |
- |
|
| 110 |
-int |
|
| 111 |
-iscomment(char *w, int *skip) |
|
| 112 |
-{
|
|
| 113 |
- if(w[0] == ')') {
|
|
| 114 |
- *skip = 0; |
|
| 115 |
- return 1; |
|
| 116 |
- } |
|
| 117 |
- if(w[0] == '(') *skip = 1;
|
|
| 118 |
- if(*skip) return 1; |
|
| 119 |
- return 0; |
|
| 120 |
-} |
|
| 49 |
+/* clang-format on */ |
|
| 121 | 50 |
|
| 122 | 51 |
#pragma mark - I/O |
| 123 | 52 |
|
| ... | ... |
@@ -125,7 +54,7 @@ void |
| 125 | 54 |
pushbyte(Uint8 b, int lit) |
| 126 | 55 |
{
|
| 127 | 56 |
if(lit) {
|
| 128 |
- pushbyte(0x02, 0); |
|
| 57 |
+ pushbyte(0x01, 0); |
|
| 129 | 58 |
pushbyte(0x01, 0); |
| 130 | 59 |
} |
| 131 | 60 |
p.data[p.ptr++] = b; |
| ... | ... |
@@ -135,7 +64,7 @@ void |
| 135 | 64 |
pushshort(Uint16 s, int lit) |
| 136 | 65 |
{
|
| 137 | 66 |
if(lit) {
|
| 138 |
- pushbyte(0x02, 0); |
|
| 67 |
+ pushbyte(0x01, 0); |
|
| 139 | 68 |
pushbyte(0x02, 0); |
| 140 | 69 |
} |
| 141 | 70 |
pushbyte((s >> 8) & 0xff, 0); |
| ... | ... |
@@ -143,10 +72,10 @@ pushshort(Uint16 s, int lit) |
| 143 | 72 |
} |
| 144 | 73 |
|
| 145 | 74 |
void |
| 146 |
-pushword(char *w) |
|
| 75 |
+pushtext(char *w) |
|
| 147 | 76 |
{
|
| 148 | 77 |
int i = slen(w); |
| 149 |
- pushbyte(0x02, 0); |
|
| 78 |
+ pushbyte(0x01, 0); |
|
| 150 | 79 |
pushbyte(slen(w), 0); |
| 151 | 80 |
while(i > 0) |
| 152 | 81 |
pushbyte(w[--i], 0); |
| ... | ... |
@@ -163,19 +92,18 @@ findlabel(char *s) |
| 163 | 92 |
} |
| 164 | 93 |
|
| 165 | 94 |
Uint8 |
| 166 |
-findop(char *s) |
|
| 95 |
+findoperator(char *s) |
|
| 167 | 96 |
{
|
| 168 | 97 |
int i; |
| 169 |
- for(i = 0; i < 32; ++i) {
|
|
| 98 |
+ for(i = 0; i < 0x20; ++i) {
|
|
| 170 | 99 |
int m = 0; |
| 171 |
- if(ops[i][0] != s[0]) continue; |
|
| 172 |
- if(ops[i][1] != s[1]) continue; |
|
| 173 |
- if(ops[i][2] != s[2]) continue; |
|
| 100 |
+ char *o = ops[i]; |
|
| 101 |
+ if(o[0] != s[0] || o[1] != s[1] || o[2] != s[2]) |
|
| 102 |
+ continue; |
|
| 174 | 103 |
while(s[3 + m]) {
|
| 175 |
- char c = s[3 + m]; |
|
| 176 |
- if(c == '^') i |= (1 << 5); /* mode: 16 bits */ |
|
| 177 |
- if(c == '~') i |= (1 << 6); /* mode: signed */ |
|
| 178 |
- if(c == '&') i |= (1 << 7); /* mode: unused */ |
|
| 104 |
+ if(s[3 + m] == '^') i |= (1 << 5); /* mode: 16 bits */ |
|
| 105 |
+ if(s[3 + m] == '~') i |= (1 << 6); /* mode: signed */ |
|
| 106 |
+ if(s[3 + m] == '&') i |= (1 << 7); /* mode: unused */ |
|
| 179 | 107 |
m++; |
| 180 | 108 |
} |
| 181 | 109 |
return i; |
| ... | ... |
@@ -193,14 +121,14 @@ error(char *name, char *id) |
| 193 | 121 |
} |
| 194 | 122 |
|
| 195 | 123 |
int |
| 196 |
-makelabel(char *id, Uint16 addr) |
|
| 124 |
+makelabel(char *name, Uint16 addr) |
|
| 197 | 125 |
{
|
| 198 | 126 |
Label *l; |
| 199 |
- if(findlabel(id)) |
|
| 200 |
- return error("Label duplicate", id);
|
|
| 127 |
+ if(findlabel(name)) |
|
| 128 |
+ return error("Label duplicate", name);
|
|
| 201 | 129 |
l = &labels[labelslen++]; |
| 202 |
- scpy(id, l->name, 64); |
|
| 203 | 130 |
l->addr = addr; |
| 131 |
+ scpy(name, l->name, 64); |
|
| 204 | 132 |
printf("New label: %s[0x%02x]\n", l->name, l->addr);
|
| 205 | 133 |
return 1; |
| 206 | 134 |
} |
| ... | ... |
@@ -220,7 +148,8 @@ pass1(FILE *f) |
| 220 | 148 |
Uint16 addr = 0; |
| 221 | 149 |
char w[64]; |
| 222 | 150 |
while(fscanf(f, "%s", w) == 1) {
|
| 223 |
- if(iscomment(w, &skip)) continue; |
|
| 151 |
+ if(cmnt(w, &skip)) |
|
| 152 |
+ continue; |
|
| 224 | 153 |
if(w[0] == '@' && !makelabel(w + 1, addr)) |
| 225 | 154 |
return error("Pass1 failed", w);
|
| 226 | 155 |
if(w[0] == ';' && !makelabel(w + 1, vars++)) |
| ... | ... |
@@ -231,23 +160,19 @@ pass1(FILE *f) |
| 231 | 160 |
else |
| 232 | 161 |
continue; |
| 233 | 162 |
} |
| 234 |
- /* move addr ptr */ |
|
| 235 |
- if(findop(w) || scmp(w, "BRK")) |
|
| 163 |
+ if(findoperator(w) || scmp(w, "BRK")) |
|
| 236 | 164 |
addr += 1; |
| 237 |
- else if(w[0] == '|') |
|
| 238 |
- addr = shex(w + 1); |
|
| 239 |
- else if(w[0] == '@') |
|
| 240 |
- addr += 0; |
|
| 241 |
- else if(w[0] == ';') |
|
| 242 |
- addr += 0; |
|
| 243 |
- else if(w[0] == '.') |
|
| 244 |
- addr += 2; |
|
| 245 |
- else if(w[0] == '"') |
|
| 246 |
- addr += slen(w + 1) + 2; |
|
| 247 |
- else if(w[0] == ',') |
|
| 248 |
- addr += 2 + (sihx(w + 1) && slen(w + 1) == 2 ? 1 : 2); |
|
| 249 |
- else |
|
| 250 |
- return error("Unknown label", w);
|
|
| 165 |
+ else {
|
|
| 166 |
+ switch(w[0]) {
|
|
| 167 |
+ case '|': addr = shex(w + 1); break; |
|
| 168 |
+ case '@': |
|
| 169 |
+ case ';': break; |
|
| 170 |
+ case '.': addr += 2; break; |
|
| 171 |
+ case '"': addr += slen(w + 1) + 2; break; |
|
| 172 |
+ case ',': addr += 2 + (sihx(w + 1) && slen(w + 1) == 2 ? 1 : 2); break; |
|
| 173 |
+ default: return error("Unknown label", w);
|
|
| 174 |
+ } |
|
| 175 |
+ } |
|
| 251 | 176 |
} |
| 252 | 177 |
rewind(f); |
| 253 | 178 |
return 1; |
| ... | ... |
@@ -263,16 +188,16 @@ pass2(FILE *f) |
| 263 | 188 |
Label *l; |
| 264 | 189 |
if(w[0] == '@') continue; |
| 265 | 190 |
if(w[0] == ';') continue; |
| 266 |
- if(iscomment(w, &skip)) continue; |
|
| 191 |
+ if(cmnt(w, &skip)) continue; |
|
| 267 | 192 |
if(w[0] == '|') |
| 268 | 193 |
p.ptr = shex(w + 1); |
| 269 | 194 |
else if(w[0] == ':') |
| 270 | 195 |
fscanf(f, "%s", w); |
| 271 | 196 |
else if(w[0] == '"') |
| 272 |
- pushword(w + 1); |
|
| 197 |
+ pushtext(w + 1); |
|
| 273 | 198 |
else if((l = findlabel(w + 1))) |
| 274 | 199 |
pushshort(l->addr, w[0] == ','); |
| 275 |
- else if((op = findop(w)) || scmp(w, "BRK")) |
|
| 200 |
+ else if((op = findoperator(w)) || scmp(w, "BRK")) |
|
| 276 | 201 |
pushbyte(op, 0); |
| 277 | 202 |
else if(sihx(w + 1) && slen(w + 1) == 2) |
| 278 | 203 |
pushbyte(shex(w + 1), w[0] == ','); |