Lines Matching defs:emu

177 x86emu_intr_dispatch(struct x86emu *emu, uint8_t intno)
179 if (emu->_x86emu_intrTab[intno]) {
180 (*emu->_x86emu_intrTab[intno]) (emu, intno);
182 push_word(emu, (uint16_t) emu->x86.R_FLG);
185 push_word(emu, emu->x86.R_CS);
186 emu->x86.R_CS = fetch_word(emu, 0, intno * 4 + 2);
187 push_word(emu, emu->x86.R_IP);
188 emu->x86.R_IP = fetch_word(emu, 0, intno * 4);
193 x86emu_intr_handle(struct x86emu *emu)
197 if (emu->x86.intr & INTR_SYNCH) {
198 intno = emu->x86.intno;
199 emu->x86.intr = 0;
200 x86emu_intr_dispatch(emu, intno);
213 x86emu_intr_raise(struct x86emu *emu, uint8_t intrnum)
215 emu->x86.intno = intrnum;
216 emu->x86.intr |= INTR_SYNCH;
226 x86emu_exec(struct x86emu *emu)
228 emu->x86.intr = 0;
231 if (setjmp(&emu->exec_state))
234 if (setjmp(emu->exec_state))
239 if (emu->x86.intr) {
240 if (((emu->x86.intr & INTR_SYNCH) &&
241 (emu->x86.intno == 0 || emu->x86.intno == 2)) ||
243 x86emu_intr_handle(emu);
246 if (emu->x86.R_CS == 0 && emu->x86.R_IP == 0)
248 x86emu_exec_one_byte(emu);
249 ++emu->cur_cycles;
254 x86emu_exec_call(struct x86emu *emu, uint16_t seg, uint16_t off)
256 push_word(emu, 0);
257 push_word(emu, 0);
258 emu->x86.R_CS = seg;
259 emu->x86.R_IP = off;
261 x86emu_exec(emu);
265 x86emu_exec_intr(struct x86emu *emu, uint8_t intr)
267 push_word(emu, emu->x86.R_FLG);
270 push_word(emu, 0);
271 push_word(emu, 0);
272 emu->x86.R_CS = (*emu->emu_rdw)(emu, intr * 4 + 2);
273 emu->x86.R_IP = (*emu->emu_rdw)(emu, intr * 4);
274 emu->x86.intr = 0;
276 x86emu_exec(emu);
284 x86emu_halt_sys(struct x86emu *emu)
287 longjmp(&emu->exec_state);
289 longjmp(emu->exec_state, 1);
303 * NOTE: Do not inline this function, as (*emu->emu_rdb) is already inline!
306 fetch_decode_modrm(struct x86emu *emu)
310 fetched = fetch_byte_imm(emu);
311 emu->cur_mod = (fetched >> 6) & 0x03;
312 emu->cur_rh = (fetched >> 3) & 0x07;
313 emu->cur_rl = (fetched >> 0) & 0x07;
324 * NOTE: Do not inline this function, as (*emu->emu_rdb) is already inline!
327 fetch_byte_imm(struct x86emu *emu)
331 fetched = fetch_byte(emu, emu->x86.R_CS, emu->x86.R_IP);
332 emu->x86.R_IP++;
344 * NOTE: Do not inline this function, as (*emu->emu_rdw) is already inline!
347 fetch_word_imm(struct x86emu *emu)
351 fetched = fetch_word(emu, emu->x86.R_CS, emu->x86.R_IP);
352 emu->x86.R_IP += 2;
364 * NOTE: Do not inline this function, as (*emu->emu_rdw) is already inline!
367 fetch_long_imm(struct x86emu *emu)
371 fetched = fetch_long(emu, emu->x86.R_CS, emu->x86.R_IP);
372 emu->x86.R_IP += 4;
389 * cpu-state-variable emu->x86.mode. There are several potential states:
406 get_data_segment(struct x86emu *emu)
408 switch (emu->x86.mode & SYSMODE_SEGMASK) {
412 return emu->x86.R_DS;
414 return emu->x86.R_SS;
417 return emu->x86.R_CS;
420 return emu->x86.R_ES;
423 return emu->x86.R_FS;
426 return emu->x86.R_GS;
429 return emu->x86.R_SS;
431 x86emu_halt_sys(emu);
441 * NOTE: Do not inline this function as (*emu->emu_rdX) is already inline!
444 fetch_data_byte(struct x86emu *emu, uint32_t offset)
446 return fetch_byte(emu, get_data_segment(emu), offset);
456 * NOTE: Do not inline this function as (*emu->emu_rdX) is already inline!
459 fetch_data_word(struct x86emu *emu, uint32_t offset)
461 return fetch_word(emu, get_data_segment(emu), offset);
471 * NOTE: Do not inline this function as (*emu->emu_rdX) is already inline!
474 fetch_data_long(struct x86emu *emu, uint32_t offset)
476 return fetch_long(emu, get_data_segment(emu), offset);
487 * NOTE: Do not inline this function as (*emu->emu_rdX) is already inline!
490 fetch_byte(struct x86emu *emu, uint32_t segment, uint32_t offset)
492 return (*emu->emu_rdb) (emu, ((uint32_t) segment << 4) + offset);
503 * NOTE: Do not inline this function as (*emu->emu_rdX) is already inline!
506 fetch_word(struct x86emu *emu, uint32_t segment, uint32_t offset)
508 return (*emu->emu_rdw) (emu, ((uint32_t) segment << 4) + offset);
519 * NOTE: Do not inline this function as (*emu->emu_rdX) is already inline!
522 fetch_long(struct x86emu *emu, uint32_t segment, uint32_t offset)
524 return (*emu->emu_rdl) (emu, ((uint32_t) segment << 4) + offset);
536 * NOTE: Do not inline this function as (*emu->emu_wrX) is already inline!
539 store_data_byte(struct x86emu *emu, uint32_t offset, uint8_t val)
541 store_byte(emu, get_data_segment(emu), offset, val);
553 * NOTE: Do not inline this function as (*emu->emu_wrX) is already inline!
556 store_data_word(struct x86emu *emu, uint32_t offset, uint16_t val)
558 store_word(emu, get_data_segment(emu), offset, val);
570 * NOTE: Do not inline this function as (*emu->emu_wrX) is already inline!
573 store_data_long(struct x86emu *emu, uint32_t offset, uint32_t val)
575 store_long(emu, get_data_segment(emu), offset, val);
587 * NOTE: Do not inline this function as (*emu->emu_wrX) is already inline!
590 store_byte(struct x86emu *emu, uint32_t segment, uint32_t offset, uint8_t val)
592 (*emu->emu_wrb) (emu, ((uint32_t) segment << 4) + offset, val);
604 * NOTE: Do not inline this function as (*emu->emu_wrX) is already inline!
607 store_word(struct x86emu *emu, uint32_t segment, uint32_t offset, uint16_t val)
609 (*emu->emu_wrw) (emu, ((uint32_t) segment << 4) + offset, val);
621 * NOTE: Do not inline this function as (*emu->emu_wrX) is already inline!
624 store_long(struct x86emu *emu, uint32_t segment, uint32_t offset, uint32_t val)
626 (*emu->emu_wrl) (emu, ((uint32_t) segment << 4) + offset, val);
641 decode_rm_byte_register(struct x86emu *emu, int reg)
645 return &emu->x86.R_AL;
647 return &emu->x86.R_CL;
649 return &emu->x86.R_DL;
651 return &emu->x86.R_BL;
653 return &emu->x86.R_AH;
655 return &emu->x86.R_CH;
657 return &emu->x86.R_DH;
659 return &emu->x86.R_BH;
661 x86emu_halt_sys(emu);
666 decode_rl_byte_register(struct x86emu *emu)
668 return decode_rm_byte_register(emu, emu->cur_rl);
672 decode_rh_byte_register(struct x86emu *emu)
674 return decode_rm_byte_register(emu, emu->cur_rh);
689 decode_rm_word_register(struct x86emu *emu, int reg)
693 return &emu->x86.R_AX;
695 return &emu->x86.R_CX;
697 return &emu->x86.R_DX;
699 return &emu->x86.R_BX;
701 return &emu->x86.R_SP;
703 return &emu->x86.R_BP;
705 return &emu->x86.R_SI;
707 return &emu->x86.R_DI;
709 x86emu_halt_sys(emu);
714 decode_rl_word_register(struct x86emu *emu)
716 return decode_rm_word_register(emu, emu->cur_rl);
720 decode_rh_word_register(struct x86emu *emu)
722 return decode_rm_word_register(emu, emu->cur_rh);
737 decode_rm_long_register(struct x86emu *emu, int reg)
741 return &emu->x86.R_EAX;
743 return &emu->x86.R_ECX;
745 return &emu->x86.R_EDX;
747 return &emu->x86.R_EBX;
749 return &emu->x86.R_ESP;
751 return &emu->x86.R_EBP;
753 return &emu->x86.R_ESI;
755 return &emu->x86.R_EDI;
757 x86emu_halt_sys(emu);
762 decode_rl_long_register(struct x86emu *emu)
764 return decode_rm_long_register(emu, emu->cur_rl);
768 decode_rh_long_register(struct x86emu *emu)
770 return decode_rm_long_register(emu, emu->cur_rh);
787 decode_rh_seg_register(struct x86emu *emu)
789 switch (emu->cur_rh) {
791 return &emu->x86.R_ES;
793 return &emu->x86.R_CS;
795 return &emu->x86.R_SS;
797 return &emu->x86.R_DS;
799 return &emu->x86.R_FS;
801 return &emu->x86.R_GS;
803 x86emu_halt_sys(emu);
811 decode_sib_address(struct x86emu *emu, int sib, int mod)
817 base = emu->x86.R_EAX;
820 base = emu->x86.R_ECX;
824 base = emu->x86.R_EDX;
827 base = emu->x86.R_EBX;
830 base = emu->x86.R_ESP;
831 emu->x86.mode |= SYSMODE_SEG_DS_SS;
835 base = fetch_long_imm(emu);
837 base = emu->x86.R_EBP;
838 emu->x86.mode |= SYSMODE_SEG_DS_SS;
842 base = emu->x86.R_ESI;
845 base = emu->x86.R_EDI;
850 i = emu->x86.R_EAX;
853 i = emu->x86.R_ECX;
856 i = emu->x86.R_EDX;
859 i = emu->x86.R_EBX;
865 i = emu->x86.R_EBP;
868 i = emu->x86.R_ESI;
871 i = emu->x86.R_EDI;
890 decode_rl_address(struct x86emu *emu)
892 if (emu->x86.mode & SYSMODE_PREFIX_ADDR) {
895 switch (emu->cur_rl) {
897 offset = emu->x86.R_EAX;
900 offset = emu->x86.R_ECX;
903 offset = emu->x86.R_EDX;
906 offset = emu->x86.R_EBX;
909 sib = fetch_byte_imm(emu);
910 offset = decode_sib_address(emu, sib, 0);
913 if (emu->cur_mod == 0) {
914 offset = fetch_long_imm(emu);
916 emu->x86.mode |= SYSMODE_SEG_DS_SS;
917 offset = emu->x86.R_EBP;
921 offset = emu->x86.R_ESI;
924 offset = emu->x86.R_EDI;
927 x86emu_halt_sys(emu);
929 if (emu->cur_mod == 1)
930 offset += (int8_t)fetch_byte_imm(emu);
931 else if (emu->cur_mod == 2)
932 offset += fetch_long_imm(emu);
938 switch (emu->cur_rl) {
940 offset = emu->x86.R_BX + emu->x86.R_SI;
943 offset = emu->x86.R_BX + emu->x86.R_DI;
946 emu->x86.mode |= SYSMODE_SEG_DS_SS;
947 offset = emu->x86.R_BP + emu->x86.R_SI;
950 emu->x86.mode |= SYSMODE_SEG_DS_SS;
951 offset = emu->x86.R_BP + emu->x86.R_DI;
954 offset = emu->x86.R_SI;
957 offset = emu->x86.R_DI;
960 if (emu->cur_mod == 0) {
961 offset = fetch_word_imm(emu);
963 emu->x86.mode |= SYSMODE_SEG_DS_SS;
964 offset = emu->x86.R_BP;
968 offset = emu->x86.R_BX;
971 x86emu_halt_sys(emu);
973 if (emu->cur_mod == 1)
974 offset += (int8_t)fetch_byte_imm(emu);
975 else if (emu->cur_mod == 2)
976 offset += fetch_word_imm(emu);
982 decode_and_fetch_byte(struct x86emu *emu)
984 if (emu->cur_mod != 3) {
985 emu->cur_offset = decode_rl_address(emu);
986 return fetch_data_byte(emu, emu->cur_offset);
988 return *decode_rl_byte_register(emu);
993 decode_and_fetch_word_disp(struct x86emu *emu, int16_t disp)
995 if (emu->cur_mod != 3) {
997 emu->cur_offset = decode_rl_address(emu) + disp;
998 if ((emu->x86.mode & SYSMODE_PREFIX_ADDR) == 0)
999 emu->cur_offset &= 0xffff;
1000 return fetch_data_word(emu, emu->cur_offset);
1002 return *decode_rl_word_register(emu);
1007 decode_and_fetch_long_disp(struct x86emu *emu, int16_t disp)
1009 if (emu->cur_mod != 3) {
1011 emu->cur_offset = decode_rl_address(emu) + disp;
1012 if ((emu->x86.mode & SYSMODE_PREFIX_ADDR) == 0)
1013 emu->cur_offset &= 0xffff;
1014 return fetch_data_long(emu, emu->cur_offset);
1016 return *decode_rl_long_register(emu);
1021 decode_and_fetch_word(struct x86emu *emu)
1023 return decode_and_fetch_word_disp(emu, 0);
1027 decode_and_fetch_long(struct x86emu *emu)
1029 return decode_and_fetch_long_disp(emu, 0);
1033 decode_and_fetch_byte_imm8(struct x86emu *emu, uint8_t *imm)
1035 if (emu->cur_mod != 3) {
1036 emu->cur_offset = decode_rl_address(emu);
1037 *imm = fetch_byte_imm(emu);
1038 return fetch_data_byte(emu, emu->cur_offset);
1040 *imm = fetch_byte_imm(emu);
1041 return *decode_rl_byte_register(emu);
1046 decode_and_fetch_word_imm8(struct x86emu *emu, uint8_t *imm)
1048 if (emu->cur_mod != 3) {
1049 emu->cur_offset = decode_rl_address(emu);
1050 *imm = fetch_byte_imm(emu);
1051 return fetch_data_word(emu, emu->cur_offset);
1053 *imm = fetch_byte_imm(emu);
1054 return *decode_rl_word_register(emu);
1059 decode_and_fetch_long_imm8(struct x86emu *emu, uint8_t *imm)
1061 if (emu->cur_mod != 3) {
1062 emu->cur_offset = decode_rl_address(emu);
1063 *imm = fetch_byte_imm(emu);
1064 return fetch_data_long(emu, emu->cur_offset);
1066 *imm = fetch_byte_imm(emu);
1067 return *decode_rl_long_register(emu);
1072 write_back_byte(struct x86emu *emu, uint8_t val)
1074 if (emu->cur_mod != 3)
1075 store_data_byte(emu, emu->cur_offset, val);
1077 *decode_rl_byte_register(emu) = val;
1081 write_back_word(struct x86emu *emu, uint16_t val)
1083 if (emu->cur_mod != 3)
1084 store_data_word(emu, emu->cur_offset, val);
1086 *decode_rl_word_register(emu) = val;
1090 write_back_long(struct x86emu *emu, uint32_t val)
1092 if (emu->cur_mod != 3)
1093 store_data_long(emu, emu->cur_offset, val);
1095 *decode_rl_long_register(emu) = val;
1099 common_inc_word_long(struct x86emu *emu, union x86emu_register *reg)
1101 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1102 reg->I32_reg.e_reg = inc_long(emu, reg->I32_reg.e_reg);
1104 reg->I16_reg.x_reg = inc_word(emu, reg->I16_reg.x_reg);
1108 common_dec_word_long(struct x86emu *emu, union x86emu_register *reg)
1110 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1111 reg->I32_reg.e_reg = dec_long(emu, reg->I32_reg.e_reg);
1113 reg->I16_reg.x_reg = dec_word(emu, reg->I16_reg.x_reg);
1117 common_binop_byte_rm_r(struct x86emu *emu,
1124 fetch_decode_modrm(emu);
1125 srcval = *decode_rh_byte_register(emu);
1126 if (emu->cur_mod != 3) {
1127 destoffset = decode_rl_address(emu);
1128 destval = fetch_data_byte(emu, destoffset);
1129 destval = (*binop)(emu, destval, srcval);
1130 store_data_byte(emu, destoffset, destval);
1132 destreg = decode_rl_byte_register(emu);
1133 *destreg = (*binop)(emu, *destreg, srcval);
1138 common_binop_ns_byte_rm_r(struct x86emu *emu,
1144 fetch_decode_modrm(emu);
1145 srcval = *decode_rh_byte_register(emu);
1146 if (emu->cur_mod != 3) {
1147 destoffset = decode_rl_address(emu);
1148 destval = fetch_data_byte(emu, destoffset);
1150 destval = *decode_rl_byte_register(emu);
1152 (*binop)(emu, destval, srcval);
1156 common_binop_word_rm_r(struct x86emu *emu,
1162 fetch_decode_modrm(emu);
1163 srcval = *decode_rh_word_register(emu);
1164 if (emu->cur_mod != 3) {
1165 destoffset = decode_rl_address(emu);
1166 destval = fetch_data_word(emu, destoffset);
1167 destval = (*binop)(emu, destval, srcval);
1168 store_data_word(emu, destoffset, destval);
1170 destreg = decode_rl_word_register(emu);
1171 *destreg = (*binop)(emu, *destreg, srcval);
1176 common_binop_byte_r_rm(struct x86emu *emu,
1182 fetch_decode_modrm(emu);
1183 destreg = decode_rh_byte_register(emu);
1184 if (emu->cur_mod != 3) {
1185 srcoffset = decode_rl_address(emu);
1186 srcval = fetch_data_byte(emu, srcoffset);
1188 srcval = *decode_rl_byte_register(emu);
1190 *destreg = (*binop)(emu, *destreg, srcval);
1194 common_binop_long_rm_r(struct x86emu *emu,
1200 fetch_decode_modrm(emu);
1201 srcval = *decode_rh_long_register(emu);
1202 if (emu->cur_mod != 3) {
1203 destoffset = decode_rl_address(emu);
1204 destval = fetch_data_long(emu, destoffset);
1205 destval = (*binop)(emu, destval, srcval);
1206 store_data_long(emu, destoffset, destval);
1208 destreg = decode_rl_long_register(emu);
1209 *destreg = (*binop)(emu, *destreg, srcval);
1214 common_binop_word_long_rm_r(struct x86emu *emu,
1218 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1219 common_binop_long_rm_r(emu, binop32);
1221 common_binop_word_rm_r(emu, binop16);
1225 common_binop_ns_word_rm_r(struct x86emu *emu,
1231 fetch_decode_modrm(emu);
1232 srcval = *decode_rh_word_register(emu);
1233 if (emu->cur_mod != 3) {
1234 destoffset = decode_rl_address(emu);
1235 destval = fetch_data_word(emu, destoffset);
1237 destval = *decode_rl_word_register(emu);
1239 (*binop)(emu, destval, srcval);
1244 common_binop_ns_long_rm_r(struct x86emu *emu,
1250 fetch_decode_modrm(emu);
1251 srcval = *decode_rh_long_register(emu);
1252 if (emu->cur_mod != 3) {
1253 destoffset = decode_rl_address(emu);
1254 destval = fetch_data_long(emu, destoffset);
1256 destval = *decode_rl_long_register(emu);
1258 (*binop)(emu, destval, srcval);
1262 common_binop_ns_word_long_rm_r(struct x86emu *emu,
1266 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1267 common_binop_ns_long_rm_r(emu, binop32);
1269 common_binop_ns_word_rm_r(emu, binop16);
1273 common_binop_long_r_rm(struct x86emu *emu,
1279 fetch_decode_modrm(emu);
1280 destreg = decode_rh_long_register(emu);
1281 if (emu->cur_mod != 3) {
1282 srcoffset = decode_rl_address(emu);
1283 srcval = fetch_data_long(emu, srcoffset);
1285 srcval = *decode_rl_long_register(emu);
1287 *destreg = (*binop)(emu, *destreg, srcval);
1291 common_binop_word_r_rm(struct x86emu *emu,
1297 fetch_decode_modrm(emu);
1298 destreg = decode_rh_word_register(emu);
1299 if (emu->cur_mod != 3) {
1300 srcoffset = decode_rl_address(emu);
1301 srcval = fetch_data_word(emu, srcoffset);
1303 srcval = *decode_rl_word_register(emu);
1305 *destreg = (*binop)(emu, *destreg, srcval);
1309 common_binop_word_long_r_rm(struct x86emu *emu,
1313 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1314 common_binop_long_r_rm(emu, binop32);
1316 common_binop_word_r_rm(emu, binop16);
1320 common_binop_byte_imm(struct x86emu *emu,
1325 srcval = fetch_byte_imm(emu);
1326 emu->x86.R_AL = (*binop)(emu, emu->x86.R_AL, srcval);
1330 common_binop_word_long_imm(struct x86emu *emu,
1334 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
1337 srcval = fetch_long_imm(emu);
1338 emu->x86.R_EAX = (*binop32)(emu, emu->x86.R_EAX, srcval);
1342 srcval = fetch_word_imm(emu);
1343 emu->x86.R_AX = (*binop16)(emu, emu->x86.R_AX, srcval);
1348 common_push_word_long(struct x86emu *emu, union x86emu_register *reg)
1350 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1351 push_long(emu, reg->I32_reg.e_reg);
1353 push_word(emu, reg->I16_reg.x_reg);
1357 common_pop_word_long(struct x86emu *emu, union x86emu_register *reg)
1359 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1360 reg->I32_reg.e_reg = pop_long(emu);
1362 reg->I16_reg.x_reg = pop_word(emu);
1366 common_imul_long_IMM(struct x86emu *emu, int byte_imm)
1373 fetch_decode_modrm(emu);
1374 destreg = decode_rh_long_register(emu);
1375 if (emu->cur_mod != 3) {
1376 srcoffset = decode_rl_address(emu);
1377 srcval = fetch_data_long(emu, srcoffset);
1379 srcval = *decode_rl_long_register(emu);
1383 imm = (int8_t)fetch_byte_imm(emu);
1385 imm = fetch_long_imm(emu);
1399 common_imul_word_IMM(struct x86emu *emu, int byte_imm)
1406 fetch_decode_modrm(emu);
1407 destreg = decode_rh_word_register(emu);
1408 if (emu->cur_mod != 3) {
1409 srcoffset = decode_rl_address(emu);
1410 srcval = fetch_data_word(emu, srcoffset);
1412 srcval = *decode_rl_word_register(emu);
1416 imm = (int8_t)fetch_byte_imm(emu);
1418 imm = fetch_word_imm(emu);
1432 common_imul_imm(struct x86emu *emu, int byte_imm)
1434 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1435 common_imul_long_IMM(emu, byte_imm);
1437 common_imul_word_IMM(emu, byte_imm);
1441 common_jmp_near(struct x86emu *emu, int cond)
1446 offset = (int8_t) fetch_byte_imm(emu);
1447 target = (uint16_t) (emu->x86.R_IP + (int16_t) offset);
1449 emu->x86.R_IP = target;
1453 common_load_far_pointer(struct x86emu *emu, uint16_t *seg)
1458 fetch_decode_modrm(emu);
1459 if (emu->cur_mod == 3)
1460 x86emu_halt_sys(emu);
1462 dstreg = decode_rh_word_register(emu);
1463 srcoffset = decode_rl_address(emu);
1464 *dstreg = fetch_data_word(emu, srcoffset);
1465 *seg = fetch_data_word(emu, srcoffset + 2);
1475 x86emuOp_cmp_byte_R_RM(struct x86emu *emu)
1479 fetch_decode_modrm(emu);
1480 destreg = decode_rh_byte_register(emu);
1481 srcval = decode_and_fetch_byte(emu);
1482 cmp_byte(emu, *destreg, srcval);
1491 x86emuOp32_cmp_word_R_RM(struct x86emu *emu)
1495 fetch_decode_modrm(emu);
1496 destreg = decode_rh_long_register(emu);
1497 srcval = decode_and_fetch_long(emu);
1498 cmp_long(emu, *destreg, srcval);
1502 x86emuOp16_cmp_word_R_RM(struct x86emu *emu)
1506 fetch_decode_modrm(emu);
1507 destreg = decode_rh_word_register(emu);
1508 srcval = decode_and_fetch_word(emu);
1509 cmp_word(emu, *destreg, srcval);
1513 x86emuOp_cmp_word_R_RM(struct x86emu *emu)
1515 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1516 x86emuOp32_cmp_word_R_RM(emu);
1518 x86emuOp16_cmp_word_R_RM(emu);
1526 x86emuOp_cmp_byte_AL_IMM(struct x86emu *emu)
1530 srcval = fetch_byte_imm(emu);
1531 cmp_byte(emu, emu->x86.R_AL, srcval);
1539 x86emuOp32_cmp_word_AX_IMM(struct x86emu *emu)
1543 srcval = fetch_long_imm(emu);
1544 cmp_long(emu, emu->x86.R_EAX, srcval);
1548 x86emuOp16_cmp_word_AX_IMM(struct x86emu *emu)
1552 srcval = fetch_word_imm(emu);
1553 cmp_word(emu, emu->x86.R_AX, srcval);
1557 x86emuOp_cmp_word_AX_IMM(struct x86emu *emu)
1559 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1560 x86emuOp32_cmp_word_AX_IMM(emu);
1562 x86emuOp16_cmp_word_AX_IMM(emu);
1570 x86emuOp_push_all(struct x86emu *emu)
1572 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
1573 uint32_t old_sp = emu->x86.R_ESP;
1575 push_long(emu, emu->x86.R_EAX);
1576 push_long(emu, emu->x86.R_ECX);
1577 push_long(emu, emu->x86.R_EDX);
1578 push_long(emu, emu->x86.R_EBX);
1579 push_long(emu, old_sp);
1580 push_long(emu, emu->x86.R_EBP);
1581 push_long(emu, emu->x86.R_ESI);
1582 push_long(emu, emu->x86.R_EDI);
1584 uint16_t old_sp = emu->x86.R_SP;
1586 push_word(emu, emu->x86.R_AX);
1587 push_word(emu, emu->x86.R_CX);
1588 push_word(emu, emu->x86.R_DX);
1589 push_word(emu, emu->x86.R_BX);
1590 push_word(emu, old_sp);
1591 push_word(emu, emu->x86.R_BP);
1592 push_word(emu, emu->x86.R_SI);
1593 push_word(emu, emu->x86.R_DI);
1602 x86emuOp_pop_all(struct x86emu *emu)
1604 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
1605 emu->x86.R_EDI = pop_long(emu);
1606 emu->x86.R_ESI = pop_long(emu);
1607 emu->x86.R_EBP = pop_long(emu);
1608 emu->x86.R_ESP += 4; /* skip ESP */
1609 emu->x86.R_EBX = pop_long(emu);
1610 emu->x86.R_EDX = pop_long(emu);
1611 emu->x86.R_ECX = pop_long(emu);
1612 emu->x86.R_EAX = pop_long(emu);
1614 emu->x86.R_DI = pop_word(emu);
1615 emu->x86.R_SI = pop_word(emu);
1616 emu->x86.R_BP = pop_word(emu);
1617 emu->x86.R_SP += 2;/* skip SP */
1618 emu->x86.R_BX = pop_word(emu);
1619 emu->x86.R_DX = pop_word(emu);
1620 emu->x86.R_CX = pop_word(emu);
1621 emu->x86.R_AX = pop_word(emu);
1633 x86emuOp_push_word_IMM(struct x86emu *emu)
1635 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
1638 imm = fetch_long_imm(emu);
1639 push_long(emu, imm);
1643 imm = fetch_word_imm(emu);
1644 push_word(emu, imm);
1653 x86emuOp_push_byte_IMM(struct x86emu *emu)
1657 imm = (int8_t) fetch_byte_imm(emu);
1658 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
1659 push_long(emu, (int32_t) imm);
1661 push_word(emu, imm);
1670 x86emuOp_ins_word(struct x86emu *emu)
1672 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
1673 ins(emu, 4);
1675 ins(emu, 2);
1684 x86emuOp_outs_word(struct x86emu *emu)
1686 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
1687 outs(emu, 4);
1689 outs(emu, 2);
1698 x86emuOp_jump_near_L(struct x86emu *emu)
1705 common_jmp_near(emu, sf != of);
1713 x86emuOp_jump_near_NL(struct x86emu *emu)
1720 common_jmp_near(emu, sf == of);
1728 x86emuOp_jump_near_LE(struct x86emu *emu)
1735 common_jmp_near(emu, sf != of || ACCESS_FLAG(F_ZF));
1743 x86emuOp_jump_near_NLE(struct x86emu *emu)
1750 common_jmp_near(emu, sf == of && !ACCESS_FLAG(F_ZF));
1771 x86emuOp_opc80_byte_RM_IMM(struct x86emu *emu)
1780 fetch_decode_modrm(emu);
1781 destval = decode_and_fetch_byte(emu);
1782 imm = fetch_byte_imm(emu);
1783 destval = (*opc80_byte_operation[emu->cur_rh]) (emu, destval, imm);
1784 if (emu->cur_rh != 7)
1785 write_back_byte(emu, destval);
1821 x86emuOp32_opc81_word_RM_IMM(struct x86emu *emu)
1830 fetch_decode_modrm(emu);
1831 destval = decode_and_fetch_long(emu);
1832 imm = fetch_long_imm(emu);
1833 destval = (*opc81_long_operation[emu->cur_rh]) (emu, destval, imm);
1834 if (emu->cur_rh != 7)
1835 write_back_long(emu, destval);
1839 x86emuOp16_opc81_word_RM_IMM(struct x86emu *emu)
1848 fetch_decode_modrm(emu);
1849 destval = decode_and_fetch_word(emu);
1850 imm = fetch_word_imm(emu);
1851 destval = (*opc81_word_operation[emu->cur_rh]) (emu, destval, imm);
1852 if (emu->cur_rh != 7)
1853 write_back_word(emu, destval);
1857 x86emuOp_opc81_word_RM_IMM(struct x86emu *emu)
1859 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1860 x86emuOp32_opc81_word_RM_IMM(emu);
1862 x86emuOp16_opc81_word_RM_IMM(emu);
1884 x86emuOp_opc82_byte_RM_IMM(struct x86emu *emu)
1894 fetch_decode_modrm(emu);
1895 destval = decode_and_fetch_byte(emu);
1896 imm = fetch_byte_imm(emu);
1897 destval = (*opc82_byte_operation[emu->cur_rh]) (emu, destval, imm);
1898 if (emu->cur_rh != 7)
1899 write_back_byte(emu, destval);
1935 x86emuOp32_opc83_word_RM_IMM(struct x86emu *emu)
1939 fetch_decode_modrm(emu);
1940 destval = decode_and_fetch_long(emu);
1941 imm = (int8_t) fetch_byte_imm(emu);
1942 destval = (*opc83_long_operation[emu->cur_rh]) (emu, destval, imm);
1943 if (emu->cur_rh != 7)
1944 write_back_long(emu, destval);
1948 x86emuOp16_opc83_word_RM_IMM(struct x86emu *emu)
1952 fetch_decode_modrm(emu);
1953 destval = decode_and_fetch_word(emu);
1954 imm = (int8_t) fetch_byte_imm(emu);
1955 destval = (*opc83_word_operation[emu->cur_rh]) (emu, destval, imm);
1956 if (emu->cur_rh != 7)
1957 write_back_word(emu, destval);
1961 x86emuOp_opc83_word_RM_IMM(struct x86emu *emu)
1963 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1964 x86emuOp32_opc83_word_RM_IMM(emu);
1966 x86emuOp16_opc83_word_RM_IMM(emu);
1974 x86emuOp_xchg_byte_RM_R(struct x86emu *emu)
1978 fetch_decode_modrm(emu);
1979 destval = decode_and_fetch_byte(emu);
1980 srcreg = decode_rh_byte_register(emu);
1984 write_back_byte(emu, destval);
1992 x86emuOp32_xchg_word_RM_R(struct x86emu *emu)
1996 fetch_decode_modrm(emu);
1997 destval = decode_and_fetch_long(emu);
1998 srcreg = decode_rh_long_register(emu);
2002 write_back_long(emu, destval);
2006 x86emuOp16_xchg_word_RM_R(struct x86emu *emu)
2010 fetch_decode_modrm(emu);
2011 destval = decode_and_fetch_word(emu);
2012 srcreg = decode_rh_word_register(emu);
2016 write_back_word(emu, destval);
2020 x86emuOp_xchg_word_RM_R(struct x86emu *emu)
2022 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
2023 x86emuOp32_xchg_word_RM_R(emu);
2025 x86emuOp16_xchg_word_RM_R(emu);
2033 x86emuOp_mov_byte_RM_R(struct x86emu *emu)
2038 fetch_decode_modrm(emu);
2039 srcreg = decode_rh_byte_register(emu);
2040 if (emu->cur_mod != 3) {
2041 destoffset = decode_rl_address(emu);
2042 store_data_byte(emu, destoffset, *srcreg);
2044 destreg = decode_rl_byte_register(emu);
2054 x86emuOp32_mov_word_RM_R(struct x86emu *emu)
2059 fetch_decode_modrm(emu);
2060 srcval = *decode_rh_long_register(emu);
2061 if (emu->cur_mod != 3) {
2062 destoffset = decode_rl_address(emu);
2063 store_data_long(emu, destoffset, srcval);
2065 destreg = decode_rl_long_register(emu);
2071 x86emuOp16_mov_word_RM_R(struct x86emu *emu)
2076 fetch_decode_modrm(emu);
2077 srcval = *decode_rh_word_register(emu);
2078 if (emu->cur_mod != 3) {
2079 destoffset = decode_rl_address(emu);
2080 store_data_word(emu, destoffset, srcval);
2082 destreg = decode_rl_word_register(emu);
2088 x86emuOp_mov_word_RM_R(struct x86emu *emu)
2090 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
2091 x86emuOp32_mov_word_RM_R(emu);
2093 x86emuOp16_mov_word_RM_R(emu);
2101 x86emuOp_mov_byte_R_RM(struct x86emu *emu)
2105 fetch_decode_modrm(emu);
2106 destreg = decode_rh_byte_register(emu);
2107 *destreg = decode_and_fetch_byte(emu);
2115 x86emuOp_mov_word_R_RM(struct x86emu *emu)
2117 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2120 fetch_decode_modrm(emu);
2121 destreg = decode_rh_long_register(emu);
2122 *destreg = decode_and_fetch_long(emu);
2126 fetch_decode_modrm(emu);
2127 destreg = decode_rh_word_register(emu);
2128 *destreg = decode_and_fetch_word(emu);
2137 x86emuOp_mov_word_RM_SR(struct x86emu *emu)
2142 fetch_decode_modrm(emu);
2143 srcval = *decode_rh_seg_register(emu);
2144 if (emu->cur_mod != 3) {
2145 destoffset = decode_rl_address(emu);
2146 store_data_word(emu, destoffset, srcval);
2148 destreg = decode_rl_word_register(emu);
2158 x86emuOp_lea_word_R_M(struct x86emu *emu)
2162 fetch_decode_modrm(emu);
2163 if (emu->cur_mod == 3)
2164 x86emu_halt_sys(emu);
2166 destoffset = decode_rl_address(emu);
2167 if (emu->x86.mode & SYSMODE_PREFIX_ADDR) {
2170 srcreg = decode_rh_long_register(emu);
2175 srcreg = decode_rh_word_register(emu);
2185 x86emuOp_mov_word_SR_RM(struct x86emu *emu)
2189 fetch_decode_modrm(emu);
2190 destreg = decode_rh_seg_register(emu);
2191 *destreg = decode_and_fetch_word(emu);
2205 x86emuOp32_pop_RM(struct x86emu *emu)
2210 fetch_decode_modrm(emu);
2211 if (emu->cur_mod != 3) {
2212 destoffset = decode_rl_address(emu);
2213 destval = pop_long(emu);
2214 store_data_long(emu, destoffset, destval);
2216 destreg = decode_rl_long_register(emu);
2217 *destreg = pop_long(emu);
2222 x86emuOp16_pop_RM(struct x86emu *emu)
2227 fetch_decode_modrm(emu);
2228 if (emu->cur_mod != 3) {
2229 destoffset = decode_rl_address(emu);
2230 destval = pop_word(emu);
2231 store_data_word(emu, destoffset, destval);
2233 destreg = decode_rl_word_register(emu);
2234 *destreg = pop_word(emu);
2239 x86emuOp_pop_RM(struct x86emu *emu)
2241 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
2242 x86emuOp32_pop_RM(emu);
2244 x86emuOp16_pop_RM(emu);
2252 x86emuOp_xchg_word_AX_CX(struct x86emu *emu)
2256 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2257 tmp = emu->x86.R_EAX;
2258 emu->x86.R_EAX = emu->x86.R_ECX;
2259 emu->x86.R_ECX = tmp;
2261 tmp = emu->x86.R_AX;
2262 emu->x86.R_AX = emu->x86.R_CX;
2263 emu->x86.R_CX = (uint16_t) tmp;
2272 x86emuOp_xchg_word_AX_DX(struct x86emu *emu)
2276 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2277 tmp = emu->x86.R_EAX;
2278 emu->x86.R_EAX = emu->x86.R_EDX;
2279 emu->x86.R_EDX = tmp;
2281 tmp = emu->x86.R_AX;
2282 emu->x86.R_AX = emu->x86.R_DX;
2283 emu->x86.R_DX = (uint16_t) tmp;
2292 x86emuOp_xchg_word_AX_BX(struct x86emu *emu)
2296 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2297 tmp = emu->x86.R_EAX;
2298 emu->x86.R_EAX = emu->x86.R_EBX;
2299 emu->x86.R_EBX = tmp;
2301 tmp = emu->x86.R_AX;
2302 emu->x86.R_AX = emu->x86.R_BX;
2303 emu->x86.R_BX = (uint16_t) tmp;
2312 x86emuOp_xchg_word_AX_SP(struct x86emu *emu)
2316 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2317 tmp = emu->x86.R_EAX;
2318 emu->x86.R_EAX = emu->x86.R_ESP;
2319 emu->x86.R_ESP = tmp;
2321 tmp = emu->x86.R_AX;
2322 emu->x86.R_AX = emu->x86.R_SP;
2323 emu->x86.R_SP = (uint16_t) tmp;
2332 x86emuOp_xchg_word_AX_BP(struct x86emu *emu)
2336 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2337 tmp = emu->x86.R_EAX;
2338 emu->x86.R_EAX = emu->x86.R_EBP;
2339 emu->x86.R_EBP = tmp;
2341 tmp = emu->x86.R_AX;
2342 emu->x86.R_AX = emu->x86.R_BP;
2343 emu->x86.R_BP = (uint16_t) tmp;
2352 x86emuOp_xchg_word_AX_SI(struct x86emu *emu)
2356 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2357 tmp = emu->x86.R_EAX;
2358 emu->x86.R_EAX = emu->x86.R_ESI;
2359 emu->x86.R_ESI = tmp;
2361 tmp = emu->x86.R_AX;
2362 emu->x86.R_AX = emu->x86.R_SI;
2363 emu->x86.R_SI = (uint16_t) tmp;
2372 x86emuOp_xchg_word_AX_DI(struct x86emu *emu)
2376 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2377 tmp = emu->x86.R_EAX;
2378 emu->x86.R_EAX = emu->x86.R_EDI;
2379 emu->x86.R_EDI = tmp;
2381 tmp = emu->x86.R_AX;
2382 emu->x86.R_AX = emu->x86.R_DI;
2383 emu->x86.R_DI = (uint16_t) tmp;
2392 x86emuOp_cbw(struct x86emu *emu)
2394 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2395 if (emu->x86.R_AX & 0x8000) {
2396 emu->x86.R_EAX |= 0xffff0000;
2398 emu->x86.R_EAX &= 0x0000ffff;
2401 if (emu->x86.R_AL & 0x80) {
2402 emu->x86.R_AH = 0xff;
2404 emu->x86.R_AH = 0x0;
2414 x86emuOp_cwd(struct x86emu *emu)
2416 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2417 if (emu->x86.R_EAX & 0x80000000) {
2418 emu->x86.R_EDX = 0xffffffff;
2420 emu->x86.R_EDX = 0x0;
2423 if (emu->x86.R_AX & 0x8000) {
2424 emu->x86.R_DX = 0xffff;
2426 emu->x86.R_DX = 0x0;
2436 x86emuOp_call_far_IMM(struct x86emu *emu)
2440 faroff = fetch_word_imm(emu);
2441 farseg = fetch_word_imm(emu);
2447 push_word(emu, emu->x86.R_CS);
2448 emu->x86.R_CS = farseg;
2449 push_word(emu, emu->x86.R_IP);
2450 emu->x86.R_IP = faroff;
2458 x86emuOp_pushf_word(struct x86emu *emu)
2463 flags = (emu->x86.R_EFLG & F_MSK) | F_ALWAYS_ON;
2464 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2465 push_long(emu, flags);
2467 push_word(emu, (uint16_t) flags);
2476 x86emuOp_popf_word(struct x86emu *emu)
2478 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2479 emu->x86.R_EFLG = pop_long(emu);
2481 emu->x86.R_FLG = pop_word(emu);
2490 x86emuOp_sahf(struct x86emu *emu)
2493 emu->x86.R_FLG &= 0xffffff00;
2495 emu->x86.R_FLG |= emu->x86.R_AH;
2503 x86emuOp_lahf(struct x86emu *emu)
2505 emu->x86.R_AH = (uint8_t) (emu->x86.R_FLG & 0xff);
2508 emu->x86.R_AH |= 0x2;
2516 x86emuOp_mov_AL_M_IMM(struct x86emu *emu)
2520 offset = fetch_word_imm(emu);
2521 emu->x86.R_AL = fetch_data_byte(emu, offset);
2529 x86emuOp_mov_AX_M_IMM(struct x86emu *emu)
2533 offset = fetch_word_imm(emu);
2534 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2535 emu->x86.R_EAX = fetch_data_long(emu, offset);
2537 emu->x86.R_AX = fetch_data_word(emu, offset);
2546 x86emuOp_mov_M_AL_IMM(struct x86emu *emu)
2550 offset = fetch_word_imm(emu);
2551 store_data_byte(emu, offset, emu->x86.R_AL);
2559 x86emuOp_mov_M_AX_IMM(struct x86emu *emu)
2563 offset = fetch_word_imm(emu);
2564 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2565 store_data_long(emu, offset, emu->x86.R_EAX);
2567 store_data_word(emu, offset, emu->x86.R_AX);
2576 x86emuOp_movs_byte(struct x86emu *emu)
2587 if (emu->x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
2590 count = emu->x86.R_CX;
2591 emu->x86.R_CX = 0;
2592 emu->x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
2595 val = fetch_data_byte(emu, emu->x86.R_SI);
2596 store_byte(emu, emu->x86.R_ES, emu->x86.R_DI, val);
2597 emu->x86.R_SI += inc;
2598 emu->x86.R_DI += inc;
2607 x86emuOp_movs_word(struct x86emu *emu)
2613 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
2622 if (emu->x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
2625 count = emu->x86.R_CX;
2626 emu->x86.R_CX = 0;
2627 emu->x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
2630 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2631 val = fetch_data_long(emu, emu->x86.R_SI);
2632 store_long(emu, emu->x86.R_ES, emu->x86.R_DI, val);
2634 val = fetch_data_word(emu, emu->x86.R_SI);
2635 store_word(emu, emu->x86.R_ES, emu->x86.R_DI,
2638 emu->x86.R_SI += inc;
2639 emu->x86.R_DI += inc;
2648 x86emuOp_cmps_byte(struct x86emu *emu)
2658 if (emu->x86.mode & SYSMODE_PREFIX_REPE) {
2661 while (emu->x86.R_CX != 0) {
2662 val1 = fetch_data_byte(emu, emu->x86.R_SI);
2663 val2 = fetch_byte(emu, emu->x86.R_ES, emu->x86.R_DI);
2664 cmp_byte(emu, val1, val2);
2665 emu->x86.R_CX -= 1;
2666 emu->x86.R_SI += inc;
2667 emu->x86.R_DI += inc;
2671 emu->x86.mode &= ~SYSMODE_PREFIX_REPE;
2672 } else if (emu->x86.mode & SYSMODE_PREFIX_REPNE) {
2675 while (emu->x86.R_CX != 0) {
2676 val1 = fetch_data_byte(emu, emu->x86.R_SI);
2677 val2 = fetch_byte(emu, emu->x86.R_ES, emu->x86.R_DI);
2678 cmp_byte(emu, val1, val2);
2679 emu->x86.R_CX -= 1;
2680 emu->x86.R_SI += inc;
2681 emu->x86.R_DI += inc;
2685 emu->x86.mode &= ~SYSMODE_PREFIX_REPNE;
2687 val1 = fetch_data_byte(emu, emu->x86.R_SI);
2688 val2 = fetch_byte(emu, emu->x86.R_ES, emu->x86.R_DI);
2689 cmp_byte(emu, val1, val2);
2690 emu->x86.R_SI += inc;
2691 emu->x86.R_DI += inc;
2700 x86emuOp_cmps_word(struct x86emu *emu)
2705 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2716 if (emu->x86.mode & SYSMODE_PREFIX_REPE) {
2719 while (emu->x86.R_CX != 0) {
2720 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2721 val1 = fetch_data_long(emu, emu->x86.R_SI);
2722 val2 = fetch_long(emu, emu->x86.R_ES,
2723 emu->x86.R_DI);
2724 cmp_long(emu, val1, val2);
2726 val1 = fetch_data_word(emu, emu->x86.R_SI);
2727 val2 = fetch_word(emu, emu->x86.R_ES,
2728 emu->x86.R_DI);
2729 cmp_word(emu, (uint16_t) val1, (uint16_t) val2);
2731 emu->x86.R_CX -= 1;
2732 emu->x86.R_SI += inc;
2733 emu->x86.R_DI += inc;
2737 emu->x86.mode &= ~SYSMODE_PREFIX_REPE;
2738 } else if (emu->x86.mode & SYSMODE_PREFIX_REPNE) {
2741 while (emu->x86.R_CX != 0) {
2742 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2743 val1 = fetch_data_long(emu, emu->x86.R_SI);
2744 val2 = fetch_long(emu, emu->x86.R_ES,
2745 emu->x86.R_DI);
2746 cmp_long(emu, val1, val2);
2748 val1 = fetch_data_word(emu, emu->x86.R_SI);
2749 val2 = fetch_word(emu, emu->x86.R_ES,
2750 emu->x86.R_DI);
2751 cmp_word(emu, (uint16_t) val1, (uint16_t) val2);
2753 emu->x86.R_CX -= 1;
2754 emu->x86.R_SI += inc;
2755 emu->x86.R_DI += inc;
2759 emu->x86.mode &= ~SYSMODE_PREFIX_REPNE;
2761 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2762 val1 = fetch_data_long(emu, emu->x86.R_SI);
2763 val2 = fetch_long(emu, emu->x86.R_ES, emu->x86.R_DI);
2764 cmp_long(emu, val1, val2);
2766 val1 = fetch_data_word(emu, emu->x86.R_SI);
2767 val2 = fetch_word(emu, emu->x86.R_ES, emu->x86.R_DI);
2768 cmp_word(emu, (uint16_t) val1, (uint16_t) val2);
2770 emu->x86.R_SI += inc;
2771 emu->x86.R_DI += inc;
2780 x86emuOp_test_AX_IMM(struct x86emu *emu)
2782 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2783 test_long(emu, emu->x86.R_EAX, fetch_long_imm(emu));
2785 test_word(emu, emu->x86.R_AX, fetch_word_imm(emu));
2794 x86emuOp_stos_byte(struct x86emu *emu)
2802 if (emu->x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
2805 while (emu->x86.R_CX != 0) {
2806 store_byte(emu, emu->x86.R_ES, emu->x86.R_DI,
2807 emu->x86.R_AL);
2808 emu->x86.R_CX -= 1;
2809 emu->x86.R_DI += inc;
2811 emu->x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
2813 store_byte(emu, emu->x86.R_ES, emu->x86.R_DI, emu->x86.R_AL);
2814 emu->x86.R_DI += inc;
2823 x86emuOp_stos_word(struct x86emu *emu)
2828 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
2837 if (emu->x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
2840 count = emu->x86.R_CX;
2841 emu->x86.R_CX = 0;
2842 emu->x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
2845 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2846 store_long(emu, emu->x86.R_ES, emu->x86.R_DI,
2847 emu->x86.R_EAX);
2849 store_word(emu, emu->x86.R_ES, emu->x86.R_DI,
2850 emu->x86.R_AX);
2852 emu->x86.R_DI += inc;
2861 x86emuOp_lods_byte(struct x86emu *emu)
2869 if (emu->x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
2872 while (emu->x86.R_CX != 0) {
2873 emu->x86.R_AL = fetch_data_byte(emu, emu->x86.R_SI);
2874 emu->x86.R_CX -= 1;
2875 emu->x86.R_SI += inc;
2877 emu->x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
2879 emu->x86.R_AL = fetch_data_byte(emu, emu->x86.R_SI);
2880 emu->x86.R_SI += inc;
2889 x86emuOp_lods_word(struct x86emu *emu)
2894 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
2903 if (emu->x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
2906 count = emu->x86.R_CX;
2907 emu->x86.R_CX = 0;
2908 emu->x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
2911 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2912 emu->x86.R_EAX = fetch_data_long(emu, emu->x86.R_SI);
2914 emu->x86.R_AX = fetch_data_word(emu, emu->x86.R_SI);
2916 emu->x86.R_SI += inc;
2925 x86emuOp_scas_byte(struct x86emu *emu)
2934 if (emu->x86.mode & SYSMODE_PREFIX_REPE) {
2937 while (emu->x86.R_CX != 0) {
2938 val2 = fetch_byte(emu, emu->x86.R_ES, emu->x86.R_DI);
2939 cmp_byte(emu, emu->x86.R_AL, val2);
2940 emu->x86.R_CX -= 1;
2941 emu->x86.R_DI += inc;
2945 emu->x86.mode &= ~SYSMODE_PREFIX_REPE;
2946 } else if (emu->x86.mode & SYSMODE_PREFIX_REPNE) {
2949 while (emu->x86.R_CX != 0) {
2950 val2 = fetch_byte(emu, emu->x86.R_ES, emu->x86.R_DI);
2951 cmp_byte(emu, emu->x86.R_AL, val2);
2952 emu->x86.R_CX -= 1;
2953 emu->x86.R_DI += inc;
2957 emu->x86.mode &= ~SYSMODE_PREFIX_REPNE;
2959 val2 = fetch_byte(emu, emu->x86.R_ES, emu->x86.R_DI);
2960 cmp_byte(emu, emu->x86.R_AL, val2);
2961 emu->x86.R_DI += inc;
2970 x86emuOp_scas_word(struct x86emu *emu)
2975 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
2983 if (emu->x86.mode & SYSMODE_PREFIX_REPE) {
2986 while (emu->x86.R_CX != 0) {
2987 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2988 val = fetch_long(emu, emu->x86.R_ES,
2989 emu->x86.R_DI);
2990 cmp_long(emu, emu->x86.R_EAX, val);
2992 val = fetch_word(emu, emu->x86.R_ES,
2993 emu->x86.R_DI);
2994 cmp_word(emu, emu->x86.R_AX, (uint16_t) val);
2996 emu->x86.R_CX -= 1;
2997 emu->x86.R_DI += inc;
3001 emu->x86.mode &= ~SYSMODE_PREFIX_REPE;
3002 } else if (emu->x86.mode & SYSMODE_PREFIX_REPNE) {
3005 while (emu->x86.R_CX != 0) {
3006 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
3007 val = fetch_long(emu, emu->x86.R_ES,
3008 emu->x86.R_DI);
3009 cmp_long(emu, emu->x86.R_EAX, val);
3011 val = fetch_word(emu, emu->x86.R_ES,
3012 emu->x86.R_DI);
3013 cmp_word(emu, emu->x86.R_AX, (uint16_t) val);
3015 emu->x86.R_CX -= 1;
3016 emu->x86.R_DI += inc;
3020 emu->x86.mode &= ~SYSMODE_PREFIX_REPNE;
3022 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
3023 val = fetch_long(emu, emu->x86.R_ES, emu->x86.R_DI);
3024 cmp_long(emu, emu->x86.R_EAX, val);
3026 val = fetch_word(emu, emu->x86.R_ES, emu->x86.R_DI);
3027 cmp_word(emu, emu->x86.R_AX, (uint16_t) val);
3029 emu->x86.R_DI += inc;
3038 x86emuOp_mov_word_AX_IMM(struct x86emu *emu)
3040 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
3041 emu->x86.R_EAX = fetch_long_imm(emu);
3043 emu->x86.R_AX = fetch_word_imm(emu);
3051 x86emuOp_mov_word_CX_IMM(struct x86emu *emu)
3053 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
3054 emu->x86.R_ECX = fetch_long_imm(emu);
3056 emu->x86.R_CX = fetch_word_imm(emu);
3064 x86emuOp_mov_word_DX_IMM(struct x86emu *emu)
3066 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
3067 emu->x86.R_EDX = fetch_long_imm(emu);
3069 emu->x86.R_DX = fetch_word_imm(emu);
3077 x86emuOp_mov_word_BX_IMM(struct x86emu *emu)
3079 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
3080 emu->x86.R_EBX = fetch_long_imm(emu);
3082 emu->x86.R_BX = fetch_word_imm(emu);
3090 x86emuOp_mov_word_SP_IMM(struct x86emu *emu)
3092 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
3093 emu->x86.R_ESP = fetch_long_imm(emu);
3095 emu->x86.R_SP = fetch_word_imm(emu);
3103 x86emuOp_mov_word_BP_IMM(struct x86emu *emu)
3105 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
3106 emu->x86.R_EBP = fetch_long_imm(emu);
3108 emu->x86.R_BP = fetch_word_imm(emu);
3116 x86emuOp_mov_word_SI_IMM(struct x86emu *emu)
3118 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
3119 emu->x86.R_ESI = fetch_long_imm(emu);
3121 emu->x86.R_SI = fetch_word_imm(emu);
3129 x86emuOp_mov_word_DI_IMM(struct x86emu *emu)
3131 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
3132 emu->x86.R_EDI = fetch_long_imm(emu);
3134 emu->x86.R_DI = fetch_word_imm(emu);
3156 x86emuOp_opcC0_byte_RM_MEM(struct x86emu *emu)
3165 fetch_decode_modrm(emu);
3167 destval = decode_and_fetch_byte_imm8(emu, &amt);
3168 destval = (*opcD0_byte_operation[emu->cur_rh]) (emu, destval, amt);
3169 write_back_byte(emu, destval);
3205 x86emuOp_opcC1_word_RM_MEM(struct x86emu *emu)
3214 fetch_decode_modrm(emu);
3215 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
3218 destval = decode_and_fetch_long_imm8(emu, &amt);
3219 destval = (*opcD1_long_operation[emu->cur_rh])
3220 (emu, destval, amt);
3221 write_back_long(emu, destval);
3225 destval = decode_and_fetch_word_imm8(emu, &amt);
3226 destval = (*opcD1_word_operation[emu->cur_rh])
3227 (emu, destval, amt);
3228 write_back_word(emu, destval);
3237 x86emuOp_ret_near_IMM(struct x86emu *emu)
3241 imm = fetch_word_imm(emu);
3242 emu->x86.R_IP = pop_word(emu);
3243 emu->x86.R_SP += imm;
3251 x86emuOp_mov_byte_RM_IMM(struct x86emu *emu)
3257 fetch_decode_modrm(emu);
3258 if (emu->cur_rh != 0)
3259 x86emu_halt_sys(emu);
3260 if (emu->cur_mod != 3) {
3261 destoffset = decode_rl_address(emu);
3262 imm = fetch_byte_imm(emu);
3263 store_data_byte(emu, destoffset, imm);
3265 destreg = decode_rl_byte_register(emu);
3266 imm = fetch_byte_imm(emu);
3276 x86emuOp32_mov_word_RM_IMM(struct x86emu *emu)
3281 fetch_decode_modrm(emu);
3282 if (emu->cur_rh != 0)
3283 x86emu_halt_sys(emu);
3285 if (emu->cur_mod != 3) {
3286 destoffset = decode_rl_address(emu);
3287 imm = fetch_long_imm(emu);
3288 store_data_long(emu, destoffset, imm);
3290 destreg = decode_rl_long_register(emu);
3291 imm = fetch_long_imm(emu);
3297 x86emuOp16_mov_word_RM_IMM(struct x86emu *emu)
3302 fetch_decode_modrm(emu);
3303 if (emu->cur_rh != 0)
3304 x86emu_halt_sys(emu);
3306 if (emu->cur_mod != 3) {
3307 destoffset = decode_rl_address(emu);
3308 imm = fetch_word_imm(emu);
3309 store_data_word(emu, destoffset, imm);
3311 destreg = decode_rl_word_register(emu);
3312 imm = fetch_word_imm(emu);
3318 x86emuOp_mov_word_RM_IMM(struct x86emu *emu)
3320 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
3321 x86emuOp32_mov_word_RM_IMM(emu);
3323 x86emuOp16_mov_word_RM_IMM(emu);
3331 x86emuOp_enter(struct x86emu *emu)
3337 local = fetch_word_imm(emu);
3338 nesting = fetch_byte_imm(emu);
3339 push_word(emu, emu->x86.R_BP);
3340 frame_pointer = emu->x86.R_SP;
3343 emu->x86.R_BP -= 2;
3344 push_word(emu, fetch_word(emu, emu->x86.R_SS,
3345 emu->x86.R_BP));
3347 push_word(emu, frame_pointer);
3349 emu->x86.R_BP = frame_pointer;
3350 emu->x86.R_SP = (uint16_t) (emu->x86.R_SP - local);
3358 x86emuOp_leave(struct x86emu *emu)
3360 emu->x86.R_SP = emu->x86.R_BP;
3361 emu->x86.R_BP = pop_word(emu);
3369 x86emuOp_ret_far_IMM(struct x86emu *emu)
3373 imm = fetch_word_imm(emu);
3374 emu->x86.R_IP = pop_word(emu);
3375 emu->x86.R_CS = pop_word(emu);
3376 emu->x86.R_SP += imm;
3384 x86emuOp_ret_far(struct x86emu *emu)
3386 emu->x86.R_IP = pop_word(emu);
3387 emu->x86.R_CS = pop_word(emu);
3395 x86emuOp_int3(struct x86emu *emu)
3397 x86emu_intr_dispatch(emu, 3);
3405 x86emuOp_int_IMM(struct x86emu *emu)
3409 intnum = fetch_byte_imm(emu);
3410 x86emu_intr_dispatch(emu, intnum);
3418 x86emuOp_into(struct x86emu *emu)
3421 x86emu_intr_dispatch(emu, 4);
3429 x86emuOp_iret(struct x86emu *emu)
3431 emu->x86.R_IP = pop_word(emu);
3432 emu->x86.R_CS = pop_word(emu);
3433 emu->x86.R_FLG = pop_word(emu);
3441 x86emuOp_opcD0_byte_RM_1(struct x86emu *emu)
3445 fetch_decode_modrm(emu);
3446 destval = decode_and_fetch_byte(emu);
3447 destval = (*opcD0_byte_operation[emu->cur_rh]) (emu, destval, 1);
3448 write_back_byte(emu, destval);
3456 x86emuOp_opcD1_word_RM_1(struct x86emu *emu)
3458 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
3461 fetch_decode_modrm(emu);
3462 destval = decode_and_fetch_long(emu);
3463 destval = (*opcD1_long_operation[emu->cur_rh])(emu, destval, 1);
3464 write_back_long(emu, destval);
3468 fetch_decode_modrm(emu);
3469 destval = decode_and_fetch_word(emu);
3470 destval = (*opcD1_word_operation[emu->cur_rh])(emu, destval, 1);
3471 write_back_word(emu, destval);
3480 x86emuOp_opcD2_byte_RM_CL(struct x86emu *emu)
3484 fetch_decode_modrm(emu);
3485 destval = decode_and_fetch_byte(emu);
3486 destval = (*opcD0_byte_operation[emu->cur_rh])
3487 (emu, destval, emu->x86.R_CL);
3488 write_back_byte(emu, destval);
3496 x86emuOp_opcD3_word_RM_CL(struct x86emu *emu)
3498 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
3501 fetch_decode_modrm(emu);
3502 destval = decode_and_fetch_long(emu);
3503 destval = (*opcD1_long_operation[emu->cur_rh])
3504 (emu, destval, emu->x86.R_CL);
3505 write_back_long(emu, destval);
3509 fetch_decode_modrm(emu);
3510 destval = decode_and_fetch_word(emu);
3511 destval = (*opcD1_word_operation[emu->cur_rh])
3512 (emu, destval, emu->x86.R_CL);
3513 write_back_word(emu, destval);
3522 x86emuOp_aam(struct x86emu *emu)
3526 a = fetch_byte_imm(emu); /* this is a stupid encoding. */
3529 x86emu_halt_sys(emu);
3532 emu->x86.R_AX = aam_word(emu, emu->x86.R_AL);
3540 x86emuOp_aad(struct x86emu *emu)
3544 a = fetch_byte_imm(emu);
3547 x86emu_halt_sys(emu);
3549 emu->x86.R_AX = aad_word(emu, emu->x86.R_AX);
3559 x86emuOp_xlat(struct x86emu *emu)
3563 addr = (uint16_t) (emu->x86.R_BX + (uint8_t) emu->x86.R_AL);
3564 emu->x86.R_AL = fetch_data_byte(emu, addr);
3569 x86emuOp_esc_coprocess_d8(struct x86emu *emu)
3574 x86emuOp_esc_coprocess_d9(struct x86emu *emu)
3576 fetch_decode_modrm(emu);
3577 if (emu->cur_mod != 3)
3578 decode_rl_address(emu);
3582 x86emuOp_esc_coprocess_da(struct x86emu *emu)
3584 fetch_decode_modrm(emu);
3585 if (emu->cur_mod != 3)
3586 decode_rl_address(emu);
3590 x86emuOp_esc_coprocess_db(struct x86emu *emu)
3592 fetch_decode_modrm(emu);
3593 if (emu->cur_mod != 3)
3594 decode_rl_address(emu);
3598 x86emuOp_esc_coprocess_dc(struct x86emu *emu)
3600 fetch_decode_modrm(emu);
3601 if (emu->cur_mod != 3)
3602 decode_rl_address(emu);
3606 x86emuOp_esc_coprocess_dd(struct x86emu *emu)
3608 fetch_decode_modrm(emu);
3609 if (emu->cur_mod != 3)
3610 decode_rl_address(emu);
3614 x86emuOp_esc_coprocess_de(struct x86emu *emu)
3616 fetch_decode_modrm(emu);
3617 if (emu->cur_mod != 3)
3618 decode_rl_address(emu);
3622 x86emuOp_esc_coprocess_df(struct x86emu *emu)
3624 fetch_decode_modrm(emu);
3625 if (emu->cur_mod != 3)
3626 decode_rl_address(emu);
3635 x86emuOp_loopne(struct x86emu *emu)
3639 ip = (int8_t) fetch_byte_imm(emu);
3640 ip += (int16_t) emu->x86.R_IP;
3641 emu->x86.R_CX -= 1;
3642 if (emu->x86.R_CX != 0 && !ACCESS_FLAG(F_ZF)) /* CX != 0 and !ZF */
3643 emu->x86.R_IP = ip;
3651 x86emuOp_loope(struct x86emu *emu)
3655 ip = (int8_t) fetch_byte_imm(emu);
3656 ip += (int16_t) emu->x86.R_IP;
3657 emu->x86.R_CX -= 1;
3658 if (emu->x86.R_CX != 0 && ACCESS_FLAG(F_ZF)) /* CX != 0 and ZF */
3659 emu->x86.R_IP = ip;
3667 x86emuOp_loop(struct x86emu *emu)
3671 ip = (int8_t) fetch_byte_imm(emu);
3672 ip += (int16_t) emu->x86.R_IP;
3673 emu->x86.R_CX -= 1;
3674 if (emu->x86.R_CX != 0)
3675 emu->x86.R_IP = ip;
3683 x86emuOp_jcxz(struct x86emu *emu)
3689 offset = (int8_t) fetch_byte_imm(emu);
3690 target = (uint16_t) (emu->x86.R_IP + offset);
3691 if (emu->x86.R_CX == 0)
3692 emu->x86.R_IP = target;
3700 x86emuOp_in_byte_AL_IMM(struct x86emu *emu)
3704 port = (uint8_t) fetch_byte_imm(emu);
3705 emu->x86.R_AL = (*emu->emu_inb) (emu, port);
3713 x86emuOp_in_word_AX_IMM(struct x86emu *emu)
3717 port = (uint8_t) fetch_byte_imm(emu);
3718 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
3719 emu->x86.R_EAX = (*emu->emu_inl) (emu, port);
3721 emu->x86.R_AX = (*emu->emu_inw) (emu, port);
3730 x86emuOp_out_byte_IMM_AL(struct x86emu *emu)
3734 port = (uint8_t) fetch_byte_imm(emu);
3735 (*emu->emu_outb) (emu, port, emu->x86.R_AL);
3743 x86emuOp_out_word_IMM_AX(struct x86emu *emu)
3747 port = (uint8_t) fetch_byte_imm(emu);
3748 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
3749 (*emu->emu_outl) (emu, port, emu->x86.R_EAX);
3751 (*emu->emu_outw) (emu, port, emu->x86.R_AX);
3760 x86emuOp_call_near_IMM(struct x86emu *emu)
3762 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
3764 ip = (int32_t) fetch_long_imm(emu);
3765 ip += (int32_t) emu->x86.R_EIP;
3766 push_long(emu, emu->x86.R_EIP);
3767 emu->x86.R_EIP = ip;
3770 ip = (int16_t) fetch_word_imm(emu);
3771 ip += (int16_t) emu->x86.R_IP; /* CHECK SIGN */
3772 push_word(emu, emu->x86.R_IP);
3773 emu->x86.R_IP = ip;
3782 x86emuOp_jump_near_IMM(struct x86emu *emu)
3786 ip = (int16_t) fetch_word_imm(emu);
3787 ip += (int16_t) emu->x86.R_IP;
3788 emu->x86.R_IP = (uint16_t) ip;
3796 x86emuOp_jump_far_IMM(struct x86emu *emu)
3800 ip = fetch_word_imm(emu);
3801 cs = fetch_word_imm(emu);
3802 emu->x86.R_IP = ip;
3803 emu->x86.R_CS = cs;
3811 x86emuOp_jump_byte_IMM(struct x86emu *emu)
3816 offset = (int8_t) fetch_byte_imm(emu);
3817 target = (uint16_t) (emu->x86.R_IP + offset);
3818 emu->x86.R_IP = target;
3826 x86emuOp_in_byte_AL_DX(struct x86emu *emu)
3828 emu->x86.R_AL = (*emu->emu_inb) (emu, emu->x86.R_DX);
3836 x86emuOp_in_word_AX_DX(struct x86emu *emu)
3838 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
3839 emu->x86.R_EAX = (*emu->emu_inl) (emu, emu->x86.R_DX);
3841 emu->x86.R_AX = (*emu->emu_inw) (emu, emu->x86.R_DX);
3850 x86emuOp_out_byte_DX_AL(struct x86emu *emu)
3852 (*emu->emu_outb) (emu, emu->x86.R_DX, emu->x86.R_AL);
3860 x86emuOp_out_word_DX_AX(struct x86emu *emu)
3862 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
3863 (*emu->emu_outl) (emu, emu->x86.R_DX, emu->x86.R_EAX);
3865 (*emu->emu_outw) (emu, emu->x86.R_DX, emu->x86.R_AX);
3874 x86emuOp_lock(struct x86emu *emu)
3885 x86emuOp_cmc(struct x86emu *emu)
3898 x86emuOp_opcF6_byte_RM(struct x86emu *emu)
3904 fetch_decode_modrm(emu);
3905 if (emu->cur_rh == 1)
3906 x86emu_halt_sys(emu);
3908 if (emu->cur_rh == 0) {
3909 destval = decode_and_fetch_byte_imm8(emu, &srcval);
3910 test_byte(emu, destval, srcval);
3913 destval = decode_and_fetch_byte(emu);
3914 switch (emu->cur_rh) {
3917 write_back_byte(emu, destval);
3920 destval = neg_byte(emu, destval);
3921 write_back_byte(emu, destval);
3924 mul_byte(emu, destval);
3927 imul_byte(emu, destval);
3930 div_byte(emu, destval);
3933 idiv_byte(emu, destval);
3943 x86emuOp32_opcF7_word_RM(struct x86emu *emu)
3949 fetch_decode_modrm(emu);
3950 if (emu->cur_rh == 1)
3951 x86emu_halt_sys(emu);
3953 if (emu->cur_rh == 0) {
3954 if (emu->cur_mod != 3) {
3957 destoffset = decode_rl_address(emu);
3958 srcval = fetch_long_imm(emu);
3959 destval = fetch_data_long(emu, destoffset);
3961 srcval = fetch_long_imm(emu);
3962 destval = *decode_rl_long_register(emu);
3964 test_long(emu, destval, srcval);
3967 destval = decode_and_fetch_long(emu);
3968 switch (emu->cur_rh) {
3971 write_back_long(emu, destval);
3974 destval = neg_long(emu, destval);
3975 write_back_long(emu, destval);
3978 mul_long(emu, destval);
3981 imul_long(emu, destval);
3984 div_long(emu, destval);
3987 idiv_long(emu, destval);
3992 x86emuOp16_opcF7_word_RM(struct x86emu *emu)
3998 fetch_decode_modrm(emu);
3999 if (emu->cur_rh == 1)
4000 x86emu_halt_sys(emu);
4002 if (emu->cur_rh == 0) {
4003 if (emu->cur_mod != 3) {
4006 destoffset = decode_rl_address(emu);
4007 srcval = fetch_word_imm(emu);
4008 destval = fetch_data_word(emu, destoffset);
4010 srcval = fetch_word_imm(emu);
4011 destval = *decode_rl_word_register(emu);
4013 test_word(emu, destval, srcval);
4016 destval = decode_and_fetch_word(emu);
4017 switch (emu->cur_rh) {
4020 write_back_word(emu, destval);
4023 destval = neg_word(emu, destval);
4024 write_back_word(emu, destval);
4027 mul_word(emu, destval);
4030 imul_word(emu, destval);
4033 div_word(emu, destval);
4036 idiv_word(emu, destval);
4041 x86emuOp_opcF7_word_RM(struct x86emu *emu)
4043 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
4044 x86emuOp32_opcF7_word_RM(emu);
4046 x86emuOp16_opcF7_word_RM(emu);
4054 x86emuOp_opcFE_byte_RM(struct x86emu *emu)
4061 fetch_decode_modrm(emu);
4062 if (emu->cur_mod != 3) {
4063 destoffset = decode_rl_address(emu);
4064 switch (emu->cur_rh) {
4066 destval = fetch_data_byte(emu, destoffset);
4067 destval = inc_byte(emu, destval);
4068 store_data_byte(emu, destoffset, destval);
4071 destval = fetch_data_byte(emu, destoffset);
4072 destval = dec_byte(emu, destval);
4073 store_data_byte(emu, destoffset, destval);
4077 destreg = decode_rl_byte_register(emu);
4078 switch (emu->cur_rh) {
4080 *destreg = inc_byte(emu, *destreg);
4083 *destreg = dec_byte(emu, *destreg);
4094 x86emuOp32_opcFF_word_RM(struct x86emu *emu)
4099 if (emu->cur_mod != 3) {
4100 destoffset = decode_rl_address(emu);
4101 destval = fetch_data_long(emu, destoffset);
4102 switch (emu->cur_rh) {
4104 destval = inc_long(emu, destval);
4105 store_data_long(emu, destoffset, destval);
4108 destval = dec_long(emu, destval);
4109 store_data_long(emu, destoffset, destval);
4112 push_long(emu, destval);
4116 destreg = decode_rl_long_register(emu);
4117 switch (emu->cur_rh) {
4119 *destreg = inc_long(emu, *destreg);
4122 *destreg = dec_long(emu, *destreg);
4125 push_long(emu, *destreg);
4132 x86emuOp16_opcFF_word_RM(struct x86emu *emu)
4138 if (emu->cur_mod != 3) {
4139 destoffset = decode_rl_address(emu);
4140 destval = fetch_data_word(emu, destoffset);
4141 switch (emu->cur_rh) {
4143 destval = inc_word(emu, destval);
4144 store_data_word(emu, destoffset, destval);
4147 destval = dec_word(emu, destval);
4148 store_data_word(emu, destoffset, destval);
4151 push_word(emu, destval);
4155 destreg = decode_rl_word_register(emu);
4156 switch (emu->cur_rh) {
4158 *destreg = inc_word(emu, *destreg);
4161 *destreg = dec_word(emu, *destreg);
4164 push_word(emu, *destreg);
4171 x86emuOp_opcFF_word_RM(struct x86emu *emu)
4177 fetch_decode_modrm(emu);
4178 if ((emu->cur_mod == 3 && (emu->cur_rh == 3 || emu->cur_rh == 5)) ||
4179 emu->cur_rh == 7)
4180 x86emu_halt_sys(emu);
4181 if (emu->cur_rh == 0 || emu->cur_rh == 1 || emu->cur_rh == 6) {
4182 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
4183 x86emuOp32_opcFF_word_RM(emu);
4185 x86emuOp16_opcFF_word_RM(emu);
4189 if (emu->cur_mod != 3) {
4190 destoffset = decode_rl_address(emu);
4191 destval = fetch_data_word(emu, destoffset);
4192 switch (emu->cur_rh) {
4194 destval2 = fetch_data_word(emu, destoffset + 2);
4195 push_word(emu, emu->x86.R_CS);
4196 emu->x86.R_CS = destval2;
4197 push_word(emu, emu->x86.R_IP);
4198 emu->x86.R_IP = destval;
4201 destval2 = fetch_data_word(emu, destoffset + 2);
4202 emu->x86.R_IP = destval;
4203 emu->x86.R_CS = destval2;
4207 destval = *decode_rl_word_register(emu);
4210 switch (emu->cur_rh) {
4212 push_word(emu, emu->x86.R_IP);
4213 emu->x86.R_IP = destval;
4216 emu->x86.R_IP = destval;
4225 x86emu_exec_one_byte(struct x86emu * emu)
4229 op1 = fetch_byte_imm(emu);
4233 common_binop_byte_rm_r(emu, add_byte);
4236 common_binop_word_long_rm_r(emu, add_word, add_long);
4239 common_binop_byte_r_rm(emu, add_byte);
4242 common_binop_word_long_r_rm(emu, add_word, add_long);
4245 common_binop_byte_imm(emu, add_byte);
4248 common_binop_word_long_imm(emu, add_word, add_long);
4251 push_word(emu, emu->x86.R_ES);
4254 emu->x86.R_ES = pop_word(emu);
4258 common_binop_byte_rm_r(emu, or_byte);
4261 common_binop_word_long_rm_r(emu, or_word, or_long);
4264 common_binop_byte_r_rm(emu, or_byte);
4267 common_binop_word_long_r_rm(emu, or_word, or_long);
4270 common_binop_byte_imm(emu, or_byte);
4273 common_binop_word_long_imm(emu, or_word, or_long);
4276 push_word(emu, emu->x86.R_CS);
4279 x86emu_exec_two_byte(emu);
4283 common_binop_byte_rm_r(emu, adc_byte);
4286 common_binop_word_long_rm_r(emu, adc_word, adc_long);
4289 common_binop_byte_r_rm(emu, adc_byte);
4292 common_binop_word_long_r_rm(emu, adc_word, adc_long);
4295 common_binop_byte_imm(emu, adc_byte);
4298 common_binop_word_long_imm(emu, adc_word, adc_long);
4301 push_word(emu, emu->x86.R_SS);
4304 emu->x86.R_SS = pop_word(emu);
4308 common_binop_byte_rm_r(emu, sbb_byte);
4311 common_binop_word_long_rm_r(emu, sbb_word, sbb_long);
4314 common_binop_byte_r_rm(emu, sbb_byte);
4317 common_binop_word_long_r_rm(emu, sbb_word, sbb_long);
4320 common_binop_byte_imm(emu, sbb_byte);
4323 common_binop_word_long_imm(emu, sbb_word, sbb_long);
4326 push_word(emu, emu->x86.R_DS);
4329 emu->x86.R_DS = pop_word(emu);
4333 common_binop_byte_rm_r(emu, and_byte);
4336 common_binop_word_long_rm_r(emu, and_word, and_long);
4339 common_binop_byte_r_rm(emu, and_byte);
4342 common_binop_word_long_r_rm(emu, and_word, and_long);
4345 common_binop_byte_imm(emu, and_byte);
4348 common_binop_word_long_imm(emu, and_word, and_long);
4351 emu->x86.mode |= SYSMODE_SEGOVR_ES;
4354 emu->x86.R_AL = daa_byte(emu, emu->x86.R_AL);
4358 common_binop_byte_rm_r(emu, sub_byte);
4361 common_binop_word_long_rm_r(emu, sub_word, sub_long);
4364 common_binop_byte_r_rm(emu, sub_byte);
4367 common_binop_word_long_r_rm(emu, sub_word, sub_long);
4370 common_binop_byte_imm(emu, sub_byte);
4373 common_binop_word_long_imm(emu, sub_word, sub_long);
4376 emu->x86.mode |= SYSMODE_SEGOVR_CS;
4379 emu->x86.R_AL = das_byte(emu, emu->x86.R_AL);
4383 common_binop_byte_rm_r(emu, xor_byte);
4386 common_binop_word_long_rm_r(emu, xor_word, xor_long);
4389 common_binop_byte_r_rm(emu, xor_byte);
4392 common_binop_word_long_r_rm(emu, xor_word, xor_long);
4395 common_binop_byte_imm(emu, xor_byte);
4398 common_binop_word_long_imm(emu, xor_word, xor_long);
4401 emu->x86.mode |= SYSMODE_SEGOVR_SS;
4404 emu->x86.R_AX = aaa_word(emu, emu->x86.R_AX);
4408 common_binop_ns_byte_rm_r(emu, cmp_byte_no_return);
4411 common_binop_ns_word_long_rm_r(emu, cmp_word_no_return,
4415 x86emuOp_cmp_byte_R_RM(emu);
4418 x86emuOp_cmp_word_R_RM(emu);
4421 x86emuOp_cmp_byte_AL_IMM(emu);
4424 x86emuOp_cmp_word_AX_IMM(emu);
4427 emu->x86.mode |= SYSMODE_SEGOVR_DS;
4430 emu->x86.R_AX = aas_word(emu, emu->x86.R_AX);
4434 common_inc_word_long(emu, &emu->x86.register_a);
4437 common_inc_word_long(emu, &emu->x86.register_c);
4440 common_inc_word_long(emu, &emu->x86.register_d);
4443 common_inc_word_long(emu, &emu->x86.register_b);
4446 common_inc_word_long(emu, &emu->x86.register_sp);
4449 common_inc_word_long(emu, &emu->x86.register_bp);
4452 common_inc_word_long(emu, &emu->x86.register_si);
4455 common_inc_word_long(emu, &emu->x86.register_di);
4459 common_dec_word_long(emu, &emu->x86.register_a);
4462 common_dec_word_long(emu, &emu->x86.register_c);
4465 common_dec_word_long(emu, &emu->x86.register_d);
4468 common_dec_word_long(emu, &emu->x86.register_b);
4471 common_dec_word_long(emu, &emu->x86.register_sp);
4474 common_dec_word_long(emu, &emu->x86.register_bp);
4477 common_dec_word_long(emu, &emu->x86.register_si);
4480 common_dec_word_long(emu, &emu->x86.register_di);
4484 common_push_word_long(emu, &emu->x86.register_a);
4487 common_push_word_long(emu, &emu->x86.register_c);
4490 common_push_word_long(emu, &emu->x86.register_d);
4493 common_push_word_long(emu, &emu->x86.register_b);
4496 common_push_word_long(emu, &emu->x86.register_sp);
4499 common_push_word_long(emu, &emu->x86.register_bp);
4502 common_push_word_long(emu, &emu->x86.register_si);
4505 common_push_word_long(emu, &emu->x86.register_di);
4509 common_pop_word_long(emu, &emu->x86.register_a);
4512 common_pop_word_long(emu, &emu->x86.register_c);
4515 common_pop_word_long(emu, &emu->x86.register_d);
4518 common_pop_word_long(emu, &emu->x86.register_b);
4521 common_pop_word_long(emu, &emu->x86.register_sp);
4524 common_pop_word_long(emu, &emu->x86.register_bp);
4527 common_pop_word_long(emu, &emu->x86.register_si);
4530 common_pop_word_long(emu, &emu->x86.register_di);
4534 x86emuOp_push_all(emu);
4537 x86emuOp_pop_all(emu);
4542 emu->x86.mode |= SYSMODE_SEGOVR_FS;
4545 emu->x86.mode |= SYSMODE_SEGOVR_GS;
4548 emu->x86.mode |= SYSMODE_PREFIX_DATA;
4551 emu->x86.mode |= SYSMODE_PREFIX_ADDR;
4555 x86emuOp_push_word_IMM(emu);
4558 common_imul_imm(emu, 0);
4561 x86emuOp_push_byte_IMM(emu);
4564 common_imul_imm(emu, 1);
4567 ins(emu, 1);
4570 x86emuOp_ins_word(emu);
4573 outs(emu, 1);
4576 x86emuOp_outs_word(emu);
4580 common_jmp_near(emu, ACCESS_FLAG(F_OF));
4583 common_jmp_near(emu, !ACCESS_FLAG(F_OF));
4586 common_jmp_near(emu, ACCESS_FLAG(F_CF));
4589 common_jmp_near(emu, !ACCESS_FLAG(F_CF));
4592 common_jmp_near(emu, ACCESS_FLAG(F_ZF));
4595 common_jmp_near(emu, !ACCESS_FLAG(F_ZF));
4598 common_jmp_near(emu, ACCESS_FLAG(F_CF) || ACCESS_FLAG(F_ZF));
4601 common_jmp_near(emu, !ACCESS_FLAG(F_CF) && !ACCESS_FLAG(F_ZF));
4605 common_jmp_near(emu, ACCESS_FLAG(F_SF));
4608 common_jmp_near(emu, !ACCESS_FLAG(F_SF));
4611 common_jmp_near(emu, ACCESS_FLAG(F_PF));
4614 common_jmp_near(emu, !ACCESS_FLAG(F_PF));
4617 x86emuOp_jump_near_L(emu);
4620 x86emuOp_jump_near_NL(emu);
4623 x86emuOp_jump_near_LE(emu);
4626 x86emuOp_jump_near_NLE(emu);
4630 x86emuOp_opc80_byte_RM_IMM(emu);
4633 x86emuOp_opc81_word_RM_IMM(emu);
4636 x86emuOp_opc82_byte_RM_IMM(emu);
4639 x86emuOp_opc83_word_RM_IMM(emu);
4642 common_binop_ns_byte_rm_r(emu, test_byte);
4645 common_binop_ns_word_long_rm_r(emu, test_word, test_long);
4648 x86emuOp_xchg_byte_RM_R(emu);
4651 x86emuOp_xchg_word_RM_R(emu);
4655 x86emuOp_mov_byte_RM_R(emu);
4658 x86emuOp_mov_word_RM_R(emu);
4661 x86emuOp_mov_byte_R_RM(emu);
4664 x86emuOp_mov_word_R_RM(emu);
4667 x86emuOp_mov_word_RM_SR(emu);
4670 x86emuOp_lea_word_R_M(emu);
4673 x86emuOp_mov_word_SR_RM(emu);
4676 x86emuOp_pop_RM(emu);
4683 x86emuOp_xchg_word_AX_CX(emu);
4686 x86emuOp_xchg_word_AX_DX(emu);
4689 x86emuOp_xchg_word_AX_BX(emu);
4692 x86emuOp_xchg_word_AX_SP(emu);
4695 x86emuOp_xchg_word_AX_BP(emu);
4698 x86emuOp_xchg_word_AX_SI(emu);
4701 x86emuOp_xchg_word_AX_DI(emu);
4705 x86emuOp_cbw(emu);
4708 x86emuOp_cwd(emu);
4711 x86emuOp_call_far_IMM(emu);
4717 x86emuOp_pushf_word(emu);
4720 x86emuOp_popf_word(emu);
4723 x86emuOp_sahf(emu);
4726 x86emuOp_lahf(emu);
4730 x86emuOp_mov_AL_M_IMM(emu);
4733 x86emuOp_mov_AX_M_IMM(emu);
4736 x86emuOp_mov_M_AL_IMM(emu);
4739 x86emuOp_mov_M_AX_IMM(emu);
4742 x86emuOp_movs_byte(emu);
4745 x86emuOp_movs_word(emu);
4748 x86emuOp_cmps_byte(emu);
4751 x86emuOp_cmps_word(emu);
4755 test_byte(emu, emu->x86.R_AL, fetch_byte_imm(emu));
4758 x86emuOp_test_AX_IMM(emu);
4761 x86emuOp_stos_byte(emu);
4764 x86emuOp_stos_word(emu);
4767 x86emuOp_lods_byte(emu);
4770 x86emuOp_lods_word(emu);
4773 x86emuOp_scas_byte(emu);
4776 x86emuOp_scas_word(emu);
4780 emu->x86.R_AL = fetch_byte_imm(emu);
4783 emu->x86.R_CL = fetch_byte_imm(emu);
4786 emu->x86.R_DL = fetch_byte_imm(emu);
4789 emu->x86.R_BL = fetch_byte_imm(emu);
4792 emu->x86.R_AH = fetch_byte_imm(emu);
4795 emu->x86.R_CH = fetch_byte_imm(emu);
4798 emu->x86.R_DH = fetch_byte_imm(emu);
4801 emu->x86.R_BH = fetch_byte_imm(emu);
4805 x86emuOp_mov_word_AX_IMM(emu);
4808 x86emuOp_mov_word_CX_IMM(emu);
4811 x86emuOp_mov_word_DX_IMM(emu);
4814 x86emuOp_mov_word_BX_IMM(emu);
4818 x86emuOp_mov_word_SP_IMM(emu);
4821 x86emuOp_mov_word_BP_IMM(emu);
4824 x86emuOp_mov_word_SI_IMM(emu);
4827 x86emuOp_mov_word_DI_IMM(emu);
4831 x86emuOp_opcC0_byte_RM_MEM(emu);
4834 x86emuOp_opcC1_word_RM_MEM(emu);
4837 x86emuOp_ret_near_IMM(emu);
4840 emu->x86.R_IP = pop_word(emu);
4843 common_load_far_pointer(emu, &emu->x86.R_ES);
4846 common_load_far_pointer(emu, &emu->x86.R_DS);
4849 x86emuOp_mov_byte_RM_IMM(emu);
4852 x86emuOp_mov_word_RM_IMM(emu);
4855 x86emuOp_enter(emu);
4858 x86emuOp_leave(emu);
4861 x86emuOp_ret_far_IMM(emu);
4864 x86emuOp_ret_far(emu);
4867 x86emuOp_int3(emu);
4870 x86emuOp_int_IMM(emu);
4873 x86emuOp_into(emu);
4876 x86emuOp_iret(emu);
4880 x86emuOp_opcD0_byte_RM_1(emu);
4883 x86emuOp_opcD1_word_RM_1(emu);
4886 x86emuOp_opcD2_byte_RM_CL(emu);
4889 x86emuOp_opcD3_word_RM_CL(emu);
4892 x86emuOp_aam(emu);
4895 x86emuOp_aad(emu);
4899 x86emuOp_xlat(emu);
4902 x86emuOp_esc_coprocess_d8(emu);
4905 x86emuOp_esc_coprocess_d9(emu);
4908 x86emuOp_esc_coprocess_da(emu);
4911 x86emuOp_esc_coprocess_db(emu);
4914 x86emuOp_esc_coprocess_dc(emu);
4917 x86emuOp_esc_coprocess_dd(emu);
4920 x86emuOp_esc_coprocess_de(emu);
4923 x86emuOp_esc_coprocess_df(emu);
4927 x86emuOp_loopne(emu);
4930 x86emuOp_loope(emu);
4933 x86emuOp_loop(emu);
4936 x86emuOp_jcxz(emu);
4939 x86emuOp_in_byte_AL_IMM(emu);
4942 x86emuOp_in_word_AX_IMM(emu);
4945 x86emuOp_out_byte_IMM_AL(emu);
4948 x86emuOp_out_word_IMM_AX(emu);
4952 x86emuOp_call_near_IMM(emu);
4955 x86emuOp_jump_near_IMM(emu);
4958 x86emuOp_jump_far_IMM(emu);
4961 x86emuOp_jump_byte_IMM(emu);
4964 x86emuOp_in_byte_AL_DX(emu);
4967 x86emuOp_in_word_AX_DX(emu);
4970 x86emuOp_out_byte_DX_AL(emu);
4973 x86emuOp_out_word_DX_AX(emu);
4977 x86emuOp_lock(emu);
4980 emu->x86.mode |= SYSMODE_PREFIX_REPNE;
4983 emu->x86.mode |= SYSMODE_PREFIX_REPE;
4986 x86emu_halt_sys(emu);
4989 x86emuOp_cmc(emu);
4992 x86emuOp_opcF6_byte_RM(emu);
4995 x86emuOp_opcF7_word_RM(emu);
5017 x86emuOp_opcFE_byte_RM(emu);
5020 x86emuOp_opcFF_word_RM(emu);
5023 x86emu_halt_sys(emu);
5028 emu->x86.mode &= ~SYSMODE_CLRMASK;
5032 common_jmp_long(struct x86emu *emu, int cond)
5036 target = (int16_t) fetch_word_imm(emu);
5037 target += (int16_t) emu->x86.R_IP;
5039 emu->x86.R_IP = (uint16_t) target;
5043 common_set_byte(struct x86emu *emu, int cond)
5048 fetch_decode_modrm(emu);
5050 if (emu->cur_mod != 3) {
5051 destoffset = decode_rl_address(emu);
5052 store_data_byte(emu, destoffset, destval);
5054 destreg = decode_rl_byte_register(emu);
5060 common_bitstring32(struct x86emu *emu, int op)
5065 fetch_decode_modrm(emu);
5066 shiftreg = decode_rh_long_register(emu);
5067 srcval = decode_and_fetch_long_disp(emu, (int16_t) *shiftreg >> 5);
5076 write_back_long(emu, srcval | mask);
5079 write_back_long(emu, srcval & ~mask);
5082 write_back_long(emu, srcval ^ mask);
5088 common_bitstring16(struct x86emu *emu, int op)
5093 fetch_decode_modrm(emu);
5094 shiftreg = decode_rh_word_register(emu);
5095 srcval = decode_and_fetch_word_disp(emu, (int16_t) *shiftreg >> 4);
5104 write_back_word(emu, srcval | mask);
5107 write_back_word(emu, srcval & ~mask);
5110 write_back_word(emu, srcval ^ mask);
5116 common_bitstring(struct x86emu *emu, int op)
5118 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
5119 common_bitstring32(emu, op);
5121 common_bitstring16(emu, op);
5125 common_bitsearch32(struct x86emu *emu, int diff)
5129 fetch_decode_modrm(emu);
5130 dstreg = decode_rh_long_register(emu);
5131 srcval = decode_and_fetch_long(emu);
5140 common_bitsearch16(struct x86emu *emu, int diff)
5144 fetch_decode_modrm(emu);
5145 dstreg = decode_rh_word_register(emu);
5146 srcval = decode_and_fetch_word(emu);
5155 common_bitsearch(struct x86emu *emu, int diff)
5157 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
5158 common_bitsearch32(emu, diff);
5160 common_bitsearch16(emu, diff);
5164 common_shift32(struct x86emu *emu, int shift_left, int use_cl)
5169 fetch_decode_modrm(emu);
5170 shiftreg = decode_rh_long_register(emu);
5172 destval = decode_and_fetch_long(emu);
5173 shift = emu->x86.R_CL;
5175 destval = decode_and_fetch_long_imm8(emu, &shift);
5178 destval = shld_long(emu, destval, *shiftreg, shift);
5180 destval = shrd_long(emu, destval, *shiftreg, shift);
5181 write_back_long(emu, destval);
5185 common_shift16(struct x86emu *emu, int shift_left, int use_cl)
5190 fetch_decode_modrm(emu);
5191 shiftreg = decode_rh_word_register(emu);
5193 destval = decode_and_fetch_word(emu);
5194 shift = emu->x86.R_CL;
5196 destval = decode_and_fetch_word_imm8(emu, &shift);
5199 destval = shld_word(emu, destval, *shiftreg, shift);
5201 destval = shrd_word(emu, destval, *shiftreg, shift);
5202 write_back_word(emu, destval);
5206 common_shift(struct x86emu *emu, int shift_left, int use_cl)
5208 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
5209 common_shift32(emu, shift_left, use_cl);
5211 common_shift16(emu, shift_left, use_cl);
5225 x86emuOp2_rdtsc(struct x86emu *emu)
5227 emu->x86.R_EAX = emu->cur_cycles & 0xffffffff;
5228 emu->x86.R_EDX = emu->cur_cycles >> 32;
5236 x86emuOp2_push_FS(struct x86emu *emu)
5238 push_word(emu, emu->x86.R_FS);
5246 x86emuOp2_pop_FS(struct x86emu *emu)
5248 emu->x86.R_FS = pop_word(emu);
5267 x86emuOp2_cpuid(struct x86emu *emu)
5270 hw_cpuid(&emu->x86.R_EAX, &emu->x86.R_EBX, &emu->x86.R_ECX,
5271 &emu->x86.R_EDX);
5273 switch (emu->x86.R_EAX) {
5275 emu->x86.R_EAX = 1;
5278 emu->x86.R_EBX = 0x756e6547;
5279 emu->x86.R_EDX = 0x49656e69;
5280 emu->x86.R_ECX = 0x6c65746e;
5285 emu->x86.R_EAX = 0x00000480;
5286 emu->x86.R_EBX = emu->x86.R_ECX = 0;
5287 emu->x86.R_EDX = 0x00000002;
5289 emu->x86.R_EDX &= 0x00000012;
5293 emu->x86.R_EAX = emu->x86.R_EBX = emu->x86.R_ECX =
5294 emu->x86.R_EDX = 0;
5304 x86emuOp2_bt_R(struct x86emu *emu)
5306 common_bitstring(emu, 0);
5314 x86emuOp2_shld_IMM(struct x86emu *emu)
5316 common_shift(emu, 1, 0);
5324 x86emuOp2_shld_CL(struct x86emu *emu)
5326 common_shift(emu, 1, 1);
5334 x86emuOp2_push_GS(struct x86emu *emu)
5336 push_word(emu, emu->x86.R_GS);
5344 x86emuOp2_pop_GS(struct x86emu *emu)
5346 emu->x86.R_GS = pop_word(emu);
5354 x86emuOp2_bts_R(struct x86emu *emu)
5356 common_bitstring(emu, 1);
5364 x86emuOp2_shrd_IMM(struct x86emu *emu)
5366 common_shift(emu, 0, 0);
5374 x86emuOp2_shrd_CL(struct x86emu *emu)
5376 common_shift(emu, 0, 1);
5384 x86emuOp2_32_imul_R_RM(struct x86emu *emu)
5389 fetch_decode_modrm(emu);
5390 destreg = decode_rh_long_register(emu);
5391 srcval = decode_and_fetch_long(emu);
5404 x86emuOp2_16_imul_R_RM(struct x86emu *emu)
5409 fetch_decode_modrm(emu);
5410 destreg = decode_rh_word_register(emu);
5411 srcval = decode_and_fetch_word(emu);
5424 x86emuOp2_imul_R_RM(struct x86emu *emu)
5426 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
5427 x86emuOp2_32_imul_R_RM(emu);
5429 x86emuOp2_16_imul_R_RM(emu);
5437 x86emuOp2_lss_R_IMM(struct x86emu *emu)
5439 common_load_far_pointer(emu, &emu->x86.R_SS);
5447 x86emuOp2_btr_R(struct x86emu *emu)
5449 common_bitstring(emu, 2);
5457 x86emuOp2_lfs_R_IMM(struct x86emu *emu)
5459 common_load_far_pointer(emu, &emu->x86.R_FS);
5467 x86emuOp2_lgs_R_IMM(struct x86emu *emu)
5469 common_load_far_pointer(emu, &emu->x86.R_GS);
5477 x86emuOp2_32_movzx_byte_R_RM(struct x86emu *emu)
5481 fetch_decode_modrm(emu);
5482 destreg = decode_rh_long_register(emu);
5483 *destreg = decode_and_fetch_byte(emu);
5487 x86emuOp2_16_movzx_byte_R_RM(struct x86emu *emu)
5491 fetch_decode_modrm(emu);
5492 destreg = decode_rh_word_register(emu);
5493 *destreg = decode_and_fetch_byte(emu);
5497 x86emuOp2_movzx_byte_R_RM(struct x86emu *emu)
5499 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
5500 x86emuOp2_32_movzx_byte_R_RM(emu);
5502 x86emuOp2_16_movzx_byte_R_RM(emu);
5510 x86emuOp2_movzx_word_R_RM(struct x86emu *emu)
5514 fetch_decode_modrm(emu);
5515 destreg = decode_rh_long_register(emu);
5516 *destreg = decode_and_fetch_word(emu);
5524 x86emuOp2_32_btX_I(struct x86emu *emu)
5530 fetch_decode_modrm(emu);
5531 if (emu->cur_rh < 4)
5532 x86emu_halt_sys(emu);
5534 srcval = decode_and_fetch_long_imm8(emu, &shift);
5538 switch (emu->cur_rh) {
5540 write_back_long(emu, srcval | mask);
5543 write_back_long(emu, srcval & ~mask);
5546 write_back_long(emu, srcval ^ mask);
5553 x86emuOp2_16_btX_I(struct x86emu *emu)
5560 fetch_decode_modrm(emu);
5561 if (emu->cur_rh < 4)
5562 x86emu_halt_sys(emu);
5564 srcval = decode_and_fetch_word_imm8(emu, &shift);
5567 switch (emu->cur_rh) {
5569 write_back_word(emu, srcval | mask);
5572 write_back_word(emu, srcval & ~mask);
5575 write_back_word(emu, srcval ^ mask);
5582 x86emuOp2_btX_I(struct x86emu *emu)
5584 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
5585 x86emuOp2_32_btX_I(emu);
5587 x86emuOp2_16_btX_I(emu);
5595 x86emuOp2_btc_R(struct x86emu *emu)
5597 common_bitstring(emu, 3);
5605 x86emuOp2_bsf(struct x86emu *emu)
5607 common_bitsearch(emu, +1);
5615 x86emuOp2_bsr(struct x86emu *emu)
5617 common_bitsearch(emu, -1);
5625 x86emuOp2_32_movsx_byte_R_RM(struct x86emu *emu)
5629 fetch_decode_modrm(emu);
5630 destreg = decode_rh_long_register(emu);
5631 *destreg = (int32_t)(int8_t)decode_and_fetch_byte(emu);
5635 x86emuOp2_16_movsx_byte_R_RM(struct x86emu *emu)
5639 fetch_decode_modrm(emu);
5640 destreg = decode_rh_word_register(emu);
5641 *destreg = (int16_t)(int8_t)decode_and_fetch_byte(emu);
5645 x86emuOp2_movsx_byte_R_RM(struct x86emu *emu)
5647 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
5648 x86emuOp2_32_movsx_byte_R_RM(emu);
5650 x86emuOp2_16_movsx_byte_R_RM(emu);
5658 x86emuOp2_movsx_word_R_RM(struct x86emu *emu)
5662 fetch_decode_modrm(emu);
5663 destreg = decode_rh_long_register(emu);
5664 *destreg = (int32_t)(int16_t)decode_and_fetch_word(emu);
5668 x86emu_exec_two_byte(struct x86emu * emu)
5672 op2 = fetch_byte_imm(emu);
5693 x86emuOp2_rdtsc(emu);
5697 common_jmp_long(emu, ACCESS_FLAG(F_OF));
5700 common_jmp_long(emu, !ACCESS_FLAG(F_OF));
5703 common_jmp_long(emu, ACCESS_FLAG(F_CF));
5706 common_jmp_long(emu, !ACCESS_FLAG(F_CF));
5709 common_jmp_long(emu, ACCESS_FLAG(F_ZF));
5712 common_jmp_long(emu, !ACCESS_FLAG(F_ZF));
5715 common_jmp_long(emu, ACCESS_FLAG(F_CF) || ACCESS_FLAG(F_ZF));
5718 common_jmp_long(emu, !(ACCESS_FLAG(F_CF) || ACCESS_FLAG(F_ZF)));
5721 common_jmp_long(emu, ACCESS_FLAG(F_SF));
5724 common_jmp_long(emu, !ACCESS_FLAG(F_SF));
5727 common_jmp_long(emu, ACCESS_FLAG(F_PF));
5730 common_jmp_long(emu, !ACCESS_FLAG(F_PF));
5733 common_jmp_long(emu, xorl(ACCESS_FLAG(F_SF),
5737 common_jmp_long(emu, !(xorl(ACCESS_FLAG(F_SF),
5741 common_jmp_long(emu, (xorl(ACCESS_FLAG(F_SF), ACCESS_FLAG(F_OF))
5745 common_jmp_long(emu,
5751 common_set_byte(emu, ACCESS_FLAG(F_OF));
5754 common_set_byte(emu, !ACCESS_FLAG(F_OF));
5757 common_set_byte(emu, ACCESS_FLAG(F_CF));
5760 common_set_byte(emu, !ACCESS_FLAG(F_CF));
5763 common_set_byte(emu, ACCESS_FLAG(F_ZF));
5766 common_set_byte(emu, !ACCESS_FLAG(F_ZF));
5769 common_set_byte(emu, ACCESS_FLAG(F_CF) || ACCESS_FLAG(F_ZF));
5772 common_set_byte(emu, !(ACCESS_FLAG(F_CF) || ACCESS_FLAG(F_ZF)));
5775 common_set_byte(emu, ACCESS_FLAG(F_SF));
5778 common_set_byte(emu, !ACCESS_FLAG(F_SF));
5781 common_set_byte(emu, ACCESS_FLAG(F_PF));
5784 common_set_byte(emu, !ACCESS_FLAG(F_PF));
5787 common_set_byte(emu, xorl(ACCESS_FLAG(F_SF),
5791 common_set_byte(emu, xorl(ACCESS_FLAG(F_SF),
5795 common_set_byte(emu,
5800 common_set_byte(emu,
5806 x86emuOp2_push_FS(emu);
5809 x86emuOp2_pop_FS(emu);
5812 x86emuOp2_cpuid(emu);
5815 x86emuOp2_bt_R(emu);
5818 x86emuOp2_shld_IMM(emu);
5821 x86emuOp2_shld_CL(emu);
5824 x86emuOp2_push_GS(emu);
5827 x86emuOp2_pop_GS(emu);
5830 x86emuOp2_bts_R(emu);
5833 x86emuOp2_shrd_IMM(emu);
5836 x86emuOp2_shrd_CL(emu);
5839 x86emuOp2_imul_R_RM(emu);
5845 x86emuOp2_lss_R_IMM(emu);
5848 x86emuOp2_btr_R(emu);
5851 x86emuOp2_lfs_R_IMM(emu);
5854 x86emuOp2_lgs_R_IMM(emu);
5857 x86emuOp2_movzx_byte_R_RM(emu);
5860 x86emuOp2_movzx_word_R_RM(emu);
5863 x86emuOp2_btX_I(emu);
5866 x86emuOp2_btc_R(emu);
5869 x86emuOp2_bsf(emu);
5872 x86emuOp2_bsr(emu);
5875 x86emuOp2_movsx_byte_R_RM(emu);
5878 x86emuOp2_movsx_word_R_RM(emu);
5893 x86emu_halt_sys(emu);
5985 aaa_word(struct x86emu *emu, uint16_t d)
6009 aas_word(struct x86emu *emu, uint16_t d)
6033 aad_word(struct x86emu *emu, uint16_t d)
6056 aam_word(struct x86emu *emu, uint8_t d)
6078 adc_byte(struct x86emu *emu, uint8_t d, uint8_t s)
6105 adc_word(struct x86emu *emu, uint16_t d, uint16_t s)
6132 adc_long(struct x86emu *emu, uint32_t d, uint32_t s)
6165 add_byte(struct x86emu *emu, uint8_t d, uint8_t s)
6188 add_word(struct x86emu *emu, uint16_t d, uint16_t s)
6211 add_long(struct x86emu *emu, uint32_t d, uint32_t s)
6240 and_byte(struct x86emu *emu, uint8_t d, uint8_t s)
6261 and_word(struct x86emu *emu, uint16_t d, uint16_t s)
6282 and_long(struct x86emu *emu, uint32_t d, uint32_t s)
6303 cmp_byte(struct x86emu *emu, uint8_t d, uint8_t s)
6323 cmp_byte_no_return(struct x86emu *emu, uint8_t d, uint8_t s)
6325 cmp_byte(emu, d, s);
6333 cmp_word(struct x86emu *emu, uint16_t d, uint16_t s)
6352 cmp_word_no_return(struct x86emu *emu, uint16_t d, uint16_t s)
6354 cmp_word(emu, d, s);
6362 cmp_long(struct x86emu *emu, uint32_t d, uint32_t s)
6381 cmp_long_no_return(struct x86emu *emu, uint32_t d, uint32_t s)
6383 cmp_long(emu, d, s);
6391 daa_byte(struct x86emu *emu, uint8_t d)
6413 das_byte(struct x86emu *emu, uint8_t d)
6434 dec_byte(struct x86emu *emu, uint8_t d)
6458 dec_word(struct x86emu *emu, uint16_t d)
6482 dec_long(struct x86emu *emu, uint32_t d)
6506 inc_byte(struct x86emu *emu, uint8_t d)
6528 inc_word(struct x86emu *emu, uint16_t d)
6550 inc_long(struct x86emu *emu, uint32_t d)
6572 or_byte(struct x86emu *emu, uint8_t d, uint8_t s)
6591 or_word(struct x86emu *emu, uint16_t d, uint16_t s)
6611 or_long(struct x86emu *emu, uint32_t d, uint32_t s)
6632 neg_byte(struct x86emu *emu, uint8_t s)
6658 neg_word(struct x86emu *emu, uint16_t s)
6685 neg_long(struct x86emu *emu, uint32_t s)
6712 rcl_byte(struct x86emu *emu, uint8_t d, uint8_t s)
6783 rcl_word(struct x86emu *emu, uint16_t d, uint8_t s)
6808 rcl_long(struct x86emu *emu, uint32_t d, uint8_t s)
6833 rcr_byte(struct x86emu *emu, uint8_t d, uint8_t s)
6911 rcr_word(struct x86emu *emu, uint16_t d, uint8_t s)
6944 rcr_long(struct x86emu *emu, uint32_t d, uint8_t s)
6978 rol_byte(struct x86emu *emu, uint8_t d, uint8_t s)
7025 rol_word(struct x86emu *emu, uint16_t d, uint8_t s)
7051 rol_long(struct x86emu *emu, uint32_t d, uint8_t s)
7077 ror_byte(struct x86emu *emu, uint8_t d, uint8_t s)
7121 ror_word(struct x86emu *emu, uint16_t d, uint8_t s)
7145 ror_long(struct x86emu *emu, uint32_t d, uint8_t s)
7169 shl_byte(struct x86emu *emu, uint8_t d, uint8_t s)
7193 /* was (emu->x86.R_FLG&F_CF)==F_CF)), */
7214 shl_word(struct x86emu *emu, uint16_t d, uint8_t s)
7255 shl_long(struct x86emu *emu, uint32_t d, uint8_t s)
7293 shr_byte(struct x86emu *emu, uint8_t d, uint8_t s)
7331 shr_word(struct x86emu *emu, uint16_t d, uint8_t s)
7369 shr_long(struct x86emu *emu, uint32_t d, uint8_t s)
7406 sar_byte(struct x86emu *emu, uint8_t d, uint8_t s)
7447 sar_word(struct x86emu *emu, uint16_t d, uint8_t s)
7488 sar_long(struct x86emu *emu, uint32_t d, uint8_t s)
7529 shld_word(struct x86emu *emu, uint16_t d, uint16_t fill, uint8_t s)
7567 shld_long(struct x86emu *emu, uint32_t d, uint32_t fill, uint8_t s)
7605 shrd_word(struct x86emu *emu, uint16_t d, uint16_t fill, uint8_t s)
7643 shrd_long(struct x86emu *emu, uint32_t d, uint32_t fill, uint8_t s)
7680 sbb_byte(struct x86emu *emu, uint8_t d, uint8_t s)
7706 sbb_word(struct x86emu *emu, uint16_t d, uint16_t s)
7732 sbb_long(struct x86emu *emu, uint32_t d, uint32_t s)
7758 sub_byte(struct x86emu *emu, uint8_t d, uint8_t s)
7781 sub_word(struct x86emu *emu, uint16_t d, uint16_t s)
7804 sub_long(struct x86emu *emu, uint32_t d, uint32_t s)
7827 test_byte(struct x86emu *emu, uint8_t d, uint8_t s)
7846 test_word(struct x86emu *emu, uint16_t d, uint16_t s)
7865 test_long(struct x86emu *emu, uint32_t d, uint32_t s)
7884 xor_byte(struct x86emu *emu, uint8_t d, uint8_t s)
7903 xor_word(struct x86emu *emu, uint16_t d, uint16_t s)
7922 xor_long(struct x86emu *emu, uint32_t d, uint32_t s)
7941 imul_byte(struct x86emu *emu, uint8_t s)
7943 int16_t res = (int16_t) ((int8_t) emu->x86.R_AL * (int8_t) s);
7945 emu->x86.R_AX = res;
7946 if (((emu->x86.R_AL & 0x80) == 0 && emu->x86.R_AH == 0x00) ||
7947 ((emu->x86.R_AL & 0x80) != 0 && emu->x86.R_AH == 0xFF)) {
7961 imul_word(struct x86emu *emu, uint16_t s)
7963 int32_t res = (int16_t) emu->x86.R_AX * (int16_t) s;
7965 emu->x86.R_AX = (uint16_t) res;
7966 emu->x86.R_DX = (uint16_t) (res >> 16);
7967 if (((emu->x86.R_AX & 0x8000) == 0 && emu->x86.R_DX == 0x00) ||
7968 ((emu->x86.R_AX & 0x8000) != 0 && emu->x86.R_DX == 0xFF)) {
7982 imul_long(struct x86emu *emu, uint32_t s)
7986 res = (int64_t)(int32_t)emu->x86.R_EAX * (int32_t)s;
7987 emu->x86.R_EAX = (uint32_t)res;
7988 emu->x86.R_EDX = ((uint64_t)res) >> 32;
7989 if (((emu->x86.R_EAX & 0x80000000) == 0 && emu->x86.R_EDX == 0x00) ||
7990 ((emu->x86.R_EAX & 0x80000000) != 0 && emu->x86.R_EDX == 0xFF)) {
8004 mul_byte(struct x86emu *emu, uint8_t s)
8006 uint16_t res = (uint16_t) (emu->x86.R_AL * s);
8008 emu->x86.R_AX = res;
8009 if (emu->x86.R_AH == 0) {
8023 mul_word(struct x86emu *emu, uint16_t s)
8025 uint32_t res = emu->x86.R_AX * s;
8027 emu->x86.R_AX = (uint16_t) res;
8028 emu->x86.R_DX = (uint16_t) (res >> 16);
8029 if (emu->x86.R_DX == 0) {
8043 mul_long(struct x86emu *emu, uint32_t s)
8045 uint64_t res = (uint64_t) emu->x86.R_EAX * s;
8047 emu->x86.R_EAX = (uint32_t) res;
8048 emu->x86.R_EDX = (uint32_t) (res >> 32);
8050 if (emu->x86.R_EDX == 0) {
8064 idiv_byte(struct x86emu *emu, uint8_t s)
8068 dvd = (int16_t) emu->x86.R_AX;
8070 x86emu_intr_raise(emu, 8);
8076 x86emu_intr_raise(emu, 8);
8079 emu->x86.R_AL = (int8_t) div;
8080 emu->x86.R_AH = (int8_t) mod;
8088 idiv_word(struct x86emu *emu, uint16_t s)
8092 dvd = (((int32_t) emu->x86.R_DX) << 16) | emu->x86.R_AX;
8094 x86emu_intr_raise(emu, 8);
8100 x86emu_intr_raise(emu, 8);
8108 emu->x86.R_AX = (uint16_t) div;
8109 emu->x86.R_DX = (uint16_t) mod;
8117 idiv_long(struct x86emu *emu, uint32_t s)
8121 dvd = (((int64_t) emu->x86.R_EDX) << 32) | emu->x86.R_EAX;
8123 x86emu_intr_raise(emu, 8);
8129 x86emu_intr_raise(emu, 8);
8138 emu->x86.R_EAX = (uint32_t) div;
8139 emu->x86.R_EDX = (uint32_t) mod;
8147 div_byte(struct x86emu *emu, uint8_t s)
8151 dvd = emu->x86.R_AX;
8153 x86emu_intr_raise(emu, 8);
8159 x86emu_intr_raise(emu, 8);
8162 emu->x86.R_AL = (uint8_t) div;
8163 emu->x86.R_AH = (uint8_t) mod;
8171 div_word(struct x86emu *emu, uint16_t s)
8175 dvd = (((uint32_t) emu->x86.R_DX) << 16) | emu->x86.R_AX;
8177 x86emu_intr_raise(emu, 8);
8183 x86emu_intr_raise(emu, 8);
8191 emu->x86.R_AX = (uint16_t) div;
8192 emu->x86.R_DX = (uint16_t) mod;
8200 div_long(struct x86emu *emu, uint32_t s)
8204 dvd = (((uint64_t) emu->x86.R_EDX) << 32) | emu->x86.R_EAX;
8206 x86emu_intr_raise(emu, 8);
8212 x86emu_intr_raise(emu, 8);
8221 emu->x86.R_EAX = (uint32_t) div;
8222 emu->x86.R_EDX = (uint32_t) mod;
8230 ins(struct x86emu *emu, int size)
8237 if (emu->x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
8240 uint32_t count = ((emu->x86.mode & SYSMODE_PREFIX_DATA) ?
8241 emu->x86.R_ECX : emu->x86.R_CX);
8245 store_byte(emu, emu->x86.R_ES, emu->x86.R_DI,
8246 (*emu->emu_inb) (emu, emu->x86.R_DX));
8247 emu->x86.R_DI += inc;
8253 store_word(emu, emu->x86.R_ES, emu->x86.R_DI,
8254 (*emu->emu_inw) (emu, emu->x86.R_DX));
8255 emu->x86.R_DI += inc;
8260 store_long(emu, emu->x86.R_ES, emu->x86.R_DI,
8261 (*emu->emu_inl) (emu, emu->x86.R_DX));
8262 emu->x86.R_DI += inc;
8266 emu->x86.R_CX = 0;
8267 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
8268 emu->x86.R_ECX = 0;
8270 emu->x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
8274 store_byte(emu, emu->x86.R_ES, emu->x86.R_DI,
8275 (*emu->emu_inb) (emu, emu->x86.R_DX));
8278 store_word(emu, emu->x86.R_ES, emu->x86.R_DI,
8279 (*emu->emu_inw) (emu, emu->x86.R_DX));
8282 store_long(emu, emu->x86.R_ES, emu->x86.R_DI,
8283 (*emu->emu_inl) (emu, emu->x86.R_DX));
8286 emu->x86.R_DI += inc;
8295 outs(struct x86emu *emu, int size)
8302 if (emu->x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
8305 uint32_t count = ((emu->x86.mode & SYSMODE_PREFIX_DATA) ?
8306 emu->x86.R_ECX : emu->x86.R_CX);
8310 (*emu->emu_outb) (emu, emu->x86.R_DX,
8311 fetch_byte(emu, emu->x86.R_ES,
8312 emu->x86.R_SI));
8313 emu->x86.R_SI += inc;
8319 (*emu->emu_outw) (emu, emu->x86.R_DX,
8320 fetch_word(emu, emu->x86.R_ES,
8321 emu->x86.R_SI));
8322 emu->x86.R_SI += inc;
8327 (*emu->emu_outl) (emu, emu->x86.R_DX,
8328 fetch_long(emu, emu->x86.R_ES,
8329 emu->x86.R_SI));
8330 emu->x86.R_SI += inc;
8334 emu->x86.R_CX = 0;
8335 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
8336 emu->x86.R_ECX = 0;
8338 emu->x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
8342 (*emu->emu_outb) (emu, emu->x86.R_DX,
8343 fetch_byte(emu, emu->x86.R_ES, emu->x86.R_SI));
8346 (*emu->emu_outw) (emu, emu->x86.R_DX,
8347 fetch_word(emu, emu->x86.R_ES, emu->x86.R_SI));
8350 (*emu->emu_outl) (emu, emu->x86.R_DX,
8351 fetch_long(emu, emu->x86.R_ES, emu->x86.R_SI));
8354 emu->x86.R_SI += inc;
8362 * NOTE: Do not inline this, as (*emu->emu_wrX) is already inline!
8365 push_word(struct x86emu *emu, uint16_t w)
8367 emu->x86.R_SP -= 2;
8368 store_word(emu, emu->x86.R_SS, emu->x86.R_SP, w);
8375 * NOTE: Do not inline this, as (*emu->emu_wrX) is already inline!
8378 push_long(struct x86emu *emu, uint32_t w)
8380 emu->x86.R_SP -= 4;
8381 store_long(emu, emu->x86.R_SS, emu->x86.R_SP, w);
8388 * NOTE: Do not inline this, as (*emu->emu_rdX) is already inline!
8391 pop_word(struct x86emu *emu)
8395 res = fetch_word(emu, emu->x86.R_SS, emu->x86.R_SP);
8396 emu->x86.R_SP += 2;
8404 * NOTE: Do not inline this, as (*emu->emu_rdX) is already inline!
8407 pop_long(struct x86emu *emu)
8411 res = fetch_long(emu, emu->x86.R_SS, emu->x86.R_SP);
8412 emu->x86.R_SP += 4;