trunk/src/mess/drivers/kaypro.c
| r243372 | r243373 | |
| 9 | 9 | telephone cord, complete with modular plug on each end. The keyboard carries |
| 10 | 10 | its own Intel 87C51 processor and is an intelligent device. |
| 11 | 11 | |
| 12 | | Things that need doing: |
| 12 | ToDo: |
| 13 | 13 | |
| 14 | 14 | - See about getting keyboard to work as a serial device. |
| 15 | 15 | - Need dump of 87C51 cpu in the keyboard. |
| 16 | 16 | |
| 17 | | - Only kayproii boots up, the remainder have floppy-disk problems. |
| 17 | - Kaypro 2x, 4a: floppy not working "No operating system present on this disk" |
| 18 | - Kaypro 10: Boots from floppy, but B drive not working "Bdos Err on B: Bad Sector" |
| 19 | - Kaypro 4p88: works as a normal Kaypro 4, extra hardware not done |
| 20 | - Kaypro Robie: has twin 2.6MB 5.25 floppy drives which we don't support, no software available |
| 18 | 21 | |
| 19 | | - The DSK format needs to be supported. It is commented out until the code gets written. |
| 20 | | |
| 21 | 22 | - Hard Disk not emulated. |
| 22 | 23 | The controller is a WD1002 (original version, for Winchester drives). |
| 23 | 24 | |
| r243372 | r243373 | |
| 162 | 163 | |
| 163 | 164 | ************************************************************/ |
| 164 | 165 | |
| 165 | | //FLOPPY_FORMATS_MEMBER( kaypro_state::kayproii_floppy_formats ) |
| 166 | | // FLOPPY_KAYPROII_FORMAT |
| 167 | | //FLOPPY_FORMATS_END |
| 168 | | |
| 169 | | //FLOPPY_FORMATS_MEMBER( kaypro_state::kaypro2x_floppy_formats ) |
| 170 | | // FLOPPY_KAYPRO2X_FORMAT |
| 171 | | //FLOPPY_FORMATS_END |
| 172 | | |
| 173 | 166 | static SLOT_INTERFACE_START( kaypro_floppies ) |
| 174 | | SLOT_INTERFACE( "525dd", FLOPPY_525_DD ) |
| 167 | SLOT_INTERFACE( "drive0", FLOPPY_525_DD ) |
| 168 | SLOT_INTERFACE( "drive1", FLOPPY_525_DD ) |
| 175 | 169 | SLOT_INTERFACE_END |
| 176 | 170 | |
| 177 | 171 | |
| r243372 | r243373 | |
| 180 | 174 | MCFG_CPU_ADD("maincpu", Z80, XTAL_20MHz / 8) |
| 181 | 175 | MCFG_CPU_PROGRAM_MAP(kaypro_map) |
| 182 | 176 | MCFG_CPU_IO_MAP(kayproii_io) |
| 183 | | MCFG_CPU_VBLANK_INT_DRIVER("screen", kaypro_state, kay_kbd_interrupt) /* this doesn't actually exist, it is to run the keyboard */ |
| 177 | MCFG_CPU_VBLANK_INT_DRIVER("screen", kaypro_state, kay_kbd_interrupt) /* this doesn't actually exist, it is to run the keyboard */ |
| 184 | 178 | MCFG_CPU_CONFIG(kayproii_daisy_chain) |
| 185 | 179 | |
| 186 | 180 | MCFG_MACHINE_START_OVERRIDE(kaypro_state, kayproii ) |
| r243372 | r243373 | |
| 230 | 224 | MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(kaypro_state, fdc_intrq_w)) |
| 231 | 225 | MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(kaypro_state, fdc_drq_w)) |
| 232 | 226 | MCFG_WD_FDC_FORCE_READY |
| 233 | | //MCFG_FLOPPY_DRIVE_ADD("fdc:0", kaypro_floppies, "525dd", kaypro_state::kayproii_floppy_formats) |
| 234 | | //MCFG_FLOPPY_DRIVE_ADD("fdc:1", kaypro_floppies, "525dd", kaypro_state::kayproii_floppy_formats) |
| 235 | | MCFG_FLOPPY_DRIVE_ADD("fdc:0", kaypro_floppies, "525dd", floppy_image_device::default_floppy_formats) |
| 236 | | MCFG_FLOPPY_DRIVE_ADD("fdc:1", kaypro_floppies, "525dd", floppy_image_device::default_floppy_formats) |
| 227 | MCFG_FLOPPY_DRIVE_ADD("fdc:0", kaypro_floppies, "drive0", floppy_image_device::default_floppy_formats) |
| 228 | MCFG_FLOPPY_DRIVE_ADD("fdc:1", kaypro_floppies, "drive1", floppy_image_device::default_floppy_formats) |
| 237 | 229 | MCFG_SOFTWARE_LIST_ADD("flop_list","kayproii") |
| 238 | 230 | MACHINE_CONFIG_END |
| 239 | 231 | |
| r243372 | r243373 | |
| 250 | 242 | MCFG_CPU_ADD("maincpu", Z80, XTAL_16MHz / 4) |
| 251 | 243 | MCFG_CPU_PROGRAM_MAP(kaypro_map) |
| 252 | 244 | MCFG_CPU_IO_MAP(kaypro2x_io) |
| 253 | | MCFG_CPU_VBLANK_INT_DRIVER("screen", kaypro_state, kay_kbd_interrupt) |
| 245 | MCFG_CPU_VBLANK_INT_DRIVER("screen", kaypro_state, kay_kbd_interrupt) |
| 254 | 246 | MCFG_CPU_CONFIG(kaypro2x_daisy_chain) |
| 255 | 247 | |
| 256 | 248 | MCFG_MACHINE_RESET_OVERRIDE(kaypro_state, kaypro ) |
| r243372 | r243373 | |
| 266 | 258 | |
| 267 | 259 | MCFG_GFXDECODE_ADD("gfxdecode", "palette", kaypro2x) |
| 268 | 260 | MCFG_PALETTE_ADD("palette", 3) |
| 269 | | MCFG_PALETTE_INIT_OWNER(kaypro_state,kaypro) |
| 261 | MCFG_PALETTE_INIT_OWNER(kaypro_state, kaypro) |
| 270 | 262 | |
| 271 | 263 | /* sound hardware */ |
| 272 | 264 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| r243372 | r243373 | |
| 295 | 287 | MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(kaypro_state, fdc_intrq_w)) |
| 296 | 288 | MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(kaypro_state, fdc_drq_w)) |
| 297 | 289 | MCFG_WD_FDC_FORCE_READY |
| 298 | | //MCFG_FLOPPY_DRIVE_ADD("fdc:0", kaypro_floppies, "525dd", kaypro_state::kaypro2x_floppy_formats) |
| 299 | | //MCFG_FLOPPY_DRIVE_ADD("fdc:1", kaypro_floppies, "525dd", kaypro_state::kaypro2x_floppy_formats) |
| 300 | | MCFG_FLOPPY_DRIVE_ADD("fdc:0", kaypro_floppies, "525dd", floppy_image_device::default_floppy_formats) |
| 301 | | MCFG_FLOPPY_DRIVE_ADD("fdc:1", kaypro_floppies, "525dd", floppy_image_device::default_floppy_formats) |
| 290 | MCFG_FLOPPY_DRIVE_ADD("fdc:0", kaypro_floppies, "drive0", floppy_image_device::default_floppy_formats) |
| 291 | MCFG_FLOPPY_DRIVE_ADD("fdc:1", kaypro_floppies, "drive1", floppy_image_device::default_floppy_formats) |
| 302 | 292 | MACHINE_CONFIG_END |
| 303 | 293 | |
| 304 | 294 | static MACHINE_CONFIG_DERIVED( omni2, kaypro4 ) |
| r243372 | r243373 | |
| 431 | 421 | |
| 432 | 422 | /* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME */ |
| 433 | 423 | COMP( 1982, kayproii, 0, 0, kayproii, kay_kbd, kaypro_state, kaypro, "Non Linear Systems", "Kaypro II - 2/83" , 0 ) |
| 434 | | COMP( 1983, kaypro4, kayproii, 0, kaypro4, kay_kbd, kaypro_state, kaypro, "Non Linear Systems", "Kaypro 4 - 4/83" , GAME_NOT_WORKING ) // model 81-004 |
| 424 | COMP( 1983, kaypro4, kayproii, 0, kaypro4, kay_kbd, kaypro_state, kaypro, "Non Linear Systems", "Kaypro 4 - 4/83" , 0 ) // model 81-004 |
| 435 | 425 | COMP( 1983, kaypro4p88, kayproii, 0, kaypro4, kay_kbd, kaypro_state, kaypro, "Non Linear Systems", "Kaypro 4 plus88 - 4/83" , GAME_NOT_WORKING ) // model 81-004 with an added 8088 daughterboard and rom |
| 436 | | COMP( 198?, omni2, kayproii, 0, omni2, kay_kbd, kaypro_state, kaypro, "Non Linear Systems", "Omni II" , GAME_NOT_WORKING ) |
| 426 | COMP( 198?, omni2, kayproii, 0, omni2, kay_kbd, kaypro_state, kaypro, "Non Linear Systems", "Omni II Logic Analyzer" , 0 ) |
| 437 | 427 | COMP( 1984, kaypro2x, 0, 0, kaypro2x, kay_kbd, kaypro_state, kaypro, "Non Linear Systems", "Kaypro 2x" , GAME_NOT_WORKING ) // model 81-025 |
| 438 | 428 | COMP( 1984, kaypro4a, kaypro2x, 0, kaypro2x, kay_kbd, kaypro_state, kaypro, "Non Linear Systems", "Kaypro 4 - 4/84" , GAME_NOT_WORKING ) // model 81-015 |
| 439 | 429 | // Kaypro 4/84 plus 88 goes here, model 81-015 with an added 8088 daughterboard and rom |
trunk/src/mess/includes/kaypro.h
| r243372 | r243373 | |
| 21 | 21 | }; |
| 22 | 22 | |
| 23 | 23 | kaypro_state(const machine_config &mconfig, device_type type, const char *tag) |
| 24 | | : driver_device(mconfig, type, tag), |
| 25 | | m_maincpu(*this, "maincpu"), |
| 26 | | m_pio_g(*this, "z80pio_g"), |
| 27 | | m_pio_s(*this, "z80pio_s"), |
| 28 | | m_sio(*this, "z80sio"), |
| 29 | | m_sio2x(*this, "z80sio_2x"), |
| 30 | | m_centronics(*this, "centronics"), |
| 31 | | m_fdc(*this, "fdc"), |
| 32 | | m_floppy0(*this, "fdc:0"), |
| 33 | | m_floppy1(*this, "fdc:1"), |
| 34 | | m_crtc(*this, "crtc"), |
| 35 | | m_beep(*this, "beeper"), |
| 36 | | m_palette(*this, "palette") |
| 24 | : driver_device(mconfig, type, tag) |
| 25 | , m_palette(*this, "palette") |
| 26 | , m_maincpu(*this, "maincpu") |
| 27 | , m_pio_g(*this, "z80pio_g") |
| 28 | , m_pio_s(*this, "z80pio_s") |
| 29 | , m_sio(*this, "z80sio") |
| 30 | , m_sio2x(*this, "z80sio_2x") |
| 31 | , m_centronics(*this, "centronics") |
| 32 | , m_fdc(*this, "fdc") |
| 33 | , m_floppy0(*this, "fdc:0") |
| 34 | , m_floppy1(*this, "fdc:1") |
| 35 | , m_crtc(*this, "crtc") |
| 36 | , m_beep(*this, "beeper") |
| 37 | 37 | {} |
| 38 | 38 | |
| 39 | 39 | DECLARE_WRITE_LINE_MEMBER(write_centronics_busy); |
| r243372 | r243373 | |
| 59 | 59 | DECLARE_PALETTE_INIT(kaypro); |
| 60 | 60 | DECLARE_MACHINE_RESET(kay_kbd); |
| 61 | 61 | DECLARE_DRIVER_INIT(kaypro); |
| 62 | | DECLARE_FLOPPY_FORMATS(kayproii_floppy_formats); |
| 63 | | DECLARE_FLOPPY_FORMATS(kaypro2x_floppy_formats); |
| 64 | 62 | UINT32 screen_update_kayproii(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); |
| 65 | 63 | UINT32 screen_update_kaypro2x(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); |
| 66 | 64 | UINT32 screen_update_omni2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); |
| 67 | 65 | INTERRUPT_GEN_MEMBER(kay_kbd_interrupt); |
| 68 | | DECLARE_WRITE_LINE_MEMBER(kaypro_interrupt); |
| 69 | 66 | DECLARE_READ8_MEMBER(kaypro_sio_r); |
| 70 | 67 | DECLARE_WRITE8_MEMBER(kaypro_sio_w); |
| 71 | 68 | MC6845_UPDATE_ROW(kaypro2x_update_row); |
| r243372 | r243373 | |
| 78 | 75 | UINT8 *m_p_videoram; |
| 79 | 76 | kay_kbd_t *m_kbd; |
| 80 | 77 | int m_centronics_busy; |
| 78 | required_device<palette_device> m_palette; |
| 81 | 79 | |
| 82 | | protected: |
| 83 | | virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); |
| 84 | | |
| 85 | 80 | private: |
| 81 | bool m_is_motor_off; |
| 82 | UINT8 m_fdc_rq; |
| 86 | 83 | UINT8 m_system_port; |
| 87 | 84 | UINT16 m_mc6845_video_address; |
| 88 | 85 | floppy_image_device *m_floppy; |
| 89 | 86 | void mc6845_cursor_configure(); |
| 90 | 87 | void mc6845_screen_configure(); |
| 88 | virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); |
| 91 | 89 | required_device<cpu_device> m_maincpu; |
| 92 | 90 | optional_device<z80pio_device> m_pio_g; |
| 93 | 91 | optional_device<z80pio_device> m_pio_s; |
| r243372 | r243373 | |
| 99 | 97 | required_device<floppy_connector> m_floppy1; |
| 100 | 98 | optional_device<mc6845_device> m_crtc; |
| 101 | 99 | required_device<beep_device> m_beep; |
| 102 | | public: |
| 103 | | required_device<palette_device> m_palette; |
| 104 | 100 | }; |
| 105 | 101 | |
| 106 | 102 | |
trunk/src/mess/machine/kaypro.c
| r243372 | r243373 | |
| 13 | 13 | |
| 14 | 14 | ************************************************************/ |
| 15 | 15 | |
| 16 | | WRITE_LINE_MEMBER(kaypro_state::kaypro_interrupt) |
| 17 | | { |
| 18 | | m_maincpu->set_input_line(0, state); |
| 19 | | } |
| 20 | | |
| 21 | 16 | WRITE_LINE_MEMBER( kaypro_state::write_centronics_busy ) |
| 22 | 17 | { |
| 23 | 18 | m_centronics_busy = state; |
| r243372 | r243373 | |
| 48 | 43 | |
| 49 | 44 | membank("bankr0")->set_entry(BIT(data, 7)); |
| 50 | 45 | membank("bank3")->set_entry(BIT(data, 7)); |
| 46 | m_is_motor_off = BIT(data, 6); |
| 51 | 47 | |
| 52 | 48 | m_floppy = NULL; |
| 53 | 49 | if (BIT(data, 0)) |
| r243372 | r243373 | |
| 62 | 58 | if (m_floppy) |
| 63 | 59 | { |
| 64 | 60 | m_floppy->mon_w(BIT(data, 6)); // motor on |
| 61 | m_floppy->ss_w(!BIT(data, 2)); // signal exists even though drives are single sided |
| 65 | 62 | } |
| 66 | 63 | |
| 67 | 64 | output_set_value("ledA", BIT(data, 0)); /* LEDs in artwork */ |
| r243372 | r243373 | |
| 107 | 104 | |
| 108 | 105 | membank("bankr0")->set_entry(BIT(data, 7)); |
| 109 | 106 | membank("bank3")->set_entry(BIT(data, 7)); |
| 107 | m_is_motor_off = !BIT(data, 4); |
| 110 | 108 | |
| 111 | 109 | m_floppy = NULL; |
| 112 | 110 | if (!BIT(data, 0)) |
| r243372 | r243373 | |
| 116 | 114 | m_floppy = m_floppy1->get_device(); |
| 117 | 115 | |
| 118 | 116 | m_fdc->set_floppy(m_floppy); |
| 119 | | //m_fdc->dden_w(BIT(data, 5)); // not connected |
| 117 | m_fdc->dden_w(BIT(data, 5)); // not connected |
| 120 | 118 | |
| 121 | 119 | if (m_floppy) |
| 122 | 120 | { |
| r243372 | r243373 | |
| 195 | 193 | |
| 196 | 194 | void kaypro_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) |
| 197 | 195 | { |
| 196 | bool halt; |
| 198 | 197 | switch (id) |
| 199 | 198 | { |
| 200 | 199 | case TIMER_FLOPPY: |
| 201 | | if (m_maincpu->state_int(Z80_HALT)) |
| 200 | halt = (bool)m_maincpu->state_int(Z80_HALT); |
| 201 | if (m_is_motor_off) |
| 202 | { |
| 203 | timer_set(attotime::from_hz(10), TIMER_FLOPPY); |
| 204 | break; |
| 205 | } |
| 206 | if ((halt) && (m_fdc_rq & 3) && (m_fdc_rq < 0x80)) |
| 207 | { |
| 202 | 208 | m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); |
| 209 | m_fdc_rq |= 0x80; |
| 210 | } |
| 211 | else |
| 212 | if ((m_fdc_rq == 0x80) || ((!halt) && BIT(m_fdc_rq, 7))) |
| 213 | { |
| 214 | m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); |
| 215 | m_fdc_rq &= 0x7f; |
| 216 | } |
| 217 | timer_set(attotime::from_hz(1e5), TIMER_FLOPPY); |
| 218 | |
| 203 | 219 | break; |
| 204 | 220 | default: |
| 205 | 221 | assert_always(FALSE, "Unknown id in kaypro_state::device_timer"); |
| r243372 | r243373 | |
| 208 | 224 | |
| 209 | 225 | WRITE_LINE_MEMBER( kaypro_state::fdc_intrq_w ) |
| 210 | 226 | { |
| 211 | | if (state) |
| 212 | | timer_set(attotime::zero, TIMER_FLOPPY); |
| 213 | | else |
| 214 | | m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); |
| 227 | m_fdc_rq = (m_fdc_rq & 0x82) | state; |
| 215 | 228 | } |
| 216 | 229 | |
| 217 | 230 | WRITE_LINE_MEMBER( kaypro_state::fdc_drq_w ) |
| 218 | 231 | { |
| 219 | | if (state) |
| 220 | | timer_set(attotime::zero, TIMER_FLOPPY); |
| 221 | | else |
| 222 | | m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); |
| 223 | | |
| 232 | m_fdc_rq = (m_fdc_rq & 0x81) | (state << 1); |
| 224 | 233 | } |
| 225 | 234 | |
| 226 | 235 | |
| r243372 | r243373 | |
| 241 | 250 | membank("bankw0")->set_entry(0); // always write to ram |
| 242 | 251 | membank("bank3")->set_entry(1); // point at video ram |
| 243 | 252 | m_system_port = 0x80; |
| 253 | m_fdc_rq = 0; |
| 244 | 254 | m_maincpu->reset(); |
| 255 | timer_set(attotime::from_hz(1), TIMER_FLOPPY); /* timer for rtc */ |
| 245 | 256 | } |
| 246 | 257 | |
| 247 | 258 | |