src/mess/machine/cs4031.c
| r0 | r10784 | |
| 1 | /*************************************************************************** |
| 2 | |
| 3 | Chips & Technologies CS4031 chipset |
| 4 | |
| 5 | Chipset for 486 based PC/AT compatible systems. Consists of two |
| 6 | individual chips: |
| 7 | |
| 8 | * F84031 |
| 9 | - DRAM controller |
| 10 | - ISA-bus controller |
| 11 | - VESA VL-BUS controller |
| 12 | |
| 13 | * F84035 |
| 14 | - 2x 8257 DMA controller |
| 15 | - 2x 8259 interrupt controller |
| 16 | - 8254 timer |
| 17 | - MC14818 RTC |
| 18 | |
| 19 | ***************************************************************************/ |
| 20 | |
| 21 | #include "emu.h" |
| 22 | #include "machine/ram.h" |
| 23 | #include "machine/cs4031.h" |
| 24 | |
| 25 | |
| 26 | //************************************************************************** |
| 27 | // GLOBAL VARIABLES |
| 28 | //************************************************************************** |
| 29 | |
| 30 | #define LOG_REGISTER 1 |
| 31 | #define LOG_MEMORY 1 |
| 32 | |
| 33 | const device_type CS4031 = cs4031_device_config::static_alloc_device_config; |
| 34 | |
| 35 | enum |
| 36 | { |
| 37 | DMA_WAIT_STATE = 0x01, |
| 38 | PERFORMANCE = 0x08, |
| 39 | F84035_MISC = 0x09, |
| 40 | DMA_CLOCK = 0x0a, |
| 41 | SHADOW_READ = 0x19, |
| 42 | SHADOW_WRITE = 0x1a, |
| 43 | ROMCS = 0x1b |
| 44 | }; |
| 45 | |
| 46 | static const char *const register_names[] = |
| 47 | { |
| 48 | /* 00 */ "RESERVED", |
| 49 | /* 01 */ "DMA WAIT STATE CONTROL", |
| 50 | /* 02 */ "RESERVED", |
| 51 | /* 03 */ "RESERVED", |
| 52 | /* 04 */ "RESERVED", |
| 53 | /* 05 */ "ISA BUS COMMAND DELAY", |
| 54 | /* 06 */ "ISA BUS WAIT STATES AND ADDRESS HOLD", |
| 55 | /* 07 */ "ISA BUS CLOCK SELECTION", |
| 56 | /* 08 */ "PERFORMANCE CONTROL", |
| 57 | /* 09 */ "84035 MISC CONTROL", |
| 58 | /* 0a */ "DMA CLOCK SELECTION", |
| 59 | /* 0b */ "RESERVED", |
| 60 | /* 0c */ "RESERVED", |
| 61 | /* 0d */ "RESERVED", |
| 62 | /* 0e */ "RESERVED", |
| 63 | /* 0f */ "RESERVED", |
| 64 | /* 10 */ "DRAM TIMING", |
| 65 | /* 11 */ "DRAM SETUP", |
| 66 | /* 12 */ "DRAM CONFIGURATION 0 AND 1", |
| 67 | /* 13 */ "DRAM CONFIGURATION 2 AND 3", |
| 68 | /* 14 */ "DRAM BLOCK 0 STARTING ADDRESS", |
| 69 | /* 15 */ "DRAM BLOCK 1 STARTING ADDRESS", |
| 70 | /* 16 */ "DRAM BLOCK 2 STARTING ADDRESS", |
| 71 | /* 17 */ "DRAM BLOCK 3 STARTING ADDRESS", |
| 72 | /* 18 */ "VIDEO AREA SHADOW AND LOCAL BUS CONTROL", |
| 73 | /* 19 */ "DRAM SHADOW READ ENABLE", |
| 74 | /* 1a */ "DRAM SHADOW WRITE ENABLE", |
| 75 | /* 1b */ "ROMCS ENABLE", |
| 76 | /* 1c */ "SOFT RESET AND GATEA20", |
| 77 | /* 1d */ "RESERVED", |
| 78 | /* 1e */ "RESERVED", |
| 79 | /* 1f */ "RESERVED" |
| 80 | }; |
| 81 | |
| 82 | |
| 83 | //************************************************************************** |
| 84 | // DEVICE CONFIGURATION |
| 85 | //************************************************************************** |
| 86 | |
| 87 | //------------------------------------------------- |
| 88 | // cs4031_device_config - constructor |
| 89 | //------------------------------------------------- |
| 90 | |
| 91 | cs4031_device_config::cs4031_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) |
| 92 | : device_config(mconfig, static_alloc_device_config, "CS4031", tag, owner, clock) |
| 93 | { |
| 94 | } |
| 95 | |
| 96 | //------------------------------------------------- |
| 97 | // static_alloc_device_config - allocate a new |
| 98 | // configuration object |
| 99 | //------------------------------------------------- |
| 100 | |
| 101 | device_config *cs4031_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock) |
| 102 | { |
| 103 | return global_alloc(cs4031_device_config(mconfig, tag, owner, clock)); |
| 104 | } |
| 105 | |
| 106 | //------------------------------------------------- |
| 107 | // alloc_device - allocate a new device object |
| 108 | //------------------------------------------------- |
| 109 | |
| 110 | device_t *cs4031_device_config::alloc_device(running_machine &machine) const |
| 111 | { |
| 112 | return auto_alloc(&machine, cs4031_device(machine, *this)); |
| 113 | } |
| 114 | |
| 115 | void cs4031_device_config::static_set_cputag(device_config *device, const char *tag) |
| 116 | { |
| 117 | cs4031_device_config *cs4031 = downcast<cs4031_device_config *>(device); |
| 118 | cs4031->m_cputag = tag; |
| 119 | } |
| 120 | |
| 121 | void cs4031_device_config::static_set_isatag(device_config *device, const char *tag) |
| 122 | { |
| 123 | cs4031_device_config *cs4031 = downcast<cs4031_device_config *>(device); |
| 124 | cs4031->m_isatag = tag; |
| 125 | } |
| 126 | |
| 127 | void cs4031_device_config::static_set_biostag(device_config *device, const char *tag) |
| 128 | { |
| 129 | cs4031_device_config *cs4031 = downcast<cs4031_device_config *>(device); |
| 130 | cs4031->m_biostag = tag; |
| 131 | } |
| 132 | |
| 133 | |
| 134 | //************************************************************************** |
| 135 | // LIVE DEVICE |
| 136 | //************************************************************************** |
| 137 | |
| 138 | //------------------------------------------------- |
| 139 | // cs4031_device - constructor |
| 140 | //------------------------------------------------- |
| 141 | |
| 142 | cs4031_device::cs4031_device(running_machine &_machine, const cs4031_device_config &config) : |
| 143 | device_t(_machine, config), |
| 144 | m_config(config), |
| 145 | m_address(0), |
| 146 | m_address_valid(false) |
| 147 | { |
| 148 | } |
| 149 | |
| 150 | //------------------------------------------------- |
| 151 | // device_start - device-specific startup |
| 152 | //------------------------------------------------- |
| 153 | |
| 154 | void cs4031_device::device_start() |
| 155 | { |
| 156 | device_t *ram_device = m_machine.device(RAM_TAG); |
| 157 | |
| 158 | // make sure the ram device is already running |
| 159 | if (!ram_device->started()) |
| 160 | throw device_missing_dependencies(); |
| 161 | |
| 162 | device_t *cpu = m_machine.device(m_config.m_cputag); |
| 163 | m_space = cpu_get_address_space(cpu, ADDRESS_SPACE_PROGRAM); |
| 164 | m_isa = m_machine.region(m_config.m_isatag)->base(); |
| 165 | m_bios = m_machine.region(m_config.m_biostag)->base(); |
| 166 | |
| 167 | m_ram = ram_get_ptr(ram_device); |
| 168 | UINT32 ram_size = ram_get_size(ram_device); |
| 169 | |
| 170 | // install base memory |
| 171 | memory_install_ram(m_space, 0x000000, 0x09ffff, 0, 0, m_ram); |
| 172 | |
| 173 | // install extended memory |
| 174 | memory_install_ram(m_space, 0x100000, ram_size - 1, 0, 0, m_ram + 0x100000); |
| 175 | |
| 176 | // install bios rom at cpu inital pc |
| 177 | memory_install_rom(m_space, 0xffff0000, 0xffffffff, 0, 0, m_bios + 0xf0000); |
| 178 | } |
| 179 | |
| 180 | //------------------------------------------------- |
| 181 | // device_reset - device-specific reset |
| 182 | //------------------------------------------------- |
| 183 | |
| 184 | void cs4031_device::device_reset() |
| 185 | { |
| 186 | // setup default values |
| 187 | memset(&m_registers, 0x00, sizeof(m_registers)); |
| 188 | m_registers[ROMCS] = 0x60; |
| 189 | |
| 190 | // update rom/ram regions below 1mb |
| 191 | update_read_regions(); |
| 192 | update_write_regions(); |
| 193 | } |
| 194 | |
| 195 | |
| 196 | //************************************************************************** |
| 197 | // READ/WRITE HANDLERS |
| 198 | //************************************************************************** |
| 199 | |
| 200 | void cs4031_device::update_read_region(int index, const char *region, offs_t start, offs_t end) |
| 201 | { |
| 202 | if (!BIT(m_registers[SHADOW_READ], index) && BIT(m_registers[ROMCS], index)) |
| 203 | { |
| 204 | if (LOG_MEMORY) |
| 205 | logerror("ROM read from %x to %x\n", start, end); |
| 206 | |
| 207 | memory_install_read_bank(m_space, start, end, 0, 0, region); |
| 208 | memory_set_bankptr(m_space->machine, region, m_bios + start); |
| 209 | } |
| 210 | else if (!BIT(m_registers[SHADOW_READ], index) && !BIT(m_registers[ROMCS], index)) |
| 211 | { |
| 212 | if (LOG_MEMORY) |
| 213 | logerror("ISA read from %x to %x\n", start, end); |
| 214 | |
| 215 | memory_install_read_bank(m_space, start, end, 0, 0, region); |
| 216 | memory_set_bankptr(m_space->machine, region, m_isa + start); |
| 217 | } |
| 218 | else if (BIT(m_registers[SHADOW_READ], index)) |
| 219 | { |
| 220 | if (LOG_MEMORY) |
| 221 | logerror("RAM read from %x to %x\n", start, end); |
| 222 | |
| 223 | memory_install_read_bank(m_space, start, end, 0, 0, region); |
| 224 | memory_set_bankptr(m_space->machine, region, m_ram + start); |
| 225 | } |
| 226 | else |
| 227 | { |
| 228 | if (LOG_MEMORY) |
| 229 | logerror("NOP read from %x to %x\n", start, end); |
| 230 | |
| 231 | memory_nop_read(m_space, start, end, 0, 0); |
| 232 | } |
| 233 | } |
| 234 | |
| 235 | void cs4031_device::update_write_region(int index, const char *region, offs_t start, offs_t end) |
| 236 | { |
| 237 | if (!BIT(m_registers[SHADOW_WRITE], index) && BIT(m_registers[ROMCS], index) && BIT(m_registers[ROMCS], 7)) |
| 238 | { |
| 239 | if (LOG_MEMORY) |
| 240 | logerror("ROM write from %x to %x\n", start, end); |
| 241 | |
| 242 | memory_install_write_bank(m_space, start, end, 0, 0, region); |
| 243 | memory_set_bankptr(m_space->machine, region, m_bios + start); |
| 244 | } |
| 245 | else if (!BIT(m_registers[SHADOW_WRITE], index) && !BIT(m_registers[ROMCS], index)) |
| 246 | { |
| 247 | if (LOG_MEMORY) |
| 248 | logerror("ISA write from %x to %x\n", start, end); |
| 249 | |
| 250 | memory_install_write_bank(m_space, start, end, 0, 0, region); |
| 251 | memory_set_bankptr(m_space->machine, region, m_isa + start); |
| 252 | } |
| 253 | else if (BIT(m_registers[SHADOW_WRITE], index)) |
| 254 | { |
| 255 | if (LOG_MEMORY) |
| 256 | logerror("RAM write from %x to %x\n", start, end); |
| 257 | |
| 258 | memory_install_write_bank(m_space, start, end, 0, 0, region); |
| 259 | memory_set_bankptr(m_space->machine, region, m_ram + start); |
| 260 | } |
| 261 | else |
| 262 | { |
| 263 | if (LOG_MEMORY) |
| 264 | logerror("NOP write from %x to %x\n", start, end); |
| 265 | |
| 266 | memory_nop_write(m_space, start, end, 0 ,0); |
| 267 | } |
| 268 | } |
| 269 | |
| 270 | void cs4031_device::update_read_regions() |
| 271 | { |
| 272 | update_read_region(0, "read_c0000", 0xc0000, 0xc3fff); |
| 273 | update_read_region(1, "read_c4000", 0xc4000, 0xc7fff); |
| 274 | update_read_region(2, "read_c8000", 0xc8000, 0xcbfff); |
| 275 | update_read_region(3, "read_cc000", 0xcc000, 0xcffff); |
| 276 | update_read_region(4, "read_d0000", 0xd0000, 0xdffff); |
| 277 | update_read_region(5, "read_e0000", 0xe0000, 0xeffff); |
| 278 | update_read_region(6, "read_f0000", 0xf0000, 0xfffff); |
| 279 | } |
| 280 | |
| 281 | void cs4031_device::update_write_regions() |
| 282 | { |
| 283 | update_write_region(0, "write_c0000", 0xc0000, 0xc3fff); |
| 284 | update_write_region(1, "write_c4000", 0xc4000, 0xc7fff); |
| 285 | update_write_region(2, "write_c8000", 0xc8000, 0xcbfff); |
| 286 | update_write_region(3, "write_cc000", 0xcc000, 0xcffff); |
| 287 | update_write_region(4, "write_d0000", 0xd0000, 0xdffff); |
| 288 | update_write_region(5, "write_e0000", 0xe0000, 0xeffff); |
| 289 | update_write_region(6, "write_f0000", 0xf0000, 0xfffff); |
| 290 | } |
| 291 | |
| 292 | WRITE8_MEMBER( cs4031_device::address_w ) |
| 293 | { |
| 294 | m_address = data; |
| 295 | m_address_valid = (m_address < 0x20) ? true : false; |
| 296 | } |
| 297 | |
| 298 | READ8_MEMBER( cs4031_device::data_r ) |
| 299 | { |
| 300 | UINT8 result = 0xff; |
| 301 | |
| 302 | if (m_address_valid) |
| 303 | { |
| 304 | if (LOG_REGISTER) |
| 305 | logerror("cs4031_device: read %s = %02x\n", register_names[m_address], m_registers[m_address]); |
| 306 | |
| 307 | result = m_registers[m_address]; |
| 308 | } |
| 309 | |
| 310 | // after a read the selected address needs to be reset |
| 311 | m_address_valid = false; |
| 312 | |
| 313 | return result; |
| 314 | } |
| 315 | |
| 316 | WRITE8_MEMBER( cs4031_device::data_w ) |
| 317 | { |
| 318 | if (m_address_valid) |
| 319 | { |
| 320 | if (LOG_REGISTER) |
| 321 | logerror("cs4031_device: write %s = %02x\n", register_names[m_address], data); |
| 322 | |
| 323 | // update register with new data |
| 324 | m_registers[m_address] = data; |
| 325 | |
| 326 | // execute command |
| 327 | switch (m_address) |
| 328 | { |
| 329 | case 0x01: break; |
| 330 | case 0x05: break; |
| 331 | case 0x06: break; |
| 332 | case 0x07: break; |
| 333 | case 0x08: break; |
| 334 | case 0x09: break; |
| 335 | case 0x0a: break; |
| 336 | case 0x10: break; |
| 337 | case 0x11: break; |
| 338 | case 0x12: break; |
| 339 | case 0x13: break; |
| 340 | case 0x14: break; |
| 341 | case 0x15: break; |
| 342 | case 0x16: break; |
| 343 | case 0x17: break; |
| 344 | case 0x18: break; |
| 345 | |
| 346 | case 0x19: |
| 347 | update_read_regions(); |
| 348 | break; |
| 349 | |
| 350 | case 0x1a: |
| 351 | update_write_regions(); |
| 352 | break; |
| 353 | |
| 354 | case 0x1b: |
| 355 | update_read_regions(); |
| 356 | update_write_regions(); |
| 357 | break; |
| 358 | |
| 359 | case 0x1c: break; |
| 360 | } |
| 361 | } |
| 362 | |
| 363 | // after a write the selected address needs to be reset |
| 364 | m_address_valid = false; |
| 365 | } |
src/mess/machine/cs4031.h
| r0 | r10784 | |
| 1 | /*************************************************************************** |
| 2 | |
| 3 | Chips & Technologies CS4031 chipset |
| 4 | |
| 5 | Chipset for 486 based PC/AT compatible systems. Consists of two |
| 6 | individual chips: |
| 7 | |
| 8 | * F84031 |
| 9 | - DRAM controller |
| 10 | - ISA-bus controller |
| 11 | - VESA VL-BUS controller |
| 12 | |
| 13 | * F84035 |
| 14 | - 2x 8257 DMA controller |
| 15 | - 2x 8259 interrupt controller |
| 16 | - 8254 timer |
| 17 | - MC14818 RTC |
| 18 | |
| 19 | ***************************************************************************/ |
| 20 | |
| 21 | #pragma once |
| 22 | |
| 23 | #ifndef __CS4031_H__ |
| 24 | #define __CS4031_H__ |
| 25 | |
| 26 | #include "emu.h" |
| 27 | |
| 28 | |
| 29 | //************************************************************************** |
| 30 | // INTERFACE CONFIGURATION MACROS |
| 31 | //************************************************************************** |
| 32 | |
| 33 | #define MCFG_CS4031_ADD(_tag, _cputag, _isatag, _biostag) \ |
| 34 | MCFG_DEVICE_ADD(_tag, CS4031, 0) \ |
| 35 | cs4031_device_config::static_set_cputag(device, _cputag); \ |
| 36 | cs4031_device_config::static_set_isatag(device, _isatag); \ |
| 37 | cs4031_device_config::static_set_biostag(device, _biostag); |
| 38 | |
| 39 | |
| 40 | //************************************************************************** |
| 41 | // TYPE DEFINITIONS |
| 42 | //************************************************************************** |
| 43 | |
| 44 | // ======================> cs4031_device_config |
| 45 | |
| 46 | class cs4031_device_config : public device_config |
| 47 | { |
| 48 | friend class cs4031_device; |
| 49 | |
| 50 | // construction/destruction |
| 51 | cs4031_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); |
| 52 | |
| 53 | public: |
| 54 | // allocators |
| 55 | static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock); |
| 56 | virtual device_t *alloc_device(running_machine &machine) const; |
| 57 | |
| 58 | // inline configuration |
| 59 | static void static_set_cputag(device_config *device, const char *tag); |
| 60 | static void static_set_isatag(device_config *device, const char *tag); |
| 61 | static void static_set_biostag(device_config *device, const char *tag); |
| 62 | |
| 63 | const char *m_cputag; |
| 64 | const char *m_isatag; |
| 65 | const char *m_biostag; |
| 66 | }; |
| 67 | |
| 68 | |
| 69 | // ======================> cs4031_device |
| 70 | |
| 71 | class cs4031_device : public device_t |
| 72 | { |
| 73 | friend class cs4031_device_config; |
| 74 | |
| 75 | // construction/destruction |
| 76 | cs4031_device(running_machine &_machine, const cs4031_device_config &config); |
| 77 | |
| 78 | public: |
| 79 | DECLARE_WRITE8_MEMBER( address_w ); |
| 80 | DECLARE_READ8_MEMBER( data_r ); |
| 81 | DECLARE_WRITE8_MEMBER( data_w ); |
| 82 | |
| 83 | protected: |
| 84 | // device-level overrides |
| 85 | virtual void device_start(); |
| 86 | virtual void device_reset(); |
| 87 | |
| 88 | private: |
| 89 | void update_read_region(int index, const char *region, offs_t start, offs_t end); |
| 90 | void update_write_region(int index, const char *region, offs_t start, offs_t end); |
| 91 | void update_read_regions(); |
| 92 | void update_write_regions(); |
| 93 | |
| 94 | // internal state |
| 95 | const cs4031_device_config &m_config; |
| 96 | |
| 97 | address_space *m_space; |
| 98 | UINT8 *m_isa; |
| 99 | UINT8 *m_bios; |
| 100 | UINT8 *m_ram; |
| 101 | |
| 102 | // address selection |
| 103 | UINT8 m_address; |
| 104 | bool m_address_valid; |
| 105 | |
| 106 | UINT8 m_registers[0x20]; |
| 107 | }; |
| 108 | |
| 109 | |
| 110 | // device type definition |
| 111 | extern const device_type CS4031; |
| 112 | |
| 113 | |
| 114 | #endif /* __CS4031_H__ */ |
src/mess/drivers/at.c
| r10783 | r10784 | |
| 20 | 20 | #include "machine/pic8259.h" |
| 21 | 21 | #include "machine/i82371ab.h" |
| 22 | 22 | #include "machine/i82439tx.h" |
| 23 | | |
| 23 | #include "machine/cs4031.h" |
| 24 | 24 | #include "machine/pit8253.h" |
| 25 | 25 | #include "video/pc_vga_mess.h" |
| 26 | 26 | #include "video/pc_cga.h" |
| r10783 | r10784 | |
| 101 | 101 | AM_RANGE(0x00ff0000, 0x00ffffff) AM_ROM AM_REGION("maincpu", 0x0f0000) |
| 102 | 102 | ADDRESS_MAP_END |
| 103 | 103 | |
| 104 | // memory is mostly handled by the chipset |
| 105 | static ADDRESS_MAP_START( ct486_map, ADDRESS_SPACE_PROGRAM, 32 ) |
| 106 | AM_RANGE(0x00800000, 0x00800bff) AM_RAM AM_SHARE("nvram") |
| 107 | ADDRESS_MAP_END |
| 108 | |
| 109 | |
| 104 | 110 | static ADDRESS_MAP_START( at586_map, ADDRESS_SPACE_PROGRAM, 32 ) |
| 105 | 111 | AM_RANGE(0x00000000, 0x0009ffff) AM_RAMBANK("bank10") |
| 106 | 112 | AM_RANGE(0x000a0000, 0x000bffff) AM_NOP |
| r10783 | r10784 | |
| 216 | 222 | ADDRESS_MAP_END |
| 217 | 223 | |
| 218 | 224 | |
| 225 | static READ32_HANDLER( ct486_chipset_r ) |
| 226 | { |
| 227 | at_state *state = space->machine->driver_data<at_state>(); |
| 219 | 228 | |
| 229 | if (ACCESSING_BITS_0_7) |
| 230 | return pic8259_r(state->pic8259_master, 0); |
| 231 | |
| 232 | if (ACCESSING_BITS_8_15) |
| 233 | return pic8259_r(state->pic8259_master, 1) << 8; |
| 234 | |
| 235 | if (ACCESSING_BITS_24_31) |
| 236 | return downcast<cs4031_device *>(space->machine->device("cs4031"))->data_r(*space, 0, 0) << 24; |
| 237 | |
| 238 | return 0xffffffff; |
| 239 | } |
| 240 | |
| 241 | static WRITE32_HANDLER( ct486_chipset_w ) |
| 242 | { |
| 243 | at_state *state = space->machine->driver_data<at_state>(); |
| 244 | |
| 245 | if (ACCESSING_BITS_0_7) |
| 246 | pic8259_w(state->pic8259_master, 0, data); |
| 247 | |
| 248 | if (ACCESSING_BITS_8_15) |
| 249 | pic8259_w(state->pic8259_master, 1, data >> 8); |
| 250 | |
| 251 | if (ACCESSING_BITS_16_23) |
| 252 | downcast<cs4031_device *>(space->machine->device("cs4031"))->address_w(*space, 0, data >> 16, 0); |
| 253 | |
| 254 | if (ACCESSING_BITS_24_31) |
| 255 | downcast<cs4031_device *>(space->machine->device("cs4031"))->data_w(*space, 0, data >> 24, 0); |
| 256 | } |
| 257 | |
| 258 | static ADDRESS_MAP_START( ct486_io, ADDRESS_SPACE_IO, 32 ) |
| 259 | AM_RANGE(0x0000, 0x001f) AM_DEVREADWRITE8("dma8237_1", i8237_r, i8237_w, 0xffffffff) |
| 260 | AM_RANGE(0x0020, 0x0023) AM_READWRITE(ct486_chipset_r, ct486_chipset_w) |
| 261 | AM_RANGE(0x0040, 0x005f) AM_DEVREADWRITE8("pit8254", pit8253_r, pit8253_w, 0xffffffff) |
| 262 | AM_RANGE(0x0060, 0x0063) AM_READWRITE8(at_keybc_r, at_keybc_w, 0xffff) |
| 263 | AM_RANGE(0x0064, 0x0067) AM_DEVREADWRITE8_MODERN("keybc", at_keyboard_controller_device, status_r, command_w, 0xffff) |
| 264 | AM_RANGE(0x0070, 0x007f) AM_DEVREADWRITE8_MODERN("rtc", mc146818_device, read, write , 0xffffffff) |
| 265 | AM_RANGE(0x0080, 0x009f) AM_READWRITE8(at_page8_r, at_page8_w, 0xffffffff) |
| 266 | AM_RANGE(0x00a0, 0x00bf) AM_DEVREADWRITE8("pic8259_slave", pic8259_r, pic8259_w, 0xffffffff) |
| 267 | AM_RANGE(0x00c0, 0x00df) AM_DEVREADWRITE8("dma8237_2", at_dma8237_1_r, at_dma8237_1_w, 0xffffffff) |
| 268 | AM_RANGE(0x0278, 0x027f) AM_DEVREADWRITE8("lpt_2", pc_lpt_r, pc_lpt_w, 0x000000ff) |
| 269 | AM_RANGE(0x02e8, 0x02ef) AM_DEVREADWRITE8("ns16450_3", ins8250_r, ins8250_w, 0xffffffff) |
| 270 | AM_RANGE(0x02f8, 0x02ff) AM_DEVREADWRITE8("ns16450_1", ins8250_r, ins8250_w, 0xffffffff) |
| 271 | AM_RANGE(0x0320, 0x0323) AM_READWRITE(pc32le_HDC1_r, pc32le_HDC1_w) |
| 272 | AM_RANGE(0x0324, 0x0327) AM_READWRITE(pc32le_HDC2_r, pc32le_HDC2_w) |
| 273 | AM_RANGE(0x0378, 0x037f) AM_DEVREADWRITE8("lpt_1", pc_lpt_r, pc_lpt_w, 0x000000ff) |
| 274 | AM_RANGE(0x03f0, 0x03f7) AM_READWRITE8(pc_fdc_r, pc_fdc_w, 0xffffffff) |
| 275 | AM_RANGE(0x03bc, 0x03bf) AM_DEVREADWRITE8("lpt_0", pc_lpt_r, pc_lpt_w, 0x000000ff) |
| 276 | AM_RANGE(0x03f8, 0x03ff) AM_DEVREADWRITE8("ns16450_0", ins8250_r, ins8250_w, 0xffffffff) |
| 277 | ADDRESS_MAP_END |
| 278 | |
| 279 | |
| 220 | 280 | static ADDRESS_MAP_START(at586_io, ADDRESS_SPACE_IO, 32) |
| 221 | 281 | AM_RANGE(0x0000, 0x001f) AM_DEVREADWRITE8("dma8237_1", i8237_r, i8237_w, 0xffffffff) |
| 222 | 282 | AM_RANGE(0x0020, 0x003f) AM_DEVREADWRITE8("pic8259_master", pic8259_r, pic8259_w, 0xffffffff) |
| r10783 | r10784 | |
| 853 | 913 | MCFG_CPU_IO_MAP(at386_io) |
| 854 | 914 | MACHINE_CONFIG_END |
| 855 | 915 | |
| 916 | |
| 917 | static MACHINE_CONFIG_DERIVED( ct486, at386 ) |
| 918 | MCFG_CPU_REPLACE("maincpu", I486, 25000000) |
| 919 | MCFG_CPU_PROGRAM_MAP(ct486_map) |
| 920 | MCFG_CPU_IO_MAP(ct486_io) |
| 921 | |
| 922 | MCFG_CS4031_ADD("cs4031", "maincpu", "isa", "bios") |
| 923 | |
| 924 | MCFG_DEVICE_REMOVE(RAM_TAG) |
| 925 | MCFG_RAM_ADD(RAM_TAG) |
| 926 | MCFG_RAM_DEFAULT_SIZE("4M") |
| 927 | MCFG_RAM_EXTRA_OPTIONS("1M,2M,8M,16M,32M,64M") |
| 928 | MACHINE_CONFIG_END |
| 929 | |
| 930 | |
| 856 | 931 | static MACHINE_CONFIG_DERIVED( at586, at386 ) |
| 857 | 932 | |
| 858 | 933 | MCFG_CPU_REPLACE("maincpu", PENTIUM, 60000000) |
| r10783 | r10784 | |
| 1250 | 1325 | ROM_END |
| 1251 | 1326 | |
| 1252 | 1327 | |
| 1328 | // Unknown 486 board with Chips & Technologies CS4031 chipset |
| 1329 | ROM_START( ct486 ) |
| 1330 | ROM_REGION(0x100000, "isa", 0) |
| 1331 | ROM_LOAD("et4000.bin", 0xc0000, 0x08000, CRC(f01e4be0) SHA1(95d75ff41bcb765e50bd87a8da01835fd0aa01d5)) |
| 1332 | ROM_LOAD("wdbios.rom", 0xc8000, 0x02000, CRC(8e9e2bd4) SHA1(601d7ceab282394ebab50763c267e915a6a2166a)) |
| 1333 | |
| 1334 | ROM_REGION(0x100000, "bios", 0) |
| 1335 | ROM_LOAD("chips_1.ami", 0xf0000, 0x10000, CRC(a14a7511) SHA1(b88d09be66905ed2deddc26a6f8522e7d2d6f9a8)) |
| 1336 | ROM_END |
| 1337 | |
| 1338 | |
| 1253 | 1339 | // FIC 486-PIO-2 (4 ISA, 4 PCI) |
| 1254 | 1340 | // VIA VT82C505 + VT82C496G + VT82C406MV, NS311/312 or NS332 I/O |
| 1255 | 1341 | ROM_START( ficpio2 ) |
| r10783 | r10784 | |
| 1360 | 1446 | COMP ( 1987, atvga, ibm5170, 0, atvga, atvga, at_vga, "<generic>", "PC/AT (VGA, MF2 Keyboard)" , GAME_NOT_WORKING ) |
| 1361 | 1447 | COMP ( 1988, at386, ibm5170, 0, at386, atvga, at386, "<generic>", "PC/AT 386 (VGA, MF2 Keyboard)", GAME_NOT_WORKING ) |
| 1362 | 1448 | COMP ( 1990, at486, ibm5170, 0, at486, atvga, at386, "<generic>", "PC/AT 486 (VGA, MF2 Keyboard)", GAME_NOT_WORKING ) |
| 1449 | COMP ( 1993, ct486, ibm5170, 0, ct486, atvga, at386, "<unknown>", "PC/AT 486 with C&T chipset", GAME_NOT_WORKING ) |
| 1363 | 1450 | COMP ( 1995, ficpio2, ibm5170, 0, at486, atvga, at386, "FIC", "486-PIO-2", GAME_NOT_WORKING ) |
| 1364 | 1451 | COMP ( 1990, at586, ibm5170, 0, at586, atvga, at386, "<generic>", "PC/AT 586 (VGA, MF2 Keyboard)", GAME_NOT_WORKING ) |
| 1365 | 1452 | COMP ( 1990, c386sx16, ibm5170, 0, c386sx16, atvga, at386, "Commodore Business Machines", "Commodore 386SX-16", GAME_NOT_WORKING ) |