jb302@28: #include jb302@28: #include jb302@28: jb302@28: #define MAIN jb302@28: #include "mem.h" jb302@28: #include "iset.h" jb302@28: jb302@28: /* fill instruction table jb302@28: * MCS-51 - this needs to be stored in code memory */ jb302@28: void (*iset[256])(void) = { jb302@28: NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, jb302@28: SET, CLR, SET, CLR, SET, CLR, CPL, CPL, jb302@28: XCSD, SFA, LAF, MOV, MOV, MOV, MOV, MOV, jb302@28: MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, jb302@28: MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, jb302@28: MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, jb302@28: MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, jb302@28: MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, jb302@28: MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, jb302@28: MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, jb302@28: MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, jb302@28: MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, jb302@28: MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, jb302@28: MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, jb302@28: MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, jb302@28: MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV, jb302@28: ANL, ANL, ANL, ANL, ANL, ANL, ANL, ANL, jb302@28: ORL, ORL, ORL, ORL, ORL, ORL, ORL, ORL, jb302@28: XRL, XRL, XRL, XRL, XRL, XRL, XRL, XRL, jb302@28: RL, RLC, RR, RRC, INC, DEC, INC, DEC, jb302@28: ADD, ADD, ADD, ADD, ADD, ADD, ADD, ADD, jb302@28: ADDC, ADDC, ADDC, ADDC, ADDC, ADDC, ADDC, ADDC, jb302@28: SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, jb302@28: SUBB, SUBB, SUBB, SUBB, SUBB, SUBB, SUBB, SUBB, jb302@28: PJMP, PJMP, PJMP, PJMP, PJMP, PJMP, PJMP, PJMP, jb302@28: PCALL, PCALL, PCALL, PCALL, PCALL, PCALL, PCALL, PCALL, jb302@28: DJNZ, DJNZ, DJNZ, DJNZ, CJNE, CJNE, CJNE, CJNE, jb302@28: LJMP, LCALL, RET, RETI, SJMP, JMP, JMP, CJNE, jb302@28: JZ, JNZ, JC, JNC, JPO, JPE, JS, JNS, jb302@28: PUSH, PUSH, PUSH, PUSH, PUSH, PUSH, PUSH, PUSH, jb302@28: POP, POP, POP, POP, POP, POP, POP, POP, jb302@28: MUL, DIV, DA, NOP, IN, OUT, INT, HLT jb302@28: }; jb302@28: jb302@28: BYTE run; jb302@28: WIDE ac; jb302@28: BYTE args[4]; jb302@28: jb302@28: /* don't need the file on the MCS-51 version */ jb302@28: FILE *fp; jb302@28: void jb302@28: snd(BYTE c) { jb302@28: /* putchar(c); */ jb302@28: fp = fopen("out", "a"); jb302@28: fputc(c, fp); jb302@28: fclose(fp); jb302@28: } jb302@28: jb302@28: BYTE jb302@28: rcv(void) { jb302@28: return getchar(); jb302@28: } jb302@28: jb302@28: void jb302@28: step(void) { jb302@28: IR = fetch(); jb302@28: (*iset[IR])(); jb302@28: } jb302@28: jb302@28: void jb302@28: boot(void) { jb302@28: run = 0; jb302@28: } jb302@28: jb302@28: jb302@28: void dbgi() { jb302@28: if (run == 0) { jb302@28: switch (rcv()) { jb302@28: jb302@28: /* step */ jb302@28: case 0x00: jb302@28: step(); jb302@28: break; jb302@28: jb302@28: /* run */ jb302@28: case 0x01: jb302@28: run = 1; jb302@28: break; jb302@28: jb302@28: /* set reg */ jb302@28: case 0x02: jb302@28: args[0] = rcv(); /* reg */ jb302@28: args[1] = rcv(); /* val */ jb302@28: regs[args[0]] = args[1]; jb302@28: break; jb302@28: jb302@28: /* get reg */ jb302@28: case 0x03: jb302@28: args[0] = rcv(); /* reg */ jb302@28: snd(regs[args[0]]); jb302@28: break; jb302@28: jb302@28: /* set flag */ jb302@28: case 0x04: jb302@28: args[0] = rcv(); /* flag */ jb302@28: args[1] = rcv(); /* on? */ jb302@28: set_flag(args[0], args[1]); jb302@28: break; jb302@28: jb302@28: /* get flag */ jb302@28: case 0x05: jb302@28: args[0] = rcv(); /* flag */ jb302@28: snd(get_flag(args[0])); jb302@28: break; jb302@28: jb302@28: /* write mem block */ jb302@28: case 0x06: jb302@28: args[0] = rcv(); /* addr high */ jb302@28: args[1] = rcv(); /* addr low */ jb302@28: args[2] = rcv(); /* length high */ jb302@28: args[3] = rcv(); /* length low */ jb302@28: tmpw = args[1] | (args[0] << 8); jb302@28: for (ac = tmpw; ac < (tmpw + (args[3] | (args[2] << 8))); ac++) { jb302@28: if (ac >= 0xFFFF) { jb302@28: break; jb302@28: } jb302@28: mem[ac] = rcv(); jb302@28: } jb302@28: break; jb302@28: jb302@28: /* read mem block */ jb302@28: case 0x07: jb302@28: args[0] = rcv(); /* addr high */ jb302@28: args[1] = rcv(); /* addr low */ jb302@28: args[2] = rcv(); /* length high */ jb302@28: args[3] = rcv(); /* length low */ jb302@28: tmpw = args[1] | (args[0] << 8); jb302@28: for (ac = tmpw; ac < (tmpw + (args[3] | (args[2] << 8))); ac++) { jb302@28: if (ac >= 0xFFFF) { jb302@28: break; jb302@28: } jb302@28: snd(mem[ac]); jb302@28: } jb302@28: break; jb302@28: jb302@28: /* get A */ jb302@28: case 0x09: jb302@28: snd(A); jb302@28: jb302@28: /* get flags */ jb302@28: case 0x0F: jb302@28: snd(flags); jb302@28: jb302@28: /* get instruction register */ jb302@28: case 0x10: jb302@28: snd(IR); jb302@28: } jb302@28: } jb302@28: } jb302@28: jb302@28: void jb302@28: main(void) { jb302@28: jb302@28: A = 0xAA; jb302@28: IR = 0x12; jb302@28: jb302@28: unsigned char i; jb302@28: for (i = 0 ; i < 8 ; i++) { jb302@28: set_flag(i, 1); jb302@28: } jb302@28: jb302@28: set_wide(DPTR, 0xDE1D); jb302@28: set_wide(PC, 0xBEFA); jb302@28: set_wide(SP, 0xADEA); jb302@28: set_wide(TMP, 0xEFC3); jb302@28: jb302@28: for (i = 0; i < 4; i++) { jb302@28: regs[i] = i; jb302@28: } jb302@28: jb302@28: for (i = 8; i < 0x0C; i++) { jb302@28: regs[i] = 0x10 | (i - 8); jb302@28: } jb302@28: jb302@28: /* 0xAA 0x12 0xFF jb302@28: * 0x00 0x01 0x02 0x03 jb302@28: * 0xDE 0xAD 0xBE 0xFF jb302@28: * 0x10 0x11 0x12 0x13 jb302@28: * 0x1D 0xEA 0xFA 0xC3 */ jb302@28: jb302@28: putchar(A); jb302@28: putchar(IR); jb302@28: putchar(flags); jb302@28: jb302@28: for (i = 0; i < 0x10; i++) { jb302@28: putchar(regs[i]); jb302@28: } jb302@28: jb302@28: unsigned short int data_pointer = get_wide(DPTR); jb302@28: unsigned short int program_counter = get_wide(PC); jb302@28: unsigned short int stack_pointer = get_wide(SP); jb302@28: unsigned short int temp = get_wide(tmp); jb302@28: jb302@28: jb302@28: jb302@28: jb302@28: } jb302@28: