diff --git a/src/disasm.rs b/src/disasm.rs index 7a62763..a701cc8 100644 --- a/src/disasm.rs +++ b/src/disasm.rs @@ -634,12 +634,24 @@ impl Disassembler { 0xE8 => Mnemonic::CALL_v(self.parse_word()), - 0xE9 => Mnemonic::JMP_v(self.parse_word()), + // add to address of next instruction + 0xE9 => { + // first interpret as IByte, then cast for addition + let word = self.parse_word() as IByte as isize; + let next_addr = (self.offset + 1) as isize; + Mnemonic::JMP_v(next_addr + word) + } 0xEA => Mnemonic::JMP_p(Pointer { segment: self.parse_word(), offset: self.parse_word(), }), - 0xEB => Mnemonic::JMP_b(self.parse_byte()), + // add to address of next instruction + 0xEB => { + // first interpret as IByte, then cast for addition + let byte = self.parse_byte() as IByte as isize; + let next_addr = (self.offset + 1) as isize; + Mnemonic::JMP_b(next_addr + byte) + } 0xEC => Mnemonic::IN_ALDX, 0xED => Mnemonic::IN_AXDX, diff --git a/src/instructions.rs b/src/instructions.rs index 36c9ce4..868e155 100644 --- a/src/instructions.rs +++ b/src/instructions.rs @@ -235,8 +235,8 @@ pub enum Mnemonic { CALL_Mod(ModRmTarget), // JUMP JMP_p(Pointer), - JMP_b(Byte), - JMP_v(Word), + JMP_b(isize), // parses IByte, but stores as isize + JMP_v(isize), // parwses IWord, but stores as isize JMP_Mod(ModRmTarget), // WAIT WAIT,