aboutsummaryrefslogtreecommitdiffstats
path: root/src/uxn.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/uxn.c')
-rw-r--r--src/uxn.c174
1 files changed, 144 insertions, 30 deletions
diff --git a/src/uxn.c b/src/uxn.c
index 3a8cdb3..3934e1b 100644
--- a/src/uxn.c
+++ b/src/uxn.c
@@ -30,35 +30,21 @@ See etc/mkuxn-fast.moon for instructions.
30 30
31IWRAM_CODE 31IWRAM_CODE
32int 32int
33evaluxn(Uxn *u, u16 vec) 33uxn_eval(Uxn *u, u16 vec)
34{ 34{
35 u8 instr; 35 u8 instr;
36 if(u->dev[0].dat[0xf]) 36 if(!vec || u->dev[0].dat[0xf])
37 return 0; 37 return 0;
38 u->ram.ptr = vec; 38 u->ram.ptr = vec;
39 if(u->wst.ptr > 0xf8) u->wst.ptr = 0xf8; 39 if(u->wst.ptr > 0xf8) u->wst.ptr = 0xf8;
40 while(u->ram.ptr) { 40 while((instr = u->ram.dat[u->ram.ptr++])) {
41 instr = u->ram.dat[u->ram.ptr++];
42 switch(instr) { 41 switch(instr) {
43#pragma GCC diagnostic push 42#pragma GCC diagnostic push
44#pragma GCC diagnostic ignored "-Wunused-value" 43#pragma GCC diagnostic ignored "-Wunused-value"
45#pragma GCC diagnostic ignored "-Wunused-variable" 44#pragma GCC diagnostic ignored "-Wunused-variable"
46 case 0x00: /* BRK */ 45 case 0x00: /* LIT */
47 case 0x20: /* BRK2 */ 46 case 0x80: /* LITk */
48 case 0x40: /* BRKr */ 47 __asm__("evaluxn_00_LIT:");
49 case 0x60: /* BRK2r */
50 case 0x80: /* BRKk */
51 case 0xa0: /* BRK2k */
52 case 0xc0: /* BRKkr */
53 case 0xe0: /* BRK2kr */
54 __asm__("evaluxn_00_BRK:");
55 {
56 u->ram.ptr = 0;
57 }
58 break;
59 case 0x01: /* LIT */
60 case 0x81: /* LITk */
61 __asm__("evaluxn_01_LIT:");
62 { 48 {
63 u->wst.dat[u->wst.ptr] = mempeek8(u->ram.dat, u->ram.ptr++); 49 u->wst.dat[u->wst.ptr] = mempeek8(u->ram.dat, u->ram.ptr++);
64#ifndef NO_STACK_CHECKS 50#ifndef NO_STACK_CHECKS
@@ -70,6 +56,19 @@ evaluxn(Uxn *u, u16 vec)
70 u->wst.ptr += 1; 56 u->wst.ptr += 1;
71 } 57 }
72 break; 58 break;
59 case 0x01: /* INC */
60 __asm__("evaluxn_01_INC:");
61 {
62 u8 a = u->wst.dat[u->wst.ptr - 1];
63 u->wst.dat[u->wst.ptr - 1] = a + 1;
64#ifndef NO_STACK_CHECKS
65 if(__builtin_expect(u->wst.ptr < 1, 0)) {
66 u->wst.error = 1;
67 goto error;
68 }
69#endif
70 }
71 break;
73 case 0x02: /* POP */ 72 case 0x02: /* POP */
74 __asm__("evaluxn_02_POP:"); 73 __asm__("evaluxn_02_POP:");
75 { 74 {
@@ -522,9 +521,9 @@ evaluxn(Uxn *u, u16 vec)
522 u->wst.ptr -= 1; 521 u->wst.ptr -= 1;
523 } 522 }
524 break; 523 break;
525 case 0x21: /* LIT2 */ 524 case 0x20: /* LIT2 */
526 case 0xa1: /* LIT2k */ 525 case 0xa0: /* LIT2k */
527 __asm__("evaluxn_21_LIT2:"); 526 __asm__("evaluxn_20_LIT2:");
528 { 527 {
529 u->wst.dat[u->wst.ptr] = mempeek8(u->ram.dat, u->ram.ptr++); 528 u->wst.dat[u->wst.ptr] = mempeek8(u->ram.dat, u->ram.ptr++);
530 u->wst.dat[u->wst.ptr + 1] = mempeek8(u->ram.dat, u->ram.ptr++); 529 u->wst.dat[u->wst.ptr + 1] = mempeek8(u->ram.dat, u->ram.ptr++);
@@ -537,6 +536,20 @@ evaluxn(Uxn *u, u16 vec)
537 u->wst.ptr += 2; 536 u->wst.ptr += 2;
538 } 537 }
539 break; 538 break;
539 case 0x21: /* INC2 */
540 __asm__("evaluxn_21_INC2:");
541 {
542 u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8));
543 u->wst.dat[u->wst.ptr - 2] = (a + 1) >> 8;
544 u->wst.dat[u->wst.ptr - 1] = (a + 1) & 0xff;
545#ifndef NO_STACK_CHECKS
546 if(__builtin_expect(u->wst.ptr < 2, 0)) {
547 u->wst.error = 1;
548 goto error;
549 }
550#endif
551 }
552 break;
540 case 0x22: /* POP2 */ 553 case 0x22: /* POP2 */
541 __asm__("evaluxn_22_POP2:"); 554 __asm__("evaluxn_22_POP2:");
542 { 555 {
@@ -1024,9 +1037,9 @@ evaluxn(Uxn *u, u16 vec)
1024 u->wst.ptr -= 1; 1037 u->wst.ptr -= 1;
1025 } 1038 }
1026 break; 1039 break;
1027 case 0x41: /* LITr */ 1040 case 0x40: /* LITr */
1028 case 0xc1: /* LITkr */ 1041 case 0xc0: /* LITkr */
1029 __asm__("evaluxn_41_LITr:"); 1042 __asm__("evaluxn_40_LITr:");
1030 { 1043 {
1031 u->rst.dat[u->rst.ptr] = mempeek8(u->ram.dat, u->ram.ptr++); 1044 u->rst.dat[u->rst.ptr] = mempeek8(u->ram.dat, u->ram.ptr++);
1032#ifndef NO_STACK_CHECKS 1045#ifndef NO_STACK_CHECKS
@@ -1038,6 +1051,19 @@ evaluxn(Uxn *u, u16 vec)
1038 u->rst.ptr += 1; 1051 u->rst.ptr += 1;
1039 } 1052 }
1040 break; 1053 break;
1054 case 0x41: /* INCr */
1055 __asm__("evaluxn_41_INCr:");
1056 {
1057 u8 a = u->rst.dat[u->rst.ptr - 1];
1058 u->rst.dat[u->rst.ptr - 1] = a + 1;
1059#ifndef NO_STACK_CHECKS
1060 if(__builtin_expect(u->rst.ptr < 1, 0)) {
1061 u->rst.error = 1;
1062 goto error;
1063 }
1064#endif
1065 }
1066 break;
1041 case 0x42: /* POPr */ 1067 case 0x42: /* POPr */
1042 __asm__("evaluxn_42_POPr:"); 1068 __asm__("evaluxn_42_POPr:");
1043 { 1069 {
@@ -1490,9 +1516,9 @@ evaluxn(Uxn *u, u16 vec)
1490 u->rst.ptr -= 1; 1516 u->rst.ptr -= 1;
1491 } 1517 }
1492 break; 1518 break;
1493 case 0x61: /* LIT2r */ 1519 case 0x60: /* LIT2r */
1494 case 0xe1: /* LIT2kr */ 1520 case 0xe0: /* LIT2kr */
1495 __asm__("evaluxn_61_LIT2r:"); 1521 __asm__("evaluxn_60_LIT2r:");
1496 { 1522 {
1497 u->rst.dat[u->rst.ptr] = mempeek8(u->ram.dat, u->ram.ptr++); 1523 u->rst.dat[u->rst.ptr] = mempeek8(u->ram.dat, u->ram.ptr++);
1498 u->rst.dat[u->rst.ptr + 1] = mempeek8(u->ram.dat, u->ram.ptr++); 1524 u->rst.dat[u->rst.ptr + 1] = mempeek8(u->ram.dat, u->ram.ptr++);
@@ -1505,6 +1531,20 @@ evaluxn(Uxn *u, u16 vec)
1505 u->rst.ptr += 2; 1531 u->rst.ptr += 2;
1506 } 1532 }
1507 break; 1533 break;
1534 case 0x61: /* INC2r */
1535 __asm__("evaluxn_61_INC2r:");
1536 {
1537 u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8));
1538 u->rst.dat[u->rst.ptr - 2] = (a + 1) >> 8;
1539 u->rst.dat[u->rst.ptr - 1] = (a + 1) & 0xff;
1540#ifndef NO_STACK_CHECKS
1541 if(__builtin_expect(u->rst.ptr < 2, 0)) {
1542 u->rst.error = 1;
1543 goto error;
1544 }
1545#endif
1546 }
1547 break;
1508 case 0x62: /* POP2r */ 1548 case 0x62: /* POP2r */
1509 __asm__("evaluxn_62_POP2r:"); 1549 __asm__("evaluxn_62_POP2r:");
1510 { 1550 {
@@ -1992,6 +2032,24 @@ evaluxn(Uxn *u, u16 vec)
1992 u->rst.ptr -= 1; 2032 u->rst.ptr -= 1;
1993 } 2033 }
1994 break; 2034 break;
2035 case 0x81: /* INCk */
2036 __asm__("evaluxn_81_INCk:");
2037 {
2038 u8 a = u->wst.dat[u->wst.ptr - 1];
2039 u->wst.dat[u->wst.ptr] = a + 1;
2040#ifndef NO_STACK_CHECKS
2041 if(__builtin_expect(u->wst.ptr < 1, 0)) {
2042 u->wst.error = 1;
2043 goto error;
2044 }
2045 if(__builtin_expect(u->wst.ptr > 254, 0)) {
2046 u->wst.error = 2;
2047 goto error;
2048 }
2049#endif
2050 u->wst.ptr += 1;
2051 }
2052 break;
1995 case 0x82: /* POPk */ 2053 case 0x82: /* POPk */
1996 __asm__("evaluxn_82_POPk:"); 2054 __asm__("evaluxn_82_POPk:");
1997 { 2055 {
@@ -2515,6 +2573,25 @@ evaluxn(Uxn *u, u16 vec)
2515 u->wst.ptr += 1; 2573 u->wst.ptr += 1;
2516 } 2574 }
2517 break; 2575 break;
2576 case 0xa1: /* INC2k */
2577 __asm__("evaluxn_a1_INC2k:");
2578 {
2579 u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8));
2580 u->wst.dat[u->wst.ptr] = (a + 1) >> 8;
2581 u->wst.dat[u->wst.ptr + 1] = (a + 1) & 0xff;
2582#ifndef NO_STACK_CHECKS
2583 if(__builtin_expect(u->wst.ptr < 2, 0)) {
2584 u->wst.error = 1;
2585 goto error;
2586 }
2587 if(__builtin_expect(u->wst.ptr > 253, 0)) {
2588 u->wst.error = 2;
2589 goto error;
2590 }
2591#endif
2592 u->wst.ptr += 2;
2593 }
2594 break;
2518 case 0xa2: /* POP2k */ 2595 case 0xa2: /* POP2k */
2519 __asm__("evaluxn_a2_POP2k:"); 2596 __asm__("evaluxn_a2_POP2k:");
2520 { 2597 {
@@ -3062,6 +3139,24 @@ evaluxn(Uxn *u, u16 vec)
3062 u->wst.ptr += 2; 3139 u->wst.ptr += 2;
3063 } 3140 }
3064 break; 3141 break;
3142 case 0xc1: /* INCkr */
3143 __asm__("evaluxn_c1_INCkr:");
3144 {
3145 u8 a = u->rst.dat[u->rst.ptr - 1];
3146 u->rst.dat[u->rst.ptr] = a + 1;
3147#ifndef NO_STACK_CHECKS
3148 if(__builtin_expect(u->rst.ptr < 1, 0)) {
3149 u->rst.error = 1;
3150 goto error;
3151 }
3152 if(__builtin_expect(u->rst.ptr > 254, 0)) {
3153 u->rst.error = 2;
3154 goto error;
3155 }
3156#endif
3157 u->rst.ptr += 1;
3158 }
3159 break;
3065 case 0xc2: /* POPkr */ 3160 case 0xc2: /* POPkr */
3066 __asm__("evaluxn_c2_POPkr:"); 3161 __asm__("evaluxn_c2_POPkr:");
3067 { 3162 {
@@ -3585,6 +3680,25 @@ evaluxn(Uxn *u, u16 vec)
3585 u->rst.ptr += 1; 3680 u->rst.ptr += 1;
3586 } 3681 }
3587 break; 3682 break;
3683 case 0xe1: /* INC2kr */
3684 __asm__("evaluxn_e1_INC2kr:");
3685 {
3686 u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8));
3687 u->rst.dat[u->rst.ptr] = (a + 1) >> 8;
3688 u->rst.dat[u->rst.ptr + 1] = (a + 1) & 0xff;
3689#ifndef NO_STACK_CHECKS
3690 if(__builtin_expect(u->rst.ptr < 2, 0)) {
3691 u->rst.error = 1;
3692 goto error;
3693 }
3694 if(__builtin_expect(u->rst.ptr > 253, 0)) {
3695 u->rst.error = 2;
3696 goto error;
3697 }
3698#endif
3699 u->rst.ptr += 2;
3700 }
3701 break;
3588 case 0xe2: /* POP2kr */ 3702 case 0xe2: /* POP2kr */
3589 __asm__("evaluxn_e2_POP2kr:"); 3703 __asm__("evaluxn_e2_POP2kr:");
3590 { 3704 {
@@ -4143,7 +4257,7 @@ error:
4143} 4257}
4144 4258
4145Device * 4259Device *
4146portuxn(Uxn *u, u8 id, char *name, void (*talkfn)(Device *d, u8 b0, u8 w)) 4260uxn_port(Uxn *u, u8 id, char *name, void (*talkfn)(Device *d, u8 b0, u8 w))
4147{ 4261{
4148 Device *d = &u->dev[id]; 4262 Device *d = &u->dev[id];
4149 d->addr = id * 0x10; 4263 d->addr = id * 0x10;