Mercurial > hg > ede
changeset 35:2e35be400012
took broken instructions out of the iset
author | james <jb302@eecs.qmul.ac.uk> |
---|---|
date | Thu, 17 Apr 2014 13:34:56 +0100 |
parents | 4411dee34085 |
children | 8205f1734ff2 |
files | bin/emu dbg/dbg.pyc emu/iset.c out |
diffstat | 3 files changed, 224 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/emu/iset.c Wed Apr 16 16:51:39 2014 +0100 +++ b/emu/iset.c Thu Apr 17 13:34:56 2014 +0100 @@ -471,16 +471,63 @@ } +/* 0xA8 - ADDC A, R0 + * 0xA9 - ADDC A, R1 + * 0xAA - ADDC A, R2 + * 0xAB - ADDC A, R3 + * 0xAC - ADDC A, DPH + * 0xAD - ADDC A, DPL + * 0xAE - ADDC A, #data8 + * 0xAF - ADDC A, @DPTR */ void ADDC(void) { -/* implement me */ + if (NNN < 6) { + if ((A + get_reg(NNN) + get_flag(C)) > 0xFF) { + set_flag(C, 1); + } + else { + set_flag(C, 0); + } + A = A + get_reg(NNN) + get_flag(C); + set_zp(A); + } + else { + switch (NNN) { + + case 6: + tmpb = fetch(); + if ((A + tmpb + get_flag(C)) > 0xFF) { + set_flag(C, 1); + } + else { + set_flag(C, 0); + } + A = A + tmpb + get_flag(C); + set_zp(A); + break; + + case 7: + set_wide(TMP, get_wide(DPTR)); + if ((A + mem[TMP] + get_flag(C)) > 0xFF) { + set_flag(C, 1); + } + else { + set_flag(C, 0); + } + A = A + mem[TMP] + get_flag(C); + set_zp(A); + break; + } + } + + } /* 0xB0 - SUB A, R0 * 0xB1 - SUB A, R1 * 0xB2 - SUB A, R2 * 0xB3 - SUB A, R3 - * 0xB4 - SUB A, DPH + * 0xB4 - SB A, DPH * 0xB5 - SUB A, DPL * 0xB6 - SUB A, #data8 * 0xB7 - SUB A, @DPTR */ @@ -526,9 +573,54 @@ } } +/* 0xB8 - SUBB A, R0 + * 0xB9 - SUBB A, R1 + * 0xBA - SUBB A, R2 + * 0xBB - SUBB A, R3 + * 0xBC - SUBB A, DPH + * 0xBD - SUBB A, DPL + * 0xBE - SUBB A, #data8 + * 0xBF - SUBB A, @DPTR */ void SUBB(void) { - /* implement me */ + if (NNN < 6) { + if ((A - get_reg(NNN) - get_flag(C)) < 0){ + set_flag(C, 1); + } + else { + set_flag(C, 0); + } + A = A - get_reg(NNN) -get_flag(C); + set_zp(A); + } + else { + switch (NNN) { + + case 6: + tmpb = fetch(); + if ((A - tmpb - get_flag(C)) < 0) { + set_flag(C, 1); + } + else { + set_flag(C, 0); + } + A = A - tmpb - get_flag(C); + set_zp(A); + break; + + case 7: + set_wide(TMP, get_wide(DPTR)); + if ((A - mem[TMP] - get_flag(C)) < 0) { + set_flag(C, 1); + } + else { + set_flag(C, 0); + } + A = A - mem[TMP] - get_flag(C); + set_zp(A); + break; + } + } } void @@ -547,25 +639,73 @@ * 0xD3 - DJNZ R3, rel8 */ void DJNZ(void) { + set_reg(NNN, get_reg(NNN) - 1); + if (get_reg(NNN) == 0) { + set_wide(PC, get_wide(PC) + (signed char)fetch() - 1); + } + else { + inc_pc(1); + } } +/* 0xD4 - CJNE R0, #data, rel8 + * 0xD5 - CJNE R1, #data, rel8 + * 0xD6 - CJNE R2, #data, rel8 + * 0xD7 - CJNE R3, #data, rel8 + * 0xDF - CJNE A, #data8, rel8 */ void CJNE(void) { + switch(IR) { + + case 0xDF: + tmpb = fetch(); + if (tmpb != A) { + set_wide(PC, get_wide(PC) + (signed char)fetch() - 1); + } + else { + inc_pc(1); + } + break; + + + default: + tmpb = fetch(); + if (tmpb != get_reg(NNN - 4)) { + set_wide(PC, get_wide(PC) + (signed char)fetch() - 1); + } + else { + inc_pc(1); + } + break; + } } /* 0xD8 - LJMP addr16 */ void LJMP(void) { + set_wide(PC, fetch_wide()); } +/* 0xD9 - LCALL addr16 */ void LCALL(void) { - /* implement me */ + /* push PC to stack */ + mem[get_wide(SP)] = get_reg(PCL); + set_wide(SP, get_wide(SP) + 1); + mem[get_wide(SP)] = get_reg(PCH); + set_wide(SP, get_wide(SP) + 1); + /* jmp */ + set_wide(PC, fetch_wide()); } +/* 0xDA - RET */ void RET(void) { - /* implement me */ + /* get PC from stack */ + set_wide(SP, get_wide(SP) - 1); + tmpb = mem[get_wide(SP)]; /* PCH */ + set_wide(SP, get_wide(SP) - 1); + set_wide(PC, MWIDE(tmpb, mem[get_wide(SP)])); } void @@ -687,39 +827,112 @@ } } +/* 0xE8 - PUSH R0 + * 0xE9 - PUSH R1 + * 0xEA - PUSH R2 + * 0xEB - PUSH R3 + * 0xEC - PUSH DPH + * 0xED - PUSH DPL + * 0xEE - PUSH A + * 0xEF - PUSH FLAGS */ void PUSH(void) { + if (NNN < 6) { + mem[get_wide(SP)] = get_reg(NNN); + set_wide(SP, get_wide(SP) + 1); + + } + else { + switch(IR) { + + case 0xEE: + mem[get_wide(SP)] = A; + set_wide(SP, get_wide(SP) + 1); + break; + + case 0xEF: + mem[get_wide(SP)] = flags; + set_wide(SP, get_wide(SP) + 1); + break; + + default: + break; + } + } } +/* 0xF0 - POP R0 + * 0xF1 - POP R1 + * 0xF2 - POP R2 + * 0xF3 - POP R3 + * 0xF4 - POP DPH + * 0xF5 - POP DPL + * 0xF6 - POP A + * 0xF7 - POP FLAGS */ void -POP(void) { +POP(void) { + if (NNN < 6) { + set_wide(SP, get_wide(SP) - 1); + set_reg(NNN, mem[get_wide(SP)]); + } + else { + switch(IR) { + + case 0xF6: + set_wide(SP, get_wide(SP) - 1); + A = mem[get_wide(SP)]; + break; + + case 0xF7: + set_wide(SP, get_wide(SP) - 1); + flags = mem[get_wide(SP)]; + break; + + default: + break; + } + } } + +/* 0xF8 - MUL R0, R1 */ void -MUL(void) { +MUL(void) { + /* implement me */ } +/* 0xF9 - DIV R0, R1 */ void -DIV(void) { +DIV(void) { + /* implement me */ } +/* 0xFA - DA A */ void -DA(void) { +DA(void) { + /* implement me */ } +/* 0xFC - IN port_addr */ void -IN(void) { +IN(void) { + /* implement me */ } +/* 0xFD - OUT port_addr */ void OUT(void) { + /* implement me */ } +/* 0xFE INT vect8 */ void -INT(void) { +INT(void) { + /* implement me */ } /* 0xFF - HLT */ void HLT(void) { + /* implement me */ }