Lines Matching defs:emu

181 x86emu_intr_dispatch(struct X86EMU *emu, uint8_t intno)
183 if (emu->_X86EMU_intrTab[intno]) {
184 (*emu->_X86EMU_intrTab[intno]) (emu, intno);
186 push_word(emu, (uint16_t) emu->x86.R_FLG);
189 push_word(emu, emu->x86.R_CS);
190 emu->x86.R_CS = fetch_word(emu, 0, intno * 4 + 2);
191 push_word(emu, emu->x86.R_IP);
192 emu->x86.R_IP = fetch_word(emu, 0, intno * 4);
197 x86emu_intr_handle(struct X86EMU *emu)
201 if (emu->x86.intr & INTR_SYNCH) {
202 intno = emu->x86.intno;
203 emu->x86.intr = 0;
204 x86emu_intr_dispatch(emu, intno);
216 x86emu_intr_raise(struct X86EMU *emu, uint8_t intrnum)
218 emu->x86.intno = intrnum;
219 emu->x86.intr |= INTR_SYNCH;
228 X86EMU_exec(struct X86EMU *emu)
230 emu->x86.intr = 0;
233 if (setjmp(&emu->exec_state))
236 if (setjmp(emu->exec_state))
241 if (emu->x86.intr) {
242 if (((emu->x86.intr & INTR_SYNCH) && (emu->x86.intno == 0 || emu->x86.intno == 2)) ||
244 x86emu_intr_handle(emu);
247 if (emu->x86.R_CS == 0 && emu->x86.R_IP == 0)
249 X86EMU_exec_one_byte(emu);
250 ++emu->cur_cycles;
255 X86EMU_exec_call(struct X86EMU *emu, uint16_t seg, uint16_t off)
257 push_word(emu, 0);
258 push_word(emu, 0);
259 emu->x86.R_CS = seg;
260 emu->x86.R_IP = off;
262 X86EMU_exec(emu);
266 X86EMU_exec_intr(struct X86EMU *emu, uint8_t intr)
268 push_word(emu, emu->x86.R_FLG);
271 push_word(emu, 0);
272 push_word(emu, 0);
273 emu->x86.R_CS = (*emu->emu_rdw)(emu, intr * 4 + 2);
274 emu->x86.R_IP = (*emu->emu_rdw)(emu, intr * 4);
275 emu->x86.intr = 0;
277 X86EMU_exec(emu);
284 X86EMU_halt_sys(struct X86EMU *emu)
287 longjmp(&emu->exec_state);
289 longjmp(emu->exec_state, 1);
302 NOTE: Do not inline this function, as (*emu->emu_rdb) is already inline!
305 fetch_decode_modrm(struct X86EMU *emu)
309 fetched = fetch_byte_imm(emu);
310 emu->cur_mod = (fetched >> 6) & 0x03;
311 emu->cur_rh = (fetched >> 3) & 0x07;
312 emu->cur_rl = (fetched >> 0) & 0x07;
322 NOTE: Do not inline this function, as (*emu->emu_rdb) is already inline!
325 fetch_byte_imm(struct X86EMU *emu)
329 fetched = fetch_byte(emu, emu->x86.R_CS, emu->x86.R_IP);
330 emu->x86.R_IP++;
341 NOTE: Do not inline this function, as (*emu->emu_rdw) is already inline!
344 fetch_word_imm(struct X86EMU *emu)
348 fetched = fetch_word(emu, emu->x86.R_CS, emu->x86.R_IP);
349 emu->x86.R_IP += 2;
360 NOTE: Do not inline this function, as (*emu->emu_rdw) is already inline!
363 fetch_long_imm(struct X86EMU *emu)
367 fetched = fetch_long(emu, emu->x86.R_CS, emu->x86.R_IP);
368 emu->x86.R_IP += 4;
384 cpu-state-variable emu->x86.mode. There are several potential states:
401 get_data_segment(struct X86EMU *emu)
403 switch (emu->x86.mode & SYSMODE_SEGMASK) {
407 return emu->x86.R_DS;
409 return emu->x86.R_SS;
412 return emu->x86.R_CS;
415 return emu->x86.R_ES;
418 return emu->x86.R_FS;
421 return emu->x86.R_GS;
424 return emu->x86.R_SS;
426 X86EMU_halt_sys(emu);
435 NOTE: Do not inline this function as (*emu->emu_rdX) is already inline!
438 fetch_data_byte(struct X86EMU *emu, uint32_t offset)
440 return fetch_byte(emu, get_data_segment(emu), offset);
449 NOTE: Do not inline this function as (*emu->emu_rdX) is already inline!
452 fetch_data_word(struct X86EMU *emu, uint32_t offset)
454 return fetch_word(emu, get_data_segment(emu), offset);
463 NOTE: Do not inline this function as (*emu->emu_rdX) is already inline!
466 fetch_data_long(struct X86EMU *emu, uint32_t offset)
468 return fetch_long(emu, get_data_segment(emu), offset);
478 NOTE: Do not inline this function as (*emu->emu_rdX) is already inline!
481 fetch_byte(struct X86EMU *emu, uint32_t segment, uint32_t offset)
483 return (*emu->emu_rdb) (emu, ((uint32_t) segment << 4) + offset);
493 NOTE: Do not inline this function as (*emu->emu_rdX) is already inline!
496 fetch_word(struct X86EMU *emu, uint32_t segment, uint32_t offset)
498 return (*emu->emu_rdw) (emu, ((uint32_t) segment << 4) + offset);
508 NOTE: Do not inline this function as (*emu->emu_rdX) is already inline!
511 fetch_long(struct X86EMU *emu, uint32_t segment, uint32_t offset)
513 return (*emu->emu_rdl) (emu, ((uint32_t) segment << 4) + offset);
524 NOTE: Do not inline this function as (*emu->emu_wrX) is already inline!
527 store_data_byte(struct X86EMU *emu, uint32_t offset, uint8_t val)
529 store_byte(emu, get_data_segment(emu), offset, val);
540 NOTE: Do not inline this function as (*emu->emu_wrX) is already inline!
543 store_data_word(struct X86EMU *emu, uint32_t offset, uint16_t val)
545 store_word(emu, get_data_segment(emu), offset, val);
556 NOTE: Do not inline this function as (*emu->emu_wrX) is already inline!
559 store_data_long(struct X86EMU *emu, uint32_t offset, uint32_t val)
561 store_long(emu, get_data_segment(emu), offset, val);
572 NOTE: Do not inline this function as (*emu->emu_wrX) is already inline!
575 store_byte(struct X86EMU *emu, uint32_t segment, uint32_t offset, uint8_t val)
577 (*emu->emu_wrb) (emu, ((uint32_t) segment << 4) + offset, val);
588 NOTE: Do not inline this function as (*emu->emu_wrX) is already inline!
591 store_word(struct X86EMU *emu, uint32_t segment, uint32_t offset, uint16_t val)
593 (*emu->emu_wrw) (emu, ((uint32_t) segment << 4) + offset, val);
604 NOTE: Do not inline this function as (*emu->emu_wrX) is already inline!
607 store_long(struct X86EMU *emu, uint32_t segment, uint32_t offset, uint32_t val)
609 (*emu->emu_wrl) (emu, ((uint32_t) segment << 4) + offset, val);
623 decode_rm_byte_register(struct X86EMU *emu, int reg)
627 return &emu->x86.R_AL;
629 return &emu->x86.R_CL;
631 return &emu->x86.R_DL;
633 return &emu->x86.R_BL;
635 return &emu->x86.R_AH;
637 return &emu->x86.R_CH;
639 return &emu->x86.R_DH;
641 return &emu->x86.R_BH;
643 X86EMU_halt_sys(emu);
648 decode_rl_byte_register(struct X86EMU *emu)
650 return decode_rm_byte_register(emu, emu->cur_rl);
654 decode_rh_byte_register(struct X86EMU *emu)
656 return decode_rm_byte_register(emu, emu->cur_rh);
670 decode_rm_word_register(struct X86EMU *emu, int reg)
674 return &emu->x86.R_AX;
676 return &emu->x86.R_CX;
678 return &emu->x86.R_DX;
680 return &emu->x86.R_BX;
682 return &emu->x86.R_SP;
684 return &emu->x86.R_BP;
686 return &emu->x86.R_SI;
688 return &emu->x86.R_DI;
690 X86EMU_halt_sys(emu);
695 decode_rl_word_register(struct X86EMU *emu)
697 return decode_rm_word_register(emu, emu->cur_rl);
701 decode_rh_word_register(struct X86EMU *emu)
703 return decode_rm_word_register(emu, emu->cur_rh);
717 decode_rm_long_register(struct X86EMU *emu, int reg)
721 return &emu->x86.R_EAX;
723 return &emu->x86.R_ECX;
725 return &emu->x86.R_EDX;
727 return &emu->x86.R_EBX;
729 return &emu->x86.R_ESP;
731 return &emu->x86.R_EBP;
733 return &emu->x86.R_ESI;
735 return &emu->x86.R_EDI;
737 X86EMU_halt_sys(emu);
742 decode_rl_long_register(struct X86EMU *emu)
744 return decode_rm_long_register(emu, emu->cur_rl);
748 decode_rh_long_register(struct X86EMU *emu)
750 return decode_rm_long_register(emu, emu->cur_rh);
766 decode_rh_seg_register(struct X86EMU *emu)
768 switch (emu->cur_rh) {
770 return &emu->x86.R_ES;
772 return &emu->x86.R_CS;
774 return &emu->x86.R_SS;
776 return &emu->x86.R_DS;
778 return &emu->x86.R_FS;
780 return &emu->x86.R_GS;
782 X86EMU_halt_sys(emu);
790 decode_sib_address(struct X86EMU *emu, int sib, int mod)
796 base = emu->x86.R_EAX;
799 base = emu->x86.R_ECX;
802 base = emu->x86.R_EDX;
805 base = emu->x86.R_EBX;
808 base = emu->x86.R_ESP;
809 emu->x86.mode |= SYSMODE_SEG_DS_SS;
813 base = fetch_long_imm(emu);
815 base = emu->x86.R_EBP;
816 emu->x86.mode |= SYSMODE_SEG_DS_SS;
820 base = emu->x86.R_ESI;
823 base = emu->x86.R_EDI;
828 i = emu->x86.R_EAX;
831 i = emu->x86.R_ECX;
834 i = emu->x86.R_EDX;
837 i = emu->x86.R_EBX;
843 i = emu->x86.R_EBP;
846 i = emu->x86.R_ESI;
849 i = emu->x86.R_EDI;
867 decode_rl_address(struct X86EMU *emu)
869 if (emu->x86.mode & SYSMODE_PREFIX_ADDR) {
872 switch (emu->cur_rl) {
874 offset = emu->x86.R_EAX;
877 offset = emu->x86.R_ECX;
880 offset = emu->x86.R_EDX;
883 offset = emu->x86.R_EBX;
886 sib = fetch_byte_imm(emu);
887 offset = decode_sib_address(emu, sib, 0);
890 if (emu->cur_mod == 0) {
891 offset = fetch_long_imm(emu);
893 emu->x86.mode |= SYSMODE_SEG_DS_SS;
894 offset = emu->x86.R_EBP;
898 offset = emu->x86.R_ESI;
901 offset = emu->x86.R_EDI;
904 X86EMU_halt_sys(emu);
906 if (emu->cur_mod == 1)
907 offset += (int8_t)fetch_byte_imm(emu);
908 else if (emu->cur_mod == 2)
909 offset += fetch_long_imm(emu);
915 switch (emu->cur_rl) {
917 offset = emu->x86.R_BX + emu->x86.R_SI;
920 offset = emu->x86.R_BX + emu->x86.R_DI;
923 emu->x86.mode |= SYSMODE_SEG_DS_SS;
924 offset = emu->x86.R_BP + emu->x86.R_SI;
927 emu->x86.mode |= SYSMODE_SEG_DS_SS;
928 offset = emu->x86.R_BP + emu->x86.R_DI;
931 offset = emu->x86.R_SI;
934 offset = emu->x86.R_DI;
937 if (emu->cur_mod == 0) {
938 offset = fetch_word_imm(emu);
940 emu->x86.mode |= SYSMODE_SEG_DS_SS;
941 offset = emu->x86.R_BP;
945 offset = emu->x86.R_BX;
948 X86EMU_halt_sys(emu);
950 if (emu->cur_mod == 1)
951 offset += (int8_t)fetch_byte_imm(emu);
952 else if (emu->cur_mod == 2)
953 offset += fetch_word_imm(emu);
959 decode_and_fetch_byte(struct X86EMU *emu)
961 if (emu->cur_mod != 3) {
962 emu->cur_offset = decode_rl_address(emu);
963 return fetch_data_byte(emu, emu->cur_offset);
965 return *decode_rl_byte_register(emu);
970 decode_and_fetch_word_disp(struct X86EMU *emu, int16_t disp)
972 if (emu->cur_mod != 3) {
974 emu->cur_offset = decode_rl_address(emu) + disp;
975 if ((emu->x86.mode & SYSMODE_PREFIX_ADDR) == 0)
976 emu->cur_offset &= 0xffff;
977 return fetch_data_word(emu, emu->cur_offset);
979 return *decode_rl_word_register(emu);
984 decode_and_fetch_long_disp(struct X86EMU *emu, int16_t disp)
986 if (emu->cur_mod != 3) {
988 emu->cur_offset = decode_rl_address(emu) + disp;
989 if ((emu->x86.mode & SYSMODE_PREFIX_ADDR) == 0)
990 emu->cur_offset &= 0xffff;
991 return fetch_data_long(emu, emu->cur_offset);
993 return *decode_rl_long_register(emu);
998 decode_and_fetch_word(struct X86EMU *emu)
1000 return decode_and_fetch_word_disp(emu, 0);
1004 decode_and_fetch_long(struct X86EMU *emu)
1006 return decode_and_fetch_long_disp(emu, 0);
1010 decode_and_fetch_byte_imm8(struct X86EMU *emu, uint8_t *imm)
1012 if (emu->cur_mod != 3) {
1013 emu->cur_offset = decode_rl_address(emu);
1014 *imm = fetch_byte_imm(emu);
1015 return fetch_data_byte(emu, emu->cur_offset);
1017 *imm = fetch_byte_imm(emu);
1018 return *decode_rl_byte_register(emu);
1023 decode_and_fetch_word_imm8(struct X86EMU *emu, uint8_t *imm)
1025 if (emu->cur_mod != 3) {
1026 emu->cur_offset = decode_rl_address(emu);
1027 *imm = fetch_byte_imm(emu);
1028 return fetch_data_word(emu, emu->cur_offset);
1030 *imm = fetch_byte_imm(emu);
1031 return *decode_rl_word_register(emu);
1036 decode_and_fetch_long_imm8(struct X86EMU *emu, uint8_t *imm)
1038 if (emu->cur_mod != 3) {
1039 emu->cur_offset = decode_rl_address(emu);
1040 *imm = fetch_byte_imm(emu);
1041 return fetch_data_long(emu, emu->cur_offset);
1043 *imm = fetch_byte_imm(emu);
1044 return *decode_rl_long_register(emu);
1049 write_back_byte(struct X86EMU *emu, uint8_t val)
1051 if (emu->cur_mod != 3)
1052 store_data_byte(emu, emu->cur_offset, val);
1054 *decode_rl_byte_register(emu) = val;
1058 write_back_word(struct X86EMU *emu, uint16_t val)
1060 if (emu->cur_mod != 3)
1061 store_data_word(emu, emu->cur_offset, val);
1063 *decode_rl_word_register(emu) = val;
1067 write_back_long(struct X86EMU *emu, uint32_t val)
1069 if (emu->cur_mod != 3)
1070 store_data_long(emu, emu->cur_offset, val);
1072 *decode_rl_long_register(emu) = val;
1076 common_inc_word_long(struct X86EMU *emu, union X86EMU_register *reg)
1078 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1079 reg->I32_reg.e_reg = inc_long(emu, reg->I32_reg.e_reg);
1081 reg->I16_reg.x_reg = inc_word(emu, reg->I16_reg.x_reg);
1085 common_dec_word_long(struct X86EMU *emu, union X86EMU_register *reg)
1087 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1088 reg->I32_reg.e_reg = dec_long(emu, reg->I32_reg.e_reg);
1090 reg->I16_reg.x_reg = dec_word(emu, reg->I16_reg.x_reg);
1094 common_binop_byte_rm_r(struct X86EMU *emu, uint8_t (*binop)(struct X86EMU *, uint8_t, uint8_t))
1100 fetch_decode_modrm(emu);
1101 srcval = *decode_rh_byte_register(emu);
1102 if (emu->cur_mod != 3) {
1103 destoffset = decode_rl_address(emu);
1104 destval = fetch_data_byte(emu, destoffset);
1105 destval = (*binop)(emu, destval, srcval);
1106 store_data_byte(emu, destoffset, destval);
1108 destreg = decode_rl_byte_register(emu);
1109 *destreg = (*binop)(emu, *destreg, srcval);
1114 common_binop_ns_byte_rm_r(struct X86EMU *emu, void (*binop)(struct X86EMU *, uint8_t, uint8_t))
1119 fetch_decode_modrm(emu);
1120 srcval = *decode_rh_byte_register(emu);
1121 if (emu->cur_mod != 3) {
1122 destoffset = decode_rl_address(emu);
1123 destval = fetch_data_byte(emu, destoffset);
1125 destval = *decode_rl_byte_register(emu);
1127 (*binop)(emu, destval, srcval);
1131 common_binop_word_rm_r(struct X86EMU *emu, uint16_t (*binop)(struct X86EMU *, uint16_t, uint16_t))
1136 fetch_decode_modrm(emu);
1137 srcval = *decode_rh_word_register(emu);
1138 if (emu->cur_mod != 3) {
1139 destoffset = decode_rl_address(emu);
1140 destval = fetch_data_word(emu, destoffset);
1141 destval = (*binop)(emu, destval, srcval);
1142 store_data_word(emu, destoffset, destval);
1144 destreg = decode_rl_word_register(emu);
1145 *destreg = (*binop)(emu, *destreg, srcval);
1150 common_binop_byte_r_rm(struct X86EMU *emu, uint8_t (*binop)(struct X86EMU *, uint8_t, uint8_t))
1155 fetch_decode_modrm(emu);
1156 destreg = decode_rh_byte_register(emu);
1157 if (emu->cur_mod != 3) {
1158 srcoffset = decode_rl_address(emu);
1159 srcval = fetch_data_byte(emu, srcoffset);
1161 srcval = *decode_rl_byte_register(emu);
1163 *destreg = (*binop)(emu, *destreg, srcval);
1167 common_binop_long_rm_r(struct X86EMU *emu, uint32_t (*binop)(struct X86EMU *, uint32_t, uint32_t))
1172 fetch_decode_modrm(emu);
1173 srcval = *decode_rh_long_register(emu);
1174 if (emu->cur_mod != 3) {
1175 destoffset = decode_rl_address(emu);
1176 destval = fetch_data_long(emu, destoffset);
1177 destval = (*binop)(emu, destval, srcval);
1178 store_data_long(emu, destoffset, destval);
1180 destreg = decode_rl_long_register(emu);
1181 *destreg = (*binop)(emu, *destreg, srcval);
1186 common_binop_word_long_rm_r(struct X86EMU *emu,
1189 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1190 common_binop_long_rm_r(emu, binop32);
1192 common_binop_word_rm_r(emu, binop16);
1196 common_binop_ns_word_rm_r(struct X86EMU *emu, void (*binop)(struct X86EMU *, uint16_t, uint16_t))
1201 fetch_decode_modrm(emu);
1202 srcval = *decode_rh_word_register(emu);
1203 if (emu->cur_mod != 3) {
1204 destoffset = decode_rl_address(emu);
1205 destval = fetch_data_word(emu, destoffset);
1207 destval = *decode_rl_word_register(emu);
1209 (*binop)(emu, destval, srcval);
1214 common_binop_ns_long_rm_r(struct X86EMU *emu, void (*binop)(struct X86EMU *, uint32_t, uint32_t))
1219 fetch_decode_modrm(emu);
1220 srcval = *decode_rh_long_register(emu);
1221 if (emu->cur_mod != 3) {
1222 destoffset = decode_rl_address(emu);
1223 destval = fetch_data_long(emu, destoffset);
1225 destval = *decode_rl_long_register(emu);
1227 (*binop)(emu, destval, srcval);
1231 common_binop_ns_word_long_rm_r(struct X86EMU *emu,
1234 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1235 common_binop_ns_long_rm_r(emu, binop32);
1237 common_binop_ns_word_rm_r(emu, binop16);
1241 common_binop_long_r_rm(struct X86EMU *emu, uint32_t (*binop)(struct X86EMU *, uint32_t, uint32_t))
1246 fetch_decode_modrm(emu);
1247 destreg = decode_rh_long_register(emu);
1248 if (emu->cur_mod != 3) {
1249 srcoffset = decode_rl_address(emu);
1250 srcval = fetch_data_long(emu, srcoffset);
1252 srcval = *decode_rl_long_register(emu);
1254 *destreg = (*binop)(emu, *destreg, srcval);
1258 common_binop_word_r_rm(struct X86EMU *emu, uint16_t (*binop)(struct X86EMU *, uint16_t, uint16_t))
1263 fetch_decode_modrm(emu);
1264 destreg = decode_rh_word_register(emu);
1265 if (emu->cur_mod != 3) {
1266 srcoffset = decode_rl_address(emu);
1267 srcval = fetch_data_word(emu, srcoffset);
1269 srcval = *decode_rl_word_register(emu);
1271 *destreg = (*binop)(emu, *destreg, srcval);
1275 common_binop_word_long_r_rm(struct X86EMU *emu,
1278 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1279 common_binop_long_r_rm(emu, binop32);
1281 common_binop_word_r_rm(emu, binop16);
1285 common_binop_byte_imm(struct X86EMU *emu, uint8_t (*binop)(struct X86EMU *, uint8_t, uint8_t))
1289 srcval = fetch_byte_imm(emu);
1290 emu->x86.R_AL = (*binop)(emu, emu->x86.R_AL, srcval);
1294 common_binop_word_long_imm(struct X86EMU *emu,
1297 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
1300 srcval = fetch_long_imm(emu);
1301 emu->x86.R_EAX = (*binop32)(emu, emu->x86.R_EAX, srcval);
1305 srcval = fetch_word_imm(emu);
1306 emu->x86.R_AX = (*binop16)(emu, emu->x86.R_AX, srcval);
1311 common_push_word_long(struct X86EMU *emu, union X86EMU_register *reg)
1313 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1314 push_long(emu, reg->I32_reg.e_reg);
1316 push_word(emu, reg->I16_reg.x_reg);
1320 common_pop_word_long(struct X86EMU *emu, union X86EMU_register *reg)
1322 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1323 reg->I32_reg.e_reg = pop_long(emu);
1325 reg->I16_reg.x_reg = pop_word(emu);
1329 common_imul_long_IMM(struct X86EMU *emu, bool byte_imm)
1336 fetch_decode_modrm(emu);
1337 destreg = decode_rh_long_register(emu);
1338 if (emu->cur_mod != 3) {
1339 srcoffset = decode_rl_address(emu);
1340 srcval = fetch_data_long(emu, srcoffset);
1342 srcval = *decode_rl_long_register(emu);
1346 imm = (int8_t)fetch_byte_imm(emu);
1348 imm = fetch_long_imm(emu);
1362 common_imul_word_IMM(struct X86EMU *emu, bool byte_imm)
1369 fetch_decode_modrm(emu);
1370 destreg = decode_rh_word_register(emu);
1371 if (emu->cur_mod != 3) {
1372 srcoffset = decode_rl_address(emu);
1373 srcval = fetch_data_word(emu, srcoffset);
1375 srcval = *decode_rl_word_register(emu);
1379 imm = (int8_t)fetch_byte_imm(emu);
1381 imm = fetch_word_imm(emu);
1395 common_imul_imm(struct X86EMU *emu, bool byte_imm)
1397 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1398 common_imul_long_IMM(emu, byte_imm);
1400 common_imul_word_IMM(emu, byte_imm);
1404 common_jmp_near(struct X86EMU *emu, bool cond)
1409 offset = (int8_t) fetch_byte_imm(emu);
1410 target = (uint16_t) (emu->x86.R_IP + (int16_t) offset);
1412 emu->x86.R_IP = target;
1416 common_load_far_pointer(struct X86EMU *emu, uint16_t *seg)
1421 fetch_decode_modrm(emu);
1422 if (emu->cur_mod == 3)
1423 X86EMU_halt_sys(emu);
1425 dstreg = decode_rh_word_register(emu);
1426 srcoffset = decode_rl_address(emu);
1427 *dstreg = fetch_data_word(emu, srcoffset);
1428 *seg = fetch_data_word(emu, srcoffset + 2);
1437 x86emuOp_cmp_byte_R_RM(struct X86EMU *emu)
1441 fetch_decode_modrm(emu);
1442 destreg = decode_rh_byte_register(emu);
1443 srcval = decode_and_fetch_byte(emu);
1444 cmp_byte(emu, *destreg, srcval);
1451 x86emuOp32_cmp_word_R_RM(struct X86EMU *emu)
1455 fetch_decode_modrm(emu);
1456 destreg = decode_rh_long_register(emu);
1457 srcval = decode_and_fetch_long(emu);
1458 cmp_long(emu, *destreg, srcval);
1462 x86emuOp16_cmp_word_R_RM(struct X86EMU *emu)
1466 fetch_decode_modrm(emu);
1467 destreg = decode_rh_word_register(emu);
1468 srcval = decode_and_fetch_word(emu);
1469 cmp_word(emu, *destreg, srcval);
1473 x86emuOp_cmp_word_R_RM(struct X86EMU *emu)
1475 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1476 x86emuOp32_cmp_word_R_RM(emu);
1478 x86emuOp16_cmp_word_R_RM(emu);
1485 x86emuOp_cmp_byte_AL_IMM(struct X86EMU *emu)
1489 srcval = fetch_byte_imm(emu);
1490 cmp_byte(emu, emu->x86.R_AL, srcval);
1497 x86emuOp32_cmp_word_AX_IMM(struct X86EMU *emu)
1501 srcval = fetch_long_imm(emu);
1502 cmp_long(emu, emu->x86.R_EAX, srcval);
1506 x86emuOp16_cmp_word_AX_IMM(struct X86EMU *emu)
1510 srcval = fetch_word_imm(emu);
1511 cmp_word(emu, emu->x86.R_AX, srcval);
1515 x86emuOp_cmp_word_AX_IMM(struct X86EMU *emu)
1517 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1518 x86emuOp32_cmp_word_AX_IMM(emu);
1520 x86emuOp16_cmp_word_AX_IMM(emu);
1527 x86emuOp_push_all(struct X86EMU *emu)
1529 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
1530 uint32_t old_sp = emu->x86.R_ESP;
1532 push_long(emu, emu->x86.R_EAX);
1533 push_long(emu, emu->x86.R_ECX);
1534 push_long(emu, emu->x86.R_EDX);
1535 push_long(emu, emu->x86.R_EBX);
1536 push_long(emu, old_sp);
1537 push_long(emu, emu->x86.R_EBP);
1538 push_long(emu, emu->x86.R_ESI);
1539 push_long(emu, emu->x86.R_EDI);
1541 uint16_t old_sp = emu->x86.R_SP;
1543 push_word(emu, emu->x86.R_AX);
1544 push_word(emu, emu->x86.R_CX);
1545 push_word(emu, emu->x86.R_DX);
1546 push_word(emu, emu->x86.R_BX);
1547 push_word(emu, old_sp);
1548 push_word(emu, emu->x86.R_BP);
1549 push_word(emu, emu->x86.R_SI);
1550 push_word(emu, emu->x86.R_DI);
1558 x86emuOp_pop_all(struct X86EMU *emu)
1560 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
1561 emu->x86.R_EDI = pop_long(emu);
1562 emu->x86.R_ESI = pop_long(emu);
1563 emu->x86.R_EBP = pop_long(emu);
1564 emu->x86.R_ESP += 4; /* skip ESP */
1565 emu->x86.R_EBX = pop_long(emu);
1566 emu->x86.R_EDX = pop_long(emu);
1567 emu->x86.R_ECX = pop_long(emu);
1568 emu->x86.R_EAX = pop_long(emu);
1570 emu->x86.R_DI = pop_word(emu);
1571 emu->x86.R_SI = pop_word(emu);
1572 emu->x86.R_BP = pop_word(emu);
1573 emu->x86.R_SP += 2;/* skip SP */
1574 emu->x86.R_BX = pop_word(emu);
1575 emu->x86.R_DX = pop_word(emu);
1576 emu->x86.R_CX = pop_word(emu);
1577 emu->x86.R_AX = pop_word(emu);
1588 x86emuOp_push_word_IMM(struct X86EMU *emu)
1590 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
1593 imm = fetch_long_imm(emu);
1594 push_long(emu, imm);
1598 imm = fetch_word_imm(emu);
1599 push_word(emu, imm);
1607 x86emuOp_push_byte_IMM(struct X86EMU *emu)
1611 imm = (int8_t) fetch_byte_imm(emu);
1612 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
1613 push_long(emu, (int32_t) imm);
1615 push_word(emu, imm);
1627 x86emuOp_ins_word(struct X86EMU *emu)
1629 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
1630 ins(emu, 4);
1632 ins(emu, 2);
1640 x86emuOp_outs_word(struct X86EMU *emu)
1642 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
1643 outs(emu, 4);
1645 outs(emu, 2);
1653 x86emuOp_jump_near_L(struct X86EMU *emu)
1660 common_jmp_near(emu, sf != of);
1667 x86emuOp_jump_near_NL(struct X86EMU *emu)
1674 common_jmp_near(emu, sf == of);
1681 x86emuOp_jump_near_LE(struct X86EMU *emu)
1688 common_jmp_near(emu, sf != of || ACCESS_FLAG(F_ZF));
1695 x86emuOp_jump_near_NLE(struct X86EMU *emu)
1702 common_jmp_near(emu, sf == of && !ACCESS_FLAG(F_ZF));
1722 x86emuOp_opc80_byte_RM_IMM(struct X86EMU *emu)
1731 fetch_decode_modrm(emu);
1732 destval = decode_and_fetch_byte(emu);
1733 imm = fetch_byte_imm(emu);
1734 destval = (*opc80_byte_operation[emu->cur_rh]) (emu, destval, imm);
1735 if (emu->cur_rh != 7)
1736 write_back_byte(emu, destval);
1769 x86emuOp32_opc81_word_RM_IMM(struct X86EMU *emu)
1778 fetch_decode_modrm(emu);
1779 destval = decode_and_fetch_long(emu);
1780 imm = fetch_long_imm(emu);
1781 destval = (*opc81_long_operation[emu->cur_rh]) (emu, destval, imm);
1782 if (emu->cur_rh != 7)
1783 write_back_long(emu, destval);
1787 x86emuOp16_opc81_word_RM_IMM(struct X86EMU *emu)
1796 fetch_decode_modrm(emu);
1797 destval = decode_and_fetch_word(emu);
1798 imm = fetch_word_imm(emu);
1799 destval = (*opc81_word_operation[emu->cur_rh]) (emu, destval, imm);
1800 if (emu->cur_rh != 7)
1801 write_back_word(emu, destval);
1805 x86emuOp_opc81_word_RM_IMM(struct X86EMU *emu)
1807 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1808 x86emuOp32_opc81_word_RM_IMM(emu);
1810 x86emuOp16_opc81_word_RM_IMM(emu);
1830 x86emuOp_opc82_byte_RM_IMM(struct X86EMU *emu)
1840 fetch_decode_modrm(emu);
1841 destval = decode_and_fetch_byte(emu);
1842 imm = fetch_byte_imm(emu);
1843 destval = (*opc82_byte_operation[emu->cur_rh]) (emu, destval, imm);
1844 if (emu->cur_rh != 7)
1845 write_back_byte(emu, destval);
1878 x86emuOp32_opc83_word_RM_IMM(struct X86EMU *emu)
1882 fetch_decode_modrm(emu);
1883 destval = decode_and_fetch_long(emu);
1884 imm = (int8_t) fetch_byte_imm(emu);
1885 destval = (*opc83_long_operation[emu->cur_rh]) (emu, destval, imm);
1886 if (emu->cur_rh != 7)
1887 write_back_long(emu, destval);
1891 x86emuOp16_opc83_word_RM_IMM(struct X86EMU *emu)
1895 fetch_decode_modrm(emu);
1896 destval = decode_and_fetch_word(emu);
1897 imm = (int8_t) fetch_byte_imm(emu);
1898 destval = (*opc83_word_operation[emu->cur_rh]) (emu, destval, imm);
1899 if (emu->cur_rh != 7)
1900 write_back_word(emu, destval);
1904 x86emuOp_opc83_word_RM_IMM(struct X86EMU *emu)
1906 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1907 x86emuOp32_opc83_word_RM_IMM(emu);
1909 x86emuOp16_opc83_word_RM_IMM(emu);
1916 x86emuOp_xchg_byte_RM_R(struct X86EMU *emu)
1920 fetch_decode_modrm(emu);
1921 destval = decode_and_fetch_byte(emu);
1922 srcreg = decode_rh_byte_register(emu);
1926 write_back_byte(emu, destval);
1933 x86emuOp32_xchg_word_RM_R(struct X86EMU *emu)
1937 fetch_decode_modrm(emu);
1938 destval = decode_and_fetch_long(emu);
1939 srcreg = decode_rh_long_register(emu);
1943 write_back_long(emu, destval);
1947 x86emuOp16_xchg_word_RM_R(struct X86EMU *emu)
1951 fetch_decode_modrm(emu);
1952 destval = decode_and_fetch_word(emu);
1953 srcreg = decode_rh_word_register(emu);
1957 write_back_word(emu, destval);
1961 x86emuOp_xchg_word_RM_R(struct X86EMU *emu)
1963 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1964 x86emuOp32_xchg_word_RM_R(emu);
1966 x86emuOp16_xchg_word_RM_R(emu);
1973 x86emuOp_mov_byte_RM_R(struct X86EMU *emu)
1978 fetch_decode_modrm(emu);
1979 srcreg = decode_rh_byte_register(emu);
1980 if (emu->cur_mod != 3) {
1981 destoffset = decode_rl_address(emu);
1982 store_data_byte(emu, destoffset, *srcreg);
1984 destreg = decode_rl_byte_register(emu);
1993 x86emuOp32_mov_word_RM_R(struct X86EMU *emu)
1998 fetch_decode_modrm(emu);
1999 srcval = *decode_rh_long_register(emu);
2000 if (emu->cur_mod != 3) {
2001 destoffset = decode_rl_address(emu);
2002 store_data_long(emu, destoffset, srcval);
2004 destreg = decode_rl_long_register(emu);
2010 x86emuOp16_mov_word_RM_R(struct X86EMU *emu)
2015 fetch_decode_modrm(emu);
2016 srcval = *decode_rh_word_register(emu);
2017 if (emu->cur_mod != 3) {
2018 destoffset = decode_rl_address(emu);
2019 store_data_word(emu, destoffset, srcval);
2021 destreg = decode_rl_word_register(emu);
2027 x86emuOp_mov_word_RM_R(struct X86EMU *emu)
2029 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
2030 x86emuOp32_mov_word_RM_R(emu);
2032 x86emuOp16_mov_word_RM_R(emu);
2039 x86emuOp_mov_byte_R_RM(struct X86EMU *emu)
2043 fetch_decode_modrm(emu);
2044 destreg = decode_rh_byte_register(emu);
2045 *destreg = decode_and_fetch_byte(emu);
2052 x86emuOp_mov_word_R_RM(struct X86EMU *emu)
2054 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2057 fetch_decode_modrm(emu);
2058 destreg = decode_rh_long_register(emu);
2059 *destreg = decode_and_fetch_long(emu);
2063 fetch_decode_modrm(emu);
2064 destreg = decode_rh_word_register(emu);
2065 *destreg = decode_and_fetch_word(emu);
2073 x86emuOp_mov_word_RM_SR(struct X86EMU *emu)
2078 fetch_decode_modrm(emu);
2079 srcval = *decode_rh_seg_register(emu);
2080 if (emu->cur_mod != 3) {
2081 destoffset = decode_rl_address(emu);
2082 store_data_word(emu, destoffset, srcval);
2084 destreg = decode_rl_word_register(emu);
2093 x86emuOp_lea_word_R_M(struct X86EMU *emu)
2097 fetch_decode_modrm(emu);
2098 if (emu->cur_mod == 3)
2099 X86EMU_halt_sys(emu);
2101 destoffset = decode_rl_address(emu);
2102 if (emu->x86.mode & SYSMODE_PREFIX_ADDR) {
2105 srcreg = decode_rh_long_register(emu);
2110 srcreg = decode_rh_word_register(emu);
2119 x86emuOp_mov_word_SR_RM(struct X86EMU *emu)
2123 fetch_decode_modrm(emu);
2124 destreg = decode_rh_seg_register(emu);
2125 *destreg = decode_and_fetch_word(emu);
2138 x86emuOp32_pop_RM(struct X86EMU *emu)
2143 fetch_decode_modrm(emu);
2144 if (emu->cur_mod != 3) {
2145 destoffset = decode_rl_address(emu);
2146 destval = pop_long(emu);
2147 store_data_long(emu, destoffset, destval);
2149 destreg = decode_rl_long_register(emu);
2150 *destreg = pop_long(emu);
2155 x86emuOp16_pop_RM(struct X86EMU *emu)
2160 fetch_decode_modrm(emu);
2161 if (emu->cur_mod != 3) {
2162 destoffset = decode_rl_address(emu);
2163 destval = pop_word(emu);
2164 store_data_word(emu, destoffset, destval);
2166 destreg = decode_rl_word_register(emu);
2167 *destreg = pop_word(emu);
2172 x86emuOp_pop_RM(struct X86EMU *emu)
2174 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
2175 x86emuOp32_pop_RM(emu);
2177 x86emuOp16_pop_RM(emu);
2184 x86emuOp_xchg_word_AX_CX(struct X86EMU *emu)
2188 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2189 tmp = emu->x86.R_EAX;
2190 emu->x86.R_EAX = emu->x86.R_ECX;
2191 emu->x86.R_ECX = tmp;
2193 tmp = emu->x86.R_AX;
2194 emu->x86.R_AX = emu->x86.R_CX;
2195 emu->x86.R_CX = (uint16_t) tmp;
2203 x86emuOp_xchg_word_AX_DX(struct X86EMU *emu)
2207 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2208 tmp = emu->x86.R_EAX;
2209 emu->x86.R_EAX = emu->x86.R_EDX;
2210 emu->x86.R_EDX = tmp;
2212 tmp = emu->x86.R_AX;
2213 emu->x86.R_AX = emu->x86.R_DX;
2214 emu->x86.R_DX = (uint16_t) tmp;
2222 x86emuOp_xchg_word_AX_BX(struct X86EMU *emu)
2226 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2227 tmp = emu->x86.R_EAX;
2228 emu->x86.R_EAX = emu->x86.R_EBX;
2229 emu->x86.R_EBX = tmp;
2231 tmp = emu->x86.R_AX;
2232 emu->x86.R_AX = emu->x86.R_BX;
2233 emu->x86.R_BX = (uint16_t) tmp;
2241 x86emuOp_xchg_word_AX_SP(struct X86EMU *emu)
2245 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2246 tmp = emu->x86.R_EAX;
2247 emu->x86.R_EAX = emu->x86.R_ESP;
2248 emu->x86.R_ESP = tmp;
2250 tmp = emu->x86.R_AX;
2251 emu->x86.R_AX = emu->x86.R_SP;
2252 emu->x86.R_SP = (uint16_t) tmp;
2260 x86emuOp_xchg_word_AX_BP(struct X86EMU *emu)
2264 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2265 tmp = emu->x86.R_EAX;
2266 emu->x86.R_EAX = emu->x86.R_EBP;
2267 emu->x86.R_EBP = tmp;
2269 tmp = emu->x86.R_AX;
2270 emu->x86.R_AX = emu->x86.R_BP;
2271 emu->x86.R_BP = (uint16_t) tmp;
2279 x86emuOp_xchg_word_AX_SI(struct X86EMU *emu)
2283 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2284 tmp = emu->x86.R_EAX;
2285 emu->x86.R_EAX = emu->x86.R_ESI;
2286 emu->x86.R_ESI = tmp;
2288 tmp = emu->x86.R_AX;
2289 emu->x86.R_AX = emu->x86.R_SI;
2290 emu->x86.R_SI = (uint16_t) tmp;
2298 x86emuOp_xchg_word_AX_DI(struct X86EMU *emu)
2302 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2303 tmp = emu->x86.R_EAX;
2304 emu->x86.R_EAX = emu->x86.R_EDI;
2305 emu->x86.R_EDI = tmp;
2307 tmp = emu->x86.R_AX;
2308 emu->x86.R_AX = emu->x86.R_DI;
2309 emu->x86.R_DI = (uint16_t) tmp;
2317 x86emuOp_cbw(struct X86EMU *emu)
2319 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2320 if (emu->x86.R_AX & 0x8000) {
2321 emu->x86.R_EAX |= 0xffff0000;
2323 emu->x86.R_EAX &= 0x0000ffff;
2326 if (emu->x86.R_AL & 0x80) {
2327 emu->x86.R_AH = 0xff;
2329 emu->x86.R_AH = 0x0;
2338 x86emuOp_cwd(struct X86EMU *emu)
2340 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2341 if (emu->x86.R_EAX & 0x80000000) {
2342 emu->x86.R_EDX = 0xffffffff;
2344 emu->x86.R_EDX = 0x0;
2347 if (emu->x86.R_AX & 0x8000) {
2348 emu->x86.R_DX = 0xffff;
2350 emu->x86.R_DX = 0x0;
2359 x86emuOp_call_far_IMM(struct X86EMU *emu)
2363 faroff = fetch_word_imm(emu);
2364 farseg = fetch_word_imm(emu);
2370 push_word(emu, emu->x86.R_CS);
2371 emu->x86.R_CS = farseg;
2372 push_word(emu, emu->x86.R_IP);
2373 emu->x86.R_IP = faroff;
2380 x86emuOp_pushf_word(struct X86EMU *emu)
2385 flags = (emu->x86.R_EFLG & F_MSK) | F_ALWAYS_ON;
2386 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2387 push_long(emu, flags);
2389 push_word(emu, (uint16_t) flags);
2397 x86emuOp_popf_word(struct X86EMU *emu)
2399 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2400 emu->x86.R_EFLG = pop_long(emu);
2402 emu->x86.R_FLG = pop_word(emu);
2410 x86emuOp_sahf(struct X86EMU *emu)
2413 emu->x86.R_FLG &= 0xffffff00;
2415 emu->x86.R_FLG |= emu->x86.R_AH;
2422 x86emuOp_lahf(struct X86EMU *emu)
2424 emu->x86.R_AH = (uint8_t) (emu->x86.R_FLG & 0xff);
2427 emu->x86.R_AH |= 0x2;
2434 x86emuOp_mov_AL_M_IMM(struct X86EMU *emu)
2438 offset = fetch_word_imm(emu);
2439 emu->x86.R_AL = fetch_data_byte(emu, offset);
2446 x86emuOp_mov_AX_M_IMM(struct X86EMU *emu)
2450 offset = fetch_word_imm(emu);
2451 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2452 emu->x86.R_EAX = fetch_data_long(emu, offset);
2454 emu->x86.R_AX = fetch_data_word(emu, offset);
2462 x86emuOp_mov_M_AL_IMM(struct X86EMU *emu)
2466 offset = fetch_word_imm(emu);
2467 store_data_byte(emu, offset, emu->x86.R_AL);
2474 x86emuOp_mov_M_AX_IMM(struct X86EMU *emu)
2478 offset = fetch_word_imm(emu);
2479 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2480 store_data_long(emu, offset, emu->x86.R_EAX);
2482 store_data_word(emu, offset, emu->x86.R_AX);
2490 x86emuOp_movs_byte(struct X86EMU *emu)
2501 if (emu->x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
2504 count = emu->x86.R_CX;
2505 emu->x86.R_CX = 0;
2506 emu->x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
2509 val = fetch_data_byte(emu, emu->x86.R_SI);
2510 store_byte(emu, emu->x86.R_ES, emu->x86.R_DI, val);
2511 emu->x86.R_SI += inc;
2512 emu->x86.R_DI += inc;
2520 x86emuOp_movs_word(struct X86EMU *emu)
2526 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
2535 if (emu->x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
2538 count = emu->x86.R_CX;
2539 emu->x86.R_CX = 0;
2540 emu->x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
2543 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2544 val = fetch_data_long(emu, emu->x86.R_SI);
2545 store_long(emu, emu->x86.R_ES, emu->x86.R_DI, val);
2547 val = fetch_data_word(emu, emu->x86.R_SI);
2548 store_word(emu, emu->x86.R_ES, emu->x86.R_DI, (uint16_t) val);
2550 emu->x86.R_SI += inc;
2551 emu->x86.R_DI += inc;
2559 x86emuOp_cmps_byte(struct X86EMU *emu)
2569 if (emu->x86.mode & SYSMODE_PREFIX_REPE) {
2572 while (emu->x86.R_CX != 0) {
2573 val1 = fetch_data_byte(emu, emu->x86.R_SI);
2574 val2 = fetch_byte(emu, emu->x86.R_ES, emu->x86.R_DI);
2575 cmp_byte(emu, val1, val2);
2576 emu->x86.R_CX -= 1;
2577 emu->x86.R_SI += inc;
2578 emu->x86.R_DI += inc;
2582 emu->x86.mode &= ~SYSMODE_PREFIX_REPE;
2583 } else if (emu->x86.mode & SYSMODE_PREFIX_REPNE) {
2586 while (emu->x86.R_CX != 0) {
2587 val1 = fetch_data_byte(emu, emu->x86.R_SI);
2588 val2 = fetch_byte(emu, emu->x86.R_ES, emu->x86.R_DI);
2589 cmp_byte(emu, val1, val2);
2590 emu->x86.R_CX -= 1;
2591 emu->x86.R_SI += inc;
2592 emu->x86.R_DI += inc;
2596 emu->x86.mode &= ~SYSMODE_PREFIX_REPNE;
2598 val1 = fetch_data_byte(emu, emu->x86.R_SI);
2599 val2 = fetch_byte(emu, emu->x86.R_ES, emu->x86.R_DI);
2600 cmp_byte(emu, val1, val2);
2601 emu->x86.R_SI += inc;
2602 emu->x86.R_DI += inc;
2610 x86emuOp_cmps_word(struct X86EMU *emu)
2615 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2626 if (emu->x86.mode & SYSMODE_PREFIX_REPE) {
2629 while (emu->x86.R_CX != 0) {
2630 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2631 val1 = fetch_data_long(emu, emu->x86.R_SI);
2632 val2 = fetch_long(emu, emu->x86.R_ES, emu->x86.R_DI);
2633 cmp_long(emu, val1, val2);
2635 val1 = fetch_data_word(emu, emu->x86.R_SI);
2636 val2 = fetch_word(emu, emu->x86.R_ES, emu->x86.R_DI);
2637 cmp_word(emu, (uint16_t) val1, (uint16_t) val2);
2639 emu->x86.R_CX -= 1;
2640 emu->x86.R_SI += inc;
2641 emu->x86.R_DI += inc;
2645 emu->x86.mode &= ~SYSMODE_PREFIX_REPE;
2646 } else if (emu->x86.mode & SYSMODE_PREFIX_REPNE) {
2649 while (emu->x86.R_CX != 0) {
2650 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2651 val1 = fetch_data_long(emu, emu->x86.R_SI);
2652 val2 = fetch_long(emu, emu->x86.R_ES, emu->x86.R_DI);
2653 cmp_long(emu, val1, val2);
2655 val1 = fetch_data_word(emu, emu->x86.R_SI);
2656 val2 = fetch_word(emu, emu->x86.R_ES, emu->x86.R_DI);
2657 cmp_word(emu, (uint16_t) val1, (uint16_t) val2);
2659 emu->x86.R_CX -= 1;
2660 emu->x86.R_SI += inc;
2661 emu->x86.R_DI += inc;
2665 emu->x86.mode &= ~SYSMODE_PREFIX_REPNE;
2667 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2668 val1 = fetch_data_long(emu, emu->x86.R_SI);
2669 val2 = fetch_long(emu, emu->x86.R_ES, emu->x86.R_DI);
2670 cmp_long(emu, val1, val2);
2672 val1 = fetch_data_word(emu, emu->x86.R_SI);
2673 val2 = fetch_word(emu, emu->x86.R_ES, emu->x86.R_DI);
2674 cmp_word(emu, (uint16_t) val1, (uint16_t) val2);
2676 emu->x86.R_SI += inc;
2677 emu->x86.R_DI += inc;
2685 x86emuOp_test_AX_IMM(struct X86EMU *emu)
2687 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2688 test_long(emu, emu->x86.R_EAX, fetch_long_imm(emu));
2690 test_word(emu, emu->x86.R_AX, fetch_word_imm(emu));
2698 x86emuOp_stos_byte(struct X86EMU *emu)
2706 if (emu->x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
2709 while (emu->x86.R_CX != 0) {
2710 store_byte(emu, emu->x86.R_ES, emu->x86.R_DI, emu->x86.R_AL);
2711 emu->x86.R_CX -= 1;
2712 emu->x86.R_DI += inc;
2714 emu->x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
2716 store_byte(emu, emu->x86.R_ES, emu->x86.R_DI, emu->x86.R_AL);
2717 emu->x86.R_DI += inc;
2725 x86emuOp_stos_word(struct X86EMU *emu)
2730 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
2739 if (emu->x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
2742 count = emu->x86.R_CX;
2743 emu->x86.R_CX = 0;
2744 emu->x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
2747 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2748 store_long(emu, emu->x86.R_ES, emu->x86.R_DI, emu->x86.R_EAX);
2750 store_word(emu, emu->x86.R_ES, emu->x86.R_DI, emu->x86.R_AX);
2752 emu->x86.R_DI += inc;
2760 x86emuOp_lods_byte(struct X86EMU *emu)
2768 if (emu->x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
2771 while (emu->x86.R_CX != 0) {
2772 emu->x86.R_AL = fetch_data_byte(emu, emu->x86.R_SI);
2773 emu->x86.R_CX -= 1;
2774 emu->x86.R_SI += inc;
2776 emu->x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
2778 emu->x86.R_AL = fetch_data_byte(emu, emu->x86.R_SI);
2779 emu->x86.R_SI += inc;
2787 x86emuOp_lods_word(struct X86EMU *emu)
2792 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
2801 if (emu->x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
2804 count = emu->x86.R_CX;
2805 emu->x86.R_CX = 0;
2806 emu->x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
2809 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2810 emu->x86.R_EAX = fetch_data_long(emu, emu->x86.R_SI);
2812 emu->x86.R_AX = fetch_data_word(emu, emu->x86.R_SI);
2814 emu->x86.R_SI += inc;
2822 x86emuOp_scas_byte(struct X86EMU *emu)
2831 if (emu->x86.mode & SYSMODE_PREFIX_REPE) {
2834 while (emu->x86.R_CX != 0) {
2835 val2 = fetch_byte(emu, emu->x86.R_ES, emu->x86.R_DI);
2836 cmp_byte(emu, emu->x86.R_AL, val2);
2837 emu->x86.R_CX -= 1;
2838 emu->x86.R_DI += inc;
2842 emu->x86.mode &= ~SYSMODE_PREFIX_REPE;
2843 } else if (emu->x86.mode & SYSMODE_PREFIX_REPNE) {
2846 while (emu->x86.R_CX != 0) {
2847 val2 = fetch_byte(emu, emu->x86.R_ES, emu->x86.R_DI);
2848 cmp_byte(emu, emu->x86.R_AL, val2);
2849 emu->x86.R_CX -= 1;
2850 emu->x86.R_DI += inc;
2854 emu->x86.mode &= ~SYSMODE_PREFIX_REPNE;
2856 val2 = fetch_byte(emu, emu->x86.R_ES, emu->x86.R_DI);
2857 cmp_byte(emu, emu->x86.R_AL, val2);
2858 emu->x86.R_DI += inc;
2866 x86emuOp_scas_word(struct X86EMU *emu)
2871 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
2879 if (emu->x86.mode & SYSMODE_PREFIX_REPE) {
2882 while (emu->x86.R_CX != 0) {
2883 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2884 val = fetch_long(emu, emu->x86.R_ES, emu->x86.R_DI);
2885 cmp_long(emu, emu->x86.R_EAX, val);
2887 val = fetch_word(emu, emu->x86.R_ES, emu->x86.R_DI);
2888 cmp_word(emu, emu->x86.R_AX, (uint16_t) val);
2890 emu->x86.R_CX -= 1;
2891 emu->x86.R_DI += inc;
2895 emu->x86.mode &= ~SYSMODE_PREFIX_REPE;
2896 } else if (emu->x86.mode & SYSMODE_PREFIX_REPNE) {
2899 while (emu->x86.R_CX != 0) {
2900 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2901 val = fetch_long(emu, emu->x86.R_ES, emu->x86.R_DI);
2902 cmp_long(emu, emu->x86.R_EAX, val);
2904 val = fetch_word(emu, emu->x86.R_ES, emu->x86.R_DI);
2905 cmp_word(emu, emu->x86.R_AX, (uint16_t) val);
2907 emu->x86.R_CX -= 1;
2908 emu->x86.R_DI += inc;
2912 emu->x86.mode &= ~SYSMODE_PREFIX_REPNE;
2914 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2915 val = fetch_long(emu, emu->x86.R_ES, emu->x86.R_DI);
2916 cmp_long(emu, emu->x86.R_EAX, val);
2918 val = fetch_word(emu, emu->x86.R_ES, emu->x86.R_DI);
2919 cmp_word(emu, emu->x86.R_AX, (uint16_t) val);
2921 emu->x86.R_DI += inc;
2929 x86emuOp_mov_word_AX_IMM(struct X86EMU *emu)
2931 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
2932 emu->x86.R_EAX = fetch_long_imm(emu);
2934 emu->x86.R_AX = fetch_word_imm(emu);
2941 x86emuOp_mov_word_CX_IMM(struct X86EMU *emu)
2943 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
2944 emu->x86.R_ECX = fetch_long_imm(emu);
2946 emu->x86.R_CX = fetch_word_imm(emu);
2953 x86emuOp_mov_word_DX_IMM(struct X86EMU *emu)
2955 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
2956 emu->x86.R_EDX = fetch_long_imm(emu);
2958 emu->x86.R_DX = fetch_word_imm(emu);
2965 x86emuOp_mov_word_BX_IMM(struct X86EMU *emu)
2967 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
2968 emu->x86.R_EBX = fetch_long_imm(emu);
2970 emu->x86.R_BX = fetch_word_imm(emu);
2977 x86emuOp_mov_word_SP_IMM(struct X86EMU *emu)
2979 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
2980 emu->x86.R_ESP = fetch_long_imm(emu);
2982 emu->x86.R_SP = fetch_word_imm(emu);
2989 x86emuOp_mov_word_BP_IMM(struct X86EMU *emu)
2991 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
2992 emu->x86.R_EBP = fetch_long_imm(emu);
2994 emu->x86.R_BP = fetch_word_imm(emu);
3001 x86emuOp_mov_word_SI_IMM(struct X86EMU *emu)
3003 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
3004 emu->x86.R_ESI = fetch_long_imm(emu);
3006 emu->x86.R_SI = fetch_word_imm(emu);
3013 x86emuOp_mov_word_DI_IMM(struct X86EMU *emu)
3015 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
3016 emu->x86.R_EDI = fetch_long_imm(emu);
3018 emu->x86.R_DI = fetch_word_imm(emu);
3038 x86emuOp_opcC0_byte_RM_MEM(struct X86EMU *emu)
3047 fetch_decode_modrm(emu);
3049 destval = decode_and_fetch_byte_imm8(emu, &amt);
3050 destval = (*opcD0_byte_operation[emu->cur_rh]) (emu, destval, amt);
3051 write_back_byte(emu, destval);
3084 x86emuOp_opcC1_word_RM_MEM(struct X86EMU *emu)
3093 fetch_decode_modrm(emu);
3094 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
3097 destval = decode_and_fetch_long_imm8(emu, &amt);
3098 destval = (*opcD1_long_operation[emu->cur_rh]) (emu, destval, amt);
3099 write_back_long(emu, destval);
3103 destval = decode_and_fetch_word_imm8(emu, &amt);
3104 destval = (*opcD1_word_operation[emu->cur_rh]) (emu, destval, amt);
3105 write_back_word(emu, destval);
3113 x86emuOp_ret_near_IMM(struct X86EMU *emu)
3117 imm = fetch_word_imm(emu);
3118 emu->x86.R_IP = pop_word(emu);
3119 emu->x86.R_SP += imm;
3126 x86emuOp_mov_byte_RM_IMM(struct X86EMU *emu)
3132 fetch_decode_modrm(emu);
3133 if (emu->cur_rh != 0)
3134 X86EMU_halt_sys(emu);
3135 if (emu->cur_mod != 3) {
3136 destoffset = decode_rl_address(emu);
3137 imm = fetch_byte_imm(emu);
3138 store_data_byte(emu, destoffset, imm);
3140 destreg = decode_rl_byte_register(emu);
3141 imm = fetch_byte_imm(emu);
3150 x86emuOp32_mov_word_RM_IMM(struct X86EMU *emu)
3155 fetch_decode_modrm(emu);
3156 if (emu->cur_rh != 0)
3157 X86EMU_halt_sys(emu);
3159 if (emu->cur_mod != 3) {
3160 destoffset = decode_rl_address(emu);
3161 imm = fetch_long_imm(emu);
3162 store_data_long(emu, destoffset, imm);
3164 destreg = decode_rl_long_register(emu);
3165 imm = fetch_long_imm(emu);
3171 x86emuOp16_mov_word_RM_IMM(struct X86EMU *emu)
3176 fetch_decode_modrm(emu);
3177 if (emu->cur_rh != 0)
3178 X86EMU_halt_sys(emu);
3180 if (emu->cur_mod != 3) {
3181 destoffset = decode_rl_address(emu);
3182 imm = fetch_word_imm(emu);
3183 store_data_word(emu, destoffset, imm);
3185 destreg = decode_rl_word_register(emu);
3186 imm = fetch_word_imm(emu);
3192 x86emuOp_mov_word_RM_IMM(struct X86EMU *emu)
3194 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
3195 x86emuOp32_mov_word_RM_IMM(emu);
3197 x86emuOp16_mov_word_RM_IMM(emu);
3204 x86emuOp_enter(struct X86EMU *emu)
3210 local = fetch_word_imm(emu);
3211 nesting = fetch_byte_imm(emu);
3212 push_word(emu, emu->x86.R_BP);
3213 frame_pointer = emu->x86.R_SP;
3216 emu->x86.R_BP -= 2;
3217 push_word(emu, fetch_word(emu, emu->x86.R_SS, emu->x86.R_BP));
3219 push_word(emu, frame_pointer);
3221 emu->x86.R_BP = frame_pointer;
3222 emu->x86.R_SP = (uint16_t) (emu->x86.R_SP - local);
3229 x86emuOp_leave(struct X86EMU *emu)
3231 emu->x86.R_SP = emu->x86.R_BP;
3232 emu->x86.R_BP = pop_word(emu);
3239 x86emuOp_ret_far_IMM(struct X86EMU *emu)
3243 imm = fetch_word_imm(emu);
3244 emu->x86.R_IP = pop_word(emu);
3245 emu->x86.R_CS = pop_word(emu);
3246 emu->x86.R_SP += imm;
3253 x86emuOp_ret_far(struct X86EMU *emu)
3255 emu->x86.R_IP = pop_word(emu);
3256 emu->x86.R_CS = pop_word(emu);
3263 x86emuOp_int3(struct X86EMU *emu)
3265 x86emu_intr_dispatch(emu, 3);
3272 x86emuOp_int_IMM(struct X86EMU *emu)
3276 intnum = fetch_byte_imm(emu);
3277 x86emu_intr_dispatch(emu, intnum);
3284 x86emuOp_into(struct X86EMU *emu)
3287 x86emu_intr_dispatch(emu, 4);
3294 x86emuOp_iret(struct X86EMU *emu)
3296 emu->x86.R_IP = pop_word(emu);
3297 emu->x86.R_CS = pop_word(emu);
3298 emu->x86.R_FLG = pop_word(emu);
3305 x86emuOp_opcD0_byte_RM_1(struct X86EMU *emu)
3309 fetch_decode_modrm(emu);
3310 destval = decode_and_fetch_byte(emu);
3311 destval = (*opcD0_byte_operation[emu->cur_rh]) (emu, destval, 1);
3312 write_back_byte(emu, destval);
3319 x86emuOp_opcD1_word_RM_1(struct X86EMU *emu)
3321 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
3324 fetch_decode_modrm(emu);
3325 destval = decode_and_fetch_long(emu);
3326 destval = (*opcD1_long_operation[emu->cur_rh]) (emu, destval, 1);
3327 write_back_long(emu, destval);
3331 fetch_decode_modrm(emu);
3332 destval = decode_and_fetch_word(emu);
3333 destval = (*opcD1_word_operation[emu->cur_rh]) (emu, destval, 1);
3334 write_back_word(emu, destval);
3342 x86emuOp_opcD2_byte_RM_CL(struct X86EMU *emu)
3346 fetch_decode_modrm(emu);
3347 destval = decode_and_fetch_byte(emu);
3348 destval = (*opcD0_byte_operation[emu->cur_rh]) (emu, destval, emu->x86.R_CL);
3349 write_back_byte(emu, destval);
3356 x86emuOp_opcD3_word_RM_CL(struct X86EMU *emu)
3358 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
3361 fetch_decode_modrm(emu);
3362 destval = decode_and_fetch_long(emu);
3363 destval = (*opcD1_long_operation[emu->cur_rh]) (emu, destval, emu->x86.R_CL);
3364 write_back_long(emu, destval);
3368 fetch_decode_modrm(emu);
3369 destval = decode_and_fetch_word(emu);
3370 destval = (*opcD1_word_operation[emu->cur_rh]) (emu, destval, emu->x86.R_CL);
3371 write_back_word(emu, destval);
3379 x86emuOp_aam(struct X86EMU *emu)
3383 a = fetch_byte_imm(emu); /* this is a stupid encoding. */
3386 X86EMU_halt_sys(emu);
3389 emu->x86.R_AX = aam_word(emu, emu->x86.R_AL);
3396 x86emuOp_aad(struct X86EMU *emu)
3400 a = fetch_byte_imm(emu);
3403 X86EMU_halt_sys(emu);
3405 emu->x86.R_AX = aad_word(emu, emu->x86.R_AX);
3414 x86emuOp_xlat(struct X86EMU *emu)
3418 addr = (uint16_t) (emu->x86.R_BX + (uint8_t) emu->x86.R_AL);
3419 emu->x86.R_AL = fetch_data_byte(emu, addr);
3424 x86emuOp_esc_coprocess_d8(struct X86EMU *emu)
3429 x86emuOp_esc_coprocess_d9(struct X86EMU *emu)
3431 fetch_decode_modrm(emu);
3432 if (emu->cur_mod != 3)
3433 decode_rl_address(emu);
3437 x86emuOp_esc_coprocess_da(struct X86EMU *emu)
3439 fetch_decode_modrm(emu);
3440 if (emu->cur_mod != 3)
3441 decode_rl_address(emu);
3445 x86emuOp_esc_coprocess_db(struct X86EMU *emu)
3447 fetch_decode_modrm(emu);
3448 if (emu->cur_mod != 3)
3449 decode_rl_address(emu);
3453 x86emuOp_esc_coprocess_dc(struct X86EMU *emu)
3455 fetch_decode_modrm(emu);
3456 if (emu->cur_mod != 3)
3457 decode_rl_address(emu);
3461 x86emuOp_esc_coprocess_dd(struct X86EMU *emu)
3463 fetch_decode_modrm(emu);
3464 if (emu->cur_mod != 3)
3465 decode_rl_address(emu);
3469 x86emuOp_esc_coprocess_de(struct X86EMU *emu)
3471 fetch_decode_modrm(emu);
3472 if (emu->cur_mod != 3)
3473 decode_rl_address(emu);
3477 x86emuOp_esc_coprocess_df(struct X86EMU *emu)
3479 fetch_decode_modrm(emu);
3480 if (emu->cur_mod != 3)
3481 decode_rl_address(emu);
3489 x86emuOp_loopne(struct X86EMU *emu)
3493 ip = (int8_t) fetch_byte_imm(emu);
3494 ip += (int16_t) emu->x86.R_IP;
3495 emu->x86.R_CX -= 1;
3496 if (emu->x86.R_CX != 0 && !ACCESS_FLAG(F_ZF)) /* CX != 0 and !ZF */
3497 emu->x86.R_IP = ip;
3504 x86emuOp_loope(struct X86EMU *emu)
3508 ip = (int8_t) fetch_byte_imm(emu);
3509 ip += (int16_t) emu->x86.R_IP;
3510 emu->x86.R_CX -= 1;
3511 if (emu->x86.R_CX != 0 && ACCESS_FLAG(F_ZF)) /* CX != 0 and ZF */
3512 emu->x86.R_IP = ip;
3519 x86emuOp_loop(struct X86EMU *emu)
3523 ip = (int8_t) fetch_byte_imm(emu);
3524 ip += (int16_t) emu->x86.R_IP;
3525 emu->x86.R_CX -= 1;
3526 if (emu->x86.R_CX != 0)
3527 emu->x86.R_IP = ip;
3534 x86emuOp_jcxz(struct X86EMU *emu)
3540 offset = (int8_t) fetch_byte_imm(emu);
3541 target = (uint16_t) (emu->x86.R_IP + offset);
3542 if (emu->x86.R_CX == 0)
3543 emu->x86.R_IP = target;
3550 x86emuOp_in_byte_AL_IMM(struct X86EMU *emu)
3554 port = (uint8_t) fetch_byte_imm(emu);
3555 emu->x86.R_AL = (*emu->emu_inb) (emu, port);
3562 x86emuOp_in_word_AX_IMM(struct X86EMU *emu)
3566 port = (uint8_t) fetch_byte_imm(emu);
3567 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
3568 emu->x86.R_EAX = (*emu->emu_inl) (emu, port);
3570 emu->x86.R_AX = (*emu->emu_inw) (emu, port);
3578 x86emuOp_out_byte_IMM_AL(struct X86EMU *emu)
3582 port = (uint8_t) fetch_byte_imm(emu);
3583 (*emu->emu_outb) (emu, port, emu->x86.R_AL);
3590 x86emuOp_out_word_IMM_AX(struct X86EMU *emu)
3594 port = (uint8_t) fetch_byte_imm(emu);
3595 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
3596 (*emu->emu_outl) (emu, port, emu->x86.R_EAX);
3598 (*emu->emu_outw) (emu, port, emu->x86.R_AX);
3606 x86emuOp_call_near_IMM(struct X86EMU *emu)
3608 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
3610 ip = (int32_t) fetch_long_imm(emu);
3611 ip += (int32_t) emu->x86.R_EIP;
3612 push_long(emu, emu->x86.R_EIP);
3613 emu->x86.R_EIP = ip;
3616 ip = (int16_t) fetch_word_imm(emu);
3617 ip += (int16_t) emu->x86.R_IP; /* CHECK SIGN */
3618 push_word(emu, emu->x86.R_IP);
3619 emu->x86.R_IP = ip;
3627 x86emuOp_jump_near_IMM(struct X86EMU *emu)
3631 ip = (int16_t) fetch_word_imm(emu);
3632 ip += (int16_t) emu->x86.R_IP;
3633 emu->x86.R_IP = (uint16_t) ip;
3640 x86emuOp_jump_far_IMM(struct X86EMU *emu)
3644 ip = fetch_word_imm(emu);
3645 cs = fetch_word_imm(emu);
3646 emu->x86.R_IP = ip;
3647 emu->x86.R_CS = cs;
3654 x86emuOp_jump_byte_IMM(struct X86EMU *emu)
3659 offset = (int8_t) fetch_byte_imm(emu);
3660 target = (uint16_t) (emu->x86.R_IP + offset);
3661 emu->x86.R_IP = target;
3668 x86emuOp_in_byte_AL_DX(struct X86EMU *emu)
3670 emu->x86.R_AL = (*emu->emu_inb) (emu, emu->x86.R_DX);
3677 x86emuOp_in_word_AX_DX(struct X86EMU *emu)
3679 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
3680 emu->x86.R_EAX = (*emu->emu_inl) (emu, emu->x86.R_DX);
3682 emu->x86.R_AX = (*emu->emu_inw) (emu, emu->x86.R_DX);
3690 x86emuOp_out_byte_DX_AL(struct X86EMU *emu)
3692 (*emu->emu_outb) (emu, emu->x86.R_DX, emu->x86.R_AL);
3699 x86emuOp_out_word_DX_AX(struct X86EMU *emu)
3701 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
3702 (*emu->emu_outl) (emu, emu->x86.R_DX, emu->x86.R_EAX);
3704 (*emu->emu_outw) (emu, emu->x86.R_DX, emu->x86.R_AX);
3712 x86emuOp_lock(struct X86EMU *emu)
3722 x86emuOp_cmc(struct X86EMU *emu)
3734 x86emuOp_opcF6_byte_RM(struct X86EMU *emu)
3740 fetch_decode_modrm(emu);
3741 if (emu->cur_rh == 1)
3742 X86EMU_halt_sys(emu);
3744 if (emu->cur_rh == 0) {
3745 destval = decode_and_fetch_byte_imm8(emu, &srcval);
3746 test_byte(emu, destval, srcval);
3749 destval = decode_and_fetch_byte(emu);
3750 switch (emu->cur_rh) {
3753 write_back_byte(emu, destval);
3756 destval = neg_byte(emu, destval);
3757 write_back_byte(emu, destval);
3760 mul_byte(emu, destval);
3763 imul_byte(emu, destval);
3766 div_byte(emu, destval);
3769 idiv_byte(emu, destval);
3778 x86emuOp32_opcF7_word_RM(struct X86EMU *emu)
3784 fetch_decode_modrm(emu);
3785 if (emu->cur_rh == 1)
3786 X86EMU_halt_sys(emu);
3788 if (emu->cur_rh == 0) {
3789 if (emu->cur_mod != 3) {
3792 destoffset = decode_rl_address(emu);
3793 srcval = fetch_long_imm(emu);
3794 destval = fetch_data_long(emu, destoffset);
3796 srcval = fetch_long_imm(emu);
3797 destval = *decode_rl_long_register(emu);
3799 test_long(emu, destval, srcval);
3802 destval = decode_and_fetch_long(emu);
3803 switch (emu->cur_rh) {
3806 write_back_long(emu, destval);
3809 destval = neg_long(emu, destval);
3810 write_back_long(emu, destval);
3813 mul_long(emu, destval);
3816 imul_long(emu, destval);
3819 div_long(emu, destval);
3822 idiv_long(emu, destval);
3827 x86emuOp16_opcF7_word_RM(struct X86EMU *emu)
3833 fetch_decode_modrm(emu);
3834 if (emu->cur_rh == 1)
3835 X86EMU_halt_sys(emu);
3837 if (emu->cur_rh == 0) {
3838 if (emu->cur_mod != 3) {
3841 destoffset = decode_rl_address(emu);
3842 srcval = fetch_word_imm(emu);
3843 destval = fetch_data_word(emu, destoffset);
3845 srcval = fetch_word_imm(emu);
3846 destval = *decode_rl_word_register(emu);
3848 test_word(emu, destval, srcval);
3851 destval = decode_and_fetch_word(emu);
3852 switch (emu->cur_rh) {
3855 write_back_word(emu, destval);
3858 destval = neg_word(emu, destval);
3859 write_back_word(emu, destval);
3862 mul_word(emu, destval);
3865 imul_word(emu, destval);
3868 div_word(emu, destval);
3871 idiv_word(emu, destval);
3876 x86emuOp_opcF7_word_RM(struct X86EMU *emu)
3878 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
3879 x86emuOp32_opcF7_word_RM(emu);
3881 x86emuOp16_opcF7_word_RM(emu);
3888 x86emuOp_opcFE_byte_RM(struct X86EMU *emu)
3895 fetch_decode_modrm(emu);
3896 if (emu->cur_mod != 3) {
3897 destoffset = decode_rl_address(emu);
3898 switch (emu->cur_rh) {
3900 destval = fetch_data_byte(emu, destoffset);
3901 destval = inc_byte(emu, destval);
3902 store_data_byte(emu, destoffset, destval);
3905 destval = fetch_data_byte(emu, destoffset);
3906 destval = dec_byte(emu, destval);
3907 store_data_byte(emu, destoffset, destval);
3911 destreg = decode_rl_byte_register(emu);
3912 switch (emu->cur_rh) {
3914 *destreg = inc_byte(emu, *destreg);
3917 *destreg = dec_byte(emu, *destreg);
3927 x86emuOp32_opcFF_word_RM(struct X86EMU *emu)
3932 if (emu->cur_mod != 3) {
3933 destoffset = decode_rl_address(emu);
3934 destval = fetch_data_long(emu, destoffset);
3935 switch (emu->cur_rh) {
3937 destval = inc_long(emu, destval);
3938 store_data_long(emu, destoffset, destval);
3941 destval = dec_long(emu, destval);
3942 store_data_long(emu, destoffset, destval);
3945 push_long(emu, destval);
3949 destreg = decode_rl_long_register(emu);
3950 switch (emu->cur_rh) {
3952 *destreg = inc_long(emu, *destreg);
3955 *destreg = dec_long(emu, *destreg);
3958 push_long(emu, *destreg);
3965 x86emuOp16_opcFF_word_RM(struct X86EMU *emu)
3971 if (emu->cur_mod != 3) {
3972 destoffset = decode_rl_address(emu);
3973 destval = fetch_data_word(emu, destoffset);
3974 switch (emu->cur_rh) {
3976 destval = inc_word(emu, destval);
3977 store_data_word(emu, destoffset, destval);
3980 destval = dec_word(emu, destval);
3981 store_data_word(emu, destoffset, destval);
3984 push_word(emu, destval);
3988 destreg = decode_rl_word_register(emu);
3989 switch (emu->cur_rh) {
3991 *destreg = inc_word(emu, *destreg);
3994 *destreg = dec_word(emu, *destreg);
3997 push_word(emu, *destreg);
4004 x86emuOp_opcFF_word_RM(struct X86EMU *emu)
4010 fetch_decode_modrm(emu);
4011 if ((emu->cur_mod == 3 && (emu->cur_rh == 3 || emu->cur_rh == 5)) || emu->cur_rh == 7)
4012 X86EMU_halt_sys(emu);
4013 if (emu->cur_rh == 0 || emu->cur_rh == 1 || emu->cur_rh == 6) {
4014 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
4015 x86emuOp32_opcFF_word_RM(emu);
4017 x86emuOp16_opcFF_word_RM(emu);
4021 if (emu->cur_mod != 3) {
4022 destoffset = decode_rl_address(emu);
4023 destval = fetch_data_word(emu, destoffset);
4024 switch (emu->cur_rh) {
4026 destval2 = fetch_data_word(emu, destoffset + 2);
4027 push_word(emu, emu->x86.R_CS);
4028 emu->x86.R_CS = destval2;
4029 push_word(emu, emu->x86.R_IP);
4030 emu->x86.R_IP = destval;
4033 destval2 = fetch_data_word(emu, destoffset + 2);
4034 emu->x86.R_IP = destval;
4035 emu->x86.R_CS = destval2;
4039 destval = *decode_rl_word_register(emu);
4042 switch (emu->cur_rh) {
4044 push_word(emu, emu->x86.R_IP);
4045 emu->x86.R_IP = destval;
4048 emu->x86.R_IP = destval;
4056 X86EMU_exec_one_byte(struct X86EMU * emu)
4060 op1 = fetch_byte_imm(emu);
4064 common_binop_byte_rm_r(emu, add_byte);
4067 common_binop_word_long_rm_r(emu, add_word, add_long);
4070 common_binop_byte_r_rm(emu, add_byte);
4073 common_binop_word_long_r_rm(emu, add_word, add_long);
4076 common_binop_byte_imm(emu, add_byte);
4079 common_binop_word_long_imm(emu, add_word, add_long);
4082 push_word(emu, emu->x86.R_ES);
4085 emu->x86.R_ES = pop_word(emu);
4089 common_binop_byte_rm_r(emu, or_byte);
4092 common_binop_word_long_rm_r(emu, or_word, or_long);
4095 common_binop_byte_r_rm(emu, or_byte);
4098 common_binop_word_long_r_rm(emu, or_word, or_long);
4101 common_binop_byte_imm(emu, or_byte);
4104 common_binop_word_long_imm(emu, or_word, or_long);
4107 push_word(emu, emu->x86.R_CS);
4110 X86EMU_exec_two_byte(emu);
4114 common_binop_byte_rm_r(emu, adc_byte);
4117 common_binop_word_long_rm_r(emu, adc_word, adc_long);
4120 common_binop_byte_r_rm(emu, adc_byte);
4123 common_binop_word_long_r_rm(emu, adc_word, adc_long);
4126 common_binop_byte_imm(emu, adc_byte);
4129 common_binop_word_long_imm(emu, adc_word, adc_long);
4132 push_word(emu, emu->x86.R_SS);
4135 emu->x86.R_SS = pop_word(emu);
4139 common_binop_byte_rm_r(emu, sbb_byte);
4142 common_binop_word_long_rm_r(emu, sbb_word, sbb_long);
4145 common_binop_byte_r_rm(emu, sbb_byte);
4148 common_binop_word_long_r_rm(emu, sbb_word, sbb_long);
4151 common_binop_byte_imm(emu, sbb_byte);
4154 common_binop_word_long_imm(emu, sbb_word, sbb_long);
4157 push_word(emu, emu->x86.R_DS);
4160 emu->x86.R_DS = pop_word(emu);
4164 common_binop_byte_rm_r(emu, and_byte);
4167 common_binop_word_long_rm_r(emu, and_word, and_long);
4170 common_binop_byte_r_rm(emu, and_byte);
4173 common_binop_word_long_r_rm(emu, and_word, and_long);
4176 common_binop_byte_imm(emu, and_byte);
4179 common_binop_word_long_imm(emu, and_word, and_long);
4182 emu->x86.mode |= SYSMODE_SEGOVR_ES;
4185 emu->x86.R_AL = daa_byte(emu, emu->x86.R_AL);
4189 common_binop_byte_rm_r(emu, sub_byte);
4192 common_binop_word_long_rm_r(emu, sub_word, sub_long);
4195 common_binop_byte_r_rm(emu, sub_byte);
4198 common_binop_word_long_r_rm(emu, sub_word, sub_long);
4201 common_binop_byte_imm(emu, sub_byte);
4204 common_binop_word_long_imm(emu, sub_word, sub_long);
4207 emu->x86.mode |= SYSMODE_SEGOVR_CS;
4210 emu->x86.R_AL = das_byte(emu, emu->x86.R_AL);
4214 common_binop_byte_rm_r(emu, xor_byte);
4217 common_binop_word_long_rm_r(emu, xor_word, xor_long);
4220 common_binop_byte_r_rm(emu, xor_byte);
4223 common_binop_word_long_r_rm(emu, xor_word, xor_long);
4226 common_binop_byte_imm(emu, xor_byte);
4229 common_binop_word_long_imm(emu, xor_word, xor_long);
4232 emu->x86.mode |= SYSMODE_SEGOVR_SS;
4235 emu->x86.R_AX = aaa_word(emu, emu->x86.R_AX);
4239 common_binop_ns_byte_rm_r(emu, cmp_byte_no_return);
4242 common_binop_ns_word_long_rm_r(emu, cmp_word_no_return,
4246 x86emuOp_cmp_byte_R_RM(emu);
4249 x86emuOp_cmp_word_R_RM(emu);
4252 x86emuOp_cmp_byte_AL_IMM(emu);
4255 x86emuOp_cmp_word_AX_IMM(emu);
4258 emu->x86.mode |= SYSMODE_SEGOVR_DS;
4261 emu->x86.R_AX = aas_word(emu, emu->x86.R_AX);
4265 common_inc_word_long(emu, &emu->x86.register_a);
4268 common_inc_word_long(emu, &emu->x86.register_c);
4271 common_inc_word_long(emu, &emu->x86.register_d);
4274 common_inc_word_long(emu, &emu->x86.register_b);
4277 common_inc_word_long(emu, &emu->x86.register_sp);
4280 common_inc_word_long(emu, &emu->x86.register_bp);
4283 common_inc_word_long(emu, &emu->x86.register_si);
4286 common_inc_word_long(emu, &emu->x86.register_di);
4290 common_dec_word_long(emu, &emu->x86.register_a);
4293 common_dec_word_long(emu, &emu->x86.register_c);
4296 common_dec_word_long(emu, &emu->x86.register_d);
4299 common_dec_word_long(emu, &emu->x86.register_b);
4302 common_dec_word_long(emu, &emu->x86.register_sp);
4305 common_dec_word_long(emu, &emu->x86.register_bp);
4308 common_dec_word_long(emu, &emu->x86.register_si);
4311 common_dec_word_long(emu, &emu->x86.register_di);
4315 common_push_word_long(emu, &emu->x86.register_a);
4318 common_push_word_long(emu, &emu->x86.register_c);
4321 common_push_word_long(emu, &emu->x86.register_d);
4324 common_push_word_long(emu, &emu->x86.register_b);
4327 common_push_word_long(emu, &emu->x86.register_sp);
4330 common_push_word_long(emu, &emu->x86.register_bp);
4333 common_push_word_long(emu, &emu->x86.register_si);
4336 common_push_word_long(emu, &emu->x86.register_di);
4340 common_pop_word_long(emu, &emu->x86.register_a);
4343 common_pop_word_long(emu, &emu->x86.register_c);
4346 common_pop_word_long(emu, &emu->x86.register_d);
4349 common_pop_word_long(emu, &emu->x86.register_b);
4352 common_pop_word_long(emu, &emu->x86.register_sp);
4355 common_pop_word_long(emu, &emu->x86.register_bp);
4358 common_pop_word_long(emu, &emu->x86.register_si);
4361 common_pop_word_long(emu, &emu->x86.register_di);
4365 x86emuOp_push_all(emu);
4368 x86emuOp_pop_all(emu);
4373 emu->x86.mode |= SYSMODE_SEGOVR_FS;
4376 emu->x86.mode |= SYSMODE_SEGOVR_GS;
4379 emu->x86.mode |= SYSMODE_PREFIX_DATA;
4382 emu->x86.mode |= SYSMODE_PREFIX_ADDR;
4386 x86emuOp_push_word_IMM(emu);
4389 common_imul_imm(emu, false);
4392 x86emuOp_push_byte_IMM(emu);
4395 common_imul_imm(emu, true);
4398 ins(emu, 1);
4401 x86emuOp_ins_word(emu);
4404 outs(emu, 1);
4407 x86emuOp_outs_word(emu);
4411 common_jmp_near(emu, ACCESS_FLAG(F_OF));
4414 common_jmp_near(emu, !ACCESS_FLAG(F_OF));
4417 common_jmp_near(emu, ACCESS_FLAG(F_CF));
4420 common_jmp_near(emu, !ACCESS_FLAG(F_CF));
4423 common_jmp_near(emu, ACCESS_FLAG(F_ZF));
4426 common_jmp_near(emu, !ACCESS_FLAG(F_ZF));
4429 common_jmp_near(emu, ACCESS_FLAG(F_CF) || ACCESS_FLAG(F_ZF));
4432 common_jmp_near(emu, !ACCESS_FLAG(F_CF) && !ACCESS_FLAG(F_ZF));
4436 common_jmp_near(emu, ACCESS_FLAG(F_SF));
4439 common_jmp_near(emu, !ACCESS_FLAG(F_SF));
4442 common_jmp_near(emu, ACCESS_FLAG(F_PF));
4445 common_jmp_near(emu, !ACCESS_FLAG(F_PF));
4448 x86emuOp_jump_near_L(emu);
4451 x86emuOp_jump_near_NL(emu);
4454 x86emuOp_jump_near_LE(emu);
4457 x86emuOp_jump_near_NLE(emu);
4461 x86emuOp_opc80_byte_RM_IMM(emu);
4464 x86emuOp_opc81_word_RM_IMM(emu);
4467 x86emuOp_opc82_byte_RM_IMM(emu);
4470 x86emuOp_opc83_word_RM_IMM(emu);
4473 common_binop_ns_byte_rm_r(emu, test_byte);
4476 common_binop_ns_word_long_rm_r(emu, test_word, test_long);
4479 x86emuOp_xchg_byte_RM_R(emu);
4482 x86emuOp_xchg_word_RM_R(emu);
4486 x86emuOp_mov_byte_RM_R(emu);
4489 x86emuOp_mov_word_RM_R(emu);
4492 x86emuOp_mov_byte_R_RM(emu);
4495 x86emuOp_mov_word_R_RM(emu);
4498 x86emuOp_mov_word_RM_SR(emu);
4501 x86emuOp_lea_word_R_M(emu);
4504 x86emuOp_mov_word_SR_RM(emu);
4507 x86emuOp_pop_RM(emu);
4514 x86emuOp_xchg_word_AX_CX(emu);
4517 x86emuOp_xchg_word_AX_DX(emu);
4520 x86emuOp_xchg_word_AX_BX(emu);
4523 x86emuOp_xchg_word_AX_SP(emu);
4526 x86emuOp_xchg_word_AX_BP(emu);
4529 x86emuOp_xchg_word_AX_SI(emu);
4532 x86emuOp_xchg_word_AX_DI(emu);
4536 x86emuOp_cbw(emu);
4539 x86emuOp_cwd(emu);
4542 x86emuOp_call_far_IMM(emu);
4548 x86emuOp_pushf_word(emu);
4551 x86emuOp_popf_word(emu);
4554 x86emuOp_sahf(emu);
4557 x86emuOp_lahf(emu);
4561 x86emuOp_mov_AL_M_IMM(emu);
4564 x86emuOp_mov_AX_M_IMM(emu);
4567 x86emuOp_mov_M_AL_IMM(emu);
4570 x86emuOp_mov_M_AX_IMM(emu);
4573 x86emuOp_movs_byte(emu);
4576 x86emuOp_movs_word(emu);
4579 x86emuOp_cmps_byte(emu);
4582 x86emuOp_cmps_word(emu);
4586 test_byte(emu, emu->x86.R_AL, fetch_byte_imm(emu));
4589 x86emuOp_test_AX_IMM(emu);
4592 x86emuOp_stos_byte(emu);
4595 x86emuOp_stos_word(emu);
4598 x86emuOp_lods_byte(emu);
4601 x86emuOp_lods_word(emu);
4604 x86emuOp_scas_byte(emu);
4607 x86emuOp_scas_word(emu);
4611 emu->x86.R_AL = fetch_byte_imm(emu);
4614 emu->x86.R_CL = fetch_byte_imm(emu);
4617 emu->x86.R_DL = fetch_byte_imm(emu);
4620 emu->x86.R_BL = fetch_byte_imm(emu);
4623 emu->x86.R_AH = fetch_byte_imm(emu);
4626 emu->x86.R_CH = fetch_byte_imm(emu);
4629 emu->x86.R_DH = fetch_byte_imm(emu);
4632 emu->x86.R_BH = fetch_byte_imm(emu);
4636 x86emuOp_mov_word_AX_IMM(emu);
4639 x86emuOp_mov_word_CX_IMM(emu);
4642 x86emuOp_mov_word_DX_IMM(emu);
4645 x86emuOp_mov_word_BX_IMM(emu);
4648 x86emuOp_mov_word_SP_IMM(emu);
4651 x86emuOp_mov_word_BP_IMM(emu);
4654 x86emuOp_mov_word_SI_IMM(emu);
4657 x86emuOp_mov_word_DI_IMM(emu);
4661 x86emuOp_opcC0_byte_RM_MEM(emu);
4664 x86emuOp_opcC1_word_RM_MEM(emu);
4667 x86emuOp_ret_near_IMM(emu);
4670 emu->x86.R_IP = pop_word(emu);
4673 common_load_far_pointer(emu, &emu->x86.R_ES);
4676 common_load_far_pointer(emu, &emu->x86.R_DS);
4679 x86emuOp_mov_byte_RM_IMM(emu);
4682 x86emuOp_mov_word_RM_IMM(emu);
4685 x86emuOp_enter(emu);
4688 x86emuOp_leave(emu);
4691 x86emuOp_ret_far_IMM(emu);
4694 x86emuOp_ret_far(emu);
4697 x86emuOp_int3(emu);
4700 x86emuOp_int_IMM(emu);
4703 x86emuOp_into(emu);
4706 x86emuOp_iret(emu);
4710 x86emuOp_opcD0_byte_RM_1(emu);
4713 x86emuOp_opcD1_word_RM_1(emu);
4716 x86emuOp_opcD2_byte_RM_CL(emu);
4719 x86emuOp_opcD3_word_RM_CL(emu);
4722 x86emuOp_aam(emu);
4725 x86emuOp_aad(emu);
4729 x86emuOp_xlat(emu);
4732 x86emuOp_esc_coprocess_d8(emu);
4735 x86emuOp_esc_coprocess_d9(emu);
4738 x86emuOp_esc_coprocess_da(emu);
4741 x86emuOp_esc_coprocess_db(emu);
4744 x86emuOp_esc_coprocess_dc(emu);
4747 x86emuOp_esc_coprocess_dd(emu);
4750 x86emuOp_esc_coprocess_de(emu);
4753 x86emuOp_esc_coprocess_df(emu);
4757 x86emuOp_loopne(emu);
4760 x86emuOp_loope(emu);
4763 x86emuOp_loop(emu);
4766 x86emuOp_jcxz(emu);
4769 x86emuOp_in_byte_AL_IMM(emu);
4772 x86emuOp_in_word_AX_IMM(emu);
4775 x86emuOp_out_byte_IMM_AL(emu);
4778 x86emuOp_out_word_IMM_AX(emu);
4782 x86emuOp_call_near_IMM(emu);
4785 x86emuOp_jump_near_IMM(emu);
4788 x86emuOp_jump_far_IMM(emu);
4791 x86emuOp_jump_byte_IMM(emu);
4794 x86emuOp_in_byte_AL_DX(emu);
4797 x86emuOp_in_word_AX_DX(emu);
4800 x86emuOp_out_byte_DX_AL(emu);
4803 x86emuOp_out_word_DX_AX(emu);
4807 x86emuOp_lock(emu);
4810 emu->x86.mode |= SYSMODE_PREFIX_REPNE;
4813 emu->x86.mode |= SYSMODE_PREFIX_REPE;
4816 X86EMU_halt_sys(emu);
4819 x86emuOp_cmc(emu);
4822 x86emuOp_opcF6_byte_RM(emu);
4825 x86emuOp_opcF7_word_RM(emu);
4847 x86emuOp_opcFE_byte_RM(emu);
4850 x86emuOp_opcFF_word_RM(emu);
4853 X86EMU_halt_sys(emu);
4858 emu->x86.mode &= ~SYSMODE_CLRMASK;
4862 common_jmp_long(struct X86EMU *emu, bool cond)
4866 target = (int16_t) fetch_word_imm(emu);
4867 target += (int16_t) emu->x86.R_IP;
4869 emu->x86.R_IP = (uint16_t) target;
4873 common_set_byte(struct X86EMU *emu, bool cond)
4878 fetch_decode_modrm(emu);
4880 if (emu->cur_mod != 3) {
4881 destoffset = decode_rl_address(emu);
4882 store_data_byte(emu, destoffset, destval);
4884 destreg = decode_rl_byte_register(emu);
4890 common_bitstring32(struct X86EMU *emu, int op)
4895 fetch_decode_modrm(emu);
4896 shiftreg = decode_rh_long_register(emu);
4897 srcval = decode_and_fetch_long_disp(emu, (int16_t) *shiftreg >> 5);
4906 write_back_long(emu, srcval | mask);
4909 write_back_long(emu, srcval & ~mask);
4912 write_back_long(emu, srcval ^ mask);
4918 common_bitstring16(struct X86EMU *emu, int op)
4923 fetch_decode_modrm(emu);
4924 shiftreg = decode_rh_word_register(emu);
4925 srcval = decode_and_fetch_word_disp(emu, (int16_t) *shiftreg >> 4);
4934 write_back_word(emu, srcval | mask);
4937 write_back_word(emu, srcval & ~mask);
4940 write_back_word(emu, srcval ^ mask);
4946 common_bitstring(struct X86EMU *emu, int op)
4948 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
4949 common_bitstring32(emu, op);
4951 common_bitstring16(emu, op);
4955 common_bitsearch32(struct X86EMU *emu, int diff)
4959 fetch_decode_modrm(emu);
4960 dstreg = decode_rh_long_register(emu);
4961 srcval = decode_and_fetch_long(emu);
4970 common_bitsearch16(struct X86EMU *emu, int diff)
4974 fetch_decode_modrm(emu);
4975 dstreg = decode_rh_word_register(emu);
4976 srcval = decode_and_fetch_word(emu);
4985 common_bitsearch(struct X86EMU *emu, int diff)
4987 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
4988 common_bitsearch32(emu, diff);
4990 common_bitsearch16(emu, diff);
4994 common_shift32(struct X86EMU *emu, bool shift_left, bool use_cl)
4999 fetch_decode_modrm(emu);
5000 shiftreg = decode_rh_long_register(emu);
5002 destval = decode_and_fetch_long(emu);
5003 shift = emu->x86.R_CL;
5005 destval = decode_and_fetch_long_imm8(emu, &shift);
5008 destval = shld_long(emu, destval, *shiftreg, shift);
5010 destval = shrd_long(emu, destval, *shiftreg, shift);
5011 write_back_long(emu, destval);
5015 common_shift16(struct X86EMU *emu, bool shift_left, bool use_cl)
5020 fetch_decode_modrm(emu);
5021 shiftreg = decode_rh_word_register(emu);
5023 destval = decode_and_fetch_word(emu);
5024 shift = emu->x86.R_CL;
5026 destval = decode_and_fetch_word_imm8(emu, &shift);
5029 destval = shld_word(emu, destval, *shiftreg, shift);
5031 destval = shrd_word(emu, destval, *shiftreg, shift);
5032 write_back_word(emu, destval);
5036 common_shift(struct X86EMU *emu, bool shift_left, bool use_cl)
5038 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
5039 common_shift32(emu, shift_left, use_cl);
5041 common_shift16(emu, shift_left, use_cl);
5052 x86emuOp2_rdtsc(struct X86EMU *emu)
5054 emu->x86.R_EAX = emu->cur_cycles & 0xffffffff;
5055 emu->x86.R_EDX = emu->cur_cycles >> 32;
5062 x86emuOp2_push_FS(struct X86EMU *emu)
5064 push_word(emu, emu->x86.R_FS);
5071 x86emuOp2_pop_FS(struct X86EMU *emu)
5073 emu->x86.R_FS = pop_word(emu);
5091 x86emuOp2_cpuid(struct X86EMU *emu)
5094 hw_cpuid(&emu->x86.R_EAX, &emu->x86.R_EBX, &emu->x86.R_ECX,
5095 &emu->x86.R_EDX);
5097 switch (emu->x86.R_EAX) {
5099 emu->x86.R_EAX = 1;
5102 emu->x86.R_EBX = 0x756e6547;
5103 emu->x86.R_EDX = 0x49656e69;
5104 emu->x86.R_ECX = 0x6c65746e;
5109 emu->x86.R_EAX = 0x00000480;
5110 emu->x86.R_EBX = emu->x86.R_ECX = 0;
5111 emu->x86.R_EDX = 0x00000002;
5113 emu->x86.R_EDX &= 0x00000012;
5117 emu->x86.R_EAX = emu->x86.R_EBX = emu->x86.R_ECX =
5118 emu->x86.R_EDX = 0;
5127 x86emuOp2_bt_R(struct X86EMU *emu)
5129 common_bitstring(emu, 0);
5136 x86emuOp2_shld_IMM(struct X86EMU *emu)
5138 common_shift(emu, true, false);
5145 x86emuOp2_shld_CL(struct X86EMU *emu)
5147 common_shift(emu, true, true);
5154 x86emuOp2_push_GS(struct X86EMU *emu)
5156 push_word(emu, emu->x86.R_GS);
5163 x86emuOp2_pop_GS(struct X86EMU *emu)
5165 emu->x86.R_GS = pop_word(emu);
5172 x86emuOp2_bts_R(struct X86EMU *emu)
5174 common_bitstring(emu, 1);
5181 x86emuOp2_shrd_IMM(struct X86EMU *emu)
5183 common_shift(emu, false, false);
5190 x86emuOp2_shrd_CL(struct X86EMU *emu)
5192 common_shift(emu, false, true);
5199 x86emuOp2_32_imul_R_RM(struct X86EMU *emu)
5204 fetch_decode_modrm(emu);
5205 destreg = decode_rh_long_register(emu);
5206 srcval = decode_and_fetch_long(emu);
5219 x86emuOp2_16_imul_R_RM(struct X86EMU *emu)
5224 fetch_decode_modrm(emu);
5225 destreg = decode_rh_word_register(emu);
5226 srcval = decode_and_fetch_word(emu);
5239 x86emuOp2_imul_R_RM(struct X86EMU *emu)
5241 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
5242 x86emuOp2_32_imul_R_RM(emu);
5244 x86emuOp2_16_imul_R_RM(emu);
5251 x86emuOp2_lss_R_IMM(struct X86EMU *emu)
5253 common_load_far_pointer(emu, &emu->x86.R_SS);
5260 x86emuOp2_btr_R(struct X86EMU *emu)
5262 common_bitstring(emu, 2);
5269 x86emuOp2_lfs_R_IMM(struct X86EMU *emu)
5271 common_load_far_pointer(emu, &emu->x86.R_FS);
5278 x86emuOp2_lgs_R_IMM(struct X86EMU *emu)
5280 common_load_far_pointer(emu, &emu->x86.R_GS);
5287 x86emuOp2_32_movzx_byte_R_RM(struct X86EMU *emu)
5291 fetch_decode_modrm(emu);
5292 destreg = decode_rh_long_register(emu);
5293 *destreg = decode_and_fetch_byte(emu);
5297 x86emuOp2_16_movzx_byte_R_RM(struct X86EMU *emu)
5301 fetch_decode_modrm(emu);
5302 destreg = decode_rh_word_register(emu);
5303 *destreg = decode_and_fetch_byte(emu);
5307 x86emuOp2_movzx_byte_R_RM(struct X86EMU *emu)
5309 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
5310 x86emuOp2_32_movzx_byte_R_RM(emu);
5312 x86emuOp2_16_movzx_byte_R_RM(emu);
5319 x86emuOp2_movzx_word_R_RM(struct X86EMU *emu)
5323 fetch_decode_modrm(emu);
5324 destreg = decode_rh_long_register(emu);
5325 *destreg = decode_and_fetch_word(emu);
5332 x86emuOp2_32_btX_I(struct X86EMU *emu)
5338 fetch_decode_modrm(emu);
5339 if (emu->cur_rh < 4)
5340 X86EMU_halt_sys(emu);
5342 srcval = decode_and_fetch_long_imm8(emu, &shift);
5346 switch (emu->cur_rh) {
5348 write_back_long(emu, srcval | mask);
5351 write_back_long(emu, srcval & ~mask);
5354 write_back_long(emu, srcval ^ mask);
5361 x86emuOp2_16_btX_I(struct X86EMU *emu)
5368 fetch_decode_modrm(emu);
5369 if (emu->cur_rh < 4)
5370 X86EMU_halt_sys(emu);
5372 srcval = decode_and_fetch_word_imm8(emu, &shift);
5375 switch (emu->cur_rh) {
5377 write_back_word(emu, srcval | mask);
5380 write_back_word(emu, srcval & ~mask);
5383 write_back_word(emu, srcval ^ mask);
5390 x86emuOp2_btX_I(struct X86EMU *emu)
5392 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
5393 x86emuOp2_32_btX_I(emu);
5395 x86emuOp2_16_btX_I(emu);
5402 x86emuOp2_btc_R(struct X86EMU *emu)
5404 common_bitstring(emu, 3);
5411 x86emuOp2_bsf(struct X86EMU *emu)
5413 common_bitsearch(emu, +1);
5420 x86emuOp2_bsr(struct X86EMU *emu)
5422 common_bitsearch(emu, -1);
5429 x86emuOp2_32_movsx_byte_R_RM(struct X86EMU *emu)
5433 fetch_decode_modrm(emu);
5434 destreg = decode_rh_long_register(emu);
5435 *destreg = (int32_t)(int8_t)decode_and_fetch_byte(emu);
5439 x86emuOp2_16_movsx_byte_R_RM(struct X86EMU *emu)
5443 fetch_decode_modrm(emu);
5444 destreg = decode_rh_word_register(emu);
5445 *destreg = (int16_t)(int8_t)decode_and_fetch_byte(emu);
5449 x86emuOp2_movsx_byte_R_RM(struct X86EMU *emu)
5451 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
5452 x86emuOp2_32_movsx_byte_R_RM(emu);
5454 x86emuOp2_16_movsx_byte_R_RM(emu);
5461 x86emuOp2_movsx_word_R_RM(struct X86EMU *emu)
5465 fetch_decode_modrm(emu);
5466 destreg = decode_rh_long_register(emu);
5467 *destreg = (int32_t)(int16_t)decode_and_fetch_word(emu);
5471 X86EMU_exec_two_byte(struct X86EMU * emu)
5475 op2 = fetch_byte_imm(emu);
5496 x86emuOp2_rdtsc(emu);
5500 common_jmp_long(emu, ACCESS_FLAG(F_OF));
5503 common_jmp_long(emu, !ACCESS_FLAG(F_OF));
5506 common_jmp_long(emu, ACCESS_FLAG(F_CF));
5509 common_jmp_long(emu, !ACCESS_FLAG(F_CF));
5512 common_jmp_long(emu, ACCESS_FLAG(F_ZF));
5515 common_jmp_long(emu, !ACCESS_FLAG(F_ZF));
5518 common_jmp_long(emu, ACCESS_FLAG(F_CF) || ACCESS_FLAG(F_ZF));
5521 common_jmp_long(emu, !(ACCESS_FLAG(F_CF) || ACCESS_FLAG(F_ZF)));
5524 common_jmp_long(emu, ACCESS_FLAG(F_SF));
5527 common_jmp_long(emu, !ACCESS_FLAG(F_SF));
5530 common_jmp_long(emu, ACCESS_FLAG(F_PF));
5533 common_jmp_long(emu, !ACCESS_FLAG(F_PF));
5536 common_jmp_long(emu, xorl(ACCESS_FLAG(F_SF), ACCESS_FLAG(F_OF)));
5539 common_jmp_long(emu, !(xorl(ACCESS_FLAG(F_SF), ACCESS_FLAG(F_OF))));
5542 common_jmp_long(emu,
5546 common_jmp_long(emu,
5551 common_set_byte(emu, ACCESS_FLAG(F_OF));
5554 common_set_byte(emu, !ACCESS_FLAG(F_OF));
5557 common_set_byte(emu, ACCESS_FLAG(F_CF));
5560 common_set_byte(emu, !ACCESS_FLAG(F_CF));
5563 common_set_byte(emu, ACCESS_FLAG(F_ZF));
5566 common_set_byte(emu, !ACCESS_FLAG(F_ZF));
5569 common_set_byte(emu, ACCESS_FLAG(F_CF) || ACCESS_FLAG(F_ZF));
5572 common_set_byte(emu, !(ACCESS_FLAG(F_CF) || ACCESS_FLAG(F_ZF)));
5575 common_set_byte(emu, ACCESS_FLAG(F_SF));
5578 common_set_byte(emu, !ACCESS_FLAG(F_SF));
5581 common_set_byte(emu, ACCESS_FLAG(F_PF));
5584 common_set_byte(emu, !ACCESS_FLAG(F_PF));
5587 common_set_byte(emu, xorl(ACCESS_FLAG(F_SF), ACCESS_FLAG(F_OF)));
5590 common_set_byte(emu, xorl(ACCESS_FLAG(F_SF), ACCESS_FLAG(F_OF)));
5593 common_set_byte(emu,
5598 common_set_byte(emu,
5604 x86emuOp2_push_FS(emu);
5607 x86emuOp2_pop_FS(emu);
5610 x86emuOp2_cpuid(emu);
5613 x86emuOp2_bt_R(emu);
5616 x86emuOp2_shld_IMM(emu);
5619 x86emuOp2_shld_CL(emu);
5622 x86emuOp2_push_GS(emu);
5625 x86emuOp2_pop_GS(emu);
5628 x86emuOp2_bts_R(emu);
5631 x86emuOp2_shrd_IMM(emu);
5634 x86emuOp2_shrd_CL(emu);
5637 x86emuOp2_imul_R_RM(emu);
5643 x86emuOp2_lss_R_IMM(emu);
5646 x86emuOp2_btr_R(emu);
5649 x86emuOp2_lfs_R_IMM(emu);
5652 x86emuOp2_lgs_R_IMM(emu);
5655 x86emuOp2_movzx_byte_R_RM(emu);
5658 x86emuOp2_movzx_word_R_RM(emu);
5661 x86emuOp2_btX_I(emu);
5664 x86emuOp2_btc_R(emu);
5667 x86emuOp2_bsf(emu);
5670 x86emuOp2_bsr(emu);
5673 x86emuOp2_movsx_byte_R_RM(emu);
5676 x86emuOp2_movsx_word_R_RM(emu);
5691 X86EMU_halt_sys(emu);
5780 aaa_word(struct X86EMU *emu, uint16_t d)
5803 aas_word(struct X86EMU *emu, uint16_t d)
5826 aad_word(struct X86EMU *emu, uint16_t d)
5848 aam_word(struct X86EMU *emu, uint8_t d)
5869 adc_byte(struct X86EMU *emu, uint8_t d, uint8_t s)
5895 adc_word(struct X86EMU *emu, uint16_t d, uint16_t s)
5921 adc_long(struct X86EMU *emu, uint32_t d, uint32_t s)
5953 add_byte(struct X86EMU *emu, uint8_t d, uint8_t s)
5975 add_word(struct X86EMU *emu, uint16_t d, uint16_t s)
5997 add_long(struct X86EMU *emu, uint32_t d, uint32_t s)
6025 and_byte(struct X86EMU *emu, uint8_t d, uint8_t s)
6045 and_word(struct X86EMU *emu, uint16_t d, uint16_t s)
6065 and_long(struct X86EMU *emu, uint32_t d, uint32_t s)
6085 cmp_byte(struct X86EMU *emu, uint8_t d, uint8_t s)
6105 cmp_byte_no_return(struct X86EMU *emu, uint8_t d, uint8_t s)
6107 cmp_byte(emu, d, s);
6114 cmp_word(struct X86EMU *emu, uint16_t d, uint16_t s)
6133 cmp_word_no_return(struct X86EMU *emu, uint16_t d, uint16_t s)
6135 cmp_word(emu, d, s);
6142 cmp_long(struct X86EMU *emu, uint32_t d, uint32_t s)
6161 cmp_long_no_return(struct X86EMU *emu, uint32_t d, uint32_t s)
6163 cmp_long(emu, d, s);
6170 daa_byte(struct X86EMU *emu, uint8_t d)
6191 das_byte(struct X86EMU *emu, uint8_t d)
6211 dec_byte(struct X86EMU *emu, uint8_t d)
6234 dec_word(struct X86EMU *emu, uint16_t d)
6257 dec_long(struct X86EMU *emu, uint32_t d)
6280 inc_byte(struct X86EMU *emu, uint8_t d)
6301 inc_word(struct X86EMU *emu, uint16_t d)
6322 inc_long(struct X86EMU *emu, uint32_t d)
6343 or_byte(struct X86EMU *emu, uint8_t d, uint8_t s)
6361 or_word(struct X86EMU *emu, uint16_t d, uint16_t s)
6380 or_long(struct X86EMU *emu, uint32_t d, uint32_t s)
6400 neg_byte(struct X86EMU *emu, uint8_t s)
6425 neg_word(struct X86EMU *emu, uint16_t s)
6451 neg_long(struct X86EMU *emu, uint32_t s)
6477 rcl_byte(struct X86EMU *emu, uint8_t d, uint8_t s)
6542 rcl_word(struct X86EMU *emu, uint16_t d, uint8_t s)
6566 rcl_long(struct X86EMU *emu, uint32_t d, uint8_t s)
6590 rcr_byte(struct X86EMU *emu, uint8_t d, uint8_t s)
6664 rcr_word(struct X86EMU *emu, uint16_t d, uint8_t s)
6696 rcr_long(struct X86EMU *emu, uint32_t d, uint8_t s)
6729 rol_byte(struct X86EMU *emu, uint8_t d, uint8_t s)
6775 rol_word(struct X86EMU *emu, uint16_t d, uint8_t s)
6800 rol_long(struct X86EMU *emu, uint32_t d, uint8_t s)
6825 ror_byte(struct X86EMU *emu, uint8_t d, uint8_t s)
6868 ror_word(struct X86EMU *emu, uint16_t d, uint8_t s)
6891 ror_long(struct X86EMU *emu, uint32_t d, uint8_t s)
6914 shl_byte(struct X86EMU *emu, uint8_t d, uint8_t s)
6938 /* was (emu->x86.R_FLG&F_CF)==F_CF)), */
6958 shl_word(struct X86EMU *emu, uint16_t d, uint8_t s)
6998 shl_long(struct X86EMU *emu, uint32_t d, uint8_t s)
7035 shr_byte(struct X86EMU *emu, uint8_t d, uint8_t s)
7072 shr_word(struct X86EMU *emu, uint16_t d, uint8_t s)
7109 shr_long(struct X86EMU *emu, uint32_t d, uint8_t s)
7145 sar_byte(struct X86EMU *emu, uint8_t d, uint8_t s)
7185 sar_word(struct X86EMU *emu, uint16_t d, uint8_t s)
7225 sar_long(struct X86EMU *emu, uint32_t d, uint8_t s)
7265 shld_word(struct X86EMU *emu, uint16_t d, uint16_t fill, uint8_t s)
7302 shld_long(struct X86EMU *emu, uint32_t d, uint32_t fill, uint8_t s)
7339 shrd_word(struct X86EMU *emu, uint16_t d, uint16_t fill, uint8_t s)
7376 shrd_long(struct X86EMU *emu, uint32_t d, uint32_t fill, uint8_t s)
7412 sbb_byte(struct X86EMU *emu, uint8_t d, uint8_t s)
7437 sbb_word(struct X86EMU *emu, uint16_t d, uint16_t s)
7462 sbb_long(struct X86EMU *emu, uint32_t d, uint32_t s)
7487 sub_byte(struct X86EMU *emu, uint8_t d, uint8_t s)
7509 sub_word(struct X86EMU *emu, uint16_t d, uint16_t s)
7531 sub_long(struct X86EMU *emu, uint32_t d, uint32_t s)
7553 test_byte(struct X86EMU *emu, uint8_t d, uint8_t s)
7571 test_word(struct X86EMU *emu, uint16_t d, uint16_t s)
7589 test_long(struct X86EMU *emu, uint32_t d, uint32_t s)
7607 xor_byte(struct X86EMU *emu, uint8_t d, uint8_t s)
7625 xor_word(struct X86EMU *emu, uint16_t d, uint16_t s)
7643 xor_long(struct X86EMU *emu, uint32_t d, uint32_t s)
7661 imul_byte(struct X86EMU *emu, uint8_t s)
7663 int16_t res = (int16_t) ((int8_t) emu->x86.R_AL * (int8_t) s);
7665 emu->x86.R_AX = res;
7666 if (((emu->x86.R_AL & 0x80) == 0 && emu->x86.R_AH == 0x00) ||
7667 ((emu->x86.R_AL & 0x80) != 0 && emu->x86.R_AH == 0xFF)) {
7680 imul_word(struct X86EMU *emu, uint16_t s)
7682 int32_t res = (int16_t) emu->x86.R_AX * (int16_t) s;
7684 emu->x86.R_AX = (uint16_t) res;
7685 emu->x86.R_DX = (uint16_t) (res >> 16);
7686 if (((emu->x86.R_AX & 0x8000) == 0 && emu->x86.R_DX == 0x00) ||
7687 ((emu->x86.R_AX & 0x8000) != 0 && emu->x86.R_DX == 0xFF)) {
7700 imul_long(struct X86EMU *emu, uint32_t s)
7704 res = (int64_t)(int32_t)emu->x86.R_EAX * (int32_t)s;
7705 emu->x86.R_EAX = (uint32_t)res;
7706 emu->x86.R_EDX = ((uint64_t)res) >> 32;
7707 if (((emu->x86.R_EAX & 0x80000000) == 0 && emu->x86.R_EDX == 0x00) ||
7708 ((emu->x86.R_EAX & 0x80000000) != 0 && emu->x86.R_EDX == 0xFF)) {
7721 mul_byte(struct X86EMU *emu, uint8_t s)
7723 uint16_t res = (uint16_t) (emu->x86.R_AL * s);
7725 emu->x86.R_AX = res;
7726 if (emu->x86.R_AH == 0) {
7739 mul_word(struct X86EMU *emu, uint16_t s)
7741 uint32_t res = emu->x86.R_AX * s;
7743 emu->x86.R_AX = (uint16_t) res;
7744 emu->x86.R_DX = (uint16_t) (res >> 16);
7745 if (emu->x86.R_DX == 0) {
7758 mul_long(struct X86EMU *emu, uint32_t s)
7760 uint64_t res = (uint64_t) emu->x86.R_EAX * s;
7762 emu->x86.R_EAX = (uint32_t) res;
7763 emu->x86.R_EDX = (uint32_t) (res >> 32);
7765 if (emu->x86.R_EDX == 0) {
7778 idiv_byte(struct X86EMU *emu, uint8_t s)
7782 dvd = (int16_t) emu->x86.R_AX;
7784 x86emu_intr_raise(emu, 8);
7790 x86emu_intr_raise(emu, 8);
7793 emu->x86.R_AL = (int8_t) div;
7794 emu->x86.R_AH = (int8_t) mod;
7801 idiv_word(struct X86EMU *emu, uint16_t s)
7805 dvd = (((int32_t) emu->x86.R_DX) << 16) | emu->x86.R_AX;
7807 x86emu_intr_raise(emu, 8);
7813 x86emu_intr_raise(emu, 8);
7821 emu->x86.R_AX = (uint16_t) div;
7822 emu->x86.R_DX = (uint16_t) mod;
7829 idiv_long(struct X86EMU *emu, uint32_t s)
7833 dvd = (((int64_t) emu->x86.R_EDX) << 32) | emu->x86.R_EAX;
7835 x86emu_intr_raise(emu, 8);
7841 x86emu_intr_raise(emu, 8);
7850 emu->x86.R_EAX = (uint32_t) div;
7851 emu->x86.R_EDX = (uint32_t) mod;
7858 div_byte(struct X86EMU *emu, uint8_t s)
7862 dvd = emu->x86.R_AX;
7864 x86emu_intr_raise(emu, 8);
7870 x86emu_intr_raise(emu, 8);
7873 emu->x86.R_AL = (uint8_t) div;
7874 emu->x86.R_AH = (uint8_t) mod;
7881 div_word(struct X86EMU *emu, uint16_t s)
7885 dvd = (((uint32_t) emu->x86.R_DX) << 16) | emu->x86.R_AX;
7887 x86emu_intr_raise(emu, 8);
7893 x86emu_intr_raise(emu, 8);
7901 emu->x86.R_AX = (uint16_t) div;
7902 emu->x86.R_DX = (uint16_t) mod;
7909 div_long(struct X86EMU *emu, uint32_t s)
7913 dvd = (((uint64_t) emu->x86.R_EDX) << 32) | emu->x86.R_EAX;
7915 x86emu_intr_raise(emu, 8);
7921 x86emu_intr_raise(emu, 8);
7930 emu->x86.R_EAX = (uint32_t) div;
7931 emu->x86.R_EDX = (uint32_t) mod;
7938 ins(struct X86EMU *emu, int size)
7945 if (emu->x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
7948 uint32_t count = ((emu->x86.mode & SYSMODE_PREFIX_DATA) ?
7949 emu->x86.R_ECX : emu->x86.R_CX);
7953 store_byte(emu, emu->x86.R_ES, emu->x86.R_DI,
7954 (*emu->emu_inb) (emu, emu->x86.R_DX));
7955 emu->x86.R_DI += inc;
7961 store_word(emu, emu->x86.R_ES, emu->x86.R_DI,
7962 (*emu->emu_inw) (emu, emu->x86.R_DX));
7963 emu->x86.R_DI += inc;
7968 store_long(emu, emu->x86.R_ES, emu->x86.R_DI,
7969 (*emu->emu_inl) (emu, emu->x86.R_DX));
7970 emu->x86.R_DI += inc;
7974 emu->x86.R_CX = 0;
7975 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
7976 emu->x86.R_ECX = 0;
7978 emu->x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
7982 store_byte(emu, emu->x86.R_ES, emu->x86.R_DI,
7983 (*emu->emu_inb) (emu, emu->x86.R_DX));
7986 store_word(emu, emu->x86.R_ES, emu->x86.R_DI,
7987 (*emu->emu_inw) (emu, emu->x86.R_DX));
7990 store_long(emu, emu->x86.R_ES, emu->x86.R_DI,
7991 (*emu->emu_inl) (emu, emu->x86.R_DX));
7994 emu->x86.R_DI += inc;
8002 outs(struct X86EMU *emu, int size)
8009 if (emu->x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
8012 uint32_t count = ((emu->x86.mode & SYSMODE_PREFIX_DATA) ?
8013 emu->x86.R_ECX : emu->x86.R_CX);
8017 (*emu->emu_outb) (emu, emu->x86.R_DX,
8018 fetch_byte(emu, emu->x86.R_ES, emu->x86.R_SI));
8019 emu->x86.R_SI += inc;
8025 (*emu->emu_outw) (emu, emu->x86.R_DX,
8026 fetch_word(emu, emu->x86.R_ES, emu->x86.R_SI));
8027 emu->x86.R_SI += inc;
8032 (*emu->emu_outl) (emu, emu->x86.R_DX,
8033 fetch_long(emu, emu->x86.R_ES, emu->x86.R_SI));
8034 emu->x86.R_SI += inc;
8038 emu->x86.R_CX = 0;
8039 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
8040 emu->x86.R_ECX = 0;
8042 emu->x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
8046 (*emu->emu_outb) (emu, emu->x86.R_DX,
8047 fetch_byte(emu, emu->x86.R_ES, emu->x86.R_SI));
8050 (*emu->emu_outw) (emu, emu->x86.R_DX,
8051 fetch_word(emu, emu->x86.R_ES, emu->x86.R_SI));
8054 (*emu->emu_outl) (emu, emu->x86.R_DX,
8055 fetch_long(emu, emu->x86.R_ES, emu->x86.R_SI));
8058 emu->x86.R_SI += inc;
8065 NOTE: Do not inline this, as (*emu->emu_wrX) is already inline!
8068 push_word(struct X86EMU *emu, uint16_t w)
8070 emu->x86.R_SP -= 2;
8071 store_word(emu, emu->x86.R_SS, emu->x86.R_SP, w);
8077 NOTE: Do not inline this, as (*emu->emu_wrX) is already inline!
8080 push_long(struct X86EMU *emu, uint32_t w)
8082 emu->x86.R_SP -= 4;
8083 store_long(emu, emu->x86.R_SS, emu->x86.R_SP, w);
8089 NOTE: Do not inline this, as (*emu->emu_rdX) is already inline!
8092 pop_word(struct X86EMU *emu)
8096 res = fetch_word(emu, emu->x86.R_SS, emu->x86.R_SP);
8097 emu->x86.R_SP += 2;
8104 NOTE: Do not inline this, as (*emu->emu_rdX) is already inline!
8107 pop_long(struct X86EMU *emu)
8111 res = fetch_long(emu, emu->x86.R_SS, emu->x86.R_SP);
8112 emu->x86.R_SP += 4;