view emu/main.c @ 29:83e80c2c489c

seperated working emu code from broken emu code. wrote dbg interface
author james <jb302@eecs.qmul.ac.uk>
date Sun, 13 Apr 2014 22:42:57 +0100
parents 6d32e54e5c16
children b4a4ae2f127e
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 free_run;  /* free run if not 0 */
WIDE ac;        /* address counter */
BYTE args[4];   /* dbg args */

/* 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 dbgi() {
    if (free_run == 0) {
        switch (rcv()) {

            /* step */
            case 0x00:
                step();
                break;

            /* run */
            case 0x01:
                args[0] = rcv(); /* length high */
                args[1] = rcv(); /* length low */
                tmpw = get_wide(PC);
                for (ac = tmpw ; ac < tmpw + MWIDE(args[0], args[1]) ; ac++) {
                    step();
                }
                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 = MWIDE(args[0], args[1]);         
                for (ac = tmpw; ac < tmpw + MWIDE(args[2], args[3]); 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 = MWIDE(args[0], args[1]);         
                for (ac = tmpw; ac < tmpw + MWIDE(args[2], args[3]); ac++) { 
                    if (ac >= 0xFFFF) {
                        break;
                    }
                    snd(mem[ac]);
                }
                break;

            /* get A */
            case 0x09:
                snd(A);
                break;
            
            /* get flags */
            case 0x0A:
                snd(flags);
                break;
            
            /* get instruction register */
            case 0x0B:
                snd(IR);
                break;
       }
    }
}

void 
main(void) {
    /* dont go into free run on restart */
    free_run = 0;
    for (;;) {
        dbgi();
    }
}