annotate emu/main.c @ 31:7a35e6ae1c36

set zp
author james <jb302@eecs.qmul.ac.uk>
date Tue, 15 Apr 2014 14:17:27 +0100
parents 83e80c2c489c
children b4a4ae2f127e
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@29 45 BYTE free_run; /* free run if not 0 */
jb302@29 46 WIDE ac; /* address counter */
jb302@29 47 BYTE args[4]; /* dbg args */
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 dbgi() {
jb302@29 71 if (free_run == 0) {
jb302@28 72 switch (rcv()) {
jb302@28 73
jb302@28 74 /* step */
jb302@28 75 case 0x00:
jb302@28 76 step();
jb302@28 77 break;
jb302@28 78
jb302@28 79 /* run */
jb302@28 80 case 0x01:
jb302@29 81 args[0] = rcv(); /* length high */
jb302@29 82 args[1] = rcv(); /* length low */
jb302@29 83 tmpw = get_wide(PC);
jb302@29 84 for (ac = tmpw ; ac < tmpw + MWIDE(args[0], args[1]) ; ac++) {
jb302@29 85 step();
jb302@29 86 }
jb302@28 87 break;
jb302@28 88
jb302@28 89 /* set reg */
jb302@28 90 case 0x02:
jb302@28 91 args[0] = rcv(); /* reg */
jb302@28 92 args[1] = rcv(); /* val */
jb302@28 93 regs[args[0]] = args[1];
jb302@28 94 break;
jb302@28 95
jb302@28 96 /* get reg */
jb302@28 97 case 0x03:
jb302@28 98 args[0] = rcv(); /* reg */
jb302@28 99 snd(regs[args[0]]);
jb302@28 100 break;
jb302@28 101
jb302@28 102 /* set flag */
jb302@28 103 case 0x04:
jb302@28 104 args[0] = rcv(); /* flag */
jb302@28 105 args[1] = rcv(); /* on? */
jb302@28 106 set_flag(args[0], args[1]);
jb302@28 107 break;
jb302@28 108
jb302@28 109 /* get flag */
jb302@28 110 case 0x05:
jb302@28 111 args[0] = rcv(); /* flag */
jb302@28 112 snd(get_flag(args[0]));
jb302@28 113 break;
jb302@28 114
jb302@28 115 /* write mem block */
jb302@28 116 case 0x06:
jb302@28 117 args[0] = rcv(); /* addr high */
jb302@28 118 args[1] = rcv(); /* addr low */
jb302@28 119 args[2] = rcv(); /* length high */
jb302@28 120 args[3] = rcv(); /* length low */
jb302@29 121 tmpw = MWIDE(args[0], args[1]);
jb302@29 122 for (ac = tmpw; ac < tmpw + MWIDE(args[2], args[3]); ac++) {
jb302@28 123 if (ac >= 0xFFFF) {
jb302@28 124 break;
jb302@28 125 }
jb302@28 126 mem[ac] = rcv();
jb302@28 127 }
jb302@28 128 break;
jb302@28 129
jb302@28 130 /* read mem block */
jb302@28 131 case 0x07:
jb302@28 132 args[0] = rcv(); /* addr high */
jb302@28 133 args[1] = rcv(); /* addr low */
jb302@28 134 args[2] = rcv(); /* length high */
jb302@28 135 args[3] = rcv(); /* length low */
jb302@29 136 tmpw = MWIDE(args[0], args[1]);
jb302@29 137 for (ac = tmpw; ac < tmpw + MWIDE(args[2], args[3]); ac++) {
jb302@28 138 if (ac >= 0xFFFF) {
jb302@28 139 break;
jb302@28 140 }
jb302@28 141 snd(mem[ac]);
jb302@28 142 }
jb302@28 143 break;
jb302@28 144
jb302@28 145 /* get A */
jb302@28 146 case 0x09:
jb302@28 147 snd(A);
jb302@29 148 break;
jb302@28 149
jb302@28 150 /* get flags */
jb302@29 151 case 0x0A:
jb302@28 152 snd(flags);
jb302@29 153 break;
jb302@28 154
jb302@28 155 /* get instruction register */
jb302@29 156 case 0x0B:
jb302@28 157 snd(IR);
jb302@29 158 break;
jb302@28 159 }
jb302@28 160 }
jb302@28 161 }
jb302@28 162
jb302@28 163 void
jb302@28 164 main(void) {
jb302@29 165 /* dont go into free run on restart */
jb302@29 166 free_run = 0;
jb302@29 167 for (;;) {
jb302@29 168 dbgi();
jb302@28 169 }
jb302@28 170 }
jb302@28 171