From 904c398911d524da2c81dd2c871492ed89cff9ca Mon Sep 17 00:00:00 2001 From: Abdelrahman Said Date: Wed, 29 Mar 2023 22:47:59 +0100 Subject: [PATCH] Completed the first 8086 simulation homework --- 8086_sim/include/reg_access.h | 2 ++ 8086_sim/reg_access.cpp | 12 +++++++----- 8086_sim/sim86 | Bin 31808 -> 32104 bytes 8086_sim/sim86.cpp | 15 +++++++++++++-- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/8086_sim/include/reg_access.h b/8086_sim/include/reg_access.h index d6a3d1a..b1c1383 100644 --- a/8086_sim/include/reg_access.h +++ b/8086_sim/include/reg_access.h @@ -4,6 +4,8 @@ #include "aliases.h" #include "sim86_instruction.h" +#define REGISTER_COUNT 13 + void set_register(register_access reg, u16 new_value); u16 get_register(register_access reg); const char *get_register_name(register_access reg); diff --git a/8086_sim/reg_access.cpp b/8086_sim/reg_access.cpp index 113953a..b5b7dfe 100644 --- a/8086_sim/reg_access.cpp +++ b/8086_sim/reg_access.cpp @@ -2,17 +2,17 @@ #include "include/aliases.h" #include -#define REGISTER_COUNT 13 - static u16 registers[REGISTER_COUNT] = {0}; +#define BIT_PER_BYTE 8 + void set_register(register_access reg, u16 new_value) { if (reg.Count == 2) { registers[reg.Index] = new_value; return; } - u16 shift = (u16)(reg.Offset) * (u16)sizeof(u8); + u16 shift = (u16)(reg.Offset) * BIT_PER_BYTE; u16 mask = 0xff00; registers[reg.Index] &= (mask >> shift); @@ -24,8 +24,10 @@ u16 get_register(register_access reg) { return registers[reg.Index]; } - // TODO (Abdelrahman): Implement this - return 0; + u16 shift = (u16)(reg.Offset) * BIT_PER_BYTE; + u16 mask = 0x00ff; + + return (registers[reg.Index] >> shift) & mask; } const char *get_register_name(register_access reg) { diff --git a/8086_sim/sim86 b/8086_sim/sim86 index 30946de97f527f04c1168746ff0ab97d99057773..e4249f126137805112b95a19a315b87500cf3f70 100644 GIT binary patch delta 2949 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 Ne-9I`<|*~l{|B!DPD%g( delta 2480 zcmZWr3v5%@89wKpd+ZzAv9GTkJK>SokqMAQX$U2>5Q3q&y<|<3wn=ylI$nw(Y-(C) zo2Ue5xUMiBTf(6zWi4W@)NW&%5Kc-*Me3y`p_RIMYDJ60AXTNwsH~&(p_bR}|6eBr zX;(V;|GxkGALr$pWUtfo543NN6yDKae$m!wCFav;O=+~9y3>IiPY1##NQ;DY$$Q)N z=CxzJ%ZJa;tUQ0{%LB9jyR%KCcCjb(DM?*Xr%_6TReQQ18M*2@DMvEP!esq>?NzRl z7odjtht^Gdh3=W-blftGvB*sd-pg@G?DmutT)Jr(da@_04|h*=%vRnKCp@Lg|Cm$8 z=cN zA(p0zbYf)Q_t`~e+G&)*pBT}TjpM^Ovuy8V<%J0L_q?6m4PY!X2qH;F1{X&zxMG_i zR8J0>={*-JdImwz>8QT{rLbWbSqEgqPV0sdHHhnlc@Uh8uKb)Uu`@;01Sn8i41#gJ;{^#vfy;`Kmq6`|AF;uffw2V=wk z3}XPSdetyG!G^)&JtSWnMjFgfu;XAeUeU z+q9OpiZ7ZL(lRl(CFxWK5 z%V3^^A(iKKfU(NNZGmj^Z>Xw(gODIO0@e#-F;Y($-((5YleSAF^>OpBrN&7wZZ&N? z4w~%via`abziSb{i*+tF*>|AjN&Q<_Ak!=m4{SptGM_5`@OV*l7W!EK+tCluIj1s5 z2c!Q)S^>j2Ra+p_ad<+*A2n!wyMKpy3r2EP z$9oPUtwjn?ex@KS`dhrwR-8Vbf!s6P)bPILbp`8mI&H_Mk0A4MS#;s~Inhp_a_0YBAzScnW7oe$o z!0YBQNZ!eswTr-T8`z^n`_CkPOxC^xTn;m0EsFNlq`%dneGB+4D8p8%+775;=C0`^ z9-O527^o6dzXYV3J*3?Nz89}vy+H4v>EqMt_mGorl=_yppI zp}Cts2rVjEjV6J`Q)cstHg~e^y#eihz(>))AT%}2+Bw97Yriuc4Wd+5?wRUTK{Ulo z6|uGjQM_YLpw_wm-#}Z%>gL;kDy&Z1Y(_zYC1k2Wy-Yk`K!ZYDZ$2aw8TaS}#7c$o zj{uJYq-FdytU`-87#FUv$c4x}PwJ+#oF2}csz24Z>La=|pRDvOvM;vZ2RG8^rwLkA zYq#6cLx?{_nA2{r2Ur+{xP>05r2>G~D&8#etT?=Op4hkM&Dv_4vWL&L)Nx`_>bcFv zJitRrKQFR0@C8a0ud8D%?c8Qz6+1bzv`Z49bfY-9_5=7E|HRJ^xoyvKH>9&V_INuF zTG%~8S@*ySey`;nUTRVLc!@=t@8KFkyG5#XbE{Io`5MmHldG9`HK)&T!n{g=+il7{ z5ZA!jYWAn-Irga-UAL(49YAMD9lOi&r4}}pDqMe+i@@e9&NFah@PSng^jO43>s&D| z%c+OAydu-IxV-gU_uU@~jI;~d;TM^00r>QaYunnjGW5c87&cuaPLlSCj*d5^Oo7n0 zzd`#_f7{;VkbY$mwyvr>Uuj5P-t{0I7LRW6idVa)=iT`aDfRcRF-dyMD)v2JD;;SQ zBhT08{dIM&L$}D=wJ>k?x*R(tRs#EcQ;wC1f5{&4%C3;4Y!)NC>ZMGFkb3HEpFWk- Lw^H%p&f=c{c3-t5 diff --git a/8086_sim/sim86.cpp b/8086_sim/sim86.cpp index 9229eec..b9e578d 100644 --- a/8086_sim/sim86.cpp +++ b/8086_sim/sim86.cpp @@ -42,6 +42,8 @@ int main(int argc, char *argv[]) { u32 offset = 0; + bool accessed_registers[REGISTER_COUNT] = {false}; + while (offset < size) { instruction decoded; Sim86_Decode8086Instruction(size - offset, buffer + offset, &decoded); @@ -55,13 +57,22 @@ int main(int argc, char *argv[]) { if (dest.Type == Operand_Register) { mov_to_register(dest.Register, source); - printf("%s: 0x%04x\n", get_register_name(dest.Register), - get_register(dest.Register)); + + accessed_registers[dest.Register.Index] = true; } } } } + for (u32 i = 0; i < REGISTER_COUNT; ++i) { + if (accessed_registers[i]) { + register_access reg = {i, 0, 2}; + u16 value = get_register(reg); + + printf("%s: 0x%04x (%d)\n", get_register_name(reg), value, value); + } + } + return 0; }