trunk/src/emu/cpu/i86/i286.c
| r26208 | r26209 | |
| 1057 | 1057 | { |
| 1058 | 1058 | case 0: |
| 1059 | 1059 | if(!PM) |
| 1060 | | throw TRAP(FAULT_UD, -1); |
| 1060 | throw TRAP(FAULT_UD, (UINT16)-1); |
| 1061 | 1061 | m_modrm = fetch(); |
| 1062 | 1062 | switch (m_modrm & 0x38) |
| 1063 | 1063 | { |
| r26208 | r26209 | |
| 1150 | 1150 | break; |
| 1151 | 1151 | |
| 1152 | 1152 | default: |
| 1153 | | throw TRAP(FAULT_UD, -1); |
| 1153 | throw TRAP(FAULT_UD, (UINT16)-1); |
| 1154 | 1154 | } |
| 1155 | 1155 | break; |
| 1156 | 1156 | case 1: |
| r26208 | r26209 | |
| 1158 | 1158 | UINT32 ea; |
| 1159 | 1159 | m_modrm = fetch(); |
| 1160 | 1160 | if((m_modrm >= 0xc0) && (m_modrm < 0xe0)) |
| 1161 | | throw TRAP(FAULT_UD, -1); |
| 1161 | throw TRAP(FAULT_UD, (UINT16)-1); |
| 1162 | 1162 | switch (m_modrm & 0x38) |
| 1163 | 1163 | { |
| 1164 | 1164 | case 0: /* sgdt */ |
| r26208 | r26209 | |
| 1197 | 1197 | m_msw = (m_msw & 1) | msw; |
| 1198 | 1198 | break; |
| 1199 | 1199 | default: |
| 1200 | | throw TRAP(FAULT_UD, -1); |
| 1200 | throw TRAP(FAULT_UD, (UINT16)-1); |
| 1201 | 1201 | } |
| 1202 | 1202 | break; |
| 1203 | 1203 | } |
| 1204 | 1204 | case 2: /* LAR */ |
| 1205 | 1205 | if(!PM) |
| 1206 | | throw TRAP(FAULT_UD, -1); |
| 1206 | throw TRAP(FAULT_UD, (UINT16)-1); |
| 1207 | 1207 | m_modrm = fetch_op(); |
| 1208 | 1208 | tmp = GetRMWord(); |
| 1209 | 1209 | if((addr = selector_address(tmp)) == -1) |
| r26208 | r26209 | |
| 1226 | 1226 | break; |
| 1227 | 1227 | case 3: /* LSL */ |
| 1228 | 1228 | if(!PM) |
| 1229 | | throw TRAP(FAULT_UD, -1); |
| 1229 | throw TRAP(FAULT_UD, (UINT16)-1); |
| 1230 | 1230 | m_modrm = fetch_op(); |
| 1231 | 1231 | tmp = GetRMWord(); |
| 1232 | 1232 | if((addr = selector_address(tmp)) == -1) |
| r26208 | r26209 | |
| 1291 | 1291 | m_msw &= ~8; |
| 1292 | 1292 | break; |
| 1293 | 1293 | default: |
| 1294 | | throw TRAP(FAULT_UD, -1); |
| 1294 | throw TRAP(FAULT_UD, (UINT16)-1); |
| 1295 | 1295 | } |
| 1296 | 1296 | break; |
| 1297 | 1297 | } |
| r26208 | r26209 | |
| 1358 | 1358 | case 0x63: // arpl |
| 1359 | 1359 | { |
| 1360 | 1360 | UINT16 tmp, source; |
| 1361 | | if (!PM) throw TRAP(FAULT_UD,-1); |
| 1361 | if (!PM) throw TRAP(FAULT_UD,(UINT16)-1); |
| 1362 | 1362 | |
| 1363 | 1363 | m_modrm=fetch_op(); |
| 1364 | 1364 | tmp=GetRMWord(); |
| r26208 | r26209 | |
| 1442 | 1442 | break; |
| 1443 | 1443 | default: |
| 1444 | 1444 | logerror("%s: %06x: Mov Sreg - Invalid register\n", tag(), pc()); |
| 1445 | | throw TRAP(FAULT_UD, -1); |
| 1445 | throw TRAP(FAULT_UD, (UINT16)-1); |
| 1446 | 1446 | } |
| 1447 | 1447 | break; |
| 1448 | 1448 | |
| r26208 | r26209 | |
| 1471 | 1471 | |
| 1472 | 1472 | case 0x9b: // i_wait |
| 1473 | 1473 | if((m_msw & 0x0a) == 0x0a) |
| 1474 | | throw TRAP(FAULT_NM, -1); |
| 1474 | throw TRAP(FAULT_NM, (UINT16)-1); |
| 1475 | 1475 | CLK(WAIT); |
| 1476 | 1476 | break; |
| 1477 | 1477 | |
| r26208 | r26209 | |
| 1550 | 1550 | { |
| 1551 | 1551 | m_modrm = fetch(); |
| 1552 | 1552 | if(m_modrm >= 0xc0) |
| 1553 | | throw TRAP(FAULT_UD, -1); |
| 1553 | throw TRAP(FAULT_UD, (UINT16)-1); |
| 1554 | 1554 | UINT16 tmp = GetRMWord(); |
| 1555 | 1555 | data_descriptor(ES, GetnextRMWord()); |
| 1556 | 1556 | RegWord(tmp); |
| r26208 | r26209 | |
| 1562 | 1562 | { |
| 1563 | 1563 | m_modrm = fetch(); |
| 1564 | 1564 | if(m_modrm >= 0xc0) |
| 1565 | | throw TRAP(FAULT_UD, -1); |
| 1565 | throw TRAP(FAULT_UD, (UINT16)-1); |
| 1566 | 1566 | UINT16 tmp = GetRMWord(); |
| 1567 | 1567 | data_descriptor(DS, GetnextRMWord()); |
| 1568 | 1568 | RegWord(tmp); |
| r26208 | r26209 | |
| 1684 | 1684 | case 0xde: |
| 1685 | 1685 | case 0xdf: |
| 1686 | 1686 | if((m_msw & 8) || (m_msw & 4)) |
| 1687 | | throw TRAP(FAULT_NM, -1); |
| 1687 | throw TRAP(FAULT_NM, (UINT16)-1); |
| 1688 | 1688 | m_modrm = fetch(); |
| 1689 | 1689 | GetRMByte(); |
| 1690 | 1690 | CLK(NOP); |
| r26208 | r26209 | |
| 1782 | 1782 | break; |
| 1783 | 1783 | default: |
| 1784 | 1784 | logerror("%s: %06x: FF Pre with unimplemented mod\n", tag(), pc()); |
| 1785 | | throw TRAP(FAULT_UD,-1); |
| 1785 | throw TRAP(FAULT_UD,(UINT16)-1); |
| 1786 | 1786 | } |
| 1787 | 1787 | } |
| 1788 | 1788 | break; |
| r26208 | r26209 | |
| 1819 | 1819 | m_icount -= 10; // UD fault timing? |
| 1820 | 1820 | logerror("%s: %06x: Invalid Opcode %02x\n", tag(), pc(), op); |
| 1821 | 1821 | m_ip = m_prev_ip; |
| 1822 | | throw TRAP(FAULT_UD, -1); |
| 1822 | throw TRAP(FAULT_UD, (UINT16)-1); |
| 1823 | 1823 | } |
| 1824 | 1824 | break; |
| 1825 | 1825 | } |
trunk/src/emu/cpu/i86/i286.h
| r26208 | r26209 | |
| 80 | 80 | virtual void execute_set_input(int inputnum, int state); |
| 81 | 81 | bool memory_translate(address_spacenum spacenum, int intention, offs_t &address); |
| 82 | 82 | |
| 83 | | virtual void interrupt(int int_num, int trap = 1) { if(trap) throw TRAP(int_num, -1); else interrupt_descriptor(int_num, 0, 0); } |
| 83 | virtual void interrupt(int int_num, int trap = 1) { if(trap) throw TRAP(int_num, (UINT16)-1); else interrupt_descriptor(int_num, 0, 0); } |
| 84 | 84 | virtual UINT8 read_port_byte(UINT16 port); |
| 85 | 85 | virtual UINT16 read_port_word(UINT16 port); |
| 86 | 86 | virtual void write_port_byte(UINT16 port, UINT8 data); |