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