diff options
Diffstat (limited to 'arm9/source/core.c')
-rw-r--r-- | arm9/source/core.c | 437 |
1 files changed, 437 insertions, 0 deletions
diff --git a/arm9/source/core.c b/arm9/source/core.c new file mode 100644 index 0000000..cb112e0 --- /dev/null +++ b/arm9/source/core.c @@ -0,0 +1,437 @@ +#include <nds.h> +#include "bang.h" +#include "core.h" + + +void reset_br(Bedrock *br) { + *br = (Bedrock) {0}; +} + +// Load a program into an instance. +void start_br(Bedrock *br, u8 program[], int size) { + reset_br(br); + memcpy(&br->mem, program, size); + br->alive = TRUE; + br->awake = TRUE; + // br->scr.nds = &scr_main; +} + +void rouse_br(Bedrock *br) { + if (TEST(br->sys.sleep, 0x8000)) { // SYSTEM + br->awake = TRUE; + br->sys.wake = 0x0; + return; + } + if (TEST(br->sys.sleep, 0x0800)) { // INPUT + if (br->inp.wake) { + br->inp.wake = FALSE; + br->awake = TRUE; + br->sys.wake = 0x4; + return; + } + } + if (TEST(br->sys.sleep, 0x1000)) { // CLOCK + if (check_timers(&br->clk)) { + br->awake = TRUE; + br->sys.wake = 0x3; + return; + } + } +} + +u8 dev_read(Bedrock *br, u8 port) { + switch(port) { +// SYSTEM DEVICE + // TODO: name and author + case 0x02: return 0x00; // program memory size + case 0x03: return 0x00; // program memory size + case 0x04: return 0x00; // working stack size + case 0x05: return 0x00; // return stack size + case 0x06: return 0xbc; + case 0x07: return 0x00; + + // TODO: available devices + case 0x0A: return br->sys.wake; + +// MATH DEVICE + case 0x20: return HIGH(br->math.op1); + case 0x21: return LOW(br->math.op1); + case 0x22: return HIGH(br->math.op2); + case 0x23: return LOW(br->math.op2); + case 0x24: return HIGH(get_sqrt(&br->math)); + case 0x25: return LOW(get_sqrt(&br->math)); + case 0x26: return HIGH(get_atan(&br->math)); + case 0x27: return LOW(get_atan(&br->math)); + case 0x28: return H_HIGH(get_prod(&br->math)); + case 0x29: return H_LOW(get_prod(&br->math)); + case 0x2A: return L_HIGH(get_prod(&br->math)); + case 0x2B: return L_LOW(get_prod(&br->math)); + case 0x2C: return HIGH(get_quot(&br->math)); + case 0x2D: return LOW(get_quot(&br->math)); + case 0x2E: return HIGH( get_rem(&br->math)); + case 0x2F: return LOW( get_rem(&br->math)); +// CLOCK DEVICE + case 0x30: return YEAR(get_datetime()); + case 0x31: return MONTH(get_datetime()); + case 0x32: return DAY(get_datetime()); + case 0x33: return HOUR(get_datetime()); + case 0x34: return MINUTE(get_datetime()); + case 0x35: return SECOND(get_datetime()); + case 0x36: return HIGH(get_uptime()-br->clk.start); + case 0x37: return LOW(get_uptime()-br->clk.start); + case 0x38: return get_timer1_high(&br->clk); + case 0x39: return get_timer1_low( &br->clk); + case 0x3A: return get_timer2_high(&br->clk); + case 0x3B: return get_timer2_low( &br->clk); + case 0x3C: return get_timer3_high(&br->clk); + case 0x3D: return get_timer3_low( &br->clk); + case 0x3E: return get_timer4_high(&br->clk); + case 0x3F: return get_timer4_low( &br->clk); +// INPUT DEVICE + case 0x40: return BOOL(br->inp.pointer); + case 0x41: return br->inp.pointer << 7; + case 0x44: return HIGH(br->inp.x); + case 0x45: return LOW(br->inp.x); + case 0x46: return HIGH(br->inp.y); + case 0x47: return LOW(br->inp.y); + case 0x48: return BOOL(br->inp.keyboard); + // TODO: Keyboard input + case 0x4A: return br->inp.navigation; + case 0x4C: return br->inp.gamepad; +// SCREEN DEVICE + case 0x50: return HIGH(PIXELS_WIDTH); + case 0x51: return LOW(PIXELS_WIDTH); + case 0x52: return HIGH(PIXELS_HEIGHT); + case 0x53: return LOW(PIXELS_HEIGHT); + case 0x54: return HIGH(br->scr.x); + case 0x55: return LOW(br->scr.x); + case 0x56: return HIGH(br->scr.y); + case 0x57: return LOW(br->scr.y); + + default: return 0; + } +} + +Signal dev_write(Bedrock *br, u8 port, u8 v) { + switch(port) { +// SYSTEM DEVICE + case 0x08: SET_HIGH(br->sys.sleep,v); return 0; + case 0x09: SET_LOW(br->sys.sleep,v); return SIG_SLEEP; +// MATH DEVICE + case 0x20: set_op1_high(&br->math,v); return 0; + case 0x21: set_op1_low( &br->math,v); return 0; + case 0x22: set_op2_high(&br->math,v); return 0; + case 0x23: set_op2_low( &br->math,v); return 0; +// CLOCK DEVICE + // TODO: Set time and date + case 0x38: set_timer1_high(&br->clk,v); return 0; + case 0x39: set_timer1_low( &br->clk,v); return 0; + case 0x3A: set_timer2_high(&br->clk,v); return 0; + case 0x3B: set_timer2_low( &br->clk,v); return 0; + case 0x3C: set_timer3_high(&br->clk,v); return 0; + case 0x3D: set_timer3_low( &br->clk,v); return 0; + case 0x3E: set_timer4_high(&br->clk,v); return 0; + case 0x3F: set_timer4_low( &br->clk,v); return 0; +// SCREEN DEVICE + case 0x54: SET_HIGH(br->scr.x,v); return 0; + case 0x55: SET_LOW( br->scr.x,v); return 0; + case 0x56: SET_HIGH(br->scr.y,v); return 0; + case 0x57: SET_LOW( br->scr.y,v); return 0; + case 0x58: set_palette_high(&br->scr,v); return 0; + case 0x59: set_palette_low( &br->scr,v); return 0; + case 0x5A: SET_HIGH(br->scr.colours,v); return 0; + case 0x5B: SET_LOW( br->scr.colours,v); return 0; + case 0x5C: push_sprite(&br->scr.sprite,v); return 0; + case 0x5D: push_sprite(&br->scr.sprite,v); return 0; + case 0x5E: draw_dispatch(&br->scr,v); return 0; + case 0x5F: move_cursor(&br->scr,v); return 0; +// LOCAL DEVICE + case 0x86: printf("%c", v); return 0; + case 0x87: printf("%c", v); return 0; + + default: return SIG_NONE; + } +} + +Signal dev_write_16(Bedrock *br, u8 port, u8 high, u8 low) { + Signal s1 = dev_write(br, port, high); + Signal s2 = dev_write(br, port+1, low); + if (s1) { return s1; } else { return s2; } +} + +Signal evaluate(Bedrock *br, u16 count) { + #define SIGNAL(s) if (s) { return s; } else { continue; }; + + register u8 a, b, c, d, e, f; + register u16 x, y; + register Signal sig; + + for (u16 i=0; i < count; i++) { + switch (MLIT) { +/* HLT */ case 0x00: return SIG_HALT; +/* JMP */ case 0x01: WPOP2(a,b); PC=DOUBLE(a,b); continue; +/* JCN */ case 0x02: WPOP2(b,c); WPOP1(a); if(a) PC=DOUBLE(b,c); continue; +/* JCK */ case 0x03: WPOP2(b,c); WGET1(a); if(a) PC=DOUBLE(b,c); continue; +/* LDA */ case 0x04: WPOP2(a,b); x=DOUBLE(a,b); WPSH1(MEM[x]); continue; +/* STA */ case 0x05: WPOPD(x); WPOP1(a); MEM[x]=a; continue; +/* LDD */ case 0x06: WPOP1(a); WPSH1(dev_read(br,a)); continue; +/* STD */ case 0x07: WPOP1(b); WPOP1(a); sig=dev_write(br,b,a); SIGNAL(sig); +/* PSH */ case 0x08: RPOP1(a); WPSH1(a); continue; +/* POP */ case 0x09: WST.p-=1; continue; +/* CPY */ case 0x0A: RGET1(a); WPSH1(a); continue; +/* SPL */ case 0x0B: WPOP1(a); WPSH2(LEFT(a),RIGHT(a)); continue; +/* DUP */ case 0x0C: WGET1(a); WPSH1(a); continue; +/* OVR */ case 0x0D: WPOP1(b); WGET1(a); WPSH1(b); WPSH1(a); continue; +/* SWP */ case 0x0E: WPOP1(b); WPOP1(a); WPSH1(b); WPSH1(a); continue; +/* ROT */ case 0x0F: WPOP1(c); WPOP1(b); WPOP1(a); WPSH1(b); WPSH1(c); WPSH1(a); continue; +/* ADD */ case 0x10: WPOP1(b); WSTV(-1)+=b; continue; +/* SUB */ case 0x11: WPOP1(b); WSTV(-1)-=b; continue; +/* INC */ case 0x12: WSTV(-1)+=1; continue; +/* DEC */ case 0x13: WSTV(-1)-=1; continue; +/* LTH */ case 0x14: WPOP1(b); WPOP1(a); WPSH1(BOOL(a<b)); continue; +/* GTH */ case 0x15: WPOP1(b); WPOP1(a); WPSH1(BOOL(a>b)); continue; +/* EQU */ case 0x16: WPOP1(b); WPOP1(a); WPSH1(BOOL(a==b)); continue; +/* NQK */ case 0x17: b=WSTV(-1); a=WSTV(-2); WPSH1(BOOL(a!=b)); continue; +/* IOR */ case 0x18: WPOP1(b); WSTV(-1)|=b; continue; +/* XOR */ case 0x19: WPOP1(b); WSTV(-1)^=b; continue; +/* AND */ case 0x1A: WPOP1(b); WSTV(-1)&=b; continue; +/* NOT */ case 0x1B: WSTV(-1)=~WSTV(-1); continue; +/* SHF */ case 0x1C: WPOP1(b); WPOP1(a); x=SHF(a,b); WPSH1(x); continue; +/* SHC */ case 0x1D: WPOP1(b); WPOP1(a); x=shc(a,b); WPSH1(x); continue; +/* TAL */ case 0x1E: WSTV(-1)=TAL(WSTV(-1)); continue; +/* REV */ case 0x1F: WSTV(-1)=rev(WSTV(-1)); continue; + +/* NOP */ case 0x20: continue; +/* JMS */ case 0x21: WPOP2(a,b); RPSHD(PC); PC=DOUBLE(a,b); continue; +/* JCS */ case 0x22: WPOP2(b,c); WPOP1(a); if(a) {RPSHD(PC); PC=DOUBLE(b,c);} continue; +/* JCK* */ case 0x23: WPOP2(c,d); WGETD(x); if(x) {PC=DOUBLE(c,d);} continue; +/* LDA* */ case 0x24: WPOP2(a,b); x=DOUBLE(a,b); WPSH1(MEM[x]); WPSH1(MEM[x+1]); continue; +/* STA* */ case 0x25: WPOPD(x); WPOP2(a,b); MEM[x]=a; MEM[x+1]=b; continue; +/* LDD* */ case 0x26: WPOP1(a); WPSH1(dev_read(br,a)); WPSH1(dev_read(br,a+1)); continue; +/* STD* */ case 0x27: WPOP1(c); WPOP2(a,b); sig=dev_write_16(br,c,a,b); SIGNAL(sig); +/* PSH* */ case 0x28: RPOP2(a,b); WPSH2(a,b); continue; +/* POP* */ case 0x29: WST.p-=2; continue; +/* CPY* */ case 0x2A: RGET2(a,b); WPSH2(a,b); continue; +/* SPL* */ case 0x2B: WPOP2(a,b); WPSH2(LEFT(a),RIGHT(a)); WPSH2(LEFT(b),RIGHT(b)); continue; +/* DUP* */ case 0x2C: WGET2(a,b); WPSH2(a,b); continue; +/* OVR* */ case 0x2D: WPOP2(c,d); WGET2(a,b); WPSH2(c,d); WPSH2(a,b); continue; +/* SWP* */ case 0x2E: WPOP2(c,d); WPOP2(a,b); WPSH2(c,d); WPSH2(a,b); continue; +/* ROT* */ case 0x2F: WPOP2(e,f); WPOP2(c,d); WPOP2(a,b); WPSH2(c,d); WPSH2(e,f); WPSH2(a,b); continue; +/* ADD* */ case 0x30: WPOPD(y); WPOPD(x); WPSHD(x+y); continue; +/* SUB* */ case 0x31: WPOPD(y); WPOPD(x); WPSHD(x-y); continue; +/* INC* */ case 0x32: WPOPD(x); WPSHD(x+1); continue; +/* DEC* */ case 0x33: WPOPD(x); WPSHD(x-1); continue; +/* LTH* */ case 0x34: WPOPD(y); WPOPD(x); WPSH1(BOOL(x<y)); continue; +/* GTH* */ case 0x35: WPOPD(y); WPOPD(x); WPSH1(BOOL(x>y)); continue; +/* EQU* */ case 0x36: WPOP2(c,d); WPOP2(a,b); WPSH1(BOOL(a==c && b==d)); continue; +/* NQK* */ case 0x37: d=WSTV(-1); c=WSTV(-2); b=WSTV(-3); a=WSTV(-4); WPSH1(BOOL(a!=c || b!=d)); continue; +/* IOR* */ case 0x38: WPOP2(c,d); WSTV(-1)|=d; WSTV(-2)|=c; continue; +/* XOR* */ case 0x39: WPOP2(c,d); WSTV(-1)^=d; WSTV(-2)^=c; continue; +/* AND* */ case 0x3A: WPOP2(c,d); WSTV(-1)&=d; WSTV(-2)&=c; continue; +/* NOT* */ case 0x3B: WSTV(-1)=~WSTV(-1); WSTV(-2)=~WSTV(-2); continue; +/* SHF* */ case 0x3C: WPOP1(c); WPOPD(x); x=SHF(x,c); WPSHD(x); continue; +/* SHC* */ case 0x3D: WPOP1(c); WPOPD(x); x=shcd(x,c); WPSHD(x); continue; +/* TAL* */ case 0x3E: WPOP2(a,b); WPSH1(TAL(a)+TAL(b)); continue; +/* REV* */ case 0x3F: WPOP2(a,b); WPSH1(rev(b)); WPSH1(rev(a)); continue; + +/* DB1 */ case 0x40: return SIG_DB1; +/* JMP: */ case 0x41: MLIT2(a,b); PC=DOUBLE(a,b); continue; +/* JCN: */ case 0x42: MLIT2(b,c); WPOP1(a); if(a) PC=DOUBLE(b,c); continue; +/* JCK: */ case 0x43: MLIT2(b,c); WGET1(a); if(a) PC=DOUBLE(b,c); continue; +/* LDA: */ case 0x44: MLIT2(a,b); x=DOUBLE(a,b); WPSH1(MEM[x]); continue; +/* STA: */ case 0x45: MLITD(x); WPOP1(a); MEM[x]=a; continue; +/* LDD: */ case 0x46: MLIT1(a); WPSH1(dev_read(br,a)); continue; +/* STD: */ case 0x47: MLIT1(b); WPOP1(a); sig=dev_write(br,b,a); SIGNAL(sig); +/* PSH: */ case 0x48: MLIT1(a); WPSH1(a); continue; +/* POP: */ case 0x49: PC+=1; continue; +/* CPY: */ case 0x4A: MLIT1(a); RPSH1(a); WPSH1(a); continue; +/* SPL: */ case 0x4B: MLIT1(a); WPSH2(LEFT(a),RIGHT(a)); continue; +/* DUP: */ case 0x4C: MLIT1(a); WPSH1(a); WPSH1(a); continue; +/* OVR: */ case 0x4D: MLIT1(b); WGET1(a); WPSH1(b); WPSH1(a); continue; +/* SWP: */ case 0x4E: MLIT1(b); WPOP1(a); WPSH1(b); WPSH1(a); continue; +/* ROT: */ case 0x4F: MLIT1(c); WPOP1(b); WPOP1(a); WPSH1(b); WPSH1(c); WPSH1(a); continue; +/* ADD: */ case 0x50: MLIT1(b); WSTV(-1)+=b; continue; +/* SUB: */ case 0x51: MLIT1(b); WSTV(-1)-=b; continue; +/* INC: */ case 0x52: MLIT1(a); WPSH1(a+1); continue; +/* DEC: */ case 0x53: MLIT1(a); WPSH1(a-1); continue; +/* LTH: */ case 0x54: MLIT1(b); WPOP1(a); WPSH1(BOOL(a<b)); continue; +/* GTH: */ case 0x55: MLIT1(b); WPOP1(a); WPSH1(BOOL(a>b)); continue; +/* EQU: */ case 0x56: MLIT1(b); WPOP1(a); WPSH1(BOOL(a==b)); continue; +/* NQK: */ case 0x57: MLIT1(b); WGET1(a); WPSH1(b); WPSH1(BOOL(a!=b)); continue; +/* IOR: */ case 0x58: MLIT1(b); WSTV(-1)|=b; continue; +/* XOR: */ case 0x59: MLIT1(b); WSTV(-1)^=b; continue; +/* AND: */ case 0x5A: MLIT1(b); WSTV(-1)&=b; continue; +/* NOT: */ case 0x5B: MLIT1(a); WPSH1(~a); continue; +/* SHF: */ case 0x5C: MLIT1(b); WPOP1(a); x=SHF(a,b); WPSH1(x); continue; +/* SHC: */ case 0x5D: MLIT1(b); WPOP1(a); x=shc(a,b); WPSH1(x); continue; +/* TAL: */ case 0x5E: MLIT1(a); WPSH1(TAL(a)); continue; +/* REV: */ case 0x5F: MLIT1(a); WPSH1(rev(a)); continue; + +/* DB2 */ case 0x60: return SIG_DB2; +/* JMS: */ case 0x61: MLIT2(a,b); RPSHD(PC); PC=DOUBLE(a,b); continue; +/* JCS: */ case 0x62: MLIT2(b,c); WPOP1(a); if(a) {RPSHD(PC); PC=DOUBLE(b,c);} continue; +/* JCK:* */ case 0x63: MLIT2(c,d); WGETD(x); if(x) {PC=DOUBLE(c,d);} continue; +/* LDA:* */ case 0x64: MLIT2(a,b); x=DOUBLE(a,b); WPSH1(MEM[x]); WPSH1(MEM[x+1]); continue; +/* STA:* */ case 0x65: MLITD(x); WPOP2(a,b); MEM[x]=a; MEM[x+1]=b; continue; +/* LDD:* */ case 0x66: MLIT1(a); WPSH1(dev_read(br,a)); WPSH1(dev_read(br,a+1)); continue; +/* STD:* */ case 0x67: MLIT1(c); WPOP2(a,b); sig=dev_write_16(br,c,a,b); SIGNAL(sig); +/* PSH:* */ case 0x68: MLIT2(a,b); WPSH2(a,b); continue; +/* POP:* */ case 0x69: PC+=2; continue; +/* CPY:* */ case 0x6A: MLIT2(a,b); RPSH2(a,b); WPSH2(a,b); continue; +/* SPL:* */ case 0x6B: MLIT2(a,b); WPSH2(LEFT(a),RIGHT(a)); WPSH2(LEFT(b),RIGHT(b)); continue; +/* DUP:* */ case 0x6C: MLIT2(a,b); WPSH2(a,b); WPSH2(a,b); continue; +/* OVR:* */ case 0x6D: MLIT2(c,d); WGET2(a,b); WPSH2(c,d); WPSH2(a,b); continue; +/* SWP:* */ case 0x6E: MLIT2(c,d); WPOP2(a,b); WPSH2(c,d); WPSH2(a,b); continue; +/* ROT:* */ case 0x6F: MLIT2(e,f); WPOP2(c,d); WPOP2(a,b); WPSH2(c,d); WPSH2(e,f); WPSH2(a,b); continue; +/* ADD:* */ case 0x70: MLITD(y); WPOPD(x); WPSHD(x+y); continue; +/* SUB:* */ case 0x71: MLITD(y); WPOPD(x); WPSHD(x-y); continue; +/* INC:* */ case 0x72: MLITD(x); WPSHD(x+1); continue; +/* DEC:* */ case 0x73: MLITD(x); WPSHD(x-1); continue; +/* LTH:* */ case 0x74: MLITD(y); WPOPD(x); WPSH1(BOOL(x<y)); continue; +/* GTH:* */ case 0x75: MLITD(y); WPOPD(x); WPSH1(BOOL(x>y)); continue; +/* EQU:* */ case 0x76: MLIT2(c,d); WPOP2(a,b); WPSH1(BOOL(a==c && b==d)); continue; +/* NQK:* */ case 0x77: MLIT2(c,d); WGET2(a,b); WPSH2(c,d); WPSH1(BOOL(a!=c || b!=d)); continue; +/* IOR:* */ case 0x78: MLIT2(c,d); WSTV(-1)|=d; WSTV(-2)|=c; continue; +/* XOR:* */ case 0x79: MLIT2(c,d); WSTV(-1)^=d; WSTV(-2)^=c; continue; +/* AND:* */ case 0x7A: MLIT2(c,d); WSTV(-1)&=d; WSTV(-2)&=c; continue; +/* NOT:* */ case 0x7B: MLIT2(a,b); WPSH2(~a,~b); continue; +/* SHF:* */ case 0x7C: MLIT1(c); WPOPD(x); x=SHF(x,c); WPSHD(x); continue; +/* SHC:* */ case 0x7D: MLIT1(c); WPOPD(x); x=shcd(x,c); WPSHD(x); continue; +/* TAL:* */ case 0x7E: MLIT2(a,b); WPSH1(TAL(a)+TAL(b)); continue; +/* REV:* */ case 0x7F: MLIT2(a,b); WPSH1(rev(b)); WPSH1(rev(a)); continue; + +/* DB3 */ case 0x80: return SIG_DB3; +/* JMPr */ case 0x81: RPOP2(a,b); PC=DOUBLE(a,b); continue; +/* JCNr */ case 0x82: RPOP2(b,c); RPOP1(a); if(a) PC=DOUBLE(b,c); continue; +/* JCKr */ case 0x83: RPOP2(b,c); RGET1(a); if(a) PC=DOUBLE(b,c); continue; +/* LDAr */ case 0x84: RPOP2(a,b); x=DOUBLE(a,b); RPSH1(MEM[x]); continue; +/* STAr */ case 0x85: RPOPD(x); RPOP1(a); MEM[x]=a; continue; +/* LDDr */ case 0x86: RPOP1(a); RPSH1(dev_read(br,a)); continue; +/* STDr */ case 0x87: RPOP1(b); RPOP1(a); sig=dev_write(br,b,a); SIGNAL(sig); +/* PSHr */ case 0x88: WPOP1(a); RPSH1(a); continue; +/* POPr */ case 0x89: RST.p-=1; continue; +/* CPYr */ case 0x8A: WGET1(a); RPSH1(a); continue; +/* SPLr */ case 0x8B: RPOP1(a); RPSH2(LEFT(a),RIGHT(a)); continue; +/* DUPr */ case 0x8C: RGET1(a); RPSH1(a); continue; +/* OVRr */ case 0x8D: RPOP1(b); RGET1(a); RPSH1(b); RPSH1(a); continue; +/* SWPr */ case 0x8E: RPOP1(b); RPOP1(a); RPSH1(b); RPSH1(a); continue; +/* ROTr */ case 0x8F: RPOP1(c); RPOP1(b); RPOP1(a); RPSH1(b); RPSH1(c); RPSH1(a); continue; +/* ADDr */ case 0x90: RPOP1(b); RSTV(-1)+=b; continue; +/* SUBr */ case 0x91: RPOP1(b); RSTV(-1)-=b; continue; +/* INCr */ case 0x92: RSTV(-1)+=1; continue; +/* DECr */ case 0x93: RSTV(-1)-=1; continue; +/* LTHr */ case 0x94: RPOP1(b); RPOP1(a); RPSH1(BOOL(a<b)); continue; +/* GTHr */ case 0x95: RPOP1(b); RPOP1(a); RPSH1(BOOL(a>b)); continue; +/* EQUr */ case 0x96: RPOP1(b); RPOP1(a); RPSH1(BOOL(a==b)); continue; +/* NQKr */ case 0x97: b=RSTV(-1); a=RSTV(-2); RPSH1(BOOL(a!=b)); continue; +/* IORr */ case 0x98: RPOP1(b); RSTV(-1)|=b; continue; +/* XORr */ case 0x99: RPOP1(b); RSTV(-1)^=b; continue; +/* ANDr */ case 0x9A: RPOP1(b); RSTV(-1)&=b; continue; +/* NOTr */ case 0x9B: RSTV(-1)=~RSTV(-1); continue; +/* SHFr */ case 0x9C: RPOP1(b); RPOP1(a); x=SHF(a,b); RPSH1(x); continue; +/* SHCr */ case 0x9D: RPOP1(b); RPOP1(a); x=shc(a,b); RPSH1(x); continue; +/* TALr */ case 0x9E: RSTV(-1)=TAL(RSTV(-1)); continue; +/* REVr */ case 0x9F: RSTV(-1)=rev(RSTV(-1)); continue; + +/* DB4 */ case 0xA0: return SIG_DB4; +/* JMSr */ case 0xA1: RPOP2(a,b); WPSHD(PC); PC=DOUBLE(a,b); continue; +/* JCSr */ case 0xA2: RPOP2(b,c); RPOP1(a); if(a) {WPSHD(PC); PC=DOUBLE(b,c);} continue; +/* JCKr* */ case 0xA3: RPOP2(c,d); RGETD(x); if(x) {PC=DOUBLE(c,d);} continue; +/* LDAr* */ case 0xA4: RPOP2(a,b); x=DOUBLE(a,b); RPSH1(MEM[x]); RPSH1(MEM[x+1]); continue; +/* STAr* */ case 0xA5: RPOPD(x); RPOP2(a,b); MEM[x]=a; MEM[x+1]=b; continue; +/* LDDr* */ case 0xA6: RPOP1(a); RPSH1(dev_read(br,a)); RPSH1(dev_read(br,a+1)); continue; +/* STDr* */ case 0xA7: RPOP1(c); RPOP2(a,b); sig=dev_write_16(br,c,a,b); SIGNAL(sig); +/* PSHr* */ case 0xA8: WPOP2(a,b); RPSH2(a,b); continue; +/* POPr* */ case 0xA9: RST.p-=2; continue; +/* CPYr* */ case 0xAA: WGET2(a,b); RPSH2(a,b); continue; +/* SPLr* */ case 0xAB: RPOP2(a,b); RPSH2(LEFT(a),RIGHT(a)); RPSH2(LEFT(b),RIGHT(b)); continue; +/* DUPr* */ case 0xAC: RGET2(a,b); RPSH2(a,b); continue; +/* OVRr* */ case 0xAD: RPOP2(c,d); RGET2(a,b); RPSH2(c,d); RPSH2(a,b); continue; +/* SWPr* */ case 0xAE: RPOP2(c,d); RPOP2(a,b); RPSH2(c,d); RPSH2(a,b); continue; +/* ROTr* */ case 0xAF: RPOP2(e,f); RPOP2(c,d); RPOP2(a,b); RPSH2(c,d); RPSH2(e,f); RPSH2(a,b); continue; +/* ADDr* */ case 0xB0: RPOPD(y); RPOPD(x); RPSHD(x+y); continue; +/* SUBr* */ case 0xB1: RPOPD(y); RPOPD(x); RPSHD(x-y); continue; +/* INCr* */ case 0xB2: RPOPD(x); RPSHD(x+1); continue; +/* DECr* */ case 0xB3: RPOPD(x); RPSHD(x-1); continue; +/* LTHr* */ case 0xB4: RPOPD(y); RPOPD(x); RPSH1(BOOL(x<y)); continue; +/* GTHr* */ case 0xB5: RPOPD(y); RPOPD(x); RPSH1(BOOL(x>y)); continue; +/* EQUr* */ case 0xB6: RPOP2(c,d); RPOP2(a,b); RPSH1(BOOL(a==c && b==d)); continue; +/* NQKr* */ case 0xB7: d=RSTV(-1); c=RSTV(-2); b=RSTV(-3); a=RSTV(-4); RPSH1(BOOL(a!=c || b!=d)); continue; +/* IORr* */ case 0xB8: RPOP2(c,d); RSTV(-1)|=d; RSTV(-2)|=c; continue; +/* XORr* */ case 0xB9: RPOP2(c,d); RSTV(-1)^=d; RSTV(-2)^=c; continue; +/* ANDr* */ case 0xBA: RPOP2(c,d); RSTV(-1)&=d; RSTV(-2)&=c; continue; +/* NOTr* */ case 0xBB: RSTV(-1)=~RSTV(-1); RSTV(-2)=~RSTV(-2); continue; +/* SHFr* */ case 0xBC: RPOP1(c); RPOPD(x); x=SHF(x,c); RPSHD(x); continue; +/* SHCr* */ case 0xBD: RPOP1(c); RPOPD(x); x=shcd(x,c); RPSHD(x); continue; +/* TALr* */ case 0xBE: RPOP2(a,b); RPSH1(TAL(a)+TAL(b)); continue; +/* REVr* */ case 0xBF: RPOP2(a,b); RPSH1(rev(b)); RPSH1(rev(a)); continue; + +/* DB5 */ case 0xC0: return SIG_DB5; +/* JMPr: */ case 0xC1: MLIT2(a,b); PC=DOUBLE(a,b); continue; +/* JCNr: */ case 0xC2: MLIT2(b,c); RPOP1(a); if(a) PC=DOUBLE(b,c); continue; +/* JCKr: */ case 0xC3: MLIT2(b,c); RGET1(a); if(a) PC=DOUBLE(b,c); continue; +/* LDAr: */ case 0xC4: MLIT2(a,b); x=DOUBLE(a,b); RPSH1(MEM[x]); continue; +/* STAr: */ case 0xC5: MLITD(x); RPOP1(a); MEM[x]=a; continue; +/* LDDr: */ case 0xC6: MLIT1(a); RPSH1(dev_read(br,a)); continue; +/* STDr: */ case 0xC7: MLIT1(b); RPOP1(a); sig=dev_write(br,b,a); SIGNAL(sig); +/* PSHr: */ case 0xC8: MLIT1(a); RPSH1(a); continue; +/* POPr: */ case 0xC9: PC+=1; continue; +/* CPYr: */ case 0xCA: MLIT1(a); WPSH1(a); RPSH1(a); continue; +/* SPLr: */ case 0xCB: MLIT1(a); RPSH2(LEFT(a),RIGHT(a)); continue; +/* DUPr: */ case 0xCC: MLIT1(a); RPSH1(a); RPSH1(a); continue; +/* OVRr: */ case 0xCD: MLIT1(b); RGET1(a); RPSH1(b); RPSH1(a); continue; +/* SWPr: */ case 0xCE: MLIT1(b); RPOP1(a); RPSH1(b); RPSH1(a); continue; +/* ROTr: */ case 0xCF: MLIT1(c); RPOP1(b); RPOP1(a); RPSH1(b); RPSH1(c); RPSH1(a); continue; +/* ADDr: */ case 0xD0: MLIT1(b); RSTV(-1)+=b; continue; +/* SUBr: */ case 0xD1: MLIT1(b); RSTV(-1)-=b; continue; +/* INCr: */ case 0xD2: MLIT1(a); RPSH1(a+1); continue; +/* DECr: */ case 0xD3: MLIT1(a); RPSH1(a-1); continue; +/* LTHr: */ case 0xD4: MLIT1(b); RPOP1(a); RPSH1(BOOL(a<b)); continue; +/* GTHr: */ case 0xD5: MLIT1(b); RPOP1(a); RPSH1(BOOL(a>b)); continue; +/* EQUr: */ case 0xD6: MLIT1(b); RPOP1(a); RPSH1(BOOL(a==b)); continue; +/* NQKr: */ case 0xD7: MLIT1(b); RGET1(a); RPSH1(b); RPSH1(BOOL(a!=b)); continue; +/* IORr: */ case 0xD8: MLIT1(b); RSTV(-1)|=b; continue; +/* XORr: */ case 0xD9: MLIT1(b); RSTV(-1)^=b; continue; +/* ANDr: */ case 0xDA: MLIT1(b); RSTV(-1)&=b; continue; +/* NOTr: */ case 0xDB: MLIT1(a); RPSH1(~a); continue; +/* SHFr: */ case 0xDC: MLIT1(b); RPOP1(a); x=SHF(a,b); RPSH1(x); continue; +/* SHCr: */ case 0xDD: MLIT1(b); RPOP1(a); x=shc(a,b); RPSH1(x); continue; +/* TALr: */ case 0xDE: MLIT1(a); RPSH1(TAL(a)); continue; +/* REVr: */ case 0xDF: MLIT1(a); RPSH1(rev(a)); continue; + +/* DB6 */ case 0xE0: return SIG_DB6; +/* JMSr */ case 0xE1: MLIT2(a,b); WPSHD(PC); PC=DOUBLE(a,b); continue; +/* JCSr */ case 0xE2: MLIT2(b,c); RPOP1(a); if(a) {WPSHD(PC); PC=DOUBLE(b,c);} continue; +/* JCKr* */ case 0xE3: MLIT2(c,d); RGETD(x); if(x) {PC=DOUBLE(c,d);} continue; +/* LDAr* */ case 0xE4: MLIT2(a,b); x=DOUBLE(a,b); RPSH1(MEM[x]); RPSH1(MEM[x+1]); continue; +/* STAr* */ case 0xE5: MLITD(x); RPOP2(a,b); MEM[x]=a; MEM[x+1]=b; continue; +/* LDDr* */ case 0xE6: MLIT1(a); RPSH1(dev_read(br,a)); RPSH1(dev_read(br,a+1)); continue; +/* STDr* */ case 0xE7: MLIT1(c); RPOP2(a,b); sig=dev_write_16(br,c,a,b); SIGNAL(sig); +/* PSHr* */ case 0xE8: MLIT2(a,b); RPSH2(a,b); continue; +/* POPr* */ case 0xE9: PC+=2; continue; +/* CPYr* */ case 0xEA: MLIT2(a,b); WPSH2(a,b); RPSH2(a,b); continue; +/* SPLr* */ case 0xEB: MLIT2(a,b); RPSH2(LEFT(a),RIGHT(a)); RPSH2(LEFT(b),RIGHT(b)); continue; +/* DUPr* */ case 0xEC: MLIT2(a,b); RPSH2(a,b); RPSH2(a,b); continue; +/* OVRr* */ case 0xED: MLIT2(c,d); RGET2(a,b); RPSH2(c,d); RPSH2(a,b); continue; +/* SWPr* */ case 0xEE: MLIT2(c,d); RPOP2(a,b); RPSH2(c,d); RPSH2(a,b); continue; +/* ROTr* */ case 0xEF: MLIT2(e,f); RPOP2(c,d); RPOP2(a,b); RPSH2(c,d); RPSH2(e,f); RPSH2(a,b); continue; +/* ADDr* */ case 0xF0: MLITD(y); RPOPD(x); RPSHD(x+y); continue; +/* SUBr* */ case 0xF1: MLITD(y); RPOPD(x); RPSHD(x-y); continue; +/* INCr* */ case 0xF2: MLITD(x); RPSHD(x+1); continue; +/* DECr* */ case 0xF3: MLITD(x); RPSHD(x-1); continue; +/* LTHr* */ case 0xF4: MLITD(y); RPOPD(x); RPSH1(BOOL(x<y)); continue; +/* GTHr* */ case 0xF5: MLITD(y); RPOPD(x); RPSH1(BOOL(x>y)); continue; +/* EQUr* */ case 0xF6: MLIT2(c,d); RPOP2(a,b); RPSH1(BOOL(a==c && b==d)); continue; +/* NQKr* */ case 0xF7: MLIT2(c,d); RGET2(a,b); RPSH2(c,d); RPSH1(BOOL(a!=c || b!=d)); continue; +/* IORr* */ case 0xF8: MLIT2(c,d); RSTV(-1)|=d; RSTV(-2)|=c; continue; +/* XORr* */ case 0xF9: MLIT2(c,d); RSTV(-1)^=d; RSTV(-2)^=c; continue; +/* ANDr* */ case 0xFA: MLIT2(c,d); RSTV(-1)&=d; RSTV(-2)&=c; continue; +/* NOTr* */ case 0xFB: MLIT2(a,b); RPSH2(~a,~b); continue; +/* SHFr* */ case 0xFC: MLIT1(c); RPOPD(x); x=SHF(x,c); RPSHD(x); continue; +/* SHCr* */ case 0xFD: MLIT1(c); RPOPD(x); x=shcd(x,c); RPSHD(x); continue; +/* TALr* */ case 0xFE: MLIT2(a,b); RPSH1(TAL(a)+TAL(b)); continue; +/* REVr* */ case 0xFF: MLIT2(a,b); RPSH1(rev(b)); RPSH1(rev(a)); continue; + } + } + return SIG_NONE; +} |