Lines Matching refs:x86

185 		push_word(emu, (uint16_t) emu->x86.R_FLG);
188 push_word(emu, emu->x86.R_CS);
189 emu->x86.R_CS = fetch_word(emu, 0, intno * 4 + 2);
190 push_word(emu, emu->x86.R_IP);
191 emu->x86.R_IP = fetch_word(emu, 0, intno * 4);
200 if (emu->x86.intr & INTR_SYNCH) {
201 intno = emu->x86.intno;
202 emu->x86.intr = 0;
218 emu->x86.intno = intrnum;
219 emu->x86.intr |= INTR_SYNCH;
231 emu->x86.intr = 0;
237 if (emu->x86.intr) {
238 if (((emu->x86.intr & INTR_SYNCH) &&
239 (emu->x86.intno == 0 || emu->x86.intno == 2)) ||
244 if (emu->x86.R_CS == 0 && emu->x86.R_IP == 0)
256 emu->x86.R_CS = seg;
257 emu->x86.R_IP = off;
265 push_word(emu, emu->x86.R_FLG);
270 emu->x86.R_CS = (*emu->emu_rdw)(emu, intr * 4 + 2);
271 emu->x86.R_IP = (*emu->emu_rdw)(emu, intr * 4);
272 emu->x86.intr = 0;
325 fetched = fetch_byte(emu, emu->x86.R_CS, emu->x86.R_IP);
326 emu->x86.R_IP++;
345 fetched = fetch_word(emu, emu->x86.R_CS, emu->x86.R_IP);
346 emu->x86.R_IP += 2;
365 fetched = fetch_long(emu, emu->x86.R_CS, emu->x86.R_IP);
366 emu->x86.R_IP += 4;
378 * On the x86 processor, the default segment is not always DS if there is
383 * cpu-state-varible emu->x86.mode. There are several potential states:
402 switch (emu->x86.mode & SYSMODE_SEGMASK) {
406 return emu->x86.R_DS;
408 return emu->x86.R_SS;
411 return emu->x86.R_CS;
414 return emu->x86.R_ES;
417 return emu->x86.R_FS;
420 return emu->x86.R_GS;
423 return emu->x86.R_SS;
639 return &emu->x86.R_AL;
641 return &emu->x86.R_CL;
643 return &emu->x86.R_DL;
645 return &emu->x86.R_BL;
647 return &emu->x86.R_AH;
649 return &emu->x86.R_CH;
651 return &emu->x86.R_DH;
653 return &emu->x86.R_BH;
687 return &emu->x86.R_AX;
689 return &emu->x86.R_CX;
691 return &emu->x86.R_DX;
693 return &emu->x86.R_BX;
695 return &emu->x86.R_SP;
697 return &emu->x86.R_BP;
699 return &emu->x86.R_SI;
701 return &emu->x86.R_DI;
735 return &emu->x86.R_EAX;
737 return &emu->x86.R_ECX;
739 return &emu->x86.R_EDX;
741 return &emu->x86.R_EBX;
743 return &emu->x86.R_ESP;
745 return &emu->x86.R_EBP;
747 return &emu->x86.R_ESI;
749 return &emu->x86.R_EDI;
785 return &emu->x86.R_ES;
787 return &emu->x86.R_CS;
789 return &emu->x86.R_SS;
791 return &emu->x86.R_DS;
793 return &emu->x86.R_FS;
795 return &emu->x86.R_GS;
811 base = emu->x86.R_EAX;
814 base = emu->x86.R_ECX;
818 base = emu->x86.R_EDX;
821 base = emu->x86.R_EBX;
824 base = emu->x86.R_ESP;
825 emu->x86.mode |= SYSMODE_SEG_DS_SS;
831 base = emu->x86.R_EBP;
832 emu->x86.mode |= SYSMODE_SEG_DS_SS;
836 base = emu->x86.R_ESI;
839 base = emu->x86.R_EDI;
844 i = emu->x86.R_EAX;
847 i = emu->x86.R_ECX;
850 i = emu->x86.R_EDX;
853 i = emu->x86.R_EBX;
859 i = emu->x86.R_EBP;
862 i = emu->x86.R_ESI;
865 i = emu->x86.R_EDI;
886 if (emu->x86.mode & SYSMODE_PREFIX_ADDR) {
891 offset = emu->x86.R_EAX;
894 offset = emu->x86.R_ECX;
897 offset = emu->x86.R_EDX;
900 offset = emu->x86.R_EBX;
910 emu->x86.mode |= SYSMODE_SEG_DS_SS;
911 offset = emu->x86.R_EBP;
915 offset = emu->x86.R_ESI;
918 offset = emu->x86.R_EDI;
934 offset = emu->x86.R_BX + emu->x86.R_SI;
937 offset = emu->x86.R_BX + emu->x86.R_DI;
940 emu->x86.mode |= SYSMODE_SEG_DS_SS;
941 offset = emu->x86.R_BP + emu->x86.R_SI;
944 emu->x86.mode |= SYSMODE_SEG_DS_SS;
945 offset = emu->x86.R_BP + emu->x86.R_DI;
948 offset = emu->x86.R_SI;
951 offset = emu->x86.R_DI;
957 emu->x86.mode |= SYSMODE_SEG_DS_SS;
958 offset = emu->x86.R_BP;
962 offset = emu->x86.R_BX;
992 if ((emu->x86.mode & SYSMODE_PREFIX_ADDR) == 0)
1006 if ((emu->x86.mode & SYSMODE_PREFIX_ADDR) == 0)
1095 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1104 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1212 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1260 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1307 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1320 emu->x86.R_AL = (*binop)(emu, emu->x86.R_AL, srcval);
1328 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
1332 emu->x86.R_EAX = (*binop32)(emu, emu->x86.R_EAX, srcval);
1337 emu->x86.R_AX = (*binop16)(emu, emu->x86.R_AX, srcval);
1344 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1353 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1428 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1441 target = (uint16_t) (emu->x86.R_IP + (int16_t) offset);
1443 emu->x86.R_IP = target;
1509 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1525 cmp_byte(emu, emu->x86.R_AL, srcval);
1538 cmp_long(emu, emu->x86.R_EAX, srcval);
1547 cmp_word(emu, emu->x86.R_AX, srcval);
1553 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1566 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
1567 uint32_t old_sp = emu->x86.R_ESP;
1569 push_long(emu, emu->x86.R_EAX);
1570 push_long(emu, emu->x86.R_ECX);
1571 push_long(emu, emu->x86.R_EDX);
1572 push_long(emu, emu->x86.R_EBX);
1574 push_long(emu, emu->x86.R_EBP);
1575 push_long(emu, emu->x86.R_ESI);
1576 push_long(emu, emu->x86.R_EDI);
1578 uint16_t old_sp = emu->x86.R_SP;
1580 push_word(emu, emu->x86.R_AX);
1581 push_word(emu, emu->x86.R_CX);
1582 push_word(emu, emu->x86.R_DX);
1583 push_word(emu, emu->x86.R_BX);
1585 push_word(emu, emu->x86.R_BP);
1586 push_word(emu, emu->x86.R_SI);
1587 push_word(emu, emu->x86.R_DI);
1598 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
1599 emu->x86.R_EDI = pop_long(emu);
1600 emu->x86.R_ESI = pop_long(emu);
1601 emu->x86.R_EBP = pop_long(emu);
1602 emu->x86.R_ESP += 4; /* skip ESP */
1603 emu->x86.R_EBX = pop_long(emu);
1604 emu->x86.R_EDX = pop_long(emu);
1605 emu->x86.R_ECX = pop_long(emu);
1606 emu->x86.R_EAX = pop_long(emu);
1608 emu->x86.R_DI = pop_word(emu);
1609 emu->x86.R_SI = pop_word(emu);
1610 emu->x86.R_BP = pop_word(emu);
1611 emu->x86.R_SP += 2;/* skip SP */
1612 emu->x86.R_BX = pop_word(emu);
1613 emu->x86.R_DX = pop_word(emu);
1614 emu->x86.R_CX = pop_word(emu);
1615 emu->x86.R_AX = pop_word(emu);
1629 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
1652 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
1666 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
1680 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
1853 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1957 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
1965 * Handles opcode 0x86
2016 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
2084 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
2111 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2161 if (emu->x86.mode & SYSMODE_PREFIX_ADDR) {
2235 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
2250 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2251 tmp = emu->x86.R_EAX;
2252 emu->x86.R_EAX = emu->x86.R_ECX;
2253 emu->x86.R_ECX = tmp;
2255 tmp = emu->x86.R_AX;
2256 emu->x86.R_AX = emu->x86.R_CX;
2257 emu->x86.R_CX = (uint16_t) tmp;
2270 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2271 tmp = emu->x86.R_EAX;
2272 emu->x86.R_EAX = emu->x86.R_EDX;
2273 emu->x86.R_EDX = tmp;
2275 tmp = emu->x86.R_AX;
2276 emu->x86.R_AX = emu->x86.R_DX;
2277 emu->x86.R_DX = (uint16_t) tmp;
2290 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2291 tmp = emu->x86.R_EAX;
2292 emu->x86.R_EAX = emu->x86.R_EBX;
2293 emu->x86.R_EBX = tmp;
2295 tmp = emu->x86.R_AX;
2296 emu->x86.R_AX = emu->x86.R_BX;
2297 emu->x86.R_BX = (uint16_t) tmp;
2310 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2311 tmp = emu->x86.R_EAX;
2312 emu->x86.R_EAX = emu->x86.R_ESP;
2313 emu->x86.R_ESP = tmp;
2315 tmp = emu->x86.R_AX;
2316 emu->x86.R_AX = emu->x86.R_SP;
2317 emu->x86.R_SP = (uint16_t) tmp;
2330 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2331 tmp = emu->x86.R_EAX;
2332 emu->x86.R_EAX = emu->x86.R_EBP;
2333 emu->x86.R_EBP = tmp;
2335 tmp = emu->x86.R_AX;
2336 emu->x86.R_AX = emu->x86.R_BP;
2337 emu->x86.R_BP = (uint16_t) tmp;
2350 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2351 tmp = emu->x86.R_EAX;
2352 emu->x86.R_EAX = emu->x86.R_ESI;
2353 emu->x86.R_ESI = tmp;
2355 tmp = emu->x86.R_AX;
2356 emu->x86.R_AX = emu->x86.R_SI;
2357 emu->x86.R_SI = (uint16_t) tmp;
2370 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2371 tmp = emu->x86.R_EAX;
2372 emu->x86.R_EAX = emu->x86.R_EDI;
2373 emu->x86.R_EDI = tmp;
2375 tmp = emu->x86.R_AX;
2376 emu->x86.R_AX = emu->x86.R_DI;
2377 emu->x86.R_DI = (uint16_t) tmp;
2388 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2389 if (emu->x86.R_AX & 0x8000) {
2390 emu->x86.R_EAX |= 0xffff0000;
2392 emu->x86.R_EAX &= 0x0000ffff;
2395 if (emu->x86.R_AL & 0x80) {
2396 emu->x86.R_AH = 0xff;
2398 emu->x86.R_AH = 0x0;
2410 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2411 if (emu->x86.R_EAX & 0x80000000) {
2412 emu->x86.R_EDX = 0xffffffff;
2414 emu->x86.R_EDX = 0x0;
2417 if (emu->x86.R_AX & 0x8000) {
2418 emu->x86.R_DX = 0xffff;
2420 emu->x86.R_DX = 0x0;
2441 push_word(emu, emu->x86.R_CS);
2442 emu->x86.R_CS = farseg;
2443 push_word(emu, emu->x86.R_IP);
2444 emu->x86.R_IP = faroff;
2457 flags = (emu->x86.R_EFLG & F_MSK) | F_ALWAYS_ON;
2458 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2472 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2473 emu->x86.R_EFLG = pop_long(emu);
2475 emu->x86.R_FLG = pop_word(emu);
2487 emu->x86.R_FLG &= 0xffffff00;
2489 emu->x86.R_FLG |= emu->x86.R_AH;
2499 emu->x86.R_AH = (uint8_t) (emu->x86.R_FLG & 0xff);
2502 emu->x86.R_AH |= 0x2;
2515 emu->x86.R_AL = fetch_data_byte(emu, offset);
2528 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2529 emu->x86.R_EAX = fetch_data_long(emu, offset);
2531 emu->x86.R_AX = fetch_data_word(emu, offset);
2545 store_data_byte(emu, offset, emu->x86.R_AL);
2558 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2559 store_data_long(emu, offset, emu->x86.R_EAX);
2561 store_data_word(emu, offset, emu->x86.R_AX);
2581 if (emu->x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
2584 count = emu->x86.R_CX;
2585 emu->x86.R_CX = 0;
2586 emu->x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
2589 val = fetch_data_byte(emu, emu->x86.R_SI);
2590 store_byte(emu, emu->x86.R_ES, emu->x86.R_DI, val);
2591 emu->x86.R_SI += inc;
2592 emu->x86.R_DI += inc;
2607 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
2616 if (emu->x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
2619 count = emu->x86.R_CX;
2620 emu->x86.R_CX = 0;
2621 emu->x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
2624 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2625 val = fetch_data_long(emu, emu->x86.R_SI);
2626 store_long(emu, emu->x86.R_ES, emu->x86.R_DI, val);
2628 val = fetch_data_word(emu, emu->x86.R_SI);
2629 store_word(emu, emu->x86.R_ES, emu->x86.R_DI,
2632 emu->x86.R_SI += inc;
2633 emu->x86.R_DI += inc;
2652 if (emu->x86.mode & SYSMODE_PREFIX_REPE) {
2655 while (emu->x86.R_CX != 0) {
2656 val1 = fetch_data_byte(emu, emu->x86.R_SI);
2657 val2 = fetch_byte(emu, emu->x86.R_ES, emu->x86.R_DI);
2659 emu->x86.R_CX -= 1;
2660 emu->x86.R_SI += inc;
2661 emu->x86.R_DI += inc;
2665 emu->x86.mode &= ~SYSMODE_PREFIX_REPE;
2666 } else if (emu->x86.mode & SYSMODE_PREFIX_REPNE) {
2669 while (emu->x86.R_CX != 0) {
2670 val1 = fetch_data_byte(emu, emu->x86.R_SI);
2671 val2 = fetch_byte(emu, emu->x86.R_ES, emu->x86.R_DI);
2673 emu->x86.R_CX -= 1;
2674 emu->x86.R_SI += inc;
2675 emu->x86.R_DI += inc;
2679 emu->x86.mode &= ~SYSMODE_PREFIX_REPNE;
2681 val1 = fetch_data_byte(emu, emu->x86.R_SI);
2682 val2 = fetch_byte(emu, emu->x86.R_ES, emu->x86.R_DI);
2684 emu->x86.R_SI += inc;
2685 emu->x86.R_DI += inc;
2699 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2710 if (emu->x86.mode & SYSMODE_PREFIX_REPE) {
2713 while (emu->x86.R_CX != 0) {
2714 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2715 val1 = fetch_data_long(emu, emu->x86.R_SI);
2716 val2 = fetch_long(emu, emu->x86.R_ES,
2717 emu->x86.R_DI);
2720 val1 = fetch_data_word(emu, emu->x86.R_SI);
2721 val2 = fetch_word(emu, emu->x86.R_ES,
2722 emu->x86.R_DI);
2725 emu->x86.R_CX -= 1;
2726 emu->x86.R_SI += inc;
2727 emu->x86.R_DI += inc;
2731 emu->x86.mode &= ~SYSMODE_PREFIX_REPE;
2732 } else if (emu->x86.mode & SYSMODE_PREFIX_REPNE) {
2735 while (emu->x86.R_CX != 0) {
2736 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2737 val1 = fetch_data_long(emu, emu->x86.R_SI);
2738 val2 = fetch_long(emu, emu->x86.R_ES,
2739 emu->x86.R_DI);
2742 val1 = fetch_data_word(emu, emu->x86.R_SI);
2743 val2 = fetch_word(emu, emu->x86.R_ES,
2744 emu->x86.R_DI);
2747 emu->x86.R_CX -= 1;
2748 emu->x86.R_SI += inc;
2749 emu->x86.R_DI += inc;
2753 emu->x86.mode &= ~SYSMODE_PREFIX_REPNE;
2755 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2756 val1 = fetch_data_long(emu, emu->x86.R_SI);
2757 val2 = fetch_long(emu, emu->x86.R_ES, emu->x86.R_DI);
2760 val1 = fetch_data_word(emu, emu->x86.R_SI);
2761 val2 = fetch_word(emu, emu->x86.R_ES, emu->x86.R_DI);
2764 emu->x86.R_SI += inc;
2765 emu->x86.R_DI += inc;
2776 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2777 test_long(emu, emu->x86.R_EAX, fetch_long_imm(emu));
2779 test_word(emu, emu->x86.R_AX, fetch_word_imm(emu));
2796 if (emu->x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
2799 while (emu->x86.R_CX != 0) {
2800 store_byte(emu, emu->x86.R_ES, emu->x86.R_DI,
2801 emu->x86.R_AL);
2802 emu->x86.R_CX -= 1;
2803 emu->x86.R_DI += inc;
2805 emu->x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
2807 store_byte(emu, emu->x86.R_ES, emu->x86.R_DI, emu->x86.R_AL);
2808 emu->x86.R_DI += inc;
2822 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
2831 if (emu->x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
2834 count = emu->x86.R_CX;
2835 emu->x86.R_CX = 0;
2836 emu->x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
2839 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2840 store_long(emu, emu->x86.R_ES, emu->x86.R_DI,
2841 emu->x86.R_EAX);
2843 store_word(emu, emu->x86.R_ES, emu->x86.R_DI,
2844 emu->x86.R_AX);
2846 emu->x86.R_DI += inc;
2863 if (emu->x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
2866 while (emu->x86.R_CX != 0) {
2867 emu->x86.R_AL = fetch_data_byte(emu, emu->x86.R_SI);
2868 emu->x86.R_CX -= 1;
2869 emu->x86.R_SI += inc;
2871 emu->x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
2873 emu->x86.R_AL = fetch_data_byte(emu, emu->x86.R_SI);
2874 emu->x86.R_SI += inc;
2888 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
2897 if (emu->x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
2900 count = emu->x86.R_CX;
2901 emu->x86.R_CX = 0;
2902 emu->x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
2905 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2906 emu->x86.R_EAX = fetch_data_long(emu, emu->x86.R_SI);
2908 emu->x86.R_AX = fetch_data_word(emu, emu->x86.R_SI);
2910 emu->x86.R_SI += inc;
2928 if (emu->x86.mode & SYSMODE_PREFIX_REPE) {
2931 while (emu->x86.R_CX != 0) {
2932 val2 = fetch_byte(emu, emu->x86.R_ES, emu->x86.R_DI);
2933 cmp_byte(emu, emu->x86.R_AL, val2);
2934 emu->x86.R_CX -= 1;
2935 emu->x86.R_DI += inc;
2939 emu->x86.mode &= ~SYSMODE_PREFIX_REPE;
2940 } else if (emu->x86.mode & SYSMODE_PREFIX_REPNE) {
2943 while (emu->x86.R_CX != 0) {
2944 val2 = fetch_byte(emu, emu->x86.R_ES, emu->x86.R_DI);
2945 cmp_byte(emu, emu->x86.R_AL, val2);
2946 emu->x86.R_CX -= 1;
2947 emu->x86.R_DI += inc;
2951 emu->x86.mode &= ~SYSMODE_PREFIX_REPNE;
2953 val2 = fetch_byte(emu, emu->x86.R_ES, emu->x86.R_DI);
2954 cmp_byte(emu, emu->x86.R_AL, val2);
2955 emu->x86.R_DI += inc;
2969 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
2977 if (emu->x86.mode & SYSMODE_PREFIX_REPE) {
2980 while (emu->x86.R_CX != 0) {
2981 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
2982 val = fetch_long(emu, emu->x86.R_ES,
2983 emu->x86.R_DI);
2984 cmp_long(emu, emu->x86.R_EAX, val);
2986 val = fetch_word(emu, emu->x86.R_ES,
2987 emu->x86.R_DI);
2988 cmp_word(emu, emu->x86.R_AX, (uint16_t) val);
2990 emu->x86.R_CX -= 1;
2991 emu->x86.R_DI += inc;
2995 emu->x86.mode &= ~SYSMODE_PREFIX_REPE;
2996 } else if (emu->x86.mode & SYSMODE_PREFIX_REPNE) {
2999 while (emu->x86.R_CX != 0) {
3000 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
3001 val = fetch_long(emu, emu->x86.R_ES,
3002 emu->x86.R_DI);
3003 cmp_long(emu, emu->x86.R_EAX, val);
3005 val = fetch_word(emu, emu->x86.R_ES,
3006 emu->x86.R_DI);
3007 cmp_word(emu, emu->x86.R_AX, (uint16_t) val);
3009 emu->x86.R_CX -= 1;
3010 emu->x86.R_DI += inc;
3014 emu->x86.mode &= ~SYSMODE_PREFIX_REPNE;
3016 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
3017 val = fetch_long(emu, emu->x86.R_ES, emu->x86.R_DI);
3018 cmp_long(emu, emu->x86.R_EAX, val);
3020 val = fetch_word(emu, emu->x86.R_ES, emu->x86.R_DI);
3021 cmp_word(emu, emu->x86.R_AX, (uint16_t) val);
3023 emu->x86.R_DI += inc;
3034 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
3035 emu->x86.R_EAX = fetch_long_imm(emu);
3037 emu->x86.R_AX = fetch_word_imm(emu);
3047 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
3048 emu->x86.R_ECX = fetch_long_imm(emu);
3050 emu->x86.R_CX = fetch_word_imm(emu);
3060 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
3061 emu->x86.R_EDX = fetch_long_imm(emu);
3063 emu->x86.R_DX = fetch_word_imm(emu);
3073 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
3074 emu->x86.R_EBX = fetch_long_imm(emu);
3076 emu->x86.R_BX = fetch_word_imm(emu);
3086 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
3087 emu->x86.R_ESP = fetch_long_imm(emu);
3089 emu->x86.R_SP = fetch_word_imm(emu);
3099 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
3100 emu->x86.R_EBP = fetch_long_imm(emu);
3102 emu->x86.R_BP = fetch_word_imm(emu);
3112 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
3113 emu->x86.R_ESI = fetch_long_imm(emu);
3115 emu->x86.R_SI = fetch_word_imm(emu);
3125 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
3126 emu->x86.R_EDI = fetch_long_imm(emu);
3128 emu->x86.R_DI = fetch_word_imm(emu);
3209 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
3236 emu->x86.R_IP = pop_word(emu);
3237 emu->x86.R_SP += imm;
3314 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
3333 push_word(emu, emu->x86.R_BP);
3334 frame_pointer = emu->x86.R_SP;
3337 emu->x86.R_BP -= 2;
3338 push_word(emu, fetch_word(emu, emu->x86.R_SS,
3339 emu->x86.R_BP));
3343 emu->x86.R_BP = frame_pointer;
3344 emu->x86.R_SP = (uint16_t) (emu->x86.R_SP - local);
3354 emu->x86.R_SP = emu->x86.R_BP;
3355 emu->x86.R_BP = pop_word(emu);
3368 emu->x86.R_IP = pop_word(emu);
3369 emu->x86.R_CS = pop_word(emu);
3370 emu->x86.R_SP += imm;
3380 emu->x86.R_IP = pop_word(emu);
3381 emu->x86.R_CS = pop_word(emu);
3425 emu->x86.R_IP = pop_word(emu);
3426 emu->x86.R_CS = pop_word(emu);
3427 emu->x86.R_FLG = pop_word(emu);
3452 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
3481 (emu, destval, emu->x86.R_CL);
3492 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
3498 (emu, destval, emu->x86.R_CL);
3506 (emu, destval, emu->x86.R_CL);
3526 emu->x86.R_AX = aam_word(emu, emu->x86.R_AL);
3543 emu->x86.R_AX = aad_word(emu, emu->x86.R_AX);
3557 addr = (uint16_t) (emu->x86.R_BX + (uint8_t) emu->x86.R_AL);
3558 emu->x86.R_AL = fetch_data_byte(emu, addr);
3634 ip += (int16_t) emu->x86.R_IP;
3635 emu->x86.R_CX -= 1;
3636 if (emu->x86.R_CX != 0 && !ACCESS_FLAG(F_ZF)) /* CX != 0 and !ZF */
3637 emu->x86.R_IP = ip;
3650 ip += (int16_t) emu->x86.R_IP;
3651 emu->x86.R_CX -= 1;
3652 if (emu->x86.R_CX != 0 && ACCESS_FLAG(F_ZF)) /* CX != 0 and ZF */
3653 emu->x86.R_IP = ip;
3666 ip += (int16_t) emu->x86.R_IP;
3667 emu->x86.R_CX -= 1;
3668 if (emu->x86.R_CX != 0)
3669 emu->x86.R_IP = ip;
3684 target = (uint16_t) (emu->x86.R_IP + offset);
3685 if (emu->x86.R_CX == 0)
3686 emu->x86.R_IP = target;
3699 emu->x86.R_AL = (*emu->emu_inb) (emu, port);
3712 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
3713 emu->x86.R_EAX = (*emu->emu_inl) (emu, port);
3715 emu->x86.R_AX = (*emu->emu_inw) (emu, port);
3729 (*emu->emu_outb) (emu, port, emu->x86.R_AL);
3742 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
3743 (*emu->emu_outl) (emu, port, emu->x86.R_EAX);
3745 (*emu->emu_outw) (emu, port, emu->x86.R_AX);
3756 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
3759 ip += (int32_t) emu->x86.R_EIP;
3760 push_long(emu, emu->x86.R_EIP);
3761 emu->x86.R_EIP = ip;
3765 ip += (int16_t) emu->x86.R_IP; /* CHECK SIGN */
3766 push_word(emu, emu->x86.R_IP);
3767 emu->x86.R_IP = ip;
3781 ip += (int16_t) emu->x86.R_IP;
3782 emu->x86.R_IP = (uint16_t) ip;
3796 emu->x86.R_IP = ip;
3797 emu->x86.R_CS = cs;
3811 target = (uint16_t) (emu->x86.R_IP + offset);
3812 emu->x86.R_IP = target;
3822 emu->x86.R_AL = (*emu->emu_inb) (emu, emu->x86.R_DX);
3832 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
3833 emu->x86.R_EAX = (*emu->emu_inl) (emu, emu->x86.R_DX);
3835 emu->x86.R_AX = (*emu->emu_inw) (emu, emu->x86.R_DX);
3846 (*emu->emu_outb) (emu, emu->x86.R_DX, emu->x86.R_AL);
3856 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
3857 (*emu->emu_outl) (emu, emu->x86.R_DX, emu->x86.R_EAX);
3859 (*emu->emu_outw) (emu, emu->x86.R_DX, emu->x86.R_AX);
4037 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
4176 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
4189 push_word(emu, emu->x86.R_CS);
4190 emu->x86.R_CS = destval2;
4191 push_word(emu, emu->x86.R_IP);
4192 emu->x86.R_IP = destval;
4196 emu->x86.R_IP = destval;
4197 emu->x86.R_CS = destval2;
4206 push_word(emu, emu->x86.R_IP);
4207 emu->x86.R_IP = destval;
4210 emu->x86.R_IP = destval;
4245 push_word(emu, emu->x86.R_ES);
4248 emu->x86.R_ES = pop_word(emu);
4270 push_word(emu, emu->x86.R_CS);
4295 push_word(emu, emu->x86.R_SS);
4298 emu->x86.R_SS = pop_word(emu);
4320 push_word(emu, emu->x86.R_DS);
4323 emu->x86.R_DS = pop_word(emu);
4345 emu->x86.mode |= SYSMODE_SEGOVR_ES;
4348 emu->x86.R_AL = daa_byte(emu, emu->x86.R_AL);
4370 emu->x86.mode |= SYSMODE_SEGOVR_CS;
4373 emu->x86.R_AL = das_byte(emu, emu->x86.R_AL);
4395 emu->x86.mode |= SYSMODE_SEGOVR_SS;
4398 emu->x86.R_AX = aaa_word(emu, emu->x86.R_AX);
4421 emu->x86.mode |= SYSMODE_SEGOVR_DS;
4424 emu->x86.R_AX = aas_word(emu, emu->x86.R_AX);
4428 common_inc_word_long(emu, &emu->x86.register_a);
4431 common_inc_word_long(emu, &emu->x86.register_c);
4434 common_inc_word_long(emu, &emu->x86.register_d);
4437 common_inc_word_long(emu, &emu->x86.register_b);
4440 common_inc_word_long(emu, &emu->x86.register_sp);
4443 common_inc_word_long(emu, &emu->x86.register_bp);
4446 common_inc_word_long(emu, &emu->x86.register_si);
4449 common_inc_word_long(emu, &emu->x86.register_di);
4453 common_dec_word_long(emu, &emu->x86.register_a);
4456 common_dec_word_long(emu, &emu->x86.register_c);
4459 common_dec_word_long(emu, &emu->x86.register_d);
4462 common_dec_word_long(emu, &emu->x86.register_b);
4465 common_dec_word_long(emu, &emu->x86.register_sp);
4468 common_dec_word_long(emu, &emu->x86.register_bp);
4471 common_dec_word_long(emu, &emu->x86.register_si);
4474 common_dec_word_long(emu, &emu->x86.register_di);
4478 common_push_word_long(emu, &emu->x86.register_a);
4481 common_push_word_long(emu, &emu->x86.register_c);
4484 common_push_word_long(emu, &emu->x86.register_d);
4487 common_push_word_long(emu, &emu->x86.register_b);
4490 common_push_word_long(emu, &emu->x86.register_sp);
4493 common_push_word_long(emu, &emu->x86.register_bp);
4496 common_push_word_long(emu, &emu->x86.register_si);
4499 common_push_word_long(emu, &emu->x86.register_di);
4503 common_pop_word_long(emu, &emu->x86.register_a);
4506 common_pop_word_long(emu, &emu->x86.register_c);
4509 common_pop_word_long(emu, &emu->x86.register_d);
4512 common_pop_word_long(emu, &emu->x86.register_b);
4515 common_pop_word_long(emu, &emu->x86.register_sp);
4518 common_pop_word_long(emu, &emu->x86.register_bp);
4521 common_pop_word_long(emu, &emu->x86.register_si);
4524 common_pop_word_long(emu, &emu->x86.register_di);
4536 emu->x86.mode |= SYSMODE_SEGOVR_FS;
4539 emu->x86.mode |= SYSMODE_SEGOVR_GS;
4542 emu->x86.mode |= SYSMODE_PREFIX_DATA;
4545 emu->x86.mode |= SYSMODE_PREFIX_ADDR;
4641 case 0x86:
4749 test_byte(emu, emu->x86.R_AL, fetch_byte_imm(emu));
4774 emu->x86.R_AL = fetch_byte_imm(emu);
4777 emu->x86.R_CL = fetch_byte_imm(emu);
4780 emu->x86.R_DL = fetch_byte_imm(emu);
4783 emu->x86.R_BL = fetch_byte_imm(emu);
4786 emu->x86.R_AH = fetch_byte_imm(emu);
4789 emu->x86.R_CH = fetch_byte_imm(emu);
4792 emu->x86.R_DH = fetch_byte_imm(emu);
4795 emu->x86.R_BH = fetch_byte_imm(emu);
4834 emu->x86.R_IP = pop_word(emu);
4837 common_load_far_pointer(emu, &emu->x86.R_ES);
4840 common_load_far_pointer(emu, &emu->x86.R_DS);
4974 emu->x86.mode |= SYSMODE_PREFIX_REPNE;
4977 emu->x86.mode |= SYSMODE_PREFIX_REPE;
5022 emu->x86.mode &= ~SYSMODE_CLRMASK;
5031 target += (int16_t) emu->x86.R_IP;
5033 emu->x86.R_IP = (uint16_t) target;
5112 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
5151 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
5167 shift = emu->x86.R_CL;
5188 shift = emu->x86.R_CL;
5202 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
5221 emu->x86.R_EAX = emu->cur_cycles & 0xffffffff;
5222 emu->x86.R_EDX = emu->cur_cycles >> 32;
5232 push_word(emu, emu->x86.R_FS);
5242 emu->x86.R_FS = pop_word(emu);
5264 hw_cpuid(&emu->x86.R_EAX, &emu->x86.R_EBX, &emu->x86.R_ECX,
5265 &emu->x86.R_EDX);
5267 switch (emu->x86.R_EAX) {
5269 emu->x86.R_EAX = 1;
5272 emu->x86.R_EBX = 0x756e6547;
5273 emu->x86.R_EDX = 0x49656e69;
5274 emu->x86.R_ECX = 0x6c65746e;
5279 emu->x86.R_EAX = 0x00000480;
5280 emu->x86.R_EBX = emu->x86.R_ECX = 0;
5281 emu->x86.R_EDX = 0x00000002;
5283 emu->x86.R_EDX &= 0x00000012;
5287 emu->x86.R_EAX = emu->x86.R_EBX = emu->x86.R_ECX =
5288 emu->x86.R_EDX = 0;
5330 push_word(emu, emu->x86.R_GS);
5340 emu->x86.R_GS = pop_word(emu);
5420 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
5433 common_load_far_pointer(emu, &emu->x86.R_SS);
5453 common_load_far_pointer(emu, &emu->x86.R_FS);
5463 common_load_far_pointer(emu, &emu->x86.R_GS);
5493 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
5578 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
5641 if (emu->x86.mode & SYSMODE_PREFIX_DATA)
5708 case 0x86:
7187 /* was (emu->x86.R_FLG&F_CF)==F_CF)), */
7937 int16_t res = (int16_t) ((int8_t) emu->x86.R_AL * (int8_t) s);
7939 emu->x86.R_AX = res;
7940 if (((emu->x86.R_AL & 0x80) == 0 && emu->x86.R_AH == 0x00) ||
7941 ((emu->x86.R_AL & 0x80) != 0 && emu->x86.R_AH == 0xFF)) {
7957 int32_t res = (int16_t) emu->x86.R_AX * (int16_t) s;
7959 emu->x86.R_AX = (uint16_t) res;
7960 emu->x86.R_DX = (uint16_t) (res >> 16);
7961 if (((emu->x86.R_AX & 0x8000) == 0 && emu->x86.R_DX == 0x00) ||
7962 ((emu->x86.R_AX & 0x8000) != 0 && emu->x86.R_DX == 0xFF)) {
7980 res = (int64_t)(int32_t)emu->x86.R_EAX * (int32_t)s;
7981 emu->x86.R_EAX = (uint32_t)res;
7982 emu->x86.R_EDX = ((uint64_t)res) >> 32;
7983 if (((emu->x86.R_EAX & 0x80000000) == 0 && emu->x86.R_EDX == 0x00) ||
7984 ((emu->x86.R_EAX & 0x80000000) != 0 && emu->x86.R_EDX == 0xFF)) {
8000 uint16_t res = (uint16_t) (emu->x86.R_AL * s);
8002 emu->x86.R_AX = res;
8003 if (emu->x86.R_AH == 0) {
8019 uint32_t res = emu->x86.R_AX * s;
8021 emu->x86.R_AX = (uint16_t) res;
8022 emu->x86.R_DX = (uint16_t) (res >> 16);
8023 if (emu->x86.R_DX == 0) {
8039 uint64_t res = (uint64_t) emu->x86.R_EAX * s;
8041 emu->x86.R_EAX = (uint32_t) res;
8042 emu->x86.R_EDX = (uint32_t) (res >> 32);
8044 if (emu->x86.R_EDX == 0) {
8062 dvd = (int16_t) emu->x86.R_AX;
8073 emu->x86.R_AL = (int8_t) div;
8074 emu->x86.R_AH = (int8_t) mod;
8086 dvd = (((int32_t) emu->x86.R_DX) << 16) | emu->x86.R_AX;
8102 emu->x86.R_AX = (uint16_t) div;
8103 emu->x86.R_DX = (uint16_t) mod;
8115 dvd = (((int64_t) emu->x86.R_EDX) << 32) | emu->x86.R_EAX;
8132 emu->x86.R_EAX = (uint32_t) div;
8133 emu->x86.R_EDX = (uint32_t) mod;
8145 dvd = emu->x86.R_AX;
8156 emu->x86.R_AL = (uint8_t) div;
8157 emu->x86.R_AH = (uint8_t) mod;
8169 dvd = (((uint32_t) emu->x86.R_DX) << 16) | emu->x86.R_AX;
8185 emu->x86.R_AX = (uint16_t) div;
8186 emu->x86.R_DX = (uint16_t) mod;
8198 dvd = (((uint64_t) emu->x86.R_EDX) << 32) | emu->x86.R_EAX;
8215 emu->x86.R_EAX = (uint32_t) div;
8216 emu->x86.R_EDX = (uint32_t) mod;
8231 if (emu->x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
8234 uint32_t count = ((emu->x86.mode & SYSMODE_PREFIX_DATA) ?
8235 emu->x86.R_ECX : emu->x86.R_CX);
8239 store_byte(emu, emu->x86.R_ES, emu->x86.R_DI,
8240 (*emu->emu_inb) (emu, emu->x86.R_DX));
8241 emu->x86.R_DI += inc;
8247 store_word(emu, emu->x86.R_ES, emu->x86.R_DI,
8248 (*emu->emu_inw) (emu, emu->x86.R_DX));
8249 emu->x86.R_DI += inc;
8254 store_long(emu, emu->x86.R_ES, emu->x86.R_DI,
8255 (*emu->emu_inl) (emu, emu->x86.R_DX));
8256 emu->x86.R_DI += inc;
8260 emu->x86.R_CX = 0;
8261 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
8262 emu->x86.R_ECX = 0;
8264 emu->x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
8268 store_byte(emu, emu->x86.R_ES, emu->x86.R_DI,
8269 (*emu->emu_inb) (emu, emu->x86.R_DX));
8272 store_word(emu, emu->x86.R_ES, emu->x86.R_DI,
8273 (*emu->emu_inw) (emu, emu->x86.R_DX));
8276 store_long(emu, emu->x86.R_ES, emu->x86.R_DI,
8277 (*emu->emu_inl) (emu, emu->x86.R_DX));
8280 emu->x86.R_DI += inc;
8296 if (emu->x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
8299 uint32_t count = ((emu->x86.mode & SYSMODE_PREFIX_DATA) ?
8300 emu->x86.R_ECX : emu->x86.R_CX);
8304 (*emu->emu_outb) (emu, emu->x86.R_DX,
8305 fetch_byte(emu, emu->x86.R_ES,
8306 emu->x86.R_SI));
8307 emu->x86.R_SI += inc;
8313 (*emu->emu_outw) (emu, emu->x86.R_DX,
8314 fetch_word(emu, emu->x86.R_ES,
8315 emu->x86.R_SI));
8316 emu->x86.R_SI += inc;
8321 (*emu->emu_outl) (emu, emu->x86.R_DX,
8322 fetch_long(emu, emu->x86.R_ES,
8323 emu->x86.R_SI));
8324 emu->x86.R_SI += inc;
8328 emu->x86.R_CX = 0;
8329 if (emu->x86.mode & SYSMODE_PREFIX_DATA) {
8330 emu->x86.R_ECX = 0;
8332 emu->x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
8336 (*emu->emu_outb) (emu, emu->x86.R_DX,
8337 fetch_byte(emu, emu->x86.R_ES, emu->x86.R_SI));
8340 (*emu->emu_outw) (emu, emu->x86.R_DX,
8341 fetch_word(emu, emu->x86.R_ES, emu->x86.R_SI));
8344 (*emu->emu_outl) (emu, emu->x86.R_DX,
8345 fetch_long(emu, emu->x86.R_ES, emu->x86.R_SI));
8348 emu->x86.R_SI += inc;
8361 emu->x86.R_SP -= 2;
8362 store_word(emu, emu->x86.R_SS, emu->x86.R_SP, w);
8374 emu->x86.R_SP -= 4;
8375 store_long(emu, emu->x86.R_SS, emu->x86.R_SP, w);
8389 res = fetch_word(emu, emu->x86.R_SS, emu->x86.R_SP);
8390 emu->x86.R_SP += 2;
8405 res = fetch_long(emu, emu->x86.R_SS, emu->x86.R_SP);
8406 emu->x86.R_SP += 4;