diff --git a/src/emu/i8088.rs b/src/emu/i8088.rs index 3ec2633..17d6fa7 100644 --- a/src/emu/i8088.rs +++ b/src/emu/i8088.rs @@ -465,6 +465,7 @@ impl i8088 { 0x24 => and[flags, reglo=a, d8] / 4, // AND al, d8 0x25 => and[flags, reg=a, d16] / 4, // AND ax, d16 0x26 => nop[seg=es, prefix] / 2, + // 0x27 DAA not implemented 0x28 _ => sub[flags, modrm8, r8] / "3/24+", // SUB r/m8, r8 0x29 _ => sub[flags, modrm16, r16] / "3/24+", // SUB r/m16, r16 0x2A _ => sub[flags, r8, modrm8] / "3/13+", // SUB r8, r/m8 @@ -472,6 +473,7 @@ impl i8088 { 0x2C => sub[flags, reglo=a, d8] / 4, // SUB al, d8 0x2D => sub[flags, reg=a, d16] / 4, // SUB ax, d16 0x2E => nop[seg=cs, prefix] / 2, + // 0x2F DAS not implemented 0x30 _ => xor[flags, modrm8, r8] / "3/24+", // XOR r/m8, r8 0x31 _ => xor[flags, modrm16, r16] / "3/24+", // XOR r/m16, r16 0x32 _ => xor[flags, r8, modrm8] / "3/13+", // XOR r8, r/m8 @@ -479,6 +481,7 @@ impl i8088 { 0x34 => xor[flags, reglo=a, d8] / 4, // XOR al, d8 0x35 => xor[flags, reg=a, d16] / 4, // XOR ax, d16 0x36 => nop[seg=ss, prefix] / 2, + // 0x37 AAA not implemented 0x38 _ => cmp[flags, modrm8, r8] / "3/24+", 0x39 _ => cmp[flags, modrm16, r16] / "3/24+", 0x3A _ => cmp[flags, r8, modrm8] / "3/24+", @@ -486,6 +489,7 @@ impl i8088 { 0x3C => cmp[flags, reglo=a, d8] / "3/24+", 0x3D => cmp[flags, reg=a, d16] / "3/24+", 0x3E => nop[seg=ds, prefix] / 2, + // 0x3F AAS not implemented 0x40 => inc[flags, reg=a] / 3, 0x41 => inc[flags, reg=c] / 3, 0x42 => inc[flags, reg=d] / 3, @@ -590,6 +594,8 @@ impl i8088 { 0x97 => xchg[reg=a, reg=di] / 3, // XCHG ax, di 0x98 => cbw[reg=a, reglo=a] / 2, // CBW 0x99 => cwd[reg=d, reg=a] / 5, // CWD + // 0x9A CALL seg:a16 todo + // 0x9B WAIT not implemented 0x9C => push[bus, regval=ss, reg=sp, flags] / 14, // PUSHF 0x9D => pop[bus, regval=ss, reg=sp, flags] / 12, // POPF // 0x9E SAHF not implemented @@ -626,10 +632,18 @@ impl i8088 { 0xBD => mov[reg=bp, d16] / 4, // MOV bp, d16 0xBE => mov[reg=si, d16] / 4, // MOV si, d16 0xBF => mov[reg=di, d16] / 4, // MOV di, d16 + // 0xC2 RET d16 todo 0xC3 => pop[bus, regval=ss, reg=sp, reg=ip] / 20, // RET + // 0xC4 LES todo + // 0xC5 LDS todo 0xC6: { 0x00 => mov[modrm8, d8] / "4/14+" }, // MOV r/m8, d8 0xC7: { 0x00 => mov[modrm16, d16] / "4/14+" }, // MOV r/m16, d16 + // 0xCA RETF d16 todo + // 0xCB RETF todo + // 0xCC INT3/bend todo 0xCD => int[cpu, bus, d8] / 71, + // 0xCE INTO todo? + // 0xCF IRET todo 0xD0: { 0x00 => rol[form=byte3, flags, modrm8, const=1u8] / "2/23+", // ROL r/m16, 1 0x08 => ror[form=byte3, flags, modrm8, const=1u8] / "2/23+", // ROR r/m16, 1 0x10 => rcl[form=byte3, flags, modrm8, const=1u8] / "2/23+", // RCL r/m16, 1 @@ -658,30 +672,60 @@ impl i8088 { 0x20 => shl[form=word3, flags, modrm16, reglo=c] / "2/23+", // SHL r/m16, CL 0x28 => shr[form=word3, flags, modrm16, reglo=c] / "2/23+", // SHR r/m16, CL 0x38 => sar[form=word3, flags, modrm16, reglo=c] / "2/23+" }, // SAR r/m16, CL + // 0xD4 AAM not implemented + // 0xD5 AAD not implemented + // 0xD6 *SALC todo? (unneeded but looks easy) + // 0xD7 XLAT todo + // 0xD8-0xDF ESC0-ESC7 not implemented 0xE0 => loopnz[flags, reg=ip, reg=c, rel8] / "18/6", // LOOPNZ/LOOPNE rel8 0xE1 => loopz[flags, reg=ip, reg=c, rel8] / "18/6", // LOOPZ/LOOPE rel8 0xE2 => looop[reg=ip, reg=c, rel8] / "17/5", // LOOP rel8 0xE3 => jcxz[reg=ip, reg=c, rel8] / "18/6", // JCXZ rel8 - 0xE9 => jmp[reg=ip, rel16] / 15, // JMP rel16 - 0xEB => jmp[reg=ip, rel8] / 15, // JMP rel8 + // 0xE4 IN AL,[d8] todo + // 0xE5 IN AX,[d16] todo + // 0xE6 OUT [d8],AL todo + // 0xE7 OUT [d16],AX todo 0xE8 => call[reg=ip, bus, regval=ss, reg=sp, rel16] / 23, // CALL rel16 + 0xE9 => jmp[reg=ip, rel16] / 15, // JMP rel16 + // 0xEA JMP seg:a16 todo + 0xEB => jmp[reg=ip, rel8] / 15, // JMP rel8 + // 0xEC IN AL,[DX] todo + // 0xED IN AX,[DX] todo + // 0xEE OUT [DX],AL todo + // 0xEF OUT [DX],AX todo + // 0xF0 not implemented 0xF2 => nop[rep=NotEqual, prefix] / 0, // REPNE/REPNZ 0xF3 => nop[rep=Equal, prefix] / 0, // REP/REPE/REPZ + // 0xF4 HLT not implemented (consider making this todo) 0xF5 => cmc[flags] / 2, // CMC (Complement Carry Flag) 0xF6: { 0x00 => test[flags, modrm8, d8] / "5/11+", // TEST r/m8, d8 0x10 => not[form=byte1, modrm8] / "3/24+", // NOT r/m8 - 0x18 => neg[form=byte1, flags, modrm8] / "3/24+" }, // NEG r/m8 + 0x18 => neg[form=byte1, flags, modrm8] / "3/24+" // NEG r/m8 + // 0x20 MUL r/m8 todo + // 0x28 IMUL r/m8 todo + // 0x30 DIV r/m8 todo + /* 0x38 IDIV r/m8 todo */ }, 0xF7: { 0x00 => test[flags, modrm16, d16] / "5/11+", // TEST r/m16, d16 0x10 => not[form=word1, modrm16] / "3/24+", // NOT r/m16 - 0x18 => neg[form=word1, flags, modrm16] / "3/24+" }, // NEG r/m16 + 0x18 => neg[form=word1, flags, modrm16] / "3/24+" // NEG r/m16 + // 0x20 MUL r/m16 todo + // 0x28 IMUL r/m16 todo + // 0x30 DIV r/m16 todo + /* 0x38 IDIV r/m16 todo */ }, 0xF8 => clc[flags] / 2, // CLC (Clear Carry Flag) 0xF9 => stc[flags] / 2, // STC (Set Carry Flag) + // 0xFA CLI todo + // 0xFB STI todo 0xFC => cld[flags] / 2, // CLD (Clear Direction Flag) 0xFD => std[flags] / 2, // STD (Set Direction Flag) 0xFE: { 0x00 => inc[form=byte1, flags, modrm8] / "3/23+", // INC r/m8 0x08 => dec[form=byte1, flags, modrm8] / "3/23+", }, // DEC r/m8 0xFF: { 0x00 => inc[form=word1, flags, modrm16] / "3/23+", // INC r/m16 - 0x08 => dec[form=word1, flags, modrm16] / "3/23+", // DEC r/m16 + 0x08 => dec[form=word1, flags, modrm16] / "3/23+", // DEC r/m16 + // 0x10 CALL r/m16 todo + // 0x18 CALL m32 todo + // 0x20 JMP r/m16 todo + // 0x28 JMP m32 todo 0x30 => push_modrm[regval=ss, reg=sp, modrm16, convert, bus] / "15/24+" }, }, modrm: {