trunk/src/mess/drivers/altos5.c
| r23511 | r23512 | |
| 37 | 37 | DECLARE_WRITE8_MEMBER(port09_w); |
| 38 | 38 | DECLARE_WRITE8_MEMBER(port14_w); |
| 39 | 39 | DECLARE_DRIVER_INIT(altos5); |
| 40 | | DECLARE_WRITE8_MEMBER(kbd_put); |
| 41 | | DECLARE_READ8_MEMBER(port2e_r); |
| 42 | | DECLARE_READ8_MEMBER(port2f_r); |
| 43 | 40 | TIMER_DEVICE_CALLBACK_MEMBER(ctc_tick); |
| 44 | 41 | DECLARE_WRITE_LINE_MEMBER(ctc_z1_w); |
| 45 | 42 | UINT8 m_port08; |
| 46 | 43 | UINT8 m_port09; |
| 44 | UINT8 *m_p_prom; |
| 47 | 45 | bool m_ipl; |
| 48 | 46 | bool m_wrpt; |
| 47 | UINT8 convert(offs_t offset, bool state); |
| 49 | 48 | void setup_banks(); |
| 50 | 49 | virtual void machine_reset(); |
| 51 | 50 | required_device<cpu_device> m_maincpu; |
| r23511 | r23512 | |
| 93 | 92 | static INPUT_PORTS_START( altos5 ) |
| 94 | 93 | INPUT_PORTS_END |
| 95 | 94 | |
| 95 | UINT8 altos5_state::convert(offs_t offset, bool state) |
| 96 | { |
| 97 | UINT8 data = m_p_prom[offset]; |
| 98 | |
| 99 | // if IPL and /A12, point at rom |
| 100 | if (!state & m_ipl & !BIT(offset, 0)) |
| 101 | data = 0x31; |
| 102 | else |
| 103 | // if WPRT point at nothing |
| 104 | if (state & BIT(data, 7)) |
| 105 | data = 0x30; |
| 106 | else |
| 107 | // normalise bank number and use it |
| 108 | if (BIT(data, 6)) |
| 109 | data-= 0x20; |
| 110 | else |
| 111 | data-= 0x10; |
| 112 | |
| 113 | return data & 0x3f; |
| 114 | } |
| 115 | |
| 96 | 116 | void altos5_state::setup_banks() |
| 97 | 117 | { |
| 98 | | UINT8 *prom = memregion("proms")->base(); |
| 99 | | UINT8 i; |
| 100 | | offs_t offset = ((~m_port09 & 0x20) << 3) | (m_port09 & 0xc0) | ((m_port09 & 0x18) << 1); |
| 101 | | printf("\n%X:",offset); |
| 102 | | for (i = 0; i < 16; i++) |
| 103 | | printf("%X ",prom[offset+i]); |
| 104 | | membank("bankr0")->set_entry(49); |
| 118 | // WPRT | template | cpu bank |
| 119 | offs_t offs = ((~m_port09 & 0x20) << 3) | ((m_port09 & 0x06) << 5) | ((m_port09 & 0x18) << 1); |
| 120 | offs_t temp = offs; |
| 121 | |
| 122 | membank("bankr0")->set_entry(convert(offs++, 0)); |
| 123 | membank("bankr1")->set_entry(convert(offs++, 0)); |
| 124 | membank("bankr2")->set_entry(convert(offs++, 0)); |
| 125 | membank("bankr3")->set_entry(convert(offs++, 0)); |
| 126 | membank("bankr4")->set_entry(convert(offs++, 0)); |
| 127 | membank("bankr5")->set_entry(convert(offs++, 0)); |
| 128 | membank("bankr6")->set_entry(convert(offs++, 0)); |
| 129 | membank("bankr7")->set_entry(convert(offs++, 0)); |
| 130 | membank("bankr8")->set_entry(convert(offs++, 0)); |
| 131 | membank("bankr9")->set_entry(convert(offs++, 0)); |
| 132 | membank("bankra")->set_entry(convert(offs++, 0)); |
| 133 | membank("bankrb")->set_entry(convert(offs++, 0)); |
| 134 | membank("bankrc")->set_entry(convert(offs++, 0)); |
| 135 | membank("bankrd")->set_entry(convert(offs++, 0)); |
| 136 | membank("bankre")->set_entry(convert(offs++, 0)); |
| 137 | membank("bankrf")->set_entry(convert(offs++, 0)); |
| 138 | |
| 139 | membank("bankw0")->set_entry(convert(temp++, 1)); |
| 140 | membank("bankw1")->set_entry(convert(temp++, 1)); |
| 141 | membank("bankw2")->set_entry(convert(temp++, 1)); |
| 142 | membank("bankw3")->set_entry(convert(temp++, 1)); |
| 143 | membank("bankw4")->set_entry(convert(temp++, 1)); |
| 144 | membank("bankw5")->set_entry(convert(temp++, 1)); |
| 145 | membank("bankw6")->set_entry(convert(temp++, 1)); |
| 146 | membank("bankw7")->set_entry(convert(temp++, 1)); |
| 147 | membank("bankw8")->set_entry(convert(temp++, 1)); |
| 148 | membank("bankw9")->set_entry(convert(temp++, 1)); |
| 149 | membank("bankwa")->set_entry(convert(temp++, 1)); |
| 150 | membank("bankwb")->set_entry(convert(temp++, 1)); |
| 151 | membank("bankwc")->set_entry(convert(temp++, 1)); |
| 152 | membank("bankwd")->set_entry(convert(temp++, 1)); |
| 153 | membank("bankwe")->set_entry(convert(temp++, 1)); |
| 154 | membank("bankwf")->set_entry(convert(temp++, 1)); |
| 105 | 155 | } |
| 106 | 156 | |
| 107 | 157 | void altos5_state::machine_reset() |
| r23511 | r23512 | |
| 111 | 161 | m_wrpt = 0; |
| 112 | 162 | m_ipl = 1; |
| 113 | 163 | setup_banks(); |
| 164 | m_maincpu->reset(); |
| 114 | 165 | } |
| 115 | 166 | |
| 116 | 167 | static const z80_daisy_config daisy_chain_intf[] = |
| r23511 | r23512 | |
| 120 | 171 | { "z80pio_1" }, |
| 121 | 172 | { "z80ctc" }, |
| 122 | 173 | { "z80dart" }, |
| 123 | | // { "z80sio" }, |
| 174 | { "z80sio" }, |
| 124 | 175 | { NULL } |
| 125 | 176 | }; |
| 126 | 177 | |
| 127 | | /* |
| 128 | | d0: L = a HD is present |
| 129 | | d1: L = a 2nd hard drive is present |
| 130 | | d2: unused configuration input (must be H to skip HD boot) |
| 131 | | d3: selected floppy is single(L) or double sided(H) |
| 132 | | d7: IRQ from FDC |
| 133 | | */ |
| 134 | | READ8_MEMBER( altos5_state::port08_r ) |
| 135 | | { |
| 136 | | return m_port08 | 0x87; |
| 137 | | } |
| 138 | 178 | |
| 139 | | /* |
| 140 | | d0: HD IRQ |
| 141 | | */ |
| 142 | | READ8_MEMBER( altos5_state::port09_r ) |
| 143 | | { |
| 144 | | return m_port09 | 0x01; |
| 145 | | } |
| 146 | | |
| 147 | | /* |
| 148 | | d4: DDEN (H = double density |
| 149 | | d5: DS (H = drive 2) |
| 150 | | d6: SS (H = side 2) |
| 151 | | */ |
| 152 | | WRITE8_MEMBER( altos5_state::port08_w ) |
| 153 | | { |
| 154 | | m_port08 = data; |
| 155 | | } |
| 156 | | |
| 157 | | /* |
| 158 | | d1, 2: Memory Map template selection (0 = diag; 1 = oasis; 2 = mp/m) |
| 159 | | d3, 4: CPU bank select |
| 160 | | d5: H = Write protect of common area |
| 161 | | d6, 7: DMA bank select |
| 162 | | */ |
| 163 | | WRITE8_MEMBER( altos5_state::port09_w ) |
| 164 | | { |
| 165 | | m_port09 = data; |
| 166 | | setup_banks(); |
| 167 | | } |
| 168 | | |
| 169 | 179 | // turns off IPL mode, removes boot rom from memory map |
| 170 | 180 | WRITE8_MEMBER( altos5_state::port14_w ) |
| 171 | 181 | { |
| r23511 | r23512 | |
| 217 | 227 | m_ctc->trg1(0); |
| 218 | 228 | m_ctc->trg2(1); |
| 219 | 229 | m_ctc->trg2(0); |
| 230 | m_ctc->trg3(1); |
| 231 | m_ctc->trg3(0); |
| 220 | 232 | } |
| 221 | 233 | |
| 222 | 234 | WRITE_LINE_MEMBER( altos5_state::ctc_z1_w ) |
| r23511 | r23512 | |
| 247 | 259 | DEVCB_NULL /* portB ready active callback */ |
| 248 | 260 | }; |
| 249 | 261 | |
| 262 | /* |
| 263 | d0: L = a HD is present |
| 264 | d1: L = a 2nd hard drive is present |
| 265 | d2: unused configuration input (must be H to skip HD boot) |
| 266 | d3: selected floppy is single(L) or double sided(H) |
| 267 | d7: IRQ from FDC |
| 268 | */ |
| 269 | READ8_MEMBER( altos5_state::port08_r ) |
| 270 | { |
| 271 | return m_port08 | 0x87; |
| 272 | } |
| 273 | |
| 274 | /* |
| 275 | d0: HD IRQ |
| 276 | */ |
| 277 | READ8_MEMBER( altos5_state::port09_r ) |
| 278 | { |
| 279 | return m_port09 | 0x01; |
| 280 | } |
| 281 | |
| 282 | /* |
| 283 | d4: DDEN (H = double density |
| 284 | d5: DS (H = drive 2) |
| 285 | d6: SS (H = side 2) |
| 286 | */ |
| 287 | WRITE8_MEMBER( altos5_state::port08_w ) |
| 288 | { |
| 289 | m_port08 = data; |
| 290 | } |
| 291 | |
| 292 | /* |
| 293 | d1, 2: Memory Map template selection (0 = diag; 1 = oasis; 2 = mp/m) |
| 294 | d3, 4: CPU bank select |
| 295 | d5: H = Write protect of common area |
| 296 | d6, 7: DMA bank select |
| 297 | */ |
| 298 | WRITE8_MEMBER( altos5_state::port09_w ) |
| 299 | { |
| 300 | m_port09 = data; |
| 301 | setup_banks(); |
| 302 | } |
| 303 | |
| 250 | 304 | // parallel port |
| 251 | 305 | static Z80PIO_INTERFACE( pio1_intf ) |
| 252 | 306 | { |
| r23511 | r23512 | |
| 287 | 341 | DEVCB_NULL |
| 288 | 342 | }; |
| 289 | 343 | |
| 344 | // consoles#1 and 2 |
| 290 | 345 | static Z80SIO_INTERFACE( sio_intf ) |
| 291 | 346 | { |
| 292 | 347 | 0, 0, 0, 0, |
| r23511 | r23512 | |
| 325 | 380 | |
| 326 | 381 | DRIVER_INIT_MEMBER( altos5_state, altos5 ) |
| 327 | 382 | { |
| 383 | m_p_prom = memregion("proms")->base(); |
| 384 | |
| 328 | 385 | UINT8 *RAM = memregion("maincpu")->base(); |
| 386 | |
| 329 | 387 | membank("bankr0")->configure_entries(0, 50, &RAM[0], 0x1000); |
| 330 | 388 | membank("bankr1")->configure_entries(0, 50, &RAM[0], 0x1000); |
| 331 | 389 | membank("bankr2")->configure_entries(0, 50, &RAM[0], 0x1000); |
| r23511 | r23512 | |
| 383 | 441 | ROM_START( altos5 ) // 00000-2FFFF = ram banks; 30000-30FFF wprt space; 31000-31FFF ROM |
| 384 | 442 | ROM_REGION( 0x32000, "maincpu", ROMREGION_ERASEFF ) |
| 385 | 443 | ROM_LOAD("2732.bin", 0x31000, 0x1000, CRC(15fdc7eb) SHA1(e15bdf5d5414ad56f8c4bb84edc6f967a5f01ba9)) // bios |
| 386 | | ROM_FILL(0x31054, 2, 0) // temp until banking sorted out |
| 387 | | ROM_FILL(0x31344, 3, 0) // kill self test |
| 388 | 444 | |
| 389 | 445 | ROM_REGION( 0x200, "proms", 0 ) |
| 390 | 446 | ROM_LOAD("82s141.bin", 0x0000, 0x0200, CRC(35c8078c) SHA1(dce24374bfcc5d23959e2c03485d82a119c0c3c9)) // banking control |
| r23511 | r23512 | |
| 393 | 449 | /* Driver */ |
| 394 | 450 | |
| 395 | 451 | /* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ |
| 396 | | COMP(1982, altos5, 0, 0, altos5, altos5, altos5_state, altos5, "Altos", "Altos 5-15", GAME_NOT_WORKING | GAME_NO_SOUND) |
| 452 | COMP(1982, altos5, 0, 0, altos5, altos5, altos5_state, altos5, "Altos", "Altos 5-15", GAME_NOT_WORKING | GAME_NO_SOUND_HW ) |