trunk/src/mess/drivers/altos5.c
| r23487 | r23488 | |
| 11 | 11 | #include "machine/z80pio.h" |
| 12 | 12 | #include "machine/z80dart.h" |
| 13 | 13 | #include "machine/z80dma.h" |
| 14 | #include "machine/serial.h" |
| 15 | #include "machine/terminal.h" |
| 14 | 16 | |
| 15 | 17 | |
| 16 | 18 | class altos5_state : public driver_device |
| r23487 | r23488 | |
| 21 | 23 | m_maincpu(*this, "maincpu"), |
| 22 | 24 | m_pio0(*this, "z80pio_0"), |
| 23 | 25 | m_pio1(*this, "z80pio_1"), |
| 24 | | m_sio1(*this, "z80sio_1"), |
| 25 | | m_sio2(*this, "z80sio_2"), |
| 26 | | m_ctc(*this, "z80ctc") |
| 26 | m_dart(*this, "z80dart"), |
| 27 | m_sio (*this, "z80sio"), |
| 28 | m_ctc (*this, "z80ctc"), |
| 29 | m_terminal(*this, TERMINAL_TAG) |
| 27 | 30 | { } |
| 28 | 31 | |
| 29 | 32 | DECLARE_READ8_MEMBER(memory_read_byte); |
| 30 | 33 | DECLARE_WRITE8_MEMBER(memory_write_byte); |
| 31 | 34 | DECLARE_READ8_MEMBER(io_read_byte); |
| 32 | 35 | DECLARE_WRITE8_MEMBER(io_write_byte); |
| 36 | DECLARE_READ8_MEMBER(port08_r); |
| 37 | DECLARE_READ8_MEMBER(port09_r); |
| 38 | DECLARE_WRITE8_MEMBER(port08_w); |
| 39 | DECLARE_WRITE8_MEMBER(port09_w); |
| 33 | 40 | DECLARE_DRIVER_INIT(altos5); |
| 41 | DECLARE_WRITE8_MEMBER(kbd_put); |
| 42 | DECLARE_READ8_MEMBER(port2e_r); |
| 43 | DECLARE_READ8_MEMBER(port2f_r); |
| 44 | UINT8 m_term_data; |
| 45 | UINT8 m_port08; |
| 46 | UINT8 m_port09; |
| 34 | 47 | virtual void machine_reset(); |
| 35 | 48 | required_device<cpu_device> m_maincpu; |
| 36 | 49 | required_device<z80pio_device> m_pio0; |
| 37 | 50 | required_device<z80pio_device> m_pio1; |
| 38 | | required_device<z80sio0_device> m_sio1; |
| 39 | | required_device<z80sio0_device> m_sio2; |
| 51 | required_device<z80dart_device> m_dart; |
| 52 | optional_device<z80dart_device> m_sio; |
| 40 | 53 | required_device<z80ctc_device> m_ctc; |
| 54 | required_device<generic_terminal_device> m_terminal; |
| 41 | 55 | }; |
| 42 | 56 | |
| 43 | 57 | static ADDRESS_MAP_START(altos5_mem, AS_PROGRAM, 8, altos5_state) |
| r23487 | r23488 | |
| 54 | 68 | AM_RANGE(0x0c, 0x0f) AM_DEVREADWRITE("z80ctc", z80ctc_device, read, write) |
| 55 | 69 | AM_RANGE(0x10, 0x13) AM_DEVREADWRITE("z80pio_1", z80pio_device, read, write) |
| 56 | 70 | //AM_RANGE(0x14, 0x17) AM_WRITE(romoff_w) |
| 57 | | AM_RANGE(0x1c, 0x1f) AM_DEVREADWRITE("z80sio_1", z80sio0_device, cd_ba_r, cd_ba_w) |
| 58 | | AM_RANGE(0x2c, 0x2f) AM_DEVREADWRITE("z80sio_2", z80sio0_device, cd_ba_r, cd_ba_w) |
| 71 | AM_RANGE(0x1c, 0x1f) AM_DEVREADWRITE("z80dart", z80dart_device, ba_cd_r, ba_cd_w) |
| 72 | //AM_RANGE(0x20, 0x23) // Hard drive |
| 73 | AM_RANGE(0x2c, 0x2d) AM_NOP |
| 74 | AM_RANGE(0x2e, 0x2e) AM_READ(port2e_r) AM_DEVWRITE(TERMINAL_TAG, generic_terminal_device, write) |
| 75 | AM_RANGE(0x2f, 0x2f) AM_READ(port2f_r) AM_WRITENOP |
| 59 | 76 | ADDRESS_MAP_END |
| 60 | 77 | |
| 61 | 78 | /* Input ports */ |
| r23487 | r23488 | |
| 73 | 90 | { "z80pio_0" }, |
| 74 | 91 | { "z80pio_1" }, |
| 75 | 92 | { "z80ctc" }, |
| 76 | | { "z80sio_1" }, |
| 77 | | { "z80sio_2" }, |
| 93 | { "z80dart" }, |
| 94 | // { "z80sio" }, |
| 78 | 95 | { NULL } |
| 79 | 96 | }; |
| 80 | 97 | |
| 98 | /* |
| 99 | d0: L = a HD is present |
| 100 | d1: L = a 2nd hard drive is present |
| 101 | d2: unused configuration input (must be H to skip HD boot) |
| 102 | d3: selected floppy is single(L) or double sided(H) |
| 103 | d7: IRQ from FDC |
| 104 | */ |
| 105 | READ8_MEMBER( altos5_state::port08_r ) |
| 106 | { |
| 107 | return m_port08 | 0x87; |
| 108 | } |
| 109 | |
| 110 | /* |
| 111 | d0: HD IRQ |
| 112 | */ |
| 113 | READ8_MEMBER( altos5_state::port09_r ) |
| 114 | { |
| 115 | return m_port09 | 0x01; |
| 116 | } |
| 117 | |
| 118 | /* |
| 119 | d4: DDEN (H = double density |
| 120 | d5: DS (H = drive 2) |
| 121 | d6: SS (H = side 2) |
| 122 | */ |
| 123 | WRITE8_MEMBER( altos5_state::port08_w ) |
| 124 | { |
| 125 | m_port08 = data; |
| 126 | } |
| 127 | |
| 128 | /* |
| 129 | d1, 2: Memory Map template selection (0 = diag; 1 = oasis; 2 = mp/m) |
| 130 | d3, 4: CPU bank select |
| 131 | d5: H = Write protect of common area |
| 132 | d6, 7: DMA bank select |
| 133 | */ |
| 134 | WRITE8_MEMBER( altos5_state::port09_w ) |
| 135 | { |
| 136 | m_port09 = data; |
| 137 | } |
| 138 | |
| 81 | 139 | READ8_MEMBER(altos5_state::memory_read_byte) |
| 82 | 140 | { |
| 83 | 141 | address_space& prog_space = m_maincpu->space(AS_PROGRAM); |
| r23487 | r23488 | |
| 113 | 171 | DEVCB_DRIVER_MEMBER(altos5_state, io_write_byte) |
| 114 | 172 | }; |
| 115 | 173 | |
| 174 | // baud rate generator and RTC. All inputs are 2MHz. |
| 116 | 175 | static Z80CTC_INTERFACE( ctc_intf ) |
| 117 | 176 | { |
| 118 | 177 | DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_IRQ0), // interrupt callback |
| 119 | | DEVCB_NULL, /* ZC/TO0 callback - SIO channel A clock */ |
| 120 | | DEVCB_NULL, /* ZC/TO1 callback - SIO channel B clock */ |
| 121 | | DEVCB_NULL,//DRIVER_LINE_MEMBER(altos5_state, pcm_82_w) /* ZC/TO2 callback - speaker */ |
| 178 | DEVCB_NULL, /* ZC/TO0 callback - SIO Ch B */ |
| 179 | DEVCB_NULL, /* ZC/TO1 callback - Z80DART Ch A, SIO Ch A */ |
| 180 | DEVCB_NULL, /* ZC/TO2 callback - Z80DART Ch B */ |
| 122 | 181 | }; |
| 123 | 182 | |
| 124 | | static Z80PIO_INTERFACE( pio0_intf ) // all pins go to expansion socket |
| 183 | // system functions |
| 184 | static Z80PIO_INTERFACE( pio0_intf ) |
| 125 | 185 | { |
| 126 | 186 | DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_IRQ0), // interrupt callback |
| 127 | | DEVCB_NULL, /* read port A */ |
| 128 | | DEVCB_NULL, /* write port A */ |
| 187 | DEVCB_DRIVER_MEMBER(altos5_state, port08_r), /* read port A */ |
| 188 | DEVCB_DRIVER_MEMBER(altos5_state, port08_w), /* write port A */ |
| 129 | 189 | DEVCB_NULL, /* portA ready active callback */ |
| 130 | | DEVCB_NULL, /* read port B */ |
| 131 | | DEVCB_NULL, /* write port B */ |
| 190 | DEVCB_DRIVER_MEMBER(altos5_state, port09_r), /* read port B */ |
| 191 | DEVCB_DRIVER_MEMBER(altos5_state, port09_w), /* write port B */ |
| 132 | 192 | DEVCB_NULL /* portB ready active callback */ |
| 133 | 193 | }; |
| 134 | 194 | |
| 195 | // parallel port |
| 135 | 196 | static Z80PIO_INTERFACE( pio1_intf ) |
| 136 | 197 | { |
| 137 | 198 | DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_IRQ0), // interrupt callback |
| 138 | | DEVCB_NULL,//DEVICE_MEMBER(K7659_KEYBOARD_TAG, k7659_keyboard_device, read), /* read port A */ |
| 199 | DEVCB_NULL, /* read port A */ |
| 139 | 200 | DEVCB_NULL, /* write port A */ |
| 140 | 201 | DEVCB_NULL, /* portA ready active callback */ |
| 141 | | DEVCB_NULL,//DRIVER_MEMBER(altos5_state, pcm_85_r), /* read port B */ |
| 142 | | DEVCB_NULL,//DRIVER_MEMBER(altos5_state, pcm_85_w), /* write port B */ |
| 202 | DEVCB_NULL, /* read port B */ |
| 203 | DEVCB_NULL, /* write port B */ |
| 143 | 204 | DEVCB_NULL /* portB ready active callback */ |
| 144 | 205 | }; |
| 145 | 206 | |
| 146 | | static Z80SIO_INTERFACE( sio1_intf ) |
| 207 | // serial printer and console#3 |
| 208 | static Z80DART_INTERFACE( dart_intf ) |
| 147 | 209 | { |
| 148 | 210 | 0, 0, 0, 0, |
| 149 | 211 | |
| 212 | // console#3 |
| 150 | 213 | DEVCB_NULL, |
| 151 | 214 | DEVCB_NULL, |
| 152 | 215 | DEVCB_NULL, |
| r23487 | r23488 | |
| 154 | 217 | DEVCB_NULL, |
| 155 | 218 | DEVCB_NULL, |
| 156 | 219 | |
| 220 | // printer |
| 157 | 221 | DEVCB_NULL, |
| 158 | 222 | DEVCB_NULL, |
| 159 | 223 | DEVCB_NULL, |
| r23487 | r23488 | |
| 161 | 225 | DEVCB_NULL, |
| 162 | 226 | DEVCB_NULL, |
| 163 | 227 | |
| 164 | | DEVCB_NULL |
| 165 | | }; |
| 166 | | |
| 167 | | static Z80SIO_INTERFACE( sio2_intf ) |
| 168 | | { |
| 169 | | 0, 0, 0, 0, |
| 170 | | |
| 228 | DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_IRQ0), |
| 171 | 229 | DEVCB_NULL, |
| 172 | 230 | DEVCB_NULL, |
| 173 | 231 | DEVCB_NULL, |
| 174 | | DEVCB_NULL, |
| 175 | | DEVCB_NULL, |
| 176 | | DEVCB_NULL, |
| 177 | | |
| 178 | | DEVCB_NULL, |
| 179 | | DEVCB_NULL, |
| 180 | | DEVCB_NULL, |
| 181 | | DEVCB_NULL, |
| 182 | | DEVCB_NULL, |
| 183 | | DEVCB_NULL, |
| 184 | | |
| 185 | 232 | DEVCB_NULL |
| 186 | 233 | }; |
| 187 | 234 | |
| 235 | |
| 188 | 236 | DRIVER_INIT_MEMBER( altos5_state, altos5 ) |
| 189 | 237 | { |
| 190 | 238 | UINT8 *RAM = memregion("maincpu")->base(); |
| 191 | 239 | membank("bank1")->configure_entries(0, 2, &RAM[0], 0x10000); |
| 192 | 240 | } |
| 193 | 241 | |
| 242 | READ8_MEMBER( altos5_state::port2e_r ) |
| 243 | { |
| 244 | UINT8 ret = m_term_data; |
| 245 | m_term_data = 0; |
| 246 | return ret; |
| 247 | } |
| 248 | |
| 249 | READ8_MEMBER( altos5_state::port2f_r ) |
| 250 | { |
| 251 | return (m_term_data) ? 13 : 12; |
| 252 | } |
| 253 | |
| 254 | WRITE8_MEMBER( altos5_state::kbd_put ) |
| 255 | { |
| 256 | m_term_data = data; |
| 257 | } |
| 258 | |
| 259 | static GENERIC_TERMINAL_INTERFACE( terminal_intf ) |
| 260 | { |
| 261 | DEVCB_DRIVER_MEMBER(altos5_state, kbd_put) |
| 262 | }; |
| 263 | |
| 194 | 264 | static MACHINE_CONFIG_START( altos5, altos5_state ) |
| 195 | 265 | /* basic machine hardware */ |
| 196 | 266 | MCFG_CPU_ADD("maincpu", Z80, XTAL_8MHz / 2) |
| r23487 | r23488 | |
| 199 | 269 | MCFG_CPU_CONFIG(daisy_chain_intf) |
| 200 | 270 | |
| 201 | 271 | /* video hardware */ |
| 272 | MCFG_GENERIC_TERMINAL_ADD(TERMINAL_TAG, terminal_intf) |
| 202 | 273 | |
| 203 | 274 | /* Devices */ |
| 204 | | MCFG_Z80DMA_ADD( "z80dma", XTAL_8MHz / 2, dma_intf) |
| 275 | MCFG_Z80DMA_ADD( "z80dma", XTAL_8MHz / 2, dma_intf) |
| 205 | 276 | MCFG_Z80PIO_ADD( "z80pio_0", XTAL_8MHz / 2, pio0_intf ) |
| 206 | 277 | MCFG_Z80PIO_ADD( "z80pio_1", XTAL_8MHz / 2, pio1_intf ) |
| 207 | | MCFG_Z80SIO0_ADD("z80sio_1", XTAL_8MHz / 2, sio1_intf ) |
| 208 | | MCFG_Z80SIO0_ADD("z80sio_2", XTAL_8MHz / 2, sio2_intf ) |
| 209 | | MCFG_Z80CTC_ADD( "z80ctc", XTAL_8MHz / 2, ctc_intf ) |
| 278 | MCFG_Z80CTC_ADD( "z80ctc", XTAL_8MHz / 2, ctc_intf ) |
| 279 | MCFG_Z80DART_ADD("z80dart", XTAL_8MHz / 2, dart_intf ) |
| 210 | 280 | MACHINE_CONFIG_END |
| 211 | 281 | |
| 212 | 282 | |
| r23487 | r23488 | |
| 217 | 287 | ROM_FILL(0x10054, 2, 0) // temp until banking sorted out |
| 218 | 288 | ROM_FILL(0x10344, 3, 0) // kill self test |
| 219 | 289 | |
| 220 | | ROM_REGION( 0x200, "user1", 0 ) |
| 221 | | ROM_LOAD("82s141.bin", 0x0000, 0x0200, CRC(35c8078c) SHA1(dce24374bfcc5d23959e2c03485d82a119c0c3c9)) // looks like a keyboard matrix |
| 290 | ROM_REGION( 0x200, "proms", 0 ) |
| 291 | ROM_LOAD("82s141.bin", 0x0000, 0x0200, CRC(35c8078c) SHA1(dce24374bfcc5d23959e2c03485d82a119c0c3c9)) // banking control |
| 222 | 292 | ROM_END |
| 223 | 293 | |
| 224 | 294 | /* Driver */ |
| 225 | 295 | |
| 226 | 296 | /* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ |
| 227 | 297 | COMP(1982, altos5, 0, 0, altos5, altos5, altos5_state, altos5, "Altos", "Altos 5-15", GAME_NOT_WORKING | GAME_NO_SOUND) |
| 298 | |
| 299 | |
| 300 | |
| 301 | |
| 302 | #if 0 |
| 303 | /****************** UNUSED SERIAL CODE ************************/ |
| 304 | |
| 305 | //AM_RANGE(0x2c, 0x2f) AM_DEVREADWRITE("z80sio", z80dart_device, ba_cd_r, ba_cd_w) |
| 306 | |
| 307 | static Z80SIO_INTERFACE( sio_intf ) |
| 308 | { |
| 309 | 9600, 9600, 153600, 153600, // rxa, txa, rxb, txb clocks (from CTC) |
| 310 | |
| 311 | // console#2 |
| 312 | DEVCB_NULL, // ChA in data |
| 313 | DEVCB_NULL, // out data |
| 314 | DEVCB_NULL, // DTR |
| 315 | DEVCB_NULL, // RTS |
| 316 | DEVCB_NULL, // WRDY |
| 317 | DEVCB_NULL, // SYNC |
| 318 | |
| 319 | // console#1 |
| 320 | DEVCB_DEVICE_LINE_MEMBER("rs232", serial_port_device, rx), |
| 321 | DEVCB_DEVICE_LINE_MEMBER("rs232", serial_port_device, tx), |
| 322 | DEVCB_DEVICE_LINE_MEMBER("rs232", rs232_port_device, dtr_w), |
| 323 | DEVCB_DEVICE_LINE_MEMBER("rs232", rs232_port_device, rts_w), |
| 324 | DEVCB_NULL, |
| 325 | DEVCB_NULL, |
| 326 | |
| 327 | DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_IRQ0), |
| 328 | DEVCB_NULL, // unused DRQ pins |
| 329 | DEVCB_NULL, |
| 330 | DEVCB_NULL, |
| 331 | DEVCB_NULL |
| 332 | }; |
| 333 | |
| 334 | static const rs232_port_interface rs232_intf = |
| 335 | { |
| 336 | // all outputs |
| 337 | DEVCB_NULL,//DEVCB_DEVICE_LINE_MEMBER("z80sio", z80dart_device, rxcb_w), // data |
| 338 | DEVCB_NULL, // DCD |
| 339 | DEVCB_NULL, // DSR |
| 340 | DEVCB_NULL, // RI |
| 341 | DEVCB_NULL //DEVCB_DEVICE_LINE_MEMBER("z80sio", z80dart_device, ctsb_w) // CTS |
| 342 | }; |
| 343 | |
| 344 | |
| 345 | //MCFG_Z80SIO0_ADD("z80sio", XTAL_8MHz / 2, sio_intf ) |
| 346 | //MCFG_RS232_PORT_ADD("rs232", rs232_intf, default_rs232_devices, "serial_terminal") |
| 347 | |
| 348 | |
| 349 | #endif |
| 350 | |