From 3652f2a9f8190e688d0e358d3a8ae6ea5c31b45d Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Mon, 16 Aug 2021 09:31:54 +0200 Subject: Update UXN with OPCODE changes (-NOP, +NIP) --- src/uxn.c | 731 +++++++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 465 insertions(+), 266 deletions(-) (limited to 'src') diff --git a/src/uxn.c b/src/uxn.c index d6da3b9..3a8cdb3 100644 --- a/src/uxn.c +++ b/src/uxn.c @@ -15,12 +15,28 @@ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE. */ +/* + ^ +/!\ THIS FILE IS AUTOMATICALLY GENERATED +--- + +Its contents can get overwritten with the processed contents of src/uxn.c. +See etc/mkuxn-fast.moon for instructions. + +*/ + +#define MODE_RETURN 0x40 +#define MODE_KEEP 0x80 + IWRAM_CODE int evaluxn(Uxn *u, u16 vec) { u8 instr; + if(u->dev[0].dat[0xf]) + return 0; u->ram.ptr = vec; + if(u->wst.ptr > 0xf8) u->wst.ptr = 0xf8; while(u->ram.ptr) { instr = u->ram.dat[u->ram.ptr++]; switch(instr) { @@ -35,14 +51,14 @@ evaluxn(Uxn *u, u16 vec) case 0xa0: /* BRK2k */ case 0xc0: /* BRKkr */ case 0xe0: /* BRK2kr */ - __asm__( "evaluxn_00_BRK:" ); + __asm__("evaluxn_00_BRK:"); { u->ram.ptr = 0; } break; case 0x01: /* LIT */ case 0x81: /* LITk */ - __asm__( "evaluxn_01_LIT:" ); + __asm__("evaluxn_01_LIT:"); { u->wst.dat[u->wst.ptr] = mempeek8(u->ram.dat, u->ram.ptr++); #ifndef NO_STACK_CHECKS @@ -54,21 +70,8 @@ evaluxn(Uxn *u, u16 vec) u->wst.ptr += 1; } break; - case 0x02: /* NOP */ - case 0x22: /* NOP2 */ - case 0x42: /* NOPr */ - case 0x62: /* NOP2r */ - case 0x82: /* NOPk */ - case 0xa2: /* NOP2k */ - case 0xc2: /* NOPkr */ - case 0xe2: /* NOP2kr */ - __asm__( "evaluxn_02_NOP:" ); - { - (void)u; - } - break; - case 0x03: /* POP */ - __asm__( "evaluxn_03_POP:" ); + case 0x02: /* POP */ + __asm__("evaluxn_02_POP:"); { u->wst.dat[u->wst.ptr - 1]; #ifndef NO_STACK_CHECKS @@ -80,8 +83,8 @@ evaluxn(Uxn *u, u16 vec) u->wst.ptr -= 1; } break; - case 0x04: /* DUP */ - __asm__( "evaluxn_04_DUP:" ); + case 0x03: /* DUP */ + __asm__("evaluxn_03_DUP:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; u->wst.dat[u->wst.ptr] = a; @@ -98,8 +101,23 @@ evaluxn(Uxn *u, u16 vec) u->wst.ptr += 1; } break; + case 0x04: /* NIP */ + __asm__("evaluxn_04_NIP:"); + { + u8 a = u->wst.dat[u->wst.ptr - 1]; + u->wst.dat[u->wst.ptr - 2]; + u->wst.dat[u->wst.ptr - 2] = a; +#ifndef NO_STACK_CHECKS + if(__builtin_expect(u->wst.ptr < 2, 0)) { + u->wst.error = 1; + goto error; + } +#endif + u->wst.ptr -= 1; + } + break; case 0x05: /* SWP */ - __asm__( "evaluxn_05_SWP:" ); + __asm__("evaluxn_05_SWP:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; u->wst.dat[u->wst.ptr - 2] = a; @@ -113,7 +131,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x06: /* OVR */ - __asm__( "evaluxn_06_OVR:" ); + __asm__("evaluxn_06_OVR:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; u->wst.dat[u->wst.ptr] = b; @@ -131,7 +149,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x07: /* ROT */ - __asm__( "evaluxn_07_ROT:" ); + __asm__("evaluxn_07_ROT:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3]; u->wst.dat[u->wst.ptr - 3] = b; @@ -146,7 +164,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x08: /* EQU */ - __asm__( "evaluxn_08_EQU:" ); + __asm__("evaluxn_08_EQU:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; u->wst.dat[u->wst.ptr - 2] = b == a; @@ -160,7 +178,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x09: /* NEQ */ - __asm__( "evaluxn_09_NEQ:" ); + __asm__("evaluxn_09_NEQ:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; u->wst.dat[u->wst.ptr - 2] = b != a; @@ -174,7 +192,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x0a: /* GTH */ - __asm__( "evaluxn_0a_GTH:" ); + __asm__("evaluxn_0a_GTH:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; u->wst.dat[u->wst.ptr - 2] = b > a; @@ -188,7 +206,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x0b: /* LTH */ - __asm__( "evaluxn_0b_LTH:" ); + __asm__("evaluxn_0b_LTH:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; u->wst.dat[u->wst.ptr - 2] = b < a; @@ -202,7 +220,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x0c: /* JMP */ - __asm__( "evaluxn_0c_JMP:" ); + __asm__("evaluxn_0c_JMP:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; u->ram.ptr += (s8)a; @@ -216,7 +234,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x0d: /* JCN */ - __asm__( "evaluxn_0d_JCN:" ); + __asm__("evaluxn_0d_JCN:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; if(u->wst.dat[u->wst.ptr - 2]) u->ram.ptr += (s8)a; @@ -230,7 +248,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x0e: /* JSR */ - __asm__( "evaluxn_0e_JSR:" ); + __asm__("evaluxn_0e_JSR:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; u->rst.dat[u->rst.ptr] = u->ram.ptr >> 8; @@ -253,7 +271,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x0f: /* STH */ - __asm__( "evaluxn_0f_STH:" ); + __asm__("evaluxn_0f_STH:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; u->rst.dat[u->rst.ptr] = a; @@ -274,7 +292,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x10: /* LDZ */ - __asm__( "evaluxn_10_LDZ:" ); + __asm__("evaluxn_10_LDZ:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; u->wst.dat[u->wst.ptr - 1] = mempeek8(u->ram.dat, a); @@ -287,7 +305,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x11: /* STZ */ - __asm__( "evaluxn_11_STZ:" ); + __asm__("evaluxn_11_STZ:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; u8 b = u->wst.dat[u->wst.ptr - 2]; @@ -302,7 +320,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x12: /* LDR */ - __asm__( "evaluxn_12_LDR:" ); + __asm__("evaluxn_12_LDR:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; u->wst.dat[u->wst.ptr - 1] = mempeek8(u->ram.dat, u->ram.ptr + (s8)a); @@ -315,7 +333,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x13: /* STR */ - __asm__( "evaluxn_13_STR:" ); + __asm__("evaluxn_13_STR:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; u8 b = u->wst.dat[u->wst.ptr - 2]; @@ -330,7 +348,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x14: /* LDA */ - __asm__( "evaluxn_14_LDA:" ); + __asm__("evaluxn_14_LDA:"); { u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); u->wst.dat[u->wst.ptr - 2] = mempeek8(u->ram.dat, a); @@ -344,7 +362,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x15: /* STA */ - __asm__( "evaluxn_15_STA:" ); + __asm__("evaluxn_15_STA:"); { u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); u8 b = u->wst.dat[u->wst.ptr - 3]; @@ -359,7 +377,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x16: /* DEI */ - __asm__( "evaluxn_16_DEI:" ); + __asm__("evaluxn_16_DEI:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; u->wst.dat[u->wst.ptr - 1] = devpeek8(&u->dev[a >> 4], a); @@ -372,7 +390,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x17: /* DEO */ - __asm__( "evaluxn_17_DEO:" ); + __asm__("evaluxn_17_DEO:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; devpoke8(&u->dev[a >> 4], a, b); @@ -386,7 +404,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x18: /* ADD */ - __asm__( "evaluxn_18_ADD:" ); + __asm__("evaluxn_18_ADD:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; u->wst.dat[u->wst.ptr - 2] = b + a; @@ -400,7 +418,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x19: /* SUB */ - __asm__( "evaluxn_19_SUB:" ); + __asm__("evaluxn_19_SUB:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; u->wst.dat[u->wst.ptr - 2] = b - a; @@ -414,7 +432,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x1a: /* MUL */ - __asm__( "evaluxn_1a_MUL:" ); + __asm__("evaluxn_1a_MUL:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; u->wst.dat[u->wst.ptr - 2] = b * a; @@ -428,9 +446,16 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x1b: /* DIV */ - __asm__( "evaluxn_1b_DIV:" ); + __asm__("evaluxn_1b_DIV:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; + if(a == 0) { + u->wst.error = 3; +#ifndef NO_STACK_CHECKS + goto error; +#endif + a = 1; + } u->wst.dat[u->wst.ptr - 2] = b / a; #ifndef NO_STACK_CHECKS if(__builtin_expect(u->wst.ptr < 2, 0)) { @@ -442,7 +467,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x1c: /* AND */ - __asm__( "evaluxn_1c_AND:" ); + __asm__("evaluxn_1c_AND:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; u->wst.dat[u->wst.ptr - 2] = b & a; @@ -456,7 +481,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x1d: /* ORA */ - __asm__( "evaluxn_1d_ORA:" ); + __asm__("evaluxn_1d_ORA:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; u->wst.dat[u->wst.ptr - 2] = b | a; @@ -470,7 +495,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x1e: /* EOR */ - __asm__( "evaluxn_1e_EOR:" ); + __asm__("evaluxn_1e_EOR:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; u->wst.dat[u->wst.ptr - 2] = b ^ a; @@ -484,7 +509,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x1f: /* SFT */ - __asm__( "evaluxn_1f_SFT:" ); + __asm__("evaluxn_1f_SFT:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; u->wst.dat[u->wst.ptr - 2] = b >> (a & 0x07) << ((a & 0x70) >> 4); @@ -499,7 +524,7 @@ evaluxn(Uxn *u, u16 vec) break; case 0x21: /* LIT2 */ case 0xa1: /* LIT2k */ - __asm__( "evaluxn_21_LIT2:" ); + __asm__("evaluxn_21_LIT2:"); { u->wst.dat[u->wst.ptr] = mempeek8(u->ram.dat, u->ram.ptr++); u->wst.dat[u->wst.ptr + 1] = mempeek8(u->ram.dat, u->ram.ptr++); @@ -512,8 +537,8 @@ evaluxn(Uxn *u, u16 vec) u->wst.ptr += 2; } break; - case 0x23: /* POP2 */ - __asm__( "evaluxn_23_POP2:" ); + case 0x22: /* POP2 */ + __asm__("evaluxn_22_POP2:"); { (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); #ifndef NO_STACK_CHECKS @@ -525,8 +550,8 @@ evaluxn(Uxn *u, u16 vec) u->wst.ptr -= 2; } break; - case 0x24: /* DUP2 */ - __asm__( "evaluxn_24_DUP2:" ); + case 0x23: /* DUP2 */ + __asm__("evaluxn_23_DUP2:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; u->wst.dat[u->wst.ptr] = b; @@ -544,8 +569,24 @@ evaluxn(Uxn *u, u16 vec) u->wst.ptr += 2; } break; + case 0x24: /* NIP2 */ + __asm__("evaluxn_24_NIP2:"); + { + u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); + (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); + u->wst.dat[u->wst.ptr - 4] = a >> 8; + u->wst.dat[u->wst.ptr - 3] = a & 0xff; +#ifndef NO_STACK_CHECKS + if(__builtin_expect(u->wst.ptr < 4, 0)) { + u->wst.error = 1; + goto error; + } +#endif + u->wst.ptr -= 2; + } + break; case 0x25: /* SWP2 */ - __asm__( "evaluxn_25_SWP2:" ); + __asm__("evaluxn_25_SWP2:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4]; u->wst.dat[u->wst.ptr - 4] = b; @@ -561,7 +602,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x26: /* OVR2 */ - __asm__( "evaluxn_26_OVR2:" ); + __asm__("evaluxn_26_OVR2:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4]; u->wst.dat[u->wst.ptr] = d; @@ -580,7 +621,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x27: /* ROT2 */ - __asm__( "evaluxn_27_ROT2:" ); + __asm__("evaluxn_27_ROT2:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4], e = u->wst.dat[u->wst.ptr - 5], f = u->wst.dat[u->wst.ptr - 6]; u->wst.dat[u->wst.ptr - 6] = d; @@ -598,7 +639,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x28: /* EQU2 */ - __asm__( "evaluxn_28_EQU2:" ); + __asm__("evaluxn_28_EQU2:"); { u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); u->wst.dat[u->wst.ptr - 4] = b == a; @@ -612,7 +653,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x29: /* NEQ2 */ - __asm__( "evaluxn_29_NEQ2:" ); + __asm__("evaluxn_29_NEQ2:"); { u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); u->wst.dat[u->wst.ptr - 4] = b != a; @@ -626,7 +667,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x2a: /* GTH2 */ - __asm__( "evaluxn_2a_GTH2:" ); + __asm__("evaluxn_2a_GTH2:"); { u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); u->wst.dat[u->wst.ptr - 4] = b > a; @@ -640,7 +681,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x2b: /* LTH2 */ - __asm__( "evaluxn_2b_LTH2:" ); + __asm__("evaluxn_2b_LTH2:"); { u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); u->wst.dat[u->wst.ptr - 4] = b < a; @@ -654,7 +695,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x2c: /* JMP2 */ - __asm__( "evaluxn_2c_JMP2:" ); + __asm__("evaluxn_2c_JMP2:"); { u->ram.ptr = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); #ifndef NO_STACK_CHECKS @@ -667,7 +708,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x2d: /* JCN2 */ - __asm__( "evaluxn_2d_JCN2:" ); + __asm__("evaluxn_2d_JCN2:"); { u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); if(u->wst.dat[u->wst.ptr - 3]) u->ram.ptr = a; @@ -681,7 +722,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x2e: /* JSR2 */ - __asm__( "evaluxn_2e_JSR2:" ); + __asm__("evaluxn_2e_JSR2:"); { u->rst.dat[u->rst.ptr] = u->ram.ptr >> 8; u->rst.dat[u->rst.ptr + 1] = u->ram.ptr & 0xff; @@ -703,7 +744,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x2f: /* STH2 */ - __asm__( "evaluxn_2f_STH2:" ); + __asm__("evaluxn_2f_STH2:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; u->rst.dat[u->rst.ptr] = b; @@ -725,7 +766,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x30: /* LDZ2 */ - __asm__( "evaluxn_30_LDZ2:" ); + __asm__("evaluxn_30_LDZ2:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; u->wst.dat[u->wst.ptr - 1] = mempeek8(u->ram.dat, a); @@ -744,7 +785,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x31: /* STZ2 */ - __asm__( "evaluxn_31_STZ2:" ); + __asm__("evaluxn_31_STZ2:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; u16 b = (u->wst.dat[u->wst.ptr - 2] | (u->wst.dat[u->wst.ptr - 3] << 8)); @@ -759,7 +800,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x32: /* LDR2 */ - __asm__( "evaluxn_32_LDR2:" ); + __asm__("evaluxn_32_LDR2:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; u->wst.dat[u->wst.ptr - 1] = mempeek8(u->ram.dat, u->ram.ptr + (s8)a); @@ -778,7 +819,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x33: /* STR2 */ - __asm__( "evaluxn_33_STR2:" ); + __asm__("evaluxn_33_STR2:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; u16 b = (u->wst.dat[u->wst.ptr - 2] | (u->wst.dat[u->wst.ptr - 3] << 8)); @@ -793,7 +834,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x34: /* LDA2 */ - __asm__( "evaluxn_34_LDA2:" ); + __asm__("evaluxn_34_LDA2:"); { u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); u->wst.dat[u->wst.ptr - 2] = mempeek8(u->ram.dat, a); @@ -807,7 +848,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x35: /* STA2 */ - __asm__( "evaluxn_35_STA2:" ); + __asm__("evaluxn_35_STA2:"); { u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); u16 b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); @@ -822,7 +863,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x36: /* DEI2 */ - __asm__( "evaluxn_36_DEI2:" ); + __asm__("evaluxn_36_DEI2:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; u->wst.dat[u->wst.ptr - 1] = devpeek8(&u->dev[a >> 4], a); @@ -841,7 +882,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x37: /* DEO2 */ - __asm__( "evaluxn_37_DEO2:" ); + __asm__("evaluxn_37_DEO2:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; u16 b = (u->wst.dat[u->wst.ptr - 2] | (u->wst.dat[u->wst.ptr - 3] << 8)); @@ -856,7 +897,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x38: /* ADD2 */ - __asm__( "evaluxn_38_ADD2:" ); + __asm__("evaluxn_38_ADD2:"); { u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); u->wst.dat[u->wst.ptr - 4] = (b + a) >> 8; @@ -871,7 +912,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x39: /* SUB2 */ - __asm__( "evaluxn_39_SUB2:" ); + __asm__("evaluxn_39_SUB2:"); { u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); u->wst.dat[u->wst.ptr - 4] = (b - a) >> 8; @@ -886,7 +927,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x3a: /* MUL2 */ - __asm__( "evaluxn_3a_MUL2:" ); + __asm__("evaluxn_3a_MUL2:"); { u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); u->wst.dat[u->wst.ptr - 4] = (b * a) >> 8; @@ -901,9 +942,16 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x3b: /* DIV2 */ - __asm__( "evaluxn_3b_DIV2:" ); + __asm__("evaluxn_3b_DIV2:"); { u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); + if(a == 0) { + u->wst.error = 3; +#ifndef NO_STACK_CHECKS + goto error; +#endif + a = 1; + } u->wst.dat[u->wst.ptr - 4] = (b / a) >> 8; u->wst.dat[u->wst.ptr - 3] = (b / a) & 0xff; #ifndef NO_STACK_CHECKS @@ -916,7 +964,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x3c: /* AND2 */ - __asm__( "evaluxn_3c_AND2:" ); + __asm__("evaluxn_3c_AND2:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4]; u->wst.dat[u->wst.ptr - 4] = d & b; @@ -931,7 +979,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x3d: /* ORA2 */ - __asm__( "evaluxn_3d_ORA2:" ); + __asm__("evaluxn_3d_ORA2:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4]; u->wst.dat[u->wst.ptr - 4] = d | b; @@ -946,7 +994,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x3e: /* EOR2 */ - __asm__( "evaluxn_3e_EOR2:" ); + __asm__("evaluxn_3e_EOR2:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4]; u->wst.dat[u->wst.ptr - 4] = d ^ b; @@ -961,7 +1009,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x3f: /* SFT2 */ - __asm__( "evaluxn_3f_SFT2:" ); + __asm__("evaluxn_3f_SFT2:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; u16 b = (u->wst.dat[u->wst.ptr - 2] | (u->wst.dat[u->wst.ptr - 3] << 8)); @@ -978,7 +1026,7 @@ evaluxn(Uxn *u, u16 vec) break; case 0x41: /* LITr */ case 0xc1: /* LITkr */ - __asm__( "evaluxn_41_LITr:" ); + __asm__("evaluxn_41_LITr:"); { u->rst.dat[u->rst.ptr] = mempeek8(u->ram.dat, u->ram.ptr++); #ifndef NO_STACK_CHECKS @@ -990,8 +1038,8 @@ evaluxn(Uxn *u, u16 vec) u->rst.ptr += 1; } break; - case 0x43: /* POPr */ - __asm__( "evaluxn_43_POPr:" ); + case 0x42: /* POPr */ + __asm__("evaluxn_42_POPr:"); { u->rst.dat[u->rst.ptr - 1]; #ifndef NO_STACK_CHECKS @@ -1003,8 +1051,8 @@ evaluxn(Uxn *u, u16 vec) u->rst.ptr -= 1; } break; - case 0x44: /* DUPr */ - __asm__( "evaluxn_44_DUPr:" ); + case 0x43: /* DUPr */ + __asm__("evaluxn_43_DUPr:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; u->rst.dat[u->rst.ptr] = a; @@ -1021,8 +1069,23 @@ evaluxn(Uxn *u, u16 vec) u->rst.ptr += 1; } break; + case 0x44: /* NIPr */ + __asm__("evaluxn_44_NIPr:"); + { + u8 a = u->rst.dat[u->rst.ptr - 1]; + u->rst.dat[u->rst.ptr - 2]; + u->rst.dat[u->rst.ptr - 2] = a; +#ifndef NO_STACK_CHECKS + if(__builtin_expect(u->rst.ptr < 2, 0)) { + u->rst.error = 1; + goto error; + } +#endif + u->rst.ptr -= 1; + } + break; case 0x45: /* SWPr */ - __asm__( "evaluxn_45_SWPr:" ); + __asm__("evaluxn_45_SWPr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; u->rst.dat[u->rst.ptr - 2] = a; @@ -1036,7 +1099,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x46: /* OVRr */ - __asm__( "evaluxn_46_OVRr:" ); + __asm__("evaluxn_46_OVRr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; u->rst.dat[u->rst.ptr] = b; @@ -1054,7 +1117,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x47: /* ROTr */ - __asm__( "evaluxn_47_ROTr:" ); + __asm__("evaluxn_47_ROTr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3]; u->rst.dat[u->rst.ptr - 3] = b; @@ -1069,7 +1132,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x48: /* EQUr */ - __asm__( "evaluxn_48_EQUr:" ); + __asm__("evaluxn_48_EQUr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; u->rst.dat[u->rst.ptr - 2] = b == a; @@ -1083,7 +1146,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x49: /* NEQr */ - __asm__( "evaluxn_49_NEQr:" ); + __asm__("evaluxn_49_NEQr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; u->rst.dat[u->rst.ptr - 2] = b != a; @@ -1097,7 +1160,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x4a: /* GTHr */ - __asm__( "evaluxn_4a_GTHr:" ); + __asm__("evaluxn_4a_GTHr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; u->rst.dat[u->rst.ptr - 2] = b > a; @@ -1111,7 +1174,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x4b: /* LTHr */ - __asm__( "evaluxn_4b_LTHr:" ); + __asm__("evaluxn_4b_LTHr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; u->rst.dat[u->rst.ptr - 2] = b < a; @@ -1125,7 +1188,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x4c: /* JMPr */ - __asm__( "evaluxn_4c_JMPr:" ); + __asm__("evaluxn_4c_JMPr:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; u->ram.ptr += (s8)a; @@ -1139,7 +1202,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x4d: /* JCNr */ - __asm__( "evaluxn_4d_JCNr:" ); + __asm__("evaluxn_4d_JCNr:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; if(u->rst.dat[u->rst.ptr - 2]) u->ram.ptr += (s8)a; @@ -1153,7 +1216,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x4e: /* JSRr */ - __asm__( "evaluxn_4e_JSRr:" ); + __asm__("evaluxn_4e_JSRr:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; u->wst.dat[u->wst.ptr] = u->ram.ptr >> 8; @@ -1176,7 +1239,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x4f: /* STHr */ - __asm__( "evaluxn_4f_STHr:" ); + __asm__("evaluxn_4f_STHr:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; u->wst.dat[u->wst.ptr] = a; @@ -1197,7 +1260,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x50: /* LDZr */ - __asm__( "evaluxn_50_LDZr:" ); + __asm__("evaluxn_50_LDZr:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; u->rst.dat[u->rst.ptr - 1] = mempeek8(u->ram.dat, a); @@ -1210,7 +1273,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x51: /* STZr */ - __asm__( "evaluxn_51_STZr:" ); + __asm__("evaluxn_51_STZr:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; u8 b = u->rst.dat[u->rst.ptr - 2]; @@ -1225,7 +1288,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x52: /* LDRr */ - __asm__( "evaluxn_52_LDRr:" ); + __asm__("evaluxn_52_LDRr:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; u->rst.dat[u->rst.ptr - 1] = mempeek8(u->ram.dat, u->ram.ptr + (s8)a); @@ -1238,7 +1301,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x53: /* STRr */ - __asm__( "evaluxn_53_STRr:" ); + __asm__("evaluxn_53_STRr:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; u8 b = u->rst.dat[u->rst.ptr - 2]; @@ -1253,7 +1316,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x54: /* LDAr */ - __asm__( "evaluxn_54_LDAr:" ); + __asm__("evaluxn_54_LDAr:"); { u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); u->rst.dat[u->rst.ptr - 2] = mempeek8(u->ram.dat, a); @@ -1267,7 +1330,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x55: /* STAr */ - __asm__( "evaluxn_55_STAr:" ); + __asm__("evaluxn_55_STAr:"); { u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); u8 b = u->rst.dat[u->rst.ptr - 3]; @@ -1282,7 +1345,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x56: /* DEIr */ - __asm__( "evaluxn_56_DEIr:" ); + __asm__("evaluxn_56_DEIr:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; u->rst.dat[u->rst.ptr - 1] = devpeek8(&u->dev[a >> 4], a); @@ -1295,7 +1358,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x57: /* DEOr */ - __asm__( "evaluxn_57_DEOr:" ); + __asm__("evaluxn_57_DEOr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; devpoke8(&u->dev[a >> 4], a, b); @@ -1309,7 +1372,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x58: /* ADDr */ - __asm__( "evaluxn_58_ADDr:" ); + __asm__("evaluxn_58_ADDr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; u->rst.dat[u->rst.ptr - 2] = b + a; @@ -1323,7 +1386,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x59: /* SUBr */ - __asm__( "evaluxn_59_SUBr:" ); + __asm__("evaluxn_59_SUBr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; u->rst.dat[u->rst.ptr - 2] = b - a; @@ -1337,7 +1400,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x5a: /* MULr */ - __asm__( "evaluxn_5a_MULr:" ); + __asm__("evaluxn_5a_MULr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; u->rst.dat[u->rst.ptr - 2] = b * a; @@ -1351,9 +1414,16 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x5b: /* DIVr */ - __asm__( "evaluxn_5b_DIVr:" ); + __asm__("evaluxn_5b_DIVr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; + if(a == 0) { + u->rst.error = 3; +#ifndef NO_STACK_CHECKS + goto error; +#endif + a = 1; + } u->rst.dat[u->rst.ptr - 2] = b / a; #ifndef NO_STACK_CHECKS if(__builtin_expect(u->rst.ptr < 2, 0)) { @@ -1365,7 +1435,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x5c: /* ANDr */ - __asm__( "evaluxn_5c_ANDr:" ); + __asm__("evaluxn_5c_ANDr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; u->rst.dat[u->rst.ptr - 2] = b & a; @@ -1379,7 +1449,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x5d: /* ORAr */ - __asm__( "evaluxn_5d_ORAr:" ); + __asm__("evaluxn_5d_ORAr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; u->rst.dat[u->rst.ptr - 2] = b | a; @@ -1393,7 +1463,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x5e: /* EORr */ - __asm__( "evaluxn_5e_EORr:" ); + __asm__("evaluxn_5e_EORr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; u->rst.dat[u->rst.ptr - 2] = b ^ a; @@ -1407,7 +1477,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x5f: /* SFTr */ - __asm__( "evaluxn_5f_SFTr:" ); + __asm__("evaluxn_5f_SFTr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; u->rst.dat[u->rst.ptr - 2] = b >> (a & 0x07) << ((a & 0x70) >> 4); @@ -1422,7 +1492,7 @@ evaluxn(Uxn *u, u16 vec) break; case 0x61: /* LIT2r */ case 0xe1: /* LIT2kr */ - __asm__( "evaluxn_61_LIT2r:" ); + __asm__("evaluxn_61_LIT2r:"); { u->rst.dat[u->rst.ptr] = mempeek8(u->ram.dat, u->ram.ptr++); u->rst.dat[u->rst.ptr + 1] = mempeek8(u->ram.dat, u->ram.ptr++); @@ -1435,8 +1505,8 @@ evaluxn(Uxn *u, u16 vec) u->rst.ptr += 2; } break; - case 0x63: /* POP2r */ - __asm__( "evaluxn_63_POP2r:" ); + case 0x62: /* POP2r */ + __asm__("evaluxn_62_POP2r:"); { (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); #ifndef NO_STACK_CHECKS @@ -1448,8 +1518,8 @@ evaluxn(Uxn *u, u16 vec) u->rst.ptr -= 2; } break; - case 0x64: /* DUP2r */ - __asm__( "evaluxn_64_DUP2r:" ); + case 0x63: /* DUP2r */ + __asm__("evaluxn_63_DUP2r:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; u->rst.dat[u->rst.ptr] = b; @@ -1467,8 +1537,24 @@ evaluxn(Uxn *u, u16 vec) u->rst.ptr += 2; } break; + case 0x64: /* NIP2r */ + __asm__("evaluxn_64_NIP2r:"); + { + u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); + (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); + u->rst.dat[u->rst.ptr - 4] = a >> 8; + u->rst.dat[u->rst.ptr - 3] = a & 0xff; +#ifndef NO_STACK_CHECKS + if(__builtin_expect(u->rst.ptr < 4, 0)) { + u->rst.error = 1; + goto error; + } +#endif + u->rst.ptr -= 2; + } + break; case 0x65: /* SWP2r */ - __asm__( "evaluxn_65_SWP2r:" ); + __asm__("evaluxn_65_SWP2r:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4]; u->rst.dat[u->rst.ptr - 4] = b; @@ -1484,7 +1570,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x66: /* OVR2r */ - __asm__( "evaluxn_66_OVR2r:" ); + __asm__("evaluxn_66_OVR2r:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4]; u->rst.dat[u->rst.ptr] = d; @@ -1503,7 +1589,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x67: /* ROT2r */ - __asm__( "evaluxn_67_ROT2r:" ); + __asm__("evaluxn_67_ROT2r:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4], e = u->rst.dat[u->rst.ptr - 5], f = u->rst.dat[u->rst.ptr - 6]; u->rst.dat[u->rst.ptr - 6] = d; @@ -1521,7 +1607,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x68: /* EQU2r */ - __asm__( "evaluxn_68_EQU2r:" ); + __asm__("evaluxn_68_EQU2r:"); { u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); u->rst.dat[u->rst.ptr - 4] = b == a; @@ -1535,7 +1621,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x69: /* NEQ2r */ - __asm__( "evaluxn_69_NEQ2r:" ); + __asm__("evaluxn_69_NEQ2r:"); { u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); u->rst.dat[u->rst.ptr - 4] = b != a; @@ -1549,7 +1635,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x6a: /* GTH2r */ - __asm__( "evaluxn_6a_GTH2r:" ); + __asm__("evaluxn_6a_GTH2r:"); { u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); u->rst.dat[u->rst.ptr - 4] = b > a; @@ -1563,7 +1649,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x6b: /* LTH2r */ - __asm__( "evaluxn_6b_LTH2r:" ); + __asm__("evaluxn_6b_LTH2r:"); { u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); u->rst.dat[u->rst.ptr - 4] = b < a; @@ -1577,7 +1663,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x6c: /* JMP2r */ - __asm__( "evaluxn_6c_JMP2r:" ); + __asm__("evaluxn_6c_JMP2r:"); { u->ram.ptr = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); #ifndef NO_STACK_CHECKS @@ -1590,7 +1676,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x6d: /* JCN2r */ - __asm__( "evaluxn_6d_JCN2r:" ); + __asm__("evaluxn_6d_JCN2r:"); { u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); if(u->rst.dat[u->rst.ptr - 3]) u->ram.ptr = a; @@ -1604,7 +1690,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x6e: /* JSR2r */ - __asm__( "evaluxn_6e_JSR2r:" ); + __asm__("evaluxn_6e_JSR2r:"); { u->wst.dat[u->wst.ptr] = u->ram.ptr >> 8; u->wst.dat[u->wst.ptr + 1] = u->ram.ptr & 0xff; @@ -1626,7 +1712,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x6f: /* STH2r */ - __asm__( "evaluxn_6f_STH2r:" ); + __asm__("evaluxn_6f_STH2r:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; u->wst.dat[u->wst.ptr] = b; @@ -1648,7 +1734,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x70: /* LDZ2r */ - __asm__( "evaluxn_70_LDZ2r:" ); + __asm__("evaluxn_70_LDZ2r:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; u->rst.dat[u->rst.ptr - 1] = mempeek8(u->ram.dat, a); @@ -1667,7 +1753,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x71: /* STZ2r */ - __asm__( "evaluxn_71_STZ2r:" ); + __asm__("evaluxn_71_STZ2r:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; u16 b = (u->rst.dat[u->rst.ptr - 2] | (u->rst.dat[u->rst.ptr - 3] << 8)); @@ -1682,7 +1768,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x72: /* LDR2r */ - __asm__( "evaluxn_72_LDR2r:" ); + __asm__("evaluxn_72_LDR2r:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; u->rst.dat[u->rst.ptr - 1] = mempeek8(u->ram.dat, u->ram.ptr + (s8)a); @@ -1701,7 +1787,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x73: /* STR2r */ - __asm__( "evaluxn_73_STR2r:" ); + __asm__("evaluxn_73_STR2r:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; u16 b = (u->rst.dat[u->rst.ptr - 2] | (u->rst.dat[u->rst.ptr - 3] << 8)); @@ -1716,7 +1802,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x74: /* LDA2r */ - __asm__( "evaluxn_74_LDA2r:" ); + __asm__("evaluxn_74_LDA2r:"); { u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); u->rst.dat[u->rst.ptr - 2] = mempeek8(u->ram.dat, a); @@ -1730,7 +1816,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x75: /* STA2r */ - __asm__( "evaluxn_75_STA2r:" ); + __asm__("evaluxn_75_STA2r:"); { u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); u16 b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); @@ -1745,7 +1831,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x76: /* DEI2r */ - __asm__( "evaluxn_76_DEI2r:" ); + __asm__("evaluxn_76_DEI2r:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; u->rst.dat[u->rst.ptr - 1] = devpeek8(&u->dev[a >> 4], a); @@ -1764,7 +1850,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x77: /* DEO2r */ - __asm__( "evaluxn_77_DEO2r:" ); + __asm__("evaluxn_77_DEO2r:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; u16 b = (u->rst.dat[u->rst.ptr - 2] | (u->rst.dat[u->rst.ptr - 3] << 8)); @@ -1779,7 +1865,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x78: /* ADD2r */ - __asm__( "evaluxn_78_ADD2r:" ); + __asm__("evaluxn_78_ADD2r:"); { u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); u->rst.dat[u->rst.ptr - 4] = (b + a) >> 8; @@ -1794,7 +1880,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x79: /* SUB2r */ - __asm__( "evaluxn_79_SUB2r:" ); + __asm__("evaluxn_79_SUB2r:"); { u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); u->rst.dat[u->rst.ptr - 4] = (b - a) >> 8; @@ -1809,7 +1895,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x7a: /* MUL2r */ - __asm__( "evaluxn_7a_MUL2r:" ); + __asm__("evaluxn_7a_MUL2r:"); { u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); u->rst.dat[u->rst.ptr - 4] = (b * a) >> 8; @@ -1824,9 +1910,16 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x7b: /* DIV2r */ - __asm__( "evaluxn_7b_DIV2r:" ); + __asm__("evaluxn_7b_DIV2r:"); { u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); + if(a == 0) { + u->rst.error = 3; +#ifndef NO_STACK_CHECKS + goto error; +#endif + a = 1; + } u->rst.dat[u->rst.ptr - 4] = (b / a) >> 8; u->rst.dat[u->rst.ptr - 3] = (b / a) & 0xff; #ifndef NO_STACK_CHECKS @@ -1839,7 +1932,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x7c: /* AND2r */ - __asm__( "evaluxn_7c_AND2r:" ); + __asm__("evaluxn_7c_AND2r:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4]; u->rst.dat[u->rst.ptr - 4] = d & b; @@ -1854,7 +1947,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x7d: /* ORA2r */ - __asm__( "evaluxn_7d_ORA2r:" ); + __asm__("evaluxn_7d_ORA2r:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4]; u->rst.dat[u->rst.ptr - 4] = d | b; @@ -1869,7 +1962,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x7e: /* EOR2r */ - __asm__( "evaluxn_7e_EOR2r:" ); + __asm__("evaluxn_7e_EOR2r:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4]; u->rst.dat[u->rst.ptr - 4] = d ^ b; @@ -1884,7 +1977,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x7f: /* SFT2r */ - __asm__( "evaluxn_7f_SFT2r:" ); + __asm__("evaluxn_7f_SFT2r:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; u16 b = (u->rst.dat[u->rst.ptr - 2] | (u->rst.dat[u->rst.ptr - 3] << 8)); @@ -1899,8 +1992,8 @@ evaluxn(Uxn *u, u16 vec) u->rst.ptr -= 1; } break; - case 0x83: /* POPk */ - __asm__( "evaluxn_83_POPk:" ); + case 0x82: /* POPk */ + __asm__("evaluxn_82_POPk:"); { u->wst.dat[u->wst.ptr - 1]; #ifndef NO_STACK_CHECKS @@ -1911,8 +2004,8 @@ evaluxn(Uxn *u, u16 vec) #endif } break; - case 0x84: /* DUPk */ - __asm__( "evaluxn_84_DUPk:" ); + case 0x83: /* DUPk */ + __asm__("evaluxn_83_DUPk:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; u->wst.dat[u->wst.ptr] = a; @@ -1930,8 +2023,27 @@ evaluxn(Uxn *u, u16 vec) u->wst.ptr += 2; } break; + case 0x84: /* NIPk */ + __asm__("evaluxn_84_NIPk:"); + { + u8 a = u->wst.dat[u->wst.ptr - 1]; + u->wst.dat[u->wst.ptr - 2]; + u->wst.dat[u->wst.ptr] = a; +#ifndef NO_STACK_CHECKS + if(__builtin_expect(u->wst.ptr < 2, 0)) { + u->wst.error = 1; + goto error; + } + if(__builtin_expect(u->wst.ptr > 254, 0)) { + u->wst.error = 2; + goto error; + } +#endif + u->wst.ptr += 1; + } + break; case 0x85: /* SWPk */ - __asm__( "evaluxn_85_SWPk:" ); + __asm__("evaluxn_85_SWPk:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; u->wst.dat[u->wst.ptr] = a; @@ -1950,7 +2062,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x86: /* OVRk */ - __asm__( "evaluxn_86_OVRk:" ); + __asm__("evaluxn_86_OVRk:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; u->wst.dat[u->wst.ptr] = b; @@ -1970,7 +2082,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x87: /* ROTk */ - __asm__( "evaluxn_87_ROTk:" ); + __asm__("evaluxn_87_ROTk:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3]; u->wst.dat[u->wst.ptr] = b; @@ -1990,7 +2102,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x88: /* EQUk */ - __asm__( "evaluxn_88_EQUk:" ); + __asm__("evaluxn_88_EQUk:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; u->wst.dat[u->wst.ptr] = b == a; @@ -2008,7 +2120,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x89: /* NEQk */ - __asm__( "evaluxn_89_NEQk:" ); + __asm__("evaluxn_89_NEQk:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; u->wst.dat[u->wst.ptr] = b != a; @@ -2026,7 +2138,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x8a: /* GTHk */ - __asm__( "evaluxn_8a_GTHk:" ); + __asm__("evaluxn_8a_GTHk:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; u->wst.dat[u->wst.ptr] = b > a; @@ -2044,7 +2156,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x8b: /* LTHk */ - __asm__( "evaluxn_8b_LTHk:" ); + __asm__("evaluxn_8b_LTHk:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; u->wst.dat[u->wst.ptr] = b < a; @@ -2062,7 +2174,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x8c: /* JMPk */ - __asm__( "evaluxn_8c_JMPk:" ); + __asm__("evaluxn_8c_JMPk:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; u->ram.ptr += (s8)a; @@ -2075,7 +2187,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x8d: /* JCNk */ - __asm__( "evaluxn_8d_JCNk:" ); + __asm__("evaluxn_8d_JCNk:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; if(u->wst.dat[u->wst.ptr - 2]) u->ram.ptr += (s8)a; @@ -2088,7 +2200,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x8e: /* JSRk */ - __asm__( "evaluxn_8e_JSRk:" ); + __asm__("evaluxn_8e_JSRk:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; u->rst.dat[u->rst.ptr] = u->ram.ptr >> 8; @@ -2108,7 +2220,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x8f: /* STHk */ - __asm__( "evaluxn_8f_STHk:" ); + __asm__("evaluxn_8f_STHk:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; u->rst.dat[u->rst.ptr] = a; @@ -2126,7 +2238,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x90: /* LDZk */ - __asm__( "evaluxn_90_LDZk:" ); + __asm__("evaluxn_90_LDZk:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; u->wst.dat[u->wst.ptr] = mempeek8(u->ram.dat, a); @@ -2144,7 +2256,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x91: /* STZk */ - __asm__( "evaluxn_91_STZk:" ); + __asm__("evaluxn_91_STZk:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; u8 b = u->wst.dat[u->wst.ptr - 2]; @@ -2158,7 +2270,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x92: /* LDRk */ - __asm__( "evaluxn_92_LDRk:" ); + __asm__("evaluxn_92_LDRk:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; u->wst.dat[u->wst.ptr] = mempeek8(u->ram.dat, u->ram.ptr + (s8)a); @@ -2176,7 +2288,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x93: /* STRk */ - __asm__( "evaluxn_93_STRk:" ); + __asm__("evaluxn_93_STRk:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; u8 b = u->wst.dat[u->wst.ptr - 2]; @@ -2190,7 +2302,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x94: /* LDAk */ - __asm__( "evaluxn_94_LDAk:" ); + __asm__("evaluxn_94_LDAk:"); { u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); u->wst.dat[u->wst.ptr] = mempeek8(u->ram.dat, a); @@ -2208,7 +2320,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x95: /* STAk */ - __asm__( "evaluxn_95_STAk:" ); + __asm__("evaluxn_95_STAk:"); { u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); u8 b = u->wst.dat[u->wst.ptr - 3]; @@ -2222,7 +2334,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x96: /* DEIk */ - __asm__( "evaluxn_96_DEIk:" ); + __asm__("evaluxn_96_DEIk:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; u->wst.dat[u->wst.ptr] = devpeek8(&u->dev[a >> 4], a); @@ -2240,7 +2352,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x97: /* DEOk */ - __asm__( "evaluxn_97_DEOk:" ); + __asm__("evaluxn_97_DEOk:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; devpoke8(&u->dev[a >> 4], a, b); @@ -2253,7 +2365,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x98: /* ADDk */ - __asm__( "evaluxn_98_ADDk:" ); + __asm__("evaluxn_98_ADDk:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; u->wst.dat[u->wst.ptr] = b + a; @@ -2271,7 +2383,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x99: /* SUBk */ - __asm__( "evaluxn_99_SUBk:" ); + __asm__("evaluxn_99_SUBk:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; u->wst.dat[u->wst.ptr] = b - a; @@ -2289,7 +2401,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x9a: /* MULk */ - __asm__( "evaluxn_9a_MULk:" ); + __asm__("evaluxn_9a_MULk:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; u->wst.dat[u->wst.ptr] = b * a; @@ -2307,9 +2419,16 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x9b: /* DIVk */ - __asm__( "evaluxn_9b_DIVk:" ); + __asm__("evaluxn_9b_DIVk:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; + if(a == 0) { + u->wst.error = 3; +#ifndef NO_STACK_CHECKS + goto error; +#endif + a = 1; + } u->wst.dat[u->wst.ptr] = b / a; #ifndef NO_STACK_CHECKS if(__builtin_expect(u->wst.ptr < 2, 0)) { @@ -2325,7 +2444,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x9c: /* ANDk */ - __asm__( "evaluxn_9c_ANDk:" ); + __asm__("evaluxn_9c_ANDk:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; u->wst.dat[u->wst.ptr] = b & a; @@ -2343,7 +2462,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x9d: /* ORAk */ - __asm__( "evaluxn_9d_ORAk:" ); + __asm__("evaluxn_9d_ORAk:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; u->wst.dat[u->wst.ptr] = b | a; @@ -2361,7 +2480,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x9e: /* EORk */ - __asm__( "evaluxn_9e_EORk:" ); + __asm__("evaluxn_9e_EORk:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; u->wst.dat[u->wst.ptr] = b ^ a; @@ -2379,7 +2498,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0x9f: /* SFTk */ - __asm__( "evaluxn_9f_SFTk:" ); + __asm__("evaluxn_9f_SFTk:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; u->wst.dat[u->wst.ptr] = b >> (a & 0x07) << ((a & 0x70) >> 4); @@ -2396,8 +2515,8 @@ evaluxn(Uxn *u, u16 vec) u->wst.ptr += 1; } break; - case 0xa3: /* POP2k */ - __asm__( "evaluxn_a3_POP2k:" ); + case 0xa2: /* POP2k */ + __asm__("evaluxn_a2_POP2k:"); { (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); #ifndef NO_STACK_CHECKS @@ -2408,8 +2527,8 @@ evaluxn(Uxn *u, u16 vec) #endif } break; - case 0xa4: /* DUP2k */ - __asm__( "evaluxn_a4_DUP2k:" ); + case 0xa3: /* DUP2k */ + __asm__("evaluxn_a3_DUP2k:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; u->wst.dat[u->wst.ptr] = b; @@ -2429,8 +2548,28 @@ evaluxn(Uxn *u, u16 vec) u->wst.ptr += 4; } break; + case 0xa4: /* NIP2k */ + __asm__("evaluxn_a4_NIP2k:"); + { + u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); + (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); + u->wst.dat[u->wst.ptr] = a >> 8; + u->wst.dat[u->wst.ptr + 1] = a & 0xff; +#ifndef NO_STACK_CHECKS + if(__builtin_expect(u->wst.ptr < 4, 0)) { + u->wst.error = 1; + goto error; + } + if(__builtin_expect(u->wst.ptr > 253, 0)) { + u->wst.error = 2; + goto error; + } +#endif + u->wst.ptr += 2; + } + break; case 0xa5: /* SWP2k */ - __asm__( "evaluxn_a5_SWP2k:" ); + __asm__("evaluxn_a5_SWP2k:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4]; u->wst.dat[u->wst.ptr] = b; @@ -2451,7 +2590,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xa6: /* OVR2k */ - __asm__( "evaluxn_a6_OVR2k:" ); + __asm__("evaluxn_a6_OVR2k:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4]; u->wst.dat[u->wst.ptr] = d; @@ -2474,7 +2613,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xa7: /* ROT2k */ - __asm__( "evaluxn_a7_ROT2k:" ); + __asm__("evaluxn_a7_ROT2k:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4], e = u->wst.dat[u->wst.ptr - 5], f = u->wst.dat[u->wst.ptr - 6]; u->wst.dat[u->wst.ptr] = d; @@ -2497,7 +2636,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xa8: /* EQU2k */ - __asm__( "evaluxn_a8_EQU2k:" ); + __asm__("evaluxn_a8_EQU2k:"); { u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); u->wst.dat[u->wst.ptr] = b == a; @@ -2515,7 +2654,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xa9: /* NEQ2k */ - __asm__( "evaluxn_a9_NEQ2k:" ); + __asm__("evaluxn_a9_NEQ2k:"); { u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); u->wst.dat[u->wst.ptr] = b != a; @@ -2533,7 +2672,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xaa: /* GTH2k */ - __asm__( "evaluxn_aa_GTH2k:" ); + __asm__("evaluxn_aa_GTH2k:"); { u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); u->wst.dat[u->wst.ptr] = b > a; @@ -2551,7 +2690,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xab: /* LTH2k */ - __asm__( "evaluxn_ab_LTH2k:" ); + __asm__("evaluxn_ab_LTH2k:"); { u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); u->wst.dat[u->wst.ptr] = b < a; @@ -2569,7 +2708,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xac: /* JMP2k */ - __asm__( "evaluxn_ac_JMP2k:" ); + __asm__("evaluxn_ac_JMP2k:"); { u->ram.ptr = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); #ifndef NO_STACK_CHECKS @@ -2581,7 +2720,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xad: /* JCN2k */ - __asm__( "evaluxn_ad_JCN2k:" ); + __asm__("evaluxn_ad_JCN2k:"); { u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); if(u->wst.dat[u->wst.ptr - 3]) u->ram.ptr = a; @@ -2594,7 +2733,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xae: /* JSR2k */ - __asm__( "evaluxn_ae_JSR2k:" ); + __asm__("evaluxn_ae_JSR2k:"); { u->rst.dat[u->rst.ptr] = u->ram.ptr >> 8; u->rst.dat[u->rst.ptr + 1] = u->ram.ptr & 0xff; @@ -2613,7 +2752,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xaf: /* STH2k */ - __asm__( "evaluxn_af_STH2k:" ); + __asm__("evaluxn_af_STH2k:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2]; u->rst.dat[u->rst.ptr] = b; @@ -2632,7 +2771,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xb0: /* LDZ2k */ - __asm__( "evaluxn_b0_LDZ2k:" ); + __asm__("evaluxn_b0_LDZ2k:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; u->wst.dat[u->wst.ptr] = mempeek8(u->ram.dat, a); @@ -2651,7 +2790,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xb1: /* STZ2k */ - __asm__( "evaluxn_b1_STZ2k:" ); + __asm__("evaluxn_b1_STZ2k:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; u16 b = (u->wst.dat[u->wst.ptr - 2] | (u->wst.dat[u->wst.ptr - 3] << 8)); @@ -2665,7 +2804,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xb2: /* LDR2k */ - __asm__( "evaluxn_b2_LDR2k:" ); + __asm__("evaluxn_b2_LDR2k:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; u->wst.dat[u->wst.ptr] = mempeek8(u->ram.dat, u->ram.ptr + (s8)a); @@ -2684,7 +2823,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xb3: /* STR2k */ - __asm__( "evaluxn_b3_STR2k:" ); + __asm__("evaluxn_b3_STR2k:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; u16 b = (u->wst.dat[u->wst.ptr - 2] | (u->wst.dat[u->wst.ptr - 3] << 8)); @@ -2698,7 +2837,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xb4: /* LDA2k */ - __asm__( "evaluxn_b4_LDA2k:" ); + __asm__("evaluxn_b4_LDA2k:"); { u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); u->wst.dat[u->wst.ptr] = mempeek8(u->ram.dat, a); @@ -2717,7 +2856,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xb5: /* STA2k */ - __asm__( "evaluxn_b5_STA2k:" ); + __asm__("evaluxn_b5_STA2k:"); { u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)); u16 b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); @@ -2731,7 +2870,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xb6: /* DEI2k */ - __asm__( "evaluxn_b6_DEI2k:" ); + __asm__("evaluxn_b6_DEI2k:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; u->wst.dat[u->wst.ptr] = devpeek8(&u->dev[a >> 4], a); @@ -2750,7 +2889,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xb7: /* DEO2k */ - __asm__( "evaluxn_b7_DEO2k:" ); + __asm__("evaluxn_b7_DEO2k:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; u16 b = (u->wst.dat[u->wst.ptr - 2] | (u->wst.dat[u->wst.ptr - 3] << 8)); @@ -2764,7 +2903,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xb8: /* ADD2k */ - __asm__( "evaluxn_b8_ADD2k:" ); + __asm__("evaluxn_b8_ADD2k:"); { u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); u->wst.dat[u->wst.ptr] = (b + a) >> 8; @@ -2783,7 +2922,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xb9: /* SUB2k */ - __asm__( "evaluxn_b9_SUB2k:" ); + __asm__("evaluxn_b9_SUB2k:"); { u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); u->wst.dat[u->wst.ptr] = (b - a) >> 8; @@ -2802,7 +2941,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xba: /* MUL2k */ - __asm__( "evaluxn_ba_MUL2k:" ); + __asm__("evaluxn_ba_MUL2k:"); { u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); u->wst.dat[u->wst.ptr] = (b * a) >> 8; @@ -2821,9 +2960,16 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xbb: /* DIV2k */ - __asm__( "evaluxn_bb_DIV2k:" ); + __asm__("evaluxn_bb_DIV2k:"); { u16 a = (u->wst.dat[u->wst.ptr - 1] | (u->wst.dat[u->wst.ptr - 2] << 8)), b = (u->wst.dat[u->wst.ptr - 3] | (u->wst.dat[u->wst.ptr - 4] << 8)); + if(a == 0) { + u->wst.error = 3; +#ifndef NO_STACK_CHECKS + goto error; +#endif + a = 1; + } u->wst.dat[u->wst.ptr] = (b / a) >> 8; u->wst.dat[u->wst.ptr + 1] = (b / a) & 0xff; #ifndef NO_STACK_CHECKS @@ -2840,7 +2986,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xbc: /* AND2k */ - __asm__( "evaluxn_bc_AND2k:" ); + __asm__("evaluxn_bc_AND2k:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4]; u->wst.dat[u->wst.ptr] = d & b; @@ -2859,7 +3005,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xbd: /* ORA2k */ - __asm__( "evaluxn_bd_ORA2k:" ); + __asm__("evaluxn_bd_ORA2k:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4]; u->wst.dat[u->wst.ptr] = d | b; @@ -2878,7 +3024,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xbe: /* EOR2k */ - __asm__( "evaluxn_be_EOR2k:" ); + __asm__("evaluxn_be_EOR2k:"); { u8 a = u->wst.dat[u->wst.ptr - 1], b = u->wst.dat[u->wst.ptr - 2], c = u->wst.dat[u->wst.ptr - 3], d = u->wst.dat[u->wst.ptr - 4]; u->wst.dat[u->wst.ptr] = d ^ b; @@ -2897,7 +3043,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xbf: /* SFT2k */ - __asm__( "evaluxn_bf_SFT2k:" ); + __asm__("evaluxn_bf_SFT2k:"); { u8 a = u->wst.dat[u->wst.ptr - 1]; u16 b = (u->wst.dat[u->wst.ptr - 2] | (u->wst.dat[u->wst.ptr - 3] << 8)); @@ -2916,8 +3062,8 @@ evaluxn(Uxn *u, u16 vec) u->wst.ptr += 2; } break; - case 0xc3: /* POPkr */ - __asm__( "evaluxn_c3_POPkr:" ); + case 0xc2: /* POPkr */ + __asm__("evaluxn_c2_POPkr:"); { u->rst.dat[u->rst.ptr - 1]; #ifndef NO_STACK_CHECKS @@ -2928,8 +3074,8 @@ evaluxn(Uxn *u, u16 vec) #endif } break; - case 0xc4: /* DUPkr */ - __asm__( "evaluxn_c4_DUPkr:" ); + case 0xc3: /* DUPkr */ + __asm__("evaluxn_c3_DUPkr:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; u->rst.dat[u->rst.ptr] = a; @@ -2947,8 +3093,27 @@ evaluxn(Uxn *u, u16 vec) u->rst.ptr += 2; } break; + case 0xc4: /* NIPkr */ + __asm__("evaluxn_c4_NIPkr:"); + { + u8 a = u->rst.dat[u->rst.ptr - 1]; + u->rst.dat[u->rst.ptr - 2]; + u->rst.dat[u->rst.ptr] = a; +#ifndef NO_STACK_CHECKS + if(__builtin_expect(u->rst.ptr < 2, 0)) { + u->rst.error = 1; + goto error; + } + if(__builtin_expect(u->rst.ptr > 254, 0)) { + u->rst.error = 2; + goto error; + } +#endif + u->rst.ptr += 1; + } + break; case 0xc5: /* SWPkr */ - __asm__( "evaluxn_c5_SWPkr:" ); + __asm__("evaluxn_c5_SWPkr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; u->rst.dat[u->rst.ptr] = a; @@ -2967,7 +3132,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xc6: /* OVRkr */ - __asm__( "evaluxn_c6_OVRkr:" ); + __asm__("evaluxn_c6_OVRkr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; u->rst.dat[u->rst.ptr] = b; @@ -2987,7 +3152,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xc7: /* ROTkr */ - __asm__( "evaluxn_c7_ROTkr:" ); + __asm__("evaluxn_c7_ROTkr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3]; u->rst.dat[u->rst.ptr] = b; @@ -3007,7 +3172,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xc8: /* EQUkr */ - __asm__( "evaluxn_c8_EQUkr:" ); + __asm__("evaluxn_c8_EQUkr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; u->rst.dat[u->rst.ptr] = b == a; @@ -3025,7 +3190,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xc9: /* NEQkr */ - __asm__( "evaluxn_c9_NEQkr:" ); + __asm__("evaluxn_c9_NEQkr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; u->rst.dat[u->rst.ptr] = b != a; @@ -3043,7 +3208,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xca: /* GTHkr */ - __asm__( "evaluxn_ca_GTHkr:" ); + __asm__("evaluxn_ca_GTHkr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; u->rst.dat[u->rst.ptr] = b > a; @@ -3061,7 +3226,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xcb: /* LTHkr */ - __asm__( "evaluxn_cb_LTHkr:" ); + __asm__("evaluxn_cb_LTHkr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; u->rst.dat[u->rst.ptr] = b < a; @@ -3079,7 +3244,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xcc: /* JMPkr */ - __asm__( "evaluxn_cc_JMPkr:" ); + __asm__("evaluxn_cc_JMPkr:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; u->ram.ptr += (s8)a; @@ -3092,7 +3257,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xcd: /* JCNkr */ - __asm__( "evaluxn_cd_JCNkr:" ); + __asm__("evaluxn_cd_JCNkr:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; if(u->rst.dat[u->rst.ptr - 2]) u->ram.ptr += (s8)a; @@ -3105,7 +3270,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xce: /* JSRkr */ - __asm__( "evaluxn_ce_JSRkr:" ); + __asm__("evaluxn_ce_JSRkr:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; u->wst.dat[u->wst.ptr] = u->ram.ptr >> 8; @@ -3125,7 +3290,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xcf: /* STHkr */ - __asm__( "evaluxn_cf_STHkr:" ); + __asm__("evaluxn_cf_STHkr:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; u->wst.dat[u->wst.ptr] = a; @@ -3143,7 +3308,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xd0: /* LDZkr */ - __asm__( "evaluxn_d0_LDZkr:" ); + __asm__("evaluxn_d0_LDZkr:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; u->rst.dat[u->rst.ptr] = mempeek8(u->ram.dat, a); @@ -3161,7 +3326,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xd1: /* STZkr */ - __asm__( "evaluxn_d1_STZkr:" ); + __asm__("evaluxn_d1_STZkr:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; u8 b = u->rst.dat[u->rst.ptr - 2]; @@ -3175,7 +3340,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xd2: /* LDRkr */ - __asm__( "evaluxn_d2_LDRkr:" ); + __asm__("evaluxn_d2_LDRkr:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; u->rst.dat[u->rst.ptr] = mempeek8(u->ram.dat, u->ram.ptr + (s8)a); @@ -3193,7 +3358,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xd3: /* STRkr */ - __asm__( "evaluxn_d3_STRkr:" ); + __asm__("evaluxn_d3_STRkr:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; u8 b = u->rst.dat[u->rst.ptr - 2]; @@ -3207,7 +3372,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xd4: /* LDAkr */ - __asm__( "evaluxn_d4_LDAkr:" ); + __asm__("evaluxn_d4_LDAkr:"); { u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); u->rst.dat[u->rst.ptr] = mempeek8(u->ram.dat, a); @@ -3225,7 +3390,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xd5: /* STAkr */ - __asm__( "evaluxn_d5_STAkr:" ); + __asm__("evaluxn_d5_STAkr:"); { u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); u8 b = u->rst.dat[u->rst.ptr - 3]; @@ -3239,7 +3404,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xd6: /* DEIkr */ - __asm__( "evaluxn_d6_DEIkr:" ); + __asm__("evaluxn_d6_DEIkr:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; u->rst.dat[u->rst.ptr] = devpeek8(&u->dev[a >> 4], a); @@ -3257,7 +3422,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xd7: /* DEOkr */ - __asm__( "evaluxn_d7_DEOkr:" ); + __asm__("evaluxn_d7_DEOkr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; devpoke8(&u->dev[a >> 4], a, b); @@ -3270,7 +3435,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xd8: /* ADDkr */ - __asm__( "evaluxn_d8_ADDkr:" ); + __asm__("evaluxn_d8_ADDkr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; u->rst.dat[u->rst.ptr] = b + a; @@ -3288,7 +3453,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xd9: /* SUBkr */ - __asm__( "evaluxn_d9_SUBkr:" ); + __asm__("evaluxn_d9_SUBkr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; u->rst.dat[u->rst.ptr] = b - a; @@ -3306,7 +3471,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xda: /* MULkr */ - __asm__( "evaluxn_da_MULkr:" ); + __asm__("evaluxn_da_MULkr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; u->rst.dat[u->rst.ptr] = b * a; @@ -3324,9 +3489,16 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xdb: /* DIVkr */ - __asm__( "evaluxn_db_DIVkr:" ); + __asm__("evaluxn_db_DIVkr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; + if(a == 0) { + u->rst.error = 3; +#ifndef NO_STACK_CHECKS + goto error; +#endif + a = 1; + } u->rst.dat[u->rst.ptr] = b / a; #ifndef NO_STACK_CHECKS if(__builtin_expect(u->rst.ptr < 2, 0)) { @@ -3342,7 +3514,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xdc: /* ANDkr */ - __asm__( "evaluxn_dc_ANDkr:" ); + __asm__("evaluxn_dc_ANDkr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; u->rst.dat[u->rst.ptr] = b & a; @@ -3360,7 +3532,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xdd: /* ORAkr */ - __asm__( "evaluxn_dd_ORAkr:" ); + __asm__("evaluxn_dd_ORAkr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; u->rst.dat[u->rst.ptr] = b | a; @@ -3378,7 +3550,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xde: /* EORkr */ - __asm__( "evaluxn_de_EORkr:" ); + __asm__("evaluxn_de_EORkr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; u->rst.dat[u->rst.ptr] = b ^ a; @@ -3396,7 +3568,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xdf: /* SFTkr */ - __asm__( "evaluxn_df_SFTkr:" ); + __asm__("evaluxn_df_SFTkr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; u->rst.dat[u->rst.ptr] = b >> (a & 0x07) << ((a & 0x70) >> 4); @@ -3413,8 +3585,8 @@ evaluxn(Uxn *u, u16 vec) u->rst.ptr += 1; } break; - case 0xe3: /* POP2kr */ - __asm__( "evaluxn_e3_POP2kr:" ); + case 0xe2: /* POP2kr */ + __asm__("evaluxn_e2_POP2kr:"); { (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); #ifndef NO_STACK_CHECKS @@ -3425,8 +3597,8 @@ evaluxn(Uxn *u, u16 vec) #endif } break; - case 0xe4: /* DUP2kr */ - __asm__( "evaluxn_e4_DUP2kr:" ); + case 0xe3: /* DUP2kr */ + __asm__("evaluxn_e3_DUP2kr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; u->rst.dat[u->rst.ptr] = b; @@ -3446,8 +3618,28 @@ evaluxn(Uxn *u, u16 vec) u->rst.ptr += 4; } break; + case 0xe4: /* NIP2kr */ + __asm__("evaluxn_e4_NIP2kr:"); + { + u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); + (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); + u->rst.dat[u->rst.ptr] = a >> 8; + u->rst.dat[u->rst.ptr + 1] = a & 0xff; +#ifndef NO_STACK_CHECKS + if(__builtin_expect(u->rst.ptr < 4, 0)) { + u->rst.error = 1; + goto error; + } + if(__builtin_expect(u->rst.ptr > 253, 0)) { + u->rst.error = 2; + goto error; + } +#endif + u->rst.ptr += 2; + } + break; case 0xe5: /* SWP2kr */ - __asm__( "evaluxn_e5_SWP2kr:" ); + __asm__("evaluxn_e5_SWP2kr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4]; u->rst.dat[u->rst.ptr] = b; @@ -3468,7 +3660,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xe6: /* OVR2kr */ - __asm__( "evaluxn_e6_OVR2kr:" ); + __asm__("evaluxn_e6_OVR2kr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4]; u->rst.dat[u->rst.ptr] = d; @@ -3491,7 +3683,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xe7: /* ROT2kr */ - __asm__( "evaluxn_e7_ROT2kr:" ); + __asm__("evaluxn_e7_ROT2kr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4], e = u->rst.dat[u->rst.ptr - 5], f = u->rst.dat[u->rst.ptr - 6]; u->rst.dat[u->rst.ptr] = d; @@ -3514,7 +3706,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xe8: /* EQU2kr */ - __asm__( "evaluxn_e8_EQU2kr:" ); + __asm__("evaluxn_e8_EQU2kr:"); { u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); u->rst.dat[u->rst.ptr] = b == a; @@ -3532,7 +3724,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xe9: /* NEQ2kr */ - __asm__( "evaluxn_e9_NEQ2kr:" ); + __asm__("evaluxn_e9_NEQ2kr:"); { u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); u->rst.dat[u->rst.ptr] = b != a; @@ -3550,7 +3742,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xea: /* GTH2kr */ - __asm__( "evaluxn_ea_GTH2kr:" ); + __asm__("evaluxn_ea_GTH2kr:"); { u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); u->rst.dat[u->rst.ptr] = b > a; @@ -3568,7 +3760,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xeb: /* LTH2kr */ - __asm__( "evaluxn_eb_LTH2kr:" ); + __asm__("evaluxn_eb_LTH2kr:"); { u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); u->rst.dat[u->rst.ptr] = b < a; @@ -3586,7 +3778,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xec: /* JMP2kr */ - __asm__( "evaluxn_ec_JMP2kr:" ); + __asm__("evaluxn_ec_JMP2kr:"); { u->ram.ptr = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); #ifndef NO_STACK_CHECKS @@ -3598,7 +3790,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xed: /* JCN2kr */ - __asm__( "evaluxn_ed_JCN2kr:" ); + __asm__("evaluxn_ed_JCN2kr:"); { u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); if(u->rst.dat[u->rst.ptr - 3]) u->ram.ptr = a; @@ -3611,7 +3803,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xee: /* JSR2kr */ - __asm__( "evaluxn_ee_JSR2kr:" ); + __asm__("evaluxn_ee_JSR2kr:"); { u->wst.dat[u->wst.ptr] = u->ram.ptr >> 8; u->wst.dat[u->wst.ptr + 1] = u->ram.ptr & 0xff; @@ -3630,7 +3822,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xef: /* STH2kr */ - __asm__( "evaluxn_ef_STH2kr:" ); + __asm__("evaluxn_ef_STH2kr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2]; u->wst.dat[u->wst.ptr] = b; @@ -3649,7 +3841,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xf0: /* LDZ2kr */ - __asm__( "evaluxn_f0_LDZ2kr:" ); + __asm__("evaluxn_f0_LDZ2kr:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; u->rst.dat[u->rst.ptr] = mempeek8(u->ram.dat, a); @@ -3668,7 +3860,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xf1: /* STZ2kr */ - __asm__( "evaluxn_f1_STZ2kr:" ); + __asm__("evaluxn_f1_STZ2kr:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; u16 b = (u->rst.dat[u->rst.ptr - 2] | (u->rst.dat[u->rst.ptr - 3] << 8)); @@ -3682,7 +3874,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xf2: /* LDR2kr */ - __asm__( "evaluxn_f2_LDR2kr:" ); + __asm__("evaluxn_f2_LDR2kr:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; u->rst.dat[u->rst.ptr] = mempeek8(u->ram.dat, u->ram.ptr + (s8)a); @@ -3701,7 +3893,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xf3: /* STR2kr */ - __asm__( "evaluxn_f3_STR2kr:" ); + __asm__("evaluxn_f3_STR2kr:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; u16 b = (u->rst.dat[u->rst.ptr - 2] | (u->rst.dat[u->rst.ptr - 3] << 8)); @@ -3715,7 +3907,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xf4: /* LDA2kr */ - __asm__( "evaluxn_f4_LDA2kr:" ); + __asm__("evaluxn_f4_LDA2kr:"); { u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); u->rst.dat[u->rst.ptr] = mempeek8(u->ram.dat, a); @@ -3734,7 +3926,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xf5: /* STA2kr */ - __asm__( "evaluxn_f5_STA2kr:" ); + __asm__("evaluxn_f5_STA2kr:"); { u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)); u16 b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); @@ -3748,7 +3940,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xf6: /* DEI2kr */ - __asm__( "evaluxn_f6_DEI2kr:" ); + __asm__("evaluxn_f6_DEI2kr:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; u->rst.dat[u->rst.ptr] = devpeek8(&u->dev[a >> 4], a); @@ -3767,7 +3959,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xf7: /* DEO2kr */ - __asm__( "evaluxn_f7_DEO2kr:" ); + __asm__("evaluxn_f7_DEO2kr:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; u16 b = (u->rst.dat[u->rst.ptr - 2] | (u->rst.dat[u->rst.ptr - 3] << 8)); @@ -3781,7 +3973,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xf8: /* ADD2kr */ - __asm__( "evaluxn_f8_ADD2kr:" ); + __asm__("evaluxn_f8_ADD2kr:"); { u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); u->rst.dat[u->rst.ptr] = (b + a) >> 8; @@ -3800,7 +3992,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xf9: /* SUB2kr */ - __asm__( "evaluxn_f9_SUB2kr:" ); + __asm__("evaluxn_f9_SUB2kr:"); { u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); u->rst.dat[u->rst.ptr] = (b - a) >> 8; @@ -3819,7 +4011,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xfa: /* MUL2kr */ - __asm__( "evaluxn_fa_MUL2kr:" ); + __asm__("evaluxn_fa_MUL2kr:"); { u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); u->rst.dat[u->rst.ptr] = (b * a) >> 8; @@ -3838,9 +4030,16 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xfb: /* DIV2kr */ - __asm__( "evaluxn_fb_DIV2kr:" ); + __asm__("evaluxn_fb_DIV2kr:"); { u16 a = (u->rst.dat[u->rst.ptr - 1] | (u->rst.dat[u->rst.ptr - 2] << 8)), b = (u->rst.dat[u->rst.ptr - 3] | (u->rst.dat[u->rst.ptr - 4] << 8)); + if(a == 0) { + u->rst.error = 3; +#ifndef NO_STACK_CHECKS + goto error; +#endif + a = 1; + } u->rst.dat[u->rst.ptr] = (b / a) >> 8; u->rst.dat[u->rst.ptr + 1] = (b / a) & 0xff; #ifndef NO_STACK_CHECKS @@ -3857,7 +4056,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xfc: /* AND2kr */ - __asm__( "evaluxn_fc_AND2kr:" ); + __asm__("evaluxn_fc_AND2kr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4]; u->rst.dat[u->rst.ptr] = d & b; @@ -3876,7 +4075,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xfd: /* ORA2kr */ - __asm__( "evaluxn_fd_ORA2kr:" ); + __asm__("evaluxn_fd_ORA2kr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4]; u->rst.dat[u->rst.ptr] = d | b; @@ -3895,7 +4094,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xfe: /* EOR2kr */ - __asm__( "evaluxn_fe_EOR2kr:" ); + __asm__("evaluxn_fe_EOR2kr:"); { u8 a = u->rst.dat[u->rst.ptr - 1], b = u->rst.dat[u->rst.ptr - 2], c = u->rst.dat[u->rst.ptr - 3], d = u->rst.dat[u->rst.ptr - 4]; u->rst.dat[u->rst.ptr] = d ^ b; @@ -3914,7 +4113,7 @@ evaluxn(Uxn *u, u16 vec) } break; case 0xff: /* SFT2kr */ - __asm__( "evaluxn_ff_SFT2kr:" ); + __asm__("evaluxn_ff_SFT2kr:"); { u8 a = u->rst.dat[u->rst.ptr - 1]; u16 b = (u->rst.dat[u->rst.ptr - 2] | (u->rst.dat[u->rst.ptr - 3] << 8)); -- cgit v1.2.1