view emu/iset.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
/* iset.c
 * IR functions */
#include <stdlib.h>
#include "iset.h"
#include "mem.h"

/* useful macros */
#define NNN (IR & 0x07)
#define MMM ((IR & 0x38) >> 3)

/* 0x00 - NOP */
void
NOP(void) {    
}

/* 0x08 - SET C
 * 0x0A - SET BS
 * 0x0C - SET IE */
void
SET(void) {
    switch (IR) {
        
        case 0x08:
            set_flag(0x07, 0x01);
            break;
        
        case 0x0A:
            set_flag(0x00, 0x01);
            break;
        
        case 0x0C:
            set_flag(0x01, 0x01);
            break;
        
        default:
            break;
    }
}

/* 0x09 - CLR C
 * 0x0B - CLR BS
 * 0x0D - CLR IE */
void
CLR(void) {
    switch (IR) {
        
        case 0x09:
            set_flag(0x07, 0x00);
            break;
        
        case 0x0B:
            set_flag(0x00, 0x00);
            break;
        
        case 0x0D:
            set_flag(0x01, 0x00);
            break;
        
        default:
            break;
    }    
}

/* 0x0E - CPL C
 * 0x0F - CPL A */
void
CPL(void) {
    switch (IR) {
        
        case 0x0E:
            if (get_flag(0x07) == 0) {
                set_flag(0x07, 0x01);
            }
            else {
                set_flag(0x07, 0x00);
            }
        
        case 0x0F:
            A = ~A;
            break;
        
        default:
            break;
    }
}

/* 0x10 - XCSD */
void
XCSD(void) {
    tmpw = get_wide(SP);
    set_wide(SP, get_wide(DPTR));
    set_wide(DPTR, tmpw);
}

/* 0x11 - SFA */
void
SFA(void) {
    A = flags;
}

/* 0x12 - LAF */
void
LAF(void) {
    flags = A;   
}

/* 0b00010XXX - special MOVs
 * 0b00011XXX - direct, indirect and indexed MOVs
 * 0b00100nnn - register-indirect MOVs - MOV @DPTR, Rn
 * 0b00101nnn - immediate movs - MOV Rn, #data8
 * 0b00110nnn - MOV Rn, A
 * 0b00111nnn - MOV A, Rn
 * 0b01mmmnnn - 64 register move instructions
 *
 * this is a mess */
void
MOV(void) {
    switch (IR & 0x40) {
       
        case 0x00:
            switch (IR & 0xF8) {
                
                /* 0b00010XXX */
                case 0x10:
                    switch (NNN) {
                        
                        /* MOV DPTR, SP */
                        case 3:
                            set_wide(DPTR, get_wide(SP));
                            break;
                        
                        /* MOV SP, DPTR */
                        case 4:
                            set_wide(SP, get_wide(DPTR));
                            break;
                        
                        /* MOV A, #data8 */
                        case 5:
                            A = fetch();
                            break;
                        
                        /* MOV SP, #data16 */
                        case 6:
                            set_wide(SP, fetch_wide());
                            break;
                        
                        /* MOV DPTR, #data16 */
                        case 7:
                            set_wide(DPTR, fetch_wide());
                            break;
                        
                        default:
                            break;
                    }
                    break;
                
                /* 0b00011XXX */
                case 0x18:
                    switch (NNN) {
                        
                        /* MOV A, addr16 */
                        case 0:
                            set_wide(TMP, fetch_wide());
                            A = mem[get_wide(TMP)];
                            break;
                        
                        /* MOV addr16, A */
                        case 1:
                            set_wide(TMP, fetch_wide());
                            mem[get_wide(TMP)] = A;
                            break;
                        
                        /* MOV A, @A+DPTR */
                        case 2:
                            A = mem[A + get_wide(DPTR)];
                            break;
                        
                        /* MOV A, @A+PC */
                        case 3:
                            A = mem[A + get_wide(PC)];
                            break;
                        
                        /* MOV A, @addr16 */
                        case 4:
                            set_wide(TMP, fetch_wide());
                            A = mem[mem[get_wide(TMP)]];
                            break;
                        
                        /* MOV @addr16, A */ 
                        case 5:
                            set_wide(TMP, fetch_wide());
                            mem[mem[get_wide(TMP)]] = A;
                            break;
                        
                        /* MOV A, @DPTR */
                        case 6:
                            A = mem[get_wide(DPTR)];
                            break;
                        
                        /* MOV @DPTR, A */
                        case 7:
                            mem[get_wide(DPTR)] = A;
                            break;
                        
                        default:
                            break;
                    }
                    break;
                
                /* 0b00100nnn */
                case 0x20:
                    break;
                
                /* 0b00101nnn */
                case 0x28:
                    break;
                
                /* 0b00110nnn */
                case 0x30:
                    break;
                
                /* 0b00111nnn */
                case 0x38:
                    break;
                
                default:
                    break;
                }
            break;
        
        /* 0b01mmmnnn */
        case 0x40:
            break;
        
        default:
            break;
    }
}

void
ANL(void) {
}

void
ORL(void) {
}

void
XRL(void) {

}

/* 0x98 - RL A */
void
RL(void) {
    A = (A << 1) | (A >> 7);
}

/* 0x99 - RLC A */
void
RLC(void) {
    /* implement me */
}

/* 0x9A - RR A */
void
RR(void) {
    A = (A >> 1) | (A << 7);
}

/* 0x9B - RRC A */
void
RRC(void) { 
    /* implement me */
}

/* 0x9C - INC DPTR
 * 0x9E - INC A */
void
INC(void) {    
}

/* 0x9D - DEC DPTR
 * 0x9F - DEC A */
void
DEC(void) {
}

void
ADD(void) {
}

void
ADDC(void) {
/* implement me */    
}

void
SUB(void) {
}

void
SUBB(void) {
    /* implement me */
}

void
PJMP(void) {
    /* implement me */
}

void
PCALL(void) {
    /* implement me */
}

/* 0xD0 - DJNZ R0, rel8
 * 0xD1 - DJNZ R1, rel8
 * 0xD2 - DJNZ R2, rel8
 * 0xD3 - DJNZ R3, rel8 */
void
DJNZ(void) {
}

void
CJNE(void) {
}

/* 0xD8 - LJMP addr16 */
void
LJMP(void) {
}

void
LCALL(void) {
    /* implement me */
}

void
RET(void) {
    /* implement me */
}

void
RETI(void) {
    /* implement me */
}

/* 0xDC - SJMP rel8 */
void
SJMP(void) {
}

/* 0xDD - JMP @A+DPTR
 * 0xDE - JMP @DPTR */
void
JMP(void) {
}

void
JZ(void) {   
}

void
JNZ(void) {
}

void
JC(void) {   
}

void
JNC(void) {   
}

void
JPO(void) {   
}

void
JPE(void) {
}

void
JS(void) {    
}

void
JNS(void) {
}

void
PUSH(void) {
}

void
POP(void) { 
}

void
MUL(void) {    
}

void
DIV(void) {   
}

void
DA(void) {    
}

void
IN(void) {   
}

void
OUT(void) {
}

void
INT(void) {    
}

/* 0xFF - HLT */
void
HLT(void) {
}