Mercurial > hg > ede
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) { }