annotate 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
rev   line source
jb302@28 1 #include <stdio.h>
jb302@28 2 #include <stdlib.h>
jb302@28 3
jb302@28 4 #define MAIN
jb302@28 5 #include "mem.h"
jb302@28 6 #include "iset.h"
jb302@28 7
jb302@28 8 /* fill instruction table
jb302@28 9 * MCS-51 - this needs to be stored in code memory */
jb302@28 10 void (*iset[256])(void) = {
jb302@28 11 NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP,
jb302@28 12 SET, CLR, SET, CLR, SET, CLR, CPL, CPL,
jb302@28 13 XCSD, SFA, LAF, MOV, MOV, MOV, MOV, MOV,
jb302@28 14 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
jb302@28 15 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
jb302@28 16 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
jb302@28 17 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
jb302@28 18 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
jb302@28 19 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
jb302@28 20 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
jb302@28 21 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
jb302@28 22 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
jb302@28 23 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
jb302@28 24 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
jb302@28 25 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
jb302@28 26 MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
jb302@28 27 ANL, ANL, ANL, ANL, ANL, ANL, ANL, ANL,
jb302@28 28 ORL, ORL, ORL, ORL, ORL, ORL, ORL, ORL,
jb302@28 29 XRL, XRL, XRL, XRL, XRL, XRL, XRL, XRL,
jb302@28 30 RL, RLC, RR, RRC, INC, DEC, INC, DEC,
jb302@28 31 ADD, ADD, ADD, ADD, ADD, ADD, ADD, ADD,
jb302@28 32 ADDC, ADDC, ADDC, ADDC, ADDC, ADDC, ADDC, ADDC,
jb302@28 33 SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB,
jb302@28 34 SUBB, SUBB, SUBB, SUBB, SUBB, SUBB, SUBB, SUBB,
jb302@28 35 PJMP, PJMP, PJMP, PJMP, PJMP, PJMP, PJMP, PJMP,
jb302@28 36 PCALL, PCALL, PCALL, PCALL, PCALL, PCALL, PCALL, PCALL,
jb302@28 37 DJNZ, DJNZ, DJNZ, DJNZ, CJNE, CJNE, CJNE, CJNE,
jb302@28 38 LJMP, LCALL, RET, RETI, SJMP, JMP, JMP, CJNE,
jb302@28 39 JZ, JNZ, JC, JNC, JPO, JPE, JS, JNS,
jb302@28 40 PUSH, PUSH, PUSH, PUSH, PUSH, PUSH, PUSH, PUSH,
jb302@28 41 POP, POP, POP, POP, POP, POP, POP, POP,
jb302@28 42 MUL, DIV, DA, NOP, IN, OUT, INT, HLT
jb302@28 43 };
jb302@28 44
jb302@28 45 BYTE run;
jb302@28 46 WIDE ac;
jb302@28 47 BYTE args[4];
jb302@28 48
jb302@28 49 /* don't need the file on the MCS-51 version */
jb302@28 50 FILE *fp;
jb302@28 51 void
jb302@28 52 snd(BYTE c) {
jb302@28 53 /* putchar(c); */
jb302@28 54 fp = fopen("out", "a");
jb302@28 55 fputc(c, fp);
jb302@28 56 fclose(fp);
jb302@28 57 }
jb302@28 58
jb302@28 59 BYTE
jb302@28 60 rcv(void) {
jb302@28 61 return getchar();
jb302@28 62 }
jb302@28 63
jb302@28 64 void
jb302@28 65 step(void) {
jb302@28 66 IR = fetch();
jb302@28 67 (*iset[IR])();
jb302@28 68 }
jb302@28 69
jb302@28 70 void
jb302@28 71 boot(void) {
jb302@28 72 run = 0;
jb302@28 73 }
jb302@28 74
jb302@28 75
jb302@28 76 void dbgi() {
jb302@28 77 if (run == 0) {
jb302@28 78 switch (rcv()) {
jb302@28 79
jb302@28 80 /* step */
jb302@28 81 case 0x00:
jb302@28 82 step();
jb302@28 83 break;
jb302@28 84
jb302@28 85 /* run */
jb302@28 86 case 0x01:
jb302@28 87 run = 1;
jb302@28 88 break;
jb302@28 89
jb302@28 90 /* set reg */
jb302@28 91 case 0x02:
jb302@28 92 args[0] = rcv(); /* reg */
jb302@28 93 args[1] = rcv(); /* val */
jb302@28 94 regs[args[0]] = args[1];
jb302@28 95 break;
jb302@28 96
jb302@28 97 /* get reg */
jb302@28 98 case 0x03:
jb302@28 99 args[0] = rcv(); /* reg */
jb302@28 100 snd(regs[args[0]]);
jb302@28 101 break;
jb302@28 102
jb302@28 103 /* set flag */
jb302@28 104 case 0x04:
jb302@28 105 args[0] = rcv(); /* flag */
jb302@28 106 args[1] = rcv(); /* on? */
jb302@28 107 set_flag(args[0], args[1]);
jb302@28 108 break;
jb302@28 109
jb302@28 110 /* get flag */
jb302@28 111 case 0x05:
jb302@28 112 args[0] = rcv(); /* flag */
jb302@28 113 snd(get_flag(args[0]));
jb302@28 114 break;
jb302@28 115
jb302@28 116 /* write mem block */
jb302@28 117 case 0x06:
jb302@28 118 args[0] = rcv(); /* addr high */
jb302@28 119 args[1] = rcv(); /* addr low */
jb302@28 120 args[2] = rcv(); /* length high */
jb302@28 121 args[3] = rcv(); /* length low */
jb302@28 122 tmpw = args[1] | (args[0] << 8);
jb302@28 123 for (ac = tmpw; ac < (tmpw + (args[3] | (args[2] << 8))); ac++) {
jb302@28 124 if (ac >= 0xFFFF) {
jb302@28 125 break;
jb302@28 126 }
jb302@28 127 mem[ac] = rcv();
jb302@28 128 }
jb302@28 129 break;
jb302@28 130
jb302@28 131 /* read mem block */
jb302@28 132 case 0x07:
jb302@28 133 args[0] = rcv(); /* addr high */
jb302@28 134 args[1] = rcv(); /* addr low */
jb302@28 135 args[2] = rcv(); /* length high */
jb302@28 136 args[3] = rcv(); /* length low */
jb302@28 137 tmpw = args[1] | (args[0] << 8);
jb302@28 138 for (ac = tmpw; ac < (tmpw + (args[3] | (args[2] << 8))); ac++) {
jb302@28 139 if (ac >= 0xFFFF) {
jb302@28 140 break;
jb302@28 141 }
jb302@28 142 snd(mem[ac]);
jb302@28 143 }
jb302@28 144 break;
jb302@28 145
jb302@28 146 /* get A */
jb302@28 147 case 0x09:
jb302@28 148 snd(A);
jb302@28 149
jb302@28 150 /* get flags */
jb302@28 151 case 0x0F:
jb302@28 152 snd(flags);
jb302@28 153
jb302@28 154 /* get instruction register */
jb302@28 155 case 0x10:
jb302@28 156 snd(IR);
jb302@28 157 }
jb302@28 158 }
jb302@28 159 }
jb302@28 160
jb302@28 161 void
jb302@28 162 main(void) {
jb302@28 163
jb302@28 164 A = 0xAA;
jb302@28 165 IR = 0x12;
jb302@28 166
jb302@28 167 unsigned char i;
jb302@28 168 for (i = 0 ; i < 8 ; i++) {
jb302@28 169 set_flag(i, 1);
jb302@28 170 }
jb302@28 171
jb302@28 172 set_wide(DPTR, 0xDE1D);
jb302@28 173 set_wide(PC, 0xBEFA);
jb302@28 174 set_wide(SP, 0xADEA);
jb302@28 175 set_wide(TMP, 0xEFC3);
jb302@28 176
jb302@28 177 for (i = 0; i < 4; i++) {
jb302@28 178 regs[i] = i;
jb302@28 179 }
jb302@28 180
jb302@28 181 for (i = 8; i < 0x0C; i++) {
jb302@28 182 regs[i] = 0x10 | (i - 8);
jb302@28 183 }
jb302@28 184
jb302@28 185 /* 0xAA 0x12 0xFF
jb302@28 186 * 0x00 0x01 0x02 0x03
jb302@28 187 * 0xDE 0xAD 0xBE 0xFF
jb302@28 188 * 0x10 0x11 0x12 0x13
jb302@28 189 * 0x1D 0xEA 0xFA 0xC3 */
jb302@28 190
jb302@28 191 putchar(A);
jb302@28 192 putchar(IR);
jb302@28 193 putchar(flags);
jb302@28 194
jb302@28 195 for (i = 0; i < 0x10; i++) {
jb302@28 196 putchar(regs[i]);
jb302@28 197 }
jb302@28 198
jb302@28 199 unsigned short int data_pointer = get_wide(DPTR);
jb302@28 200 unsigned short int program_counter = get_wide(PC);
jb302@28 201 unsigned short int stack_pointer = get_wide(SP);
jb302@28 202 unsigned short int temp = get_wide(tmp);
jb302@28 203
jb302@28 204
jb302@28 205
jb302@28 206
jb302@28 207 }
jb302@28 208