... | ... |
@@ -323,8 +323,7 @@ uxn_eval(Uxn *u, Uint16 vec) |
323 | 323 |
return 0; |
324 | 324 |
u->ram.ptr = vec; |
325 | 325 |
if(u->wst.ptr > 0xf8) u->wst.ptr = 0xf8; |
326 |
- while(u->ram.ptr) { |
|
327 |
- instr = u->ram.dat[u->ram.ptr++]; |
|
326 |
+ while((instr = u->ram.dat[u->ram.ptr++])) { |
|
328 | 327 |
switch(instr) { |
329 | 328 |
#pragma GCC diagnostic push |
330 | 329 |
#pragma GCC diagnostic ignored "-Wunused-value" |
... | ... |
@@ -232,8 +232,7 @@ uxn_eval(Uxn *u, Uint16 vec) |
232 | 232 |
return 0; |
233 | 233 |
u->ram.ptr = vec; |
234 | 234 |
if(u->wst.ptr > 0xf8) u->wst.ptr = 0xf8; |
235 |
- while(u->ram.ptr) { |
|
236 |
- instr = u->ram.dat[u->ram.ptr++]; |
|
235 |
+ while((instr = u->ram.dat[u->ram.ptr++])) { |
|
237 | 236 |
switch(instr) { |
238 | 237 |
#pragma GCC diagnostic push |
239 | 238 |
#pragma GCC diagnostic ignored "-Wunused-value" |
... | ... |
@@ -48,28 +48,14 @@ uxn_eval(Uxn *u, Uint16 vec) |
48 | 48 |
return 0; |
49 | 49 |
u->ram.ptr = vec; |
50 | 50 |
if(u->wst.ptr > 0xf8) u->wst.ptr = 0xf8; |
51 |
- while(u->ram.ptr) { |
|
52 |
- instr = u->ram.dat[u->ram.ptr++]; |
|
51 |
+ while((instr = u->ram.dat[u->ram.ptr++])) { |
|
53 | 52 |
switch(instr) { |
54 | 53 |
#pragma GCC diagnostic push |
55 | 54 |
#pragma GCC diagnostic ignored "-Wunused-value" |
56 | 55 |
#pragma GCC diagnostic ignored "-Wunused-variable" |
57 |
- case 0x00: /* BRK */ |
|
58 |
- case 0x20: /* BRK2 */ |
|
59 |
- case 0x40: /* BRKr */ |
|
60 |
- case 0x60: /* BRK2r */ |
|
61 |
- case 0x80: /* BRKk */ |
|
62 |
- case 0xa0: /* BRK2k */ |
|
63 |
- case 0xc0: /* BRKkr */ |
|
64 |
- case 0xe0: /* BRK2kr */ |
|
65 |
- __asm__("evaluxn_00_BRK:"); |
|
66 |
- { |
|
67 |
- u->ram.ptr = 0; |
|
68 |
- } |
|
69 |
- break; |
|
70 |
- case 0x01: /* LIT */ |
|
71 |
- case 0x81: /* LITk */ |
|
72 |
- __asm__("evaluxn_01_LIT:"); |
|
56 |
+ case 0x00: /* LIT */ |
|
57 |
+ case 0x80: /* LITk */ |
|
58 |
+ __asm__("evaluxn_00_LIT:"); |
|
73 | 59 |
{ |
74 | 60 |
u->wst.dat[u->wst.ptr] = mempeek8(u->ram.dat, u->ram.ptr++); |
75 | 61 |
#ifndef NO_STACK_CHECKS |
... | ... |
@@ -81,6 +67,19 @@ uxn_eval(Uxn *u, Uint16 vec) |
81 | 67 |
u->wst.ptr += 1; |
82 | 68 |
} |
83 | 69 |
break; |
70 |
+ case 0x01: /* INC */ |
|
71 |
+ __asm__("evaluxn_01_INC:"); |
|
72 |
+ { |
|
73 |
+ Uint8 a = u->wst.dat[u->wst.ptr - 1]; |
|
74 |
+ u->wst.dat[u->wst.ptr - 1] = a + 1; |
|
75 |
+#ifndef NO_STACK_CHECKS |
|
76 |
+ if(__builtin_expect(u->wst.ptr < 1, 0)) { |
|
77 |
+ u->wst.error = 1; |
|
78 |
+ goto error; |
|
79 |
+ } |
|
80 |
+#endif |
|
81 |
+ } |
|
82 |
+ break; |
|
84 | 83 |
case 0x02: /* POP */ |
85 | 84 |
__asm__("evaluxn_02_POP:"); |
86 | 85 |
{ |
... | ... |
@@ -533,9 +532,9 @@ uxn_eval(Uxn *u, Uint16 vec) |
533 | 532 |
u->wst.ptr -= 1; |
534 | 533 |
} |
535 | 534 |
break; |
536 |
- case 0x21: /* LIT2 */ |
|
537 |
- case 0xa1: /* LIT2k */ |
|
538 |
- __asm__("evaluxn_21_LIT2:"); |
|
535 |
+ case 0x20: /* LIT2 */ |
|
536 |
+ case 0xa0: /* LIT2k */ |
|
537 |
+ __asm__("evaluxn_20_LIT2:"); |
|
539 | 538 |
{ |
540 | 539 |
u->wst.dat[u->wst.ptr] = mempeek8(u->ram.dat, u->ram.ptr++); |
541 | 540 |
u->wst.dat[u->wst.ptr + 1] = mempeek8(u->ram.dat, u->ram.ptr++); |
... | ... |
@@ -548,6 +547,20 @@ uxn_eval(Uxn *u, Uint16 vec) |
548 | 547 |
u->wst.ptr += 2; |
549 | 548 |
} |
550 | 549 |
break; |
550 |
+ case 0x21: /* INC2 */ |
|
551 |
+ __asm__("evaluxn_21_INC2:"); |
|
552 |
+ { |
|
553 |
+ Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); |
|
554 |
+ u->wst.dat[u->wst.ptr - 2] = (a + 1) >> 8; |
|
555 |
+ u->wst.dat[u->wst.ptr - 1] = (a + 1) & 0xff; |
|
556 |
+#ifndef NO_STACK_CHECKS |
|
557 |
+ if(__builtin_expect(u->wst.ptr < 2, 0)) { |
|
558 |
+ u->wst.error = 1; |
|
559 |
+ goto error; |
|
560 |
+ } |
|
561 |
+#endif |
|
562 |
+ } |
|
563 |
+ break; |
|
551 | 564 |
case 0x22: /* POP2 */ |
552 | 565 |
__asm__("evaluxn_22_POP2:"); |
553 | 566 |
{ |
... | ... |
@@ -1035,9 +1048,9 @@ uxn_eval(Uxn *u, Uint16 vec) |
1035 | 1048 |
u->wst.ptr -= 1; |
1036 | 1049 |
} |
1037 | 1050 |
break; |
1038 |
- case 0x41: /* LITr */ |
|
1039 |
- case 0xc1: /* LITkr */ |
|
1040 |
- __asm__("evaluxn_41_LITr:"); |
|
1051 |
+ case 0x40: /* LITr */ |
|
1052 |
+ case 0xc0: /* LITkr */ |
|
1053 |
+ __asm__("evaluxn_40_LITr:"); |
|
1041 | 1054 |
{ |
1042 | 1055 |
u->rst.dat[u->rst.ptr] = mempeek8(u->ram.dat, u->ram.ptr++); |
1043 | 1056 |
#ifndef NO_STACK_CHECKS |
... | ... |
@@ -1049,6 +1062,19 @@ uxn_eval(Uxn *u, Uint16 vec) |
1049 | 1062 |
u->rst.ptr += 1; |
1050 | 1063 |
} |
1051 | 1064 |
break; |
1065 |
+ case 0x41: /* INCr */ |
|
1066 |
+ __asm__("evaluxn_41_INCr:"); |
|
1067 |
+ { |
|
1068 |
+ Uint8 a = u->rst.dat[u->rst.ptr - 1]; |
|
1069 |
+ u->rst.dat[u->rst.ptr - 1] = a + 1; |
|
1070 |
+#ifndef NO_STACK_CHECKS |
|
1071 |
+ if(__builtin_expect(u->rst.ptr < 1, 0)) { |
|
1072 |
+ u->rst.error = 1; |
|
1073 |
+ goto error; |
|
1074 |
+ } |
|
1075 |
+#endif |
|
1076 |
+ } |
|
1077 |
+ break; |
|
1052 | 1078 |
case 0x42: /* POPr */ |
1053 | 1079 |
__asm__("evaluxn_42_POPr:"); |
1054 | 1080 |
{ |
... | ... |
@@ -1501,9 +1527,9 @@ uxn_eval(Uxn *u, Uint16 vec) |
1501 | 1527 |
u->rst.ptr -= 1; |
1502 | 1528 |
} |
1503 | 1529 |
break; |
1504 |
- case 0x61: /* LIT2r */ |
|
1505 |
- case 0xe1: /* LIT2kr */ |
|
1506 |
- __asm__("evaluxn_61_LIT2r:"); |
|
1530 |
+ case 0x60: /* LIT2r */ |
|
1531 |
+ case 0xe0: /* LIT2kr */ |
|
1532 |
+ __asm__("evaluxn_60_LIT2r:"); |
|
1507 | 1533 |
{ |
1508 | 1534 |
u->rst.dat[u->rst.ptr] = mempeek8(u->ram.dat, u->ram.ptr++); |
1509 | 1535 |
u->rst.dat[u->rst.ptr + 1] = mempeek8(u->ram.dat, u->ram.ptr++); |
... | ... |
@@ -1516,6 +1542,20 @@ uxn_eval(Uxn *u, Uint16 vec) |
1516 | 1542 |
u->rst.ptr += 2; |
1517 | 1543 |
} |
1518 | 1544 |
break; |
1545 |
+ case 0x61: /* INC2r */ |
|
1546 |
+ __asm__("evaluxn_61_INC2r:"); |
|
1547 |
+ { |
|
1548 |
+ Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); |
|
1549 |
+ u->rst.dat[u->rst.ptr - 2] = (a + 1) >> 8; |
|
1550 |
+ u->rst.dat[u->rst.ptr - 1] = (a + 1) & 0xff; |
|
1551 |
+#ifndef NO_STACK_CHECKS |
|
1552 |
+ if(__builtin_expect(u->rst.ptr < 2, 0)) { |
|
1553 |
+ u->rst.error = 1; |
|
1554 |
+ goto error; |
|
1555 |
+ } |
|
1556 |
+#endif |
|
1557 |
+ } |
|
1558 |
+ break; |
|
1519 | 1559 |
case 0x62: /* POP2r */ |
1520 | 1560 |
__asm__("evaluxn_62_POP2r:"); |
1521 | 1561 |
{ |
... | ... |
@@ -2003,6 +2043,24 @@ uxn_eval(Uxn *u, Uint16 vec) |
2003 | 2043 |
u->rst.ptr -= 1; |
2004 | 2044 |
} |
2005 | 2045 |
break; |
2046 |
+ case 0x81: /* INCk */ |
|
2047 |
+ __asm__("evaluxn_81_INCk:"); |
|
2048 |
+ { |
|
2049 |
+ Uint8 a = u->wst.dat[u->wst.ptr - 1]; |
|
2050 |
+ u->wst.dat[u->wst.ptr] = a + 1; |
|
2051 |
+#ifndef NO_STACK_CHECKS |
|
2052 |
+ if(__builtin_expect(u->wst.ptr < 1, 0)) { |
|
2053 |
+ u->wst.error = 1; |
|
2054 |
+ goto error; |
|
2055 |
+ } |
|
2056 |
+ if(__builtin_expect(u->wst.ptr > 254, 0)) { |
|
2057 |
+ u->wst.error = 2; |
|
2058 |
+ goto error; |
|
2059 |
+ } |
|
2060 |
+#endif |
|
2061 |
+ u->wst.ptr += 1; |
|
2062 |
+ } |
|
2063 |
+ break; |
|
2006 | 2064 |
case 0x82: /* POPk */ |
2007 | 2065 |
__asm__("evaluxn_82_POPk:"); |
2008 | 2066 |
{ |
... | ... |
@@ -2526,6 +2584,25 @@ uxn_eval(Uxn *u, Uint16 vec) |
2526 | 2584 |
u->wst.ptr += 1; |
2527 | 2585 |
} |
2528 | 2586 |
break; |
2587 |
+ case 0xa1: /* INC2k */ |
|
2588 |
+ __asm__("evaluxn_a1_INC2k:"); |
|
2589 |
+ { |
|
2590 |
+ Uint16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); |
|
2591 |
+ u->wst.dat[u->wst.ptr] = (a + 1) >> 8; |
|
2592 |
+ u->wst.dat[u->wst.ptr + 1] = (a + 1) & 0xff; |
|
2593 |
+#ifndef NO_STACK_CHECKS |
|
2594 |
+ if(__builtin_expect(u->wst.ptr < 2, 0)) { |
|
2595 |
+ u->wst.error = 1; |
|
2596 |
+ goto error; |
|
2597 |
+ } |
|
2598 |
+ if(__builtin_expect(u->wst.ptr > 253, 0)) { |
|
2599 |
+ u->wst.error = 2; |
|
2600 |
+ goto error; |
|
2601 |
+ } |
|
2602 |
+#endif |
|
2603 |
+ u->wst.ptr += 2; |
|
2604 |
+ } |
|
2605 |
+ break; |
|
2529 | 2606 |
case 0xa2: /* POP2k */ |
2530 | 2607 |
__asm__("evaluxn_a2_POP2k:"); |
2531 | 2608 |
{ |
... | ... |
@@ -3073,6 +3150,24 @@ uxn_eval(Uxn *u, Uint16 vec) |
3073 | 3150 |
u->wst.ptr += 2; |
3074 | 3151 |
} |
3075 | 3152 |
break; |
3153 |
+ case 0xc1: /* INCkr */ |
|
3154 |
+ __asm__("evaluxn_c1_INCkr:"); |
|
3155 |
+ { |
|
3156 |
+ Uint8 a = u->rst.dat[u->rst.ptr - 1]; |
|
3157 |
+ u->rst.dat[u->rst.ptr] = a + 1; |
|
3158 |
+#ifndef NO_STACK_CHECKS |
|
3159 |
+ if(__builtin_expect(u->rst.ptr < 1, 0)) { |
|
3160 |
+ u->rst.error = 1; |
|
3161 |
+ goto error; |
|
3162 |
+ } |
|
3163 |
+ if(__builtin_expect(u->rst.ptr > 254, 0)) { |
|
3164 |
+ u->rst.error = 2; |
|
3165 |
+ goto error; |
|
3166 |
+ } |
|
3167 |
+#endif |
|
3168 |
+ u->rst.ptr += 1; |
|
3169 |
+ } |
|
3170 |
+ break; |
|
3076 | 3171 |
case 0xc2: /* POPkr */ |
3077 | 3172 |
__asm__("evaluxn_c2_POPkr:"); |
3078 | 3173 |
{ |
... | ... |
@@ -3596,6 +3691,25 @@ uxn_eval(Uxn *u, Uint16 vec) |
3596 | 3691 |
u->rst.ptr += 1; |
3597 | 3692 |
} |
3598 | 3693 |
break; |
3694 |
+ case 0xe1: /* INC2kr */ |
|
3695 |
+ __asm__("evaluxn_e1_INC2kr:"); |
|
3696 |
+ { |
|
3697 |
+ Uint16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); |
|
3698 |
+ u->rst.dat[u->rst.ptr] = (a + 1) >> 8; |
|
3699 |
+ u->rst.dat[u->rst.ptr + 1] = (a + 1) & 0xff; |
|
3700 |
+#ifndef NO_STACK_CHECKS |
|
3701 |
+ if(__builtin_expect(u->rst.ptr < 2, 0)) { |
|
3702 |
+ u->rst.error = 1; |
|
3703 |
+ goto error; |
|
3704 |
+ } |
|
3705 |
+ if(__builtin_expect(u->rst.ptr > 253, 0)) { |
|
3706 |
+ u->rst.error = 2; |
|
3707 |
+ goto error; |
|
3708 |
+ } |
|
3709 |
+#endif |
|
3710 |
+ u->rst.ptr += 2; |
|
3711 |
+ } |
|
3712 |
+ break; |
|
3599 | 3713 |
case 0xe2: /* POP2kr */ |
3600 | 3714 |
__asm__("evaluxn_e2_POP2kr:"); |
3601 | 3715 |
{ |
... | ... |
@@ -33,8 +33,8 @@ Uint16 mempeek16(Uint8 *m, Uint16 a) { return (mempeek8(m, a) << 8) + mempeek8(m |
33 | 33 |
static void devpoke16(Device *d, Uint8 a, Uint16 b) { devpoke8(d, a, b >> 8); devpoke8(d, a + 1, b); } |
34 | 34 |
static Uint16 devpeek16(Device *d, Uint16 a) { return (devpeek8(d, a) << 8) + devpeek8(d, a + 1); } |
35 | 35 |
/* Stack */ |
36 |
-static void op_brk(Uxn *u) { u->ram.ptr = 0; } |
|
37 | 36 |
static void op_lit(Uxn *u) { push8(u->src, mempeek8(u->ram.dat, u->ram.ptr++)); } |
37 |
+static void op_inc(Uxn *u) { Uint8 a = pop8(u->src); push8(u->src, a + 1); } |
|
38 | 38 |
static void op_pop(Uxn *u) { pop8(u->src); } |
39 | 39 |
static void op_dup(Uxn *u) { Uint8 a = pop8(u->src); push8(u->src, a); push8(u->src, a); } |
40 | 40 |
static void op_nip(Uxn *u) { Uint8 a = pop8(u->src); pop8(u->src); push8(u->src, a); } |
... | ... |
@@ -70,6 +70,7 @@ static void op_eor(Uxn *u) { Uint8 a = pop8(u->src), b = pop8(u->src); push8(u-> |
70 | 70 |
static void op_sft(Uxn *u) { Uint8 a = pop8(u->src), b = pop8(u->src); push8(u->src, b >> (a & 0x07) << ((a & 0x70) >> 4)); } |
71 | 71 |
/* Stack */ |
72 | 72 |
static void op_lit16(Uxn *u) { push16(u->src, mempeek16(u->ram.dat, u->ram.ptr++)); u->ram.ptr++; } |
73 |
+static void op_inc16(Uxn *u) { Uint16 a = pop16(u->src); push16(u->src, a + 1); } |
|
73 | 74 |
static void op_pop16(Uxn *u) { pop16(u->src); } |
74 | 75 |
static void op_dup16(Uxn *u) { Uint16 a = pop16(u->src); push16(u->src, a); push16(u->src, a); } |
75 | 76 |
static void op_nip16(Uxn *u) { Uint16 a = pop16(u->src); pop16(u->src); push16(u->src, a); } |
... | ... |
@@ -105,12 +106,12 @@ static void op_eor16(Uxn *u) { Uint16 a = pop16(u->src), b = pop16(u->src); push |
105 | 106 |
static void op_sft16(Uxn *u) { Uint8 a = pop8(u->src); Uint16 b = pop16(u->src); push16(u->src, b >> (a & 0x0f) << ((a & 0xf0) >> 4)); } |
106 | 107 |
|
107 | 108 |
static void (*ops[])(Uxn *u) = { |
108 |
- op_brk, op_lit, op_pop, op_dup, op_nip, op_swp, op_ovr, op_rot, |
|
109 |
+ op_lit, op_inc, op_pop, op_dup, op_nip, op_swp, op_ovr, op_rot, |
|
109 | 110 |
op_equ, op_neq, op_gth, op_lth, op_jmp, op_jnz, op_jsr, op_sth, |
110 | 111 |
op_pek, op_pok, op_ldr, op_str, op_lda, op_sta, op_dei, op_deo, |
111 | 112 |
op_add, op_sub, op_mul, op_div, op_and, op_ora, op_eor, op_sft, |
112 | 113 |
/* 16-bit */ |
113 |
- op_brk, op_lit16, op_pop16, op_dup16, op_nip16, op_swp16, op_ovr16, op_rot16, |
|
114 |
+ op_lit16, op_inc16, op_pop16, op_dup16, op_nip16, op_swp16, op_ovr16, op_rot16, |
|
114 | 115 |
op_equ16, op_neq16, op_gth16, op_lth16, op_jmp16, op_jnz16, op_jsr16, op_sth16, |
115 | 116 |
op_pek16, op_pok16, op_ldr16, op_str16, op_lda16, op_sta16, op_dei16, op_deo16, |
116 | 117 |
op_add16, op_sub16, op_mul16, op_div16, op_and16, op_ora16, op_eor16, op_sft16 |
... | ... |
@@ -123,12 +124,12 @@ static void (*ops[])(Uxn *u) = { |
123 | 124 |
int |
124 | 125 |
uxn_eval(Uxn *u, Uint16 vec) |
125 | 126 |
{ |
127 |
+ Uint8 instr; |
|
126 | 128 |
if(u->dev[0].dat[0xf]) |
127 | 129 |
return 0; |
128 | 130 |
u->ram.ptr = vec; |
129 | 131 |
if(u->wst.ptr > 0xf8) u->wst.ptr = 0xf8; |
130 |
- while(u->ram.ptr) { |
|
131 |
- Uint8 instr = u->ram.dat[u->ram.ptr++]; |
|
132 |
+ while((instr = u->ram.dat[u->ram.ptr++])) { |
|
132 | 133 |
/* Return Mode */ |
133 | 134 |
if(instr & MODE_RETURN) { |
134 | 135 |
u->src = &u->rst; |
... | ... |
@@ -40,7 +40,7 @@ Program p; |
40 | 40 |
/* clang-format off */ |
41 | 41 |
|
42 | 42 |
static char ops[][4] = { |
43 |
- "BRK", "LIT", "POP", "DUP", "NIP", "SWP", "OVR", "ROT", |
|
43 |
+ "LIT", "INC", "POP", "DUP", "NIP", "SWP", "OVR", "ROT", |
|
44 | 44 |
"EQU", "NEQ", "GTH", "LTH", "JMP", "JCN", "JSR", "STH", |
45 | 45 |
"LDZ", "STZ", "LDR", "STR", "LDA", "STA", "DEI", "DEO", |
46 | 46 |
"ADD", "SUB", "MUL", "DIV", "AND", "ORA", "EOR", "SFT" |
... | ... |
@@ -62,7 +62,7 @@ static char *scat(char *dst, const char *src) { char *ptr = dst + slen(dst); whi |
62 | 62 |
static void |
63 | 63 |
pushbyte(Uint8 b, int lit) |
64 | 64 |
{ |
65 |
- if(lit) pushbyte(0x01, 0); |
|
65 |
+ if(lit) pushbyte(0x80, 0); |
|
66 | 66 |
p.data[p.ptr++] = b; |
67 | 67 |
p.length = p.ptr; |
68 | 68 |
} |
... | ... |
@@ -70,7 +70,7 @@ pushbyte(Uint8 b, int lit) |
70 | 70 |
static void |
71 | 71 |
pushshort(Uint16 s, int lit) |
72 | 72 |
{ |
73 |
- if(lit) pushbyte(0x21, 0); |
|
73 |
+ if(lit) pushbyte(0x20, 0); |
|
74 | 74 |
pushbyte((s >> 8) & 0xff, 0); |
75 | 75 |
pushbyte(s & 0xff, 0); |
76 | 76 |
} |
... | ... |
@@ -123,6 +123,7 @@ findopcode(char *s) |
123 | 123 |
return 0; /* failed to match */ |
124 | 124 |
m++; |
125 | 125 |
} |
126 |
+ if(!i) i |= (1 << 7); /* force LIT nonzero (keep is ignored) */ |
|
126 | 127 |
return i; |
127 | 128 |
} |
128 | 129 |
return 0; |
... | ... |
@@ -152,7 +153,7 @@ makemacro(char *name, FILE *f) |
152 | 153 |
return error("Macro duplicate", name); |
153 | 154 |
if(sihx(name) && slen(name) % 2 == 0) |
154 | 155 |
return error("Macro name is hex number", name); |
155 |
- if(findopcode(name) || !slen(name)) |
|
156 |
+ if(findopcode(name) || scmp(name, "BRK", 4) || !slen(name)) |
|
156 | 157 |
return error("Macro name is invalid", name); |
157 | 158 |
m = &p.macros[p.mlen++]; |
158 | 159 |
scpy(name, m->name, 64); |
... | ... |
@@ -176,7 +177,7 @@ makelabel(char *name, Uint16 addr) |
176 | 177 |
return error("Label duplicate", name); |
177 | 178 |
if(sihx(name) && slen(name) % 2 == 0) |
178 | 179 |
return error("Label name is hex number", name); |
179 |
- if(findopcode(name) || !slen(name)) |
|
180 |
+ if(findopcode(name) || scmp(name, "BRK", 4) || !slen(name)) |
|
180 | 181 |
return error("Label name is invalid", name); |
181 | 182 |
l = &p.labels[p.llen++]; |
182 | 183 |
l->addr = addr; |
... | ... |
@@ -246,7 +247,10 @@ parsetoken(char *w) |
246 | 247 |
} else if(w[0] == ';' && (l = findlabel(w + 1))) { /* absolute */ |
247 | 248 |
pushshort(l->addr, 1); |
248 | 249 |
return ++l->refs; |
249 |
- } else if(findopcode(w) || scmp(w, "BRK", 4)) { /* opcode */ |
|
250 |
+ } else if(scmp(w, "BRK", 4)) { /* special BRK opcode */ |
|
251 |
+ pushbyte(0, 0); |
|
252 |
+ return 1; |
|
253 |
+ } else if(findopcode(w)) { /* opcode */ |
|
250 | 254 |
pushbyte(findopcode(w), 0); |
251 | 255 |
return 1; |
252 | 256 |
} else if(w[0] == '"') { /* string */ |