diff options
author | Bad Diode <bd@badd10de.dev> | 2021-08-18 09:42:00 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-08-18 09:42:00 +0200 |
commit | 882ae2a693a50cdfa072462be2d57b93078cf916 (patch) | |
tree | 8ceb3d51711c93a78bd221f7f59c22864a1d549a /src/uxn.c | |
parent | 3652f2a9f8190e688d0e358d3a8ae6ea5c31b45d (diff) | |
download | uxngba-882ae2a693a50cdfa072462be2d57b93078cf916.tar.gz uxngba-882ae2a693a50cdfa072462be2d57b93078cf916.zip |
Update UXN core with INC/DEC changes
Diffstat (limited to 'src/uxn.c')
-rw-r--r-- | src/uxn.c | 174 |
1 files changed, 144 insertions, 30 deletions
@@ -30,35 +30,21 @@ See etc/mkuxn-fast.moon for instructions. | |||
30 | 30 | ||
31 | IWRAM_CODE | 31 | IWRAM_CODE |
32 | int | 32 | int |
33 | evaluxn(Uxn *u, u16 vec) | 33 | uxn_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 | ||
4145 | Device * | 4259 | Device * |
4146 | portuxn(Uxn *u, u8 id, char *name, void (*talkfn)(Device *d, u8 b0, u8 w)) | 4260 | uxn_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; |