src/mess/machine/pc.c
| r15632 | r15633 | |
| 70 | 70 | } \ |
| 71 | 71 | } while (0) |
| 72 | 72 | |
| 73 | /* |
| 74 | * EC-1841 memory controller. The machine can hold four memory boards; |
| 75 | * each board has a control register, its address is set by a DIP switch |
| 76 | * on the board itself. |
| 77 | * |
| 78 | * Only one board should be enabled for read, and one for write. |
| 79 | * Normally, this is the same board. |
| 80 | * |
| 81 | * Each board is divided into 4 banks, internally numbererd 0..3. |
| 82 | * POST tests each board on startup, and an error (indicated by |
| 83 | * I/O CH CK bus signal) causes it to disable failing bank(s) by writing |
| 84 | * 'reconfiguration code' (inverted number of failing memory bank) to |
| 85 | * the register. |
| 86 | |
| 87 | * bit 1-0 'reconfiguration code' |
| 88 | * bit 2 enable read access |
| 89 | * bit 3 enable write access |
| 90 | */ |
| 91 | |
| 92 | READ8_MEMBER(pc_state::ec1841_memboard_r) |
| 93 | { |
| 94 | pc_state *st = space.machine().driver_data<pc_state>(); |
| 95 | return st->m_memboard[(offset % 4)]; |
| 96 | } |
| 97 | |
| 98 | WRITE8_MEMBER(pc_state::ec1841_memboard_w) |
| 99 | { |
| 100 | pc_state *st = space.machine().driver_data<pc_state>(); |
| 101 | address_space *program = space.machine().device("maincpu")->memory().space(AS_PROGRAM); |
| 102 | running_machine &machine = space.machine(); |
| 103 | UINT8 current; |
| 104 | |
| 105 | DBG_LOG(1,"ec1841_memboard_w",("(%d) <- %02X at %s\n", offset, data, machine.describe_context())); |
| 106 | |
| 107 | // for now, handle only board 0 |
| 108 | if (offset > 0) { |
| 109 | st->m_memboard[offset] = data; |
| 110 | return; |
| 111 | } |
| 112 | |
| 113 | current = st->m_memboard[offset]; |
| 114 | |
| 115 | if (BIT(current, 2) && !BIT(data, 2)) { |
| 116 | // disable read access |
| 117 | program->unmap_read(0, 0x7ffff); |
| 118 | DBG_LOG(1,"ec1841_memboard_w",("unmap_read(%d)\n", offset)); |
| 119 | } |
| 120 | |
| 121 | if (BIT(current, 3) && !BIT(data, 3)) { |
| 122 | // disable write access |
| 123 | program->unmap_write(0, 0x7ffff); |
| 124 | DBG_LOG(1,"ec1841_memboard_w",("unmap_write(%d)\n", offset)); |
| 125 | } |
| 126 | |
| 127 | if (!BIT(current, 2) && BIT(data, 2)) { |
| 128 | // enable read access |
| 129 | program->install_read_bank(0, 0x7ffff, "bank10"); |
| 130 | DBG_LOG(1,"ec1841_memboard_w",("map_read(%d)\n", offset)); |
| 131 | } |
| 132 | |
| 133 | if (!BIT(current, 3) && BIT(data, 3)) { |
| 134 | // enable write access |
| 135 | program->install_write_bank(0, 0x7ffff, "bank10"); |
| 136 | DBG_LOG(1,"ec1841_memboard_w",("map_write(%d)\n", offset)); |
| 137 | } |
| 138 | |
| 139 | st->m_memboard[offset] = data; |
| 140 | } |
| 141 | |
| 73 | 142 | /************************************************************************* |
| 74 | 143 | * |
| 75 | 144 | * PC DMA stuff |
| r15632 | r15633 | |
| 842 | 911 | |
| 843 | 912 | |
| 844 | 913 | static struct { |
| 914 | UINT8 pulsing; |
| 845 | 915 | UINT8 latch; /* keyboard scan code */ |
| 846 | 916 | UINT16 mask; /* input lines */ |
| 847 | 917 | emu_timer *keyb_signal_timer; |
| r15632 | r15633 | |
| 867 | 937 | key |= machine.root_device().ioport("Y10")->read(); |
| 868 | 938 | key |= machine.root_device().ioport("Y11")->read(); |
| 869 | 939 | key |= machine.root_device().ioport("Y12")->read(); |
| 870 | | DBG_LOG(1,"mc1502_k_s_c",("= %02X%s\n", key, key ? " will IRQ" : "")); |
| 940 | DBG_LOG(1,"mc1502_k_s_c",("= %02X (%d) %s\n", key, mc1502_keyb.pulsing, |
| 941 | (key || mc1502_keyb.pulsing) ? " will IRQ" : "")); |
| 871 | 942 | |
| 943 | /* |
| 944 | If a key is pressed and we're not pulsing yet, start pulsing the IRQ1; |
| 945 | keep pulsing while any key is pressed, and pulse one time after all keys |
| 946 | are released. |
| 947 | */ |
| 872 | 948 | if (key) { |
| 873 | | pic8259_ir1_w(st->m_pic8259, 1); |
| 949 | if (mc1502_keyb.pulsing < 2) { |
| 950 | mc1502_keyb.pulsing += 2; |
| 951 | } |
| 874 | 952 | } |
| 953 | |
| 954 | if (mc1502_keyb.pulsing) { |
| 955 | pic8259_ir1_w(st->m_pic8259, (mc1502_keyb.pulsing & 1)); |
| 956 | mc1502_keyb.pulsing--; |
| 957 | } |
| 875 | 958 | } |
| 876 | 959 | |
| 877 | 960 | static READ8_DEVICE_HANDLER ( mc1502_ppi_porta_r ) |
| 878 | 961 | { |
| 879 | 962 | running_machine &machine = device->machine(); |
| 963 | |
| 880 | 964 | DBG_LOG(1,"mc1502_ppi_porta_r",("= %02X\n", mc1502_keyb.latch)); |
| 881 | 965 | return mc1502_keyb.latch; |
| 882 | 966 | } |
| 883 | 967 | |
| 884 | 968 | static WRITE8_DEVICE_HANDLER ( mc1502_ppi_porta_w ) |
| 885 | 969 | { |
| 970 | pc_state *st = device->machine().driver_data<pc_state>(); |
| 886 | 971 | running_machine &machine = device->machine(); |
| 972 | |
| 887 | 973 | DBG_LOG(1,"mc1502_ppi_porta_w",("( %02X )\n", data)); |
| 888 | 974 | mc1502_keyb.latch = data; |
| 975 | if (mc1502_keyb.pulsing) |
| 976 | mc1502_keyb.pulsing--; |
| 977 | pic8259_ir1_w(st->m_pic8259, 0); |
| 889 | 978 | } |
| 890 | 979 | |
| 980 | static WRITE8_DEVICE_HANDLER ( mc1502_ppi_portb_w ) |
| 981 | { |
| 982 | pc_state *st = device->machine().driver_data<pc_state>(); |
| 983 | running_machine &machine = device->machine(); |
| 984 | |
| 985 | DBG_LOG(2,"mc1502_ppi_portb_w",("( %02X )\n", data)); |
| 986 | st->m_ppi_portb = data; |
| 987 | pit8253_gate2_w(device->machine().device("pit8253"), BIT(data, 0)); |
| 988 | pc_speaker_set_spkrdata( device->machine(), data & 0x02 ); |
| 989 | } |
| 990 | |
| 991 | static READ8_DEVICE_HANDLER ( mc1502_ppi_portc_r ) |
| 992 | { |
| 993 | running_machine &machine = device->machine(); |
| 994 | pc_state *st = device->machine().driver_data<pc_state>(); |
| 995 | int timer2_output = pit8253_get_output( device->machine().device("pit8253"), 2 ); |
| 996 | int data = 0xff; |
| 997 | double tap_val = (device->machine().device<cassette_image_device>(CASSETTE_TAG)->input()); |
| 998 | |
| 999 | // 0x80 -- serial RxD |
| 1000 | // 0x40 -- CASS IN, also loops back T2OUT (gated by CASWR) |
| 1001 | data = ( data & ~0x40 ) | ( tap_val < 0 ? 0x40 : 0x00 ) | ( (BIT(st->m_ppi_portb, 7) && timer2_output) ? 0x40 : 0x00 ); |
| 1002 | // 0x20 -- T2OUT |
| 1003 | data = ( data & ~0x20 ) | ( timer2_output ? 0x20 : 0x00 ); |
| 1004 | // 0x10 -- SNDOUT |
| 1005 | data = ( data & ~0x10 ) | ( (BIT(st->m_ppi_portb, 1) && timer2_output) ? 0x10 : 0x00 ); |
| 1006 | |
| 1007 | DBG_LOG(2,"mc1502_ppi_portc_r",("= %02X (tap_val %f t2out %d) at %s\n", |
| 1008 | data, tap_val, timer2_output, machine.describe_context())); |
| 1009 | return data; |
| 1010 | } |
| 1011 | |
| 891 | 1012 | static READ8_DEVICE_HANDLER ( mc1502_kppi_porta_r ) |
| 892 | 1013 | { |
| 893 | 1014 | running_machine &machine = device->machine(); |
| r15632 | r15633 | |
| 906 | 1027 | if (mc1502_keyb.mask & 0x0400) { key |= machine.root_device().ioport("Y11")->read(); } |
| 907 | 1028 | if (mc1502_keyb.mask & 0x0800) { key |= machine.root_device().ioport("Y12")->read(); } |
| 908 | 1029 | key ^= 0xff; |
| 909 | | DBG_LOG(1,"mc1502_kppi_porta_r",("= %02X\n", key)); |
| 1030 | DBG_LOG(2,"mc1502_kppi_porta_r",("= %02X\n", key)); |
| 910 | 1031 | return key; |
| 911 | 1032 | } |
| 912 | 1033 | |
| r15632 | r15633 | |
| 920 | 1041 | mc1502_keyb.mask |= 1 << 11; |
| 921 | 1042 | else |
| 922 | 1043 | mc1502_keyb.mask &= ~(1 << 11); |
| 923 | | DBG_LOG(1,"mc1502_kppi_portb_w",("( %02X -> %04X )\n", data, mc1502_keyb.mask)); |
| 1044 | DBG_LOG(2,"mc1502_kppi_portb_w",("( %02X -> %04X )\n", data, mc1502_keyb.mask)); |
| 924 | 1045 | } |
| 925 | 1046 | |
| 926 | 1047 | static WRITE8_DEVICE_HANDLER ( mc1502_kppi_portc_w ) |
| r15632 | r15633 | |
| 929 | 1050 | |
| 930 | 1051 | mc1502_keyb.mask &= ~(7 << 8); |
| 931 | 1052 | mc1502_keyb.mask |= ((data ^ 7) & 7) << 8; |
| 932 | | DBG_LOG(1,"mc1502_kppi_portc_w",("( %02X -> %04X )\n", data, mc1502_keyb.mask)); |
| 1053 | DBG_LOG(2,"mc1502_kppi_portc_w",("( %02X -> %04X )\n", data, mc1502_keyb.mask)); |
| 933 | 1054 | } |
| 934 | 1055 | |
| 935 | 1056 | |
| r15632 | r15633 | |
| 1024 | 1145 | DEVCB_HANDLER(mc1502_ppi_porta_r), |
| 1025 | 1146 | DEVCB_HANDLER(mc1502_ppi_porta_w), |
| 1026 | 1147 | DEVCB_NULL, |
| 1027 | | DEVCB_HANDLER(pcjr_ppi_portb_w), // hack |
| 1028 | | DEVCB_NULL, |
| 1148 | DEVCB_HANDLER(mc1502_ppi_portb_w), |
| 1149 | DEVCB_HANDLER(mc1502_ppi_portc_r), |
| 1029 | 1150 | DEVCB_NULL |
| 1030 | 1151 | }; |
| 1031 | 1152 | |
| r15632 | r15633 | |
| 1257 | 1378 | DRIVER_INIT( mc1502 ) |
| 1258 | 1379 | { |
| 1259 | 1380 | mess_init_pc_common(machine, 0, NULL, pc_set_irq_line); |
| 1260 | | memset(&mc1502_keyb, 0, sizeof(mc1502_keyb)); |
| 1261 | 1381 | } |
| 1262 | 1382 | |
| 1263 | 1383 | static READ8_HANDLER( input_port_0_r ) { return space->machine().root_device().ioport("IN0")->read(); } |
| r15632 | r15633 | |
| 1335 | 1455 | st->m_dma8237 = NULL; |
| 1336 | 1456 | st->m_pit8253 = machine.device("pit8253"); |
| 1337 | 1457 | |
| 1458 | /* |
| 1459 | Keyboard polling circuit holds IRQ1 high until a key is |
| 1460 | pressed, then it starts a timer that pulses IRQ1 low each |
| 1461 | 40ms (check) for 20ms (check) until all keys are released. |
| 1462 | Last pulse causes BIOS to write a 'break' scancode into port 60h. |
| 1463 | */ |
| 1464 | pic8259_ir1_w(st->m_pic8259, 1); |
| 1465 | memset(&mc1502_keyb, 0, sizeof(mc1502_keyb)); |
| 1338 | 1466 | mc1502_keyb.keyb_signal_timer = machine.scheduler().timer_alloc(FUNC(mc1502_keyb_signal_callback)); |
| 1339 | | mc1502_keyb.keyb_signal_timer->adjust( attotime::from_msec(40), 0, attotime::from_msec(40) ); |
| 1467 | mc1502_keyb.keyb_signal_timer->adjust( attotime::from_msec(20), 0, attotime::from_msec(20) ); |
| 1340 | 1468 | } |
| 1341 | 1469 | |
| 1342 | 1470 | |
| r15632 | r15633 | |
| 1364 | 1492 | st->m_pc_spkrdata = 0; |
| 1365 | 1493 | st->m_pc_input = 0; |
| 1366 | 1494 | st->m_dma_channel = 0; |
| 1495 | memset(st->m_memboard,0xc,sizeof(st->m_memboard)); // check |
| 1367 | 1496 | memset(st->m_dma_offset,0,sizeof(st->m_dma_offset)); |
| 1368 | 1497 | st->m_ppi_portc_switch_high = 0; |
| 1369 | 1498 | st->m_ppi_speaker = 0; |
| r15632 | r15633 | |
| 1466 | 1595 | pc_keyboard(); |
| 1467 | 1596 | } |
| 1468 | 1597 | |
| 1469 | | |
| 1470 | 1598 | /* |
| 1471 | 1599 | ibm xt bios |
| 1472 | 1600 | ----------- |
src/mess/drivers/pc.c
| r15632 | r15633 | |
| 123 | 123 | AM_RANGE(0xf0000, 0xfffff) AM_ROM |
| 124 | 124 | ADDRESS_MAP_END |
| 125 | 125 | |
| 126 | static ADDRESS_MAP_START( iskr1031_map, AS_PROGRAM, 16, pc_state ) |
| 127 | ADDRESS_MAP_UNMAP_HIGH |
| 128 | AM_RANGE(0x00000, 0x7ffff) AM_RAMBANK("bank10") |
| 129 | AM_RANGE(0xa0000, 0xbffff) AM_NOP |
| 130 | AM_RANGE(0xc0000, 0xc7fff) AM_ROM |
| 131 | AM_RANGE(0xc8000, 0xcffff) AM_ROM |
| 132 | AM_RANGE(0xd0000, 0xeffff) AM_NOP |
| 133 | AM_RANGE(0xf0000, 0xfffff) AM_ROM |
| 134 | ADDRESS_MAP_END |
| 135 | |
| 136 | static ADDRESS_MAP_START( ec1841_map, AS_PROGRAM, 16, pc_state ) |
| 137 | ADDRESS_MAP_UNMAP_HIGH |
| 138 | AM_RANGE(0x00000, 0x7ffff) AM_RAMBANK("bank10") // up to 4 banks |
| 139 | AM_RANGE(0xa0000, 0xbffff) AM_NOP |
| 140 | AM_RANGE(0xc0000, 0xc7fff) AM_ROM |
| 141 | AM_RANGE(0xc8000, 0xcffff) AM_ROM |
| 142 | AM_RANGE(0xdc000, 0xdffff) AM_RAM // monochrome chargen |
| 143 | AM_RANGE(0xf0000, 0xfffff) AM_ROM |
| 144 | ADDRESS_MAP_END |
| 145 | |
| 126 | 146 | static ADDRESS_MAP_START( mc1502_map, AS_PROGRAM, 8, pc_state ) |
| 127 | 147 | ADDRESS_MAP_UNMAP_HIGH |
| 128 | 148 | AM_RANGE(0x00000, 0x97fff) AM_RAMBANK("bank10") /* 96K on mainboard + 512K on extension card */ |
| r15632 | r15633 | |
| 205 | 225 | AM_RANGE(0x0200, 0x0207) AM_READWRITE8_LEGACY(pc_JOY_r, pc_JOY_w, 0xffff) |
| 206 | 226 | AM_RANGE(0x0240, 0x0257) AM_READWRITE8(pc_rtc_r, pc_rtc_w, 0xffff) |
| 207 | 227 | AM_RANGE(0x0278, 0x027b) AM_DEVREADWRITE8_LEGACY("lpt_2", pc_lpt_r, pc_lpt_w, 0xffff) |
| 208 | | AM_RANGE(0x02b0, 0x02bf) AM_RAM // needed for EC-18xx |
| 209 | 228 | AM_RANGE(0x02e8, 0x02ef) AM_DEVREADWRITE8("ins8250_3", ins8250_device, ins8250_r, ins8250_w, 0xffff) |
| 210 | 229 | AM_RANGE(0x02f8, 0x02ff) AM_DEVREADWRITE8("ins8250_1", ins8250_device, ins8250_r, ins8250_w, 0xffff) |
| 211 | 230 | AM_RANGE(0x0340, 0x0357) AM_NOP /* anonymous bios should not recogniced realtimeclock */ |
| r15632 | r15633 | |
| 217 | 236 | ADDRESS_MAP_END |
| 218 | 237 | |
| 219 | 238 | |
| 239 | static ADDRESS_MAP_START(ec1841_io, AS_IO, 16, pc_state) |
| 240 | ADDRESS_MAP_UNMAP_HIGH |
| 241 | AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8_LEGACY("dma8237", i8237_r, i8237_w, 0xffff) |
| 242 | AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE8_LEGACY("pic8259", pic8259_r, pic8259_w, 0xffff) |
| 243 | AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE8_LEGACY("pit8253", pit8253_r, pit8253_w, 0xffff) |
| 244 | AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE8("ppi8255", i8255_device, read, write, 0xffff) |
| 245 | AM_RANGE(0x0080, 0x0087) AM_READWRITE8(pc_page_r, pc_page_w, 0xffff) |
| 246 | AM_RANGE(0x00a0, 0x00a1) AM_WRITE8( pc_nmi_enable_w, 0x00ff ) |
| 247 | AM_RANGE(0x0210, 0x0217) AM_NOP // expansion chassis interface |
| 248 | // AM_RANGE(0x0230, 0x021f) // mouse |
| 249 | AM_RANGE(0x0240, 0x0257) AM_READWRITE8(pc_rtc_r, pc_rtc_w, 0xffff) |
| 250 | AM_RANGE(0x02b0, 0x02b3) AM_READWRITE8(ec1841_memboard_r, ec1841_memboard_w, 0xffff); |
| 251 | // AM_RANGE(0x02f8, 0x02f8) AM_DEVREADWRITE8_LEGACY("upd8251_1", i8251_device, data_r, data_w, 0x00ff) |
| 252 | // AM_RANGE(0x02f9, 0x02f9) AM_DEVREADWRITE8_LEGACY("upd8251_1", i8251_device, status_r, control_w, 0xff00) |
| 253 | AM_RANGE(0x0378, 0x037f) AM_DEVREADWRITE8_LEGACY("lpt_0", pc_lpt_r, pc_lpt_w, 0xffff) |
| 254 | AM_RANGE(0x03f0, 0x03f7) AM_READWRITE8_LEGACY(pc_fdc_r, pc_fdc_w, 0xffff) |
| 255 | // AM_RANGE(0x03f8, 0x03f9) AM_DEVREADWRITE8_LEGACY("upd8251_0", i8251_device, data_r, data_w, 0x00ff) |
| 256 | // AM_RANGE(0x03f8, 0x03f9) AM_DEVREADWRITE8_LEGACY("upd8251_0", i8251_device, status_r, control_w, 0xff00) |
| 257 | ADDRESS_MAP_END |
| 258 | |
| 259 | |
| 260 | static ADDRESS_MAP_START(iskr1031_io, AS_IO, 16, pc_state) |
| 261 | ADDRESS_MAP_UNMAP_HIGH |
| 262 | AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8_LEGACY("dma8237", i8237_r, i8237_w, 0xffff) |
| 263 | AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE8_LEGACY("pic8259", pic8259_r, pic8259_w, 0xffff) |
| 264 | AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE8_LEGACY("pit8253", pit8253_r, pit8253_w, 0xffff) |
| 265 | AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE8("ppi8255", i8255_device, read, write, 0xffff) |
| 266 | AM_RANGE(0x0080, 0x0087) AM_READWRITE8(pc_page_r, pc_page_w, 0xffff) |
| 267 | AM_RANGE(0x00a0, 0x00a1) AM_WRITE8( pc_nmi_enable_w, 0x00ff ) |
| 268 | // AM_RANGE(0x0200, 0x0207) AM_READWRITE8_LEGACY(pc_JOY_r, pc_JOY_w, 0xffff) |
| 269 | AM_RANGE(0x0240, 0x0257) AM_READWRITE8(pc_rtc_r, pc_rtc_w, 0xffff) |
| 270 | // AM_RANGE(0x02e8, 0x02ef) AM_DEVREADWRITE8("ins8250_3", ins8250_device, ins8250_r, ins8250_w, 0xffff) |
| 271 | AM_RANGE(0x02f8, 0x02ff) AM_DEVREADWRITE8("ins8250_1", ins8250_device, ins8250_r, ins8250_w, 0xffff) |
| 272 | AM_RANGE(0x0340, 0x0357) AM_NOP /* anonymous bios should not recogniced realtimeclock */ |
| 273 | AM_RANGE(0x0378, 0x037f) AM_DEVREADWRITE8_LEGACY("lpt_0", pc_lpt_r, pc_lpt_w, 0xffff) |
| 274 | // AM_RANGE(0x03e8, 0x03ef) AM_DEVREADWRITE8("ins8250_2", ins8250_device, ins8250_r, ins8250_w, 0xffff) |
| 275 | AM_RANGE(0x03f0, 0x03f7) AM_READWRITE8_LEGACY(pc_fdc_r, pc_fdc_w, 0xffff) |
| 276 | AM_RANGE(0x03f8, 0x03ff) AM_DEVREADWRITE8("ins8250_0", ins8250_device, ins8250_r, ins8250_w, 0xffff) |
| 277 | ADDRESS_MAP_END |
| 278 | |
| 279 | |
| 220 | 280 | static ADDRESS_MAP_START( ibm5550_map, AS_PROGRAM, 16, pc_state ) |
| 221 | 281 | ADDRESS_MAP_UNMAP_HIGH |
| 222 | 282 | AM_RANGE(0x00000, 0x9ffff) AM_RAMBANK("bank10") |
| r15632 | r15633 | |
| 235 | 295 | AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE8_LEGACY("pic8259", pic8259_r, pic8259_w, 0xffff) |
| 236 | 296 | AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE8_LEGACY("pit8253", pit8253_r, pit8253_w, 0xffff) |
| 237 | 297 | AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE8("ppi8255", i8255_device, read, write, 0xffff) |
| 238 | | AM_RANGE(0x0070, 0x007f) AM_RAM // needed for Poisk-2 |
| 239 | 298 | AM_RANGE(0x0080, 0x0087) AM_READWRITE8(pc_page_r, pc_page_w, 0xffff) |
| 240 | 299 | AM_RANGE(0x00a0, 0x00a1) AM_READWRITE8(unk_r, pc_nmi_enable_w, 0x00ff ) |
| 241 | 300 | AM_RANGE(0x0200, 0x0207) AM_READWRITE8_LEGACY(pc_JOY_r, pc_JOY_w, 0xffff) |
| 242 | 301 | AM_RANGE(0x0240, 0x0257) AM_READWRITE8(pc_rtc_r, pc_rtc_w, 0xffff) |
| 243 | 302 | AM_RANGE(0x0278, 0x027b) AM_DEVREADWRITE8_LEGACY("lpt_2", pc_lpt_r, pc_lpt_w, 0xffff) |
| 244 | | AM_RANGE(0x02b0, 0x02bf) AM_RAM // needed for EC-18xx |
| 245 | 303 | AM_RANGE(0x02e8, 0x02ef) AM_DEVREADWRITE8("ins8250_3", ins8250_device, ins8250_r, ins8250_w, 0xffff) |
| 246 | 304 | AM_RANGE(0x02f8, 0x02ff) AM_DEVREADWRITE8("ins8250_1", ins8250_device, ins8250_r, ins8250_w, 0xffff) |
| 247 | 305 | AM_RANGE(0x0340, 0x0357) AM_NOP /* anonymous bios should not recogniced realtimeclock */ |
| r15632 | r15633 | |
| 1167 | 1225 | NULL |
| 1168 | 1226 | }; |
| 1169 | 1227 | |
| 1228 | static const cassette_interface mc1502_cassette_interface = |
| 1229 | { |
| 1230 | cassette_default_formats, |
| 1231 | NULL, |
| 1232 | (cassette_state)(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED), |
| 1233 | NULL, |
| 1234 | NULL |
| 1235 | }; |
| 1236 | |
| 1170 | 1237 | static MACHINE_CONFIG_START( ibmpcjr, pc_state ) |
| 1171 | 1238 | /* basic machine hardware */ |
| 1172 | 1239 | MCFG_CPU_PC(ibmpcjr, ibmpcjr, I8088, 4900000, pcjr_frame_interrupt) /* TODO: Get correct cpu frequency, probably XTAL_14_31818MHz/3 */ |
| r15632 | r15633 | |
| 1248 | 1315 | |
| 1249 | 1316 | static MACHINE_CONFIG_START( mc1502, pc_state ) |
| 1250 | 1317 | /* basic machine hardware */ |
| 1251 | | MCFG_CPU_PC(mc1502, mc1502, I8088, XTAL_16MHz/3, pcjr_frame_interrupt) |
| 1318 | // MCFG_CPU_PC(mc1502, mc1502, I8088, XTAL_16MHz/3, pcjr_frame_interrupt) /* check frame_interrupt */ |
| 1319 | MCFG_CPU_ADD("maincpu", I8088, XTAL_16MHz/3) |
| 1320 | MCFG_CPU_PROGRAM_MAP(mc1502_map) |
| 1321 | MCFG_CPU_IO_MAP(mc1502_io) |
| 1322 | MCFG_CPU_CONFIG(i86_address_mask) |
| 1252 | 1323 | |
| 1253 | 1324 | MCFG_MACHINE_START(mc1502) |
| 1254 | 1325 | MCFG_MACHINE_RESET(pc) |
| r15632 | r15633 | |
| 1275 | 1346 | // MCFG_PC_LPT_ADD("lpt_0", pc_lpt_config) /* TODO: non-standard */ |
| 1276 | 1347 | |
| 1277 | 1348 | /* cassette */ |
| 1278 | | MCFG_CASSETTE_ADD( CASSETTE_TAG, ibm5150_cassette_interface ) /* TODO: verify */ |
| 1349 | MCFG_CASSETTE_ADD( CASSETTE_TAG, mc1502_cassette_interface ) // has no motor control |
| 1279 | 1350 | |
| 1280 | 1351 | MCFG_FD1793_ADD( "vg93", default_wd17xx_interface_2_drives ) |
| 1281 | 1352 | MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(ibmpc_floppy_interface) |
| r15632 | r15633 | |
| 1286 | 1357 | MACHINE_CONFIG_END |
| 1287 | 1358 | |
| 1288 | 1359 | |
| 1360 | static MACHINE_CONFIG_START( ec1841, pc_state ) |
| 1361 | /* basic machine hardware */ |
| 1362 | MCFG_CPU_PC(ec1841, ec1841, I8086, 4096000, pc_frame_interrupt) // correct but slow |
| 1363 | // MCFG_CPU_PC(ec1841, ec1841, I8086, 4772720, pc_frame_interrupt) |
| 1289 | 1364 | |
| 1365 | MCFG_QUANTUM_TIME(attotime::from_hz(60)) |
| 1366 | |
| 1367 | MCFG_MACHINE_START(pc) |
| 1368 | MCFG_MACHINE_RESET(pc) |
| 1369 | |
| 1370 | MCFG_PIT8253_ADD( "pit8253", ibm5150_pit8253_config ) |
| 1371 | |
| 1372 | // maybe XTAL_12_288MHz |
| 1373 | MCFG_I8237_ADD( "dma8237", XTAL_14_31818MHz/3, ibm5150_dma8237_config ) |
| 1374 | |
| 1375 | MCFG_PIC8259_ADD( "pic8259", ibm5150_pic8259_config ) |
| 1376 | |
| 1377 | MCFG_I8255_ADD( "ppi8255", ibm5160_ppi8255_interface ) |
| 1378 | |
| 1379 | // MCFG_I8251_ADD( "upd8251_0", default_i8251_interface ) // modeled after BSC adapter? |
| 1380 | // MCFG_I8251_ADD( "upd8251_1", default_i8251_interface ) |
| 1381 | |
| 1382 | /* video hardware -- supports font uploads */ |
| 1383 | MCFG_FRAGMENT_ADD( pcvideo_cga ) |
| 1384 | MCFG_GFXDECODE(ibm5150) |
| 1385 | |
| 1386 | /* sound hardware */ |
| 1387 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 1388 | MCFG_SOUND_ADD(SPEAKER_TAG, SPEAKER_SOUND, 0) |
| 1389 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80) |
| 1390 | |
| 1391 | /* printer */ |
| 1392 | MCFG_PC_LPT_ADD("lpt_0", pc_lpt_config) |
| 1393 | |
| 1394 | MCFG_UPD765A_ADD("upd765", pc_fdc_upd765_not_connected_interface) |
| 1395 | |
| 1396 | MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(ibmpc_floppy_interface) |
| 1397 | |
| 1398 | /* keyboard -- needs dump */ |
| 1399 | MCFG_PC_KBDC_ADD("pc_kbdc", pc_kbdc_intf) |
| 1400 | MCFG_PC_KBDC_SLOT_ADD("pc_kbdc", "kbd", pc_xt_keyboards, STR_KBD_KEYTRONIC_PC3270, NULL) |
| 1401 | |
| 1402 | /* internal ram -- up to 4 banks of 512K */ |
| 1403 | MCFG_RAM_ADD(RAM_TAG) |
| 1404 | MCFG_RAM_DEFAULT_SIZE("512K") |
| 1405 | // MCFG_RAM_EXTRA_OPTIONS("640K,1024K,1576K,2048K") |
| 1406 | MACHINE_CONFIG_END |
| 1407 | |
| 1408 | |
| 1290 | 1409 | static MACHINE_CONFIG_START( iskr1031, pc_state ) |
| 1291 | 1410 | /* basic machine hardware */ |
| 1292 | | MCFG_CPU_PC(pc16, pc16, I8086, 4772720, pc_frame_interrupt) |
| 1411 | MCFG_CPU_PC(iskr1031, iskr1031, I8086, 4772720, pc_frame_interrupt) |
| 1293 | 1412 | |
| 1294 | 1413 | MCFG_QUANTUM_TIME(attotime::from_hz(60)) |
| 1295 | 1414 | |
| r15632 | r15633 | |
| 2023 | 2142 | |
| 2024 | 2143 | ROM_START( mc1502 ) |
| 2025 | 2144 | ROM_REGION16_LE(0x100000,"maincpu", 0) |
| 2145 | ROM_DEFAULT_BIOS("v52") |
| 2026 | 2146 | ROM_LOAD( "basic.rom", 0xe8000, 0x8000, CRC(173d69fa) SHA1(003f872e12f00800e22ab6bbc009d36bfde67b9d)) |
| 2027 | 2147 | ROM_SYSTEM_BIOS(0, "v50", "v5.0") |
| 2028 | 2148 | ROMX_LOAD( "monitor_5_0.rom", 0xfc000, 0x4000, CRC(9e97c6a0) SHA1(16a304e8de69ec4d8b92acda6bf28454c361a24f),ROM_BIOS(1)) |
| r15632 | r15633 | |
| 2131 | 2251 | COMP( 1989, iskr1030m, ibm5150, 0, iskr1031, pccga, pccga, "Schetmash", "Iskra 1030M", GAME_NOT_WORKING) |
| 2132 | 2252 | COMP( 1992, iskr3104, ibm5150, 0, iskr3104, pcega, pccga, "Schetmash", "Iskra 3104", GAME_NOT_WORKING) |
| 2133 | 2253 | COMP( 1987, ec1840, ibm5150, 0, iskr1031, pccga, pccga, "<unknown>", "EC-1840", GAME_NOT_WORKING) |
| 2134 | | COMP( 1987, ec1841, ibm5150, 0, iskr1031, pccga, pccga, "<unknown>", "EC-1841", GAME_NOT_WORKING) |
| 2254 | COMP( 1987, ec1841, ibm5150, 0, ec1841, pccga, pccga, "<unknown>", "EC-1841", GAME_NOT_WORKING) |
| 2135 | 2255 | COMP( 1989, ec1845, ibm5150, 0, iskr1031, pccga, pccga, "<unknown>", "EC-1845", GAME_NOT_WORKING) |
| 2136 | 2256 | COMP( 1989, mk88, ibm5150, 0, iskr1031, pccga, pccga, "<unknown>", "MK-88", GAME_NOT_WORKING) |
| 2137 | 2257 | COMP( 1990, poisk1, ibm5150, 0, iskr1031, pccga, pccga, "<unknown>", "Poisk-1", GAME_NOT_WORKING) |