From c57f8ddcbf890050b994f3513dd0ba46eb1719c9 Mon Sep 17 00:00:00 2001 From: Raymaekers Luca Date: Fri, 17 Oct 2025 14:01:05 +0200 Subject: checkpoint --- src/code/sim86.cpp | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) (limited to 'src/code/sim86.cpp') diff --git a/src/code/sim86.cpp b/src/code/sim86.cpp index b6fb57b..7903fb6 100644 --- a/src/code/sim86.cpp +++ b/src/code/sim86.cpp @@ -101,9 +101,9 @@ OperandsToValues(s32 *Registers, } else if(DestinationOperand->Type == Operand_Immediate) { - Assert(0 && "not implemented yet."); + Result.Destination = &DestinationOperand->Immediate.Value; } - else + else if(SourceOperand->Type != Operand_None) { Assert(0); } @@ -121,7 +121,7 @@ OperandsToValues(s32 *Registers, { Assert(0 && "not implemented yet."); } - else + else if(SourceOperand->Type != Operand_None) { Assert(0); } @@ -135,15 +135,16 @@ Run8086(psize DisassemblySize, u8 *Disassembly) { s32 Registers[Register_count] = {}; u32 FlagsRegister = 0; + u32 IPRegister = 0; - u32 Offset = 0; - while(Offset < DisassemblySize) + while(IPRegister < DisassemblySize) { instruction Decoded; - Sim86_Decode8086Instruction(DisassemblySize - Offset, Disassembly + Offset, &Decoded); + Sim86_Decode8086Instruction(DisassemblySize - IPRegister, Disassembly + IPRegister, &Decoded); if(Decoded.Op) { - Offset += Decoded.Size; + u32 OldIPRegister = IPRegister; + IPRegister += Decoded.Size; #if SIM86_INTERNAL printf("Size:%u Op:%s Flags:0x%x ;", Decoded.Size, Sim86_MnemonicFromOperationType(Decoded.Op), Decoded.Flags); @@ -198,7 +199,6 @@ Run8086(psize DisassemblySize, u8 *Disassembly) Assert(SourceOperand->Type == Operand_Register || SourceOperand->Type == Operand_Immediate); s32 Old = *Destination; - u32 OldFlags = FlagsRegister; *Destination = (u16)((u16)(*Destination) - ((u16)(*Source))); printf(" %s:0x%x->0x%x", Sim86_RegisterNameFromOperand(&DestinationOperand->Register), @@ -220,11 +220,29 @@ Run8086(psize DisassemblySize, u8 *Disassembly) FlagsFromValue(&FlagsRegister, Decoded.Flags, *Destination); } + else if(Decoded.Op == Op_jne) + { + if(!(FlagsRegister & Flag_Zero)) + { + IPRegister += *Destination; + } + } + else if(Decoded.Op == Op_je) + { + if((FlagsRegister & Flag_Zero)) + { + IPRegister += *Destination; + } + } else { Assert(0 && "Op not implemented yet."); } +#if SIM86_INTERNAL + printf(" ip:0x%x->0x%x", OldIPRegister, IPRegister); +#endif + } else { @@ -256,9 +274,11 @@ Run8086(psize DisassemblySize, u8 *Disassembly) Value, Value); } } + printf(" ip: 0x%04x (%d)\n", IPRegister, IPRegister); + char FlagsString[ArrayCount(FlagToCharMapping)] = {}; FlagsToString(FlagsString, FlagsRegister); - printf(" flags: %s", FlagsString); + printf(" flags: %s\n", FlagsString); } void PrintUsage(char *ExePath) -- cgit v1.2.3-70-g09d2