trunk/src/mess/includes/ql.h
| r30837 | r30838 | |
| 1 | 1 | // license:BSD-3-Clause |
| 2 | | // copyright-holders:Curt Coder |
| 2 | // copyright-holders:Curt Coder, Phill Harvey-Smith |
| 3 | 3 | #pragma once |
| 4 | 4 | |
| 5 | 5 | #ifndef __QL__ |
| 6 | 6 | #define __QL__ |
| 7 | 7 | |
| 8 | 8 | #include "emu.h" |
| 9 | | #include "bus/centronics/ctronics.h" |
| 10 | 9 | #include "bus/ql/exp.h" |
| 11 | 10 | #include "bus/ql/rom.h" |
| 12 | 11 | #include "bus/rs232/rs232.h" |
| 13 | 12 | #include "cpu/m68000/m68000.h" |
| 14 | 13 | #include "cpu/mcs48/mcs48.h" |
| 15 | | #include "cpu/mcs51/mcs51.h" |
| 16 | | #include "formats/basicdsk.h" |
| 17 | | #include "imagedev/cartslot.h" |
| 18 | | #include "imagedev/flopdrv.h" |
| 19 | | #include "imagedev/printer.h" |
| 20 | | #include "machine/ram.h" |
| 21 | 14 | #include "machine/microdrv.h" |
| 22 | | #include "machine/wd17xx.h" |
| 15 | #include "machine/qimi.h" |
| 16 | #include "machine/ram.h" |
| 23 | 17 | #include "machine/zx8302.h" |
| 24 | 18 | #include "sound/speaker.h" |
| 25 | 19 | #include "video/zx8301.h" |
| r30837 | r30838 | |
| 31 | 25 | #define I8051_TAG "i8051" |
| 32 | 26 | #define ZX8301_TAG "ic22" |
| 33 | 27 | #define ZX8302_TAG "ic23" |
| 34 | | #define WD1772_TAG "wd1772" |
| 35 | 28 | #define RS232_A_TAG "ser1" |
| 36 | 29 | #define RS232_B_TAG "ser2" |
| 30 | #define QIMI_TAG "qimi" |
| 37 | 31 | |
| 38 | | #define ROMBANK_TAG "rombank" |
| 39 | | #define RAMBANK_TAG "rambank" |
| 40 | | |
| 41 | | #define PRINTER_TAG "printer" |
| 42 | | |
| 43 | 32 | #define X1 XTAL_15MHz |
| 44 | 33 | #define X2 XTAL_32_768kHz |
| 45 | 34 | #define X3 XTAL_4_436MHz |
| 46 | 35 | #define X4 XTAL_11MHz |
| 47 | 36 | |
| 48 | | #define QL_CONFIG_PORT "config" |
| 49 | | #define QIMI_PORT_MASK 0x01 |
| 50 | | #define QIMI_NONE 0x00 |
| 51 | | #define QIMI_MOUSE 0x01 |
| 52 | | #define DISK_TYPE_MASK 0x06 |
| 53 | | #define DISK_TYPE_NONE 0x00 |
| 54 | | #define DISK_TYPE_TRUMP 0x02 |
| 55 | | #define DISK_TYPE_SANDY_SD 0x04 |
| 56 | | #define DISK_TYPE_SANDY_SQB 0x06 |
| 57 | | #define IS_SANDY_DISK(__dtype__) ((__dtype__ == DISK_TYPE_SANDY_SD) || (__dtype__ == DISK_TYPE_SANDY_SQB)) |
| 58 | | |
| 59 | | #define TRUMP_DRIVE1_MASK 0x01 |
| 60 | | #define TRUMP_DRIVE0_MASK 0x02 |
| 61 | | #define TRUMP_MOTOR_MASK 0x04 |
| 62 | | #define TRUMP_SIDE_SHIFT 3 |
| 63 | | #define TRUMP_SIDE_MASK (1 << TRUMP_SIDE_SHIFT) |
| 64 | | |
| 65 | | #define CART_ROM_BASE 0x0c000 |
| 66 | | #define CART_ROM_END 0x0ffff |
| 67 | | |
| 68 | | #define TRUMP_ROM_MBASE 0x10000 |
| 69 | | #define TRUMP_ROM_BASE 0x14000 |
| 70 | | #define TRUMP_ROM_LEN 0x08000 |
| 71 | | #define TRUMP_ROM_END (TRUMP_ROM_MBASE+(TRUMP_ROM_LEN-1)) |
| 72 | | |
| 73 | | #define TRUMP_IO_BASE 0x1c000 |
| 74 | | #define TRUMP_IO_LEN 0x04000 |
| 75 | | #define TRUMP_IO_END (TRUMP_IO_BASE+(TRUMP_IO_LEN-1)) |
| 76 | | |
| 77 | | #define SANDY_ROM_BASE_SD 0x1c000 |
| 78 | | #define SANDY_ROM_BASE_SQB 0x20000 |
| 79 | | #define SANDY_IO_BASE 0xc3fc0 |
| 80 | | #define SANDY_IO_LEN 0x00040 |
| 81 | | #define SANDY_IO_END (SANDY_IO_BASE+(SANDY_IO_LEN-1)) |
| 82 | | |
| 83 | | #define SANDY_DRIVE0_MASK 0x02 |
| 84 | | #define SANDY_DRIVE1_MASK 0x04 |
| 85 | | #define SANDY_MOTOR_MASK 0x08 |
| 86 | | #define SANDY_SIDE_SHIFT 0 |
| 87 | | #define SANDY_SIDE_MASK (1 << SANDY_SIDE_SHIFT) |
| 88 | | #define SANDY_DDEN_SHIFT 4 |
| 89 | | #define SANDY_DDEN_MASK (1 << SANDY_DDEN_SHIFT) |
| 90 | | #define SANDY_PRINTER_STROBE 0x20 |
| 91 | | #define SANDY_PRINTER_INTMASK 0x40 |
| 92 | | #define SANDY_MOUSE_INTMASK 0x80 |
| 93 | | |
| 94 | | #define MOUSEX_TAG "MOUSEX" |
| 95 | | #define MOUSEY_TAG "MOUSEY" |
| 96 | | #define MOUSEB_TAG "MOUSEB" |
| 97 | | |
| 98 | | // Mouse bits in Sandy port order |
| 99 | | #define MOUSE_MIDDLE 0x02 |
| 100 | | #define MOUSE_RIGHT 0x04 |
| 101 | | #define MOUSE_LEFT 0x08 |
| 102 | | #define MOUSE_DIRY 0x10 |
| 103 | | #define MOUSE_DIRX 0x20 |
| 104 | | #define MOUSE_INTY 0x40 |
| 105 | | #define MOUSE_INTX 0x80 |
| 106 | | #define MOUSE_INT_MASK (MOUSE_INTX | MOUSE_INTY) |
| 107 | | |
| 108 | | #define QIMI_IO_BASE 0x1bf9c |
| 109 | | #define QIMI_IO_LEN 0x22 |
| 110 | | #define QIMI_IO_END (QIMI_IO_BASE + QIMI_IO_LEN ) |
| 111 | | |
| 112 | | #define QIMI_INTX 0x04 |
| 113 | | #define QIMI_INTY 0x20 |
| 114 | | #define QIMI_DIRX 0x10 |
| 115 | | #define QIMI_DIRY 0x01 |
| 116 | | #define QIMI_LEFT 0x20 |
| 117 | | #define QIMI_RIGHT 0x10 |
| 118 | | #define QIMI_INT_MASK (QIMI_INTX | QIMI_INTY) |
| 119 | | |
| 120 | | |
| 121 | 37 | class ql_state : public driver_device |
| 122 | 38 | { |
| 123 | 39 | public: |
| 124 | | enum |
| 125 | | { |
| 126 | | TIMER_MOUSE_TICK, |
| 127 | | }; |
| 128 | | |
| 129 | | ql_state(const machine_config &mconfig, device_type type, const char *tag) |
| 130 | | : driver_device(mconfig, type, tag), |
| 131 | | m_maincpu(*this, M68008_TAG), |
| 132 | | m_ipc(*this, I8749_TAG), |
| 133 | | m_zx8301(*this, ZX8301_TAG), |
| 134 | | m_zx8302(*this, ZX8302_TAG), |
| 135 | | m_speaker(*this, "speaker"), |
| 136 | | m_mdv1(*this, MDV_1), |
| 137 | | m_mdv2(*this, MDV_2), |
| 138 | | m_ser1(*this, RS232_A_TAG), |
| 139 | | m_ser2(*this, RS232_A_TAG), |
| 140 | | m_ram(*this, RAM_TAG), |
| 141 | | m_fdc(*this, WD1772_TAG), |
| 142 | | m_printer(*this, PRINTER_TAG), |
| 143 | | m_y0(*this, "Y0"), |
| 144 | | m_y1(*this, "Y1"), |
| 145 | | m_y2(*this, "Y2"), |
| 146 | | m_y3(*this, "Y3"), |
| 147 | | m_y4(*this, "Y4"), |
| 148 | | m_y5(*this, "Y5"), |
| 149 | | m_y6(*this, "Y6"), |
| 150 | | m_y7(*this, "Y7"), |
| 151 | | m_joy0(*this, "JOY0"), |
| 152 | | m_joy1(*this, "JOY1"), |
| 153 | | m_config(*this, QL_CONFIG_PORT), |
| 154 | | m_mousex(*this, MOUSEX_TAG), |
| 155 | | m_mousey(*this, MOUSEY_TAG), |
| 156 | | m_mouseb(*this, MOUSEB_TAG) |
| 40 | ql_state(const machine_config &mconfig, device_type type, const char *tag) : |
| 41 | driver_device(mconfig, type, tag), |
| 42 | m_maincpu(*this, M68008_TAG), |
| 43 | m_ipc(*this, I8749_TAG), |
| 44 | m_zx8301(*this, ZX8301_TAG), |
| 45 | m_zx8302(*this, ZX8302_TAG), |
| 46 | m_speaker(*this, "speaker"), |
| 47 | m_mdv1(*this, MDV_1), |
| 48 | m_mdv2(*this, MDV_2), |
| 49 | m_ser1(*this, RS232_A_TAG), |
| 50 | m_ser2(*this, RS232_A_TAG), |
| 51 | m_ram(*this, RAM_TAG), |
| 52 | m_exp(*this, "exp"), |
| 53 | m_cart(*this, "rom"), |
| 54 | m_qimi(*this, QIMI_TAG), |
| 55 | m_rom(*this, M68008_TAG), |
| 56 | m_y0(*this, "Y0"), |
| 57 | m_y1(*this, "Y1"), |
| 58 | m_y2(*this, "Y2"), |
| 59 | m_y3(*this, "Y3"), |
| 60 | m_y4(*this, "Y4"), |
| 61 | m_y5(*this, "Y5"), |
| 62 | m_y6(*this, "Y6"), |
| 63 | m_y7(*this, "Y7"), |
| 64 | m_joy0(*this, "JOY0"), |
| 65 | m_joy1(*this, "JOY1"), |
| 66 | m_config(*this, "config") |
| 157 | 67 | { } |
| 158 | 68 | |
| 159 | 69 | required_device<cpu_device> m_maincpu; |
| r30837 | r30838 | |
| 166 | 76 | required_device<rs232_port_device> m_ser1; |
| 167 | 77 | required_device<rs232_port_device> m_ser2; |
| 168 | 78 | required_device<ram_device> m_ram; |
| 169 | | required_device<wd1772_device> m_fdc; |
| 170 | | required_device<printer_image_device> m_printer; |
| 79 | required_device<ql_expansion_slot_t> m_exp; |
| 80 | required_device<ql_rom_cartridge_slot_t> m_cart; |
| 81 | optional_device<qimi_t> m_qimi; |
| 82 | required_memory_region m_rom; |
| 171 | 83 | required_ioport m_y0; |
| 172 | 84 | required_ioport m_y1; |
| 173 | 85 | required_ioport m_y2; |
| r30837 | r30838 | |
| 178 | 90 | required_ioport m_y7; |
| 179 | 91 | required_ioport m_joy0; |
| 180 | 92 | required_ioport m_joy1; |
| 181 | | optional_ioport m_config; |
| 182 | | optional_ioport m_mousex; |
| 183 | | optional_ioport m_mousey; |
| 184 | | optional_ioport m_mouseb; |
| 93 | required_ioport m_config; |
| 185 | 94 | |
| 186 | 95 | virtual void machine_start(); |
| 187 | 96 | virtual void machine_reset(); |
| 188 | 97 | |
| 98 | DECLARE_READ8_MEMBER( read ); |
| 99 | DECLARE_WRITE8_MEMBER( write ); |
| 100 | |
| 189 | 101 | DECLARE_WRITE8_MEMBER( ipc_w ); |
| 190 | 102 | DECLARE_WRITE8_MEMBER( ipc_port1_w ); |
| 191 | 103 | DECLARE_WRITE8_MEMBER( ipc_port2_w ); |
| r30837 | r30838 | |
| 204 | 116 | DECLARE_WRITE_LINE_MEMBER( zx8302_raw2_w ); |
| 205 | 117 | DECLARE_READ_LINE_MEMBER( zx8302_raw2_r ); |
| 206 | 118 | |
| 207 | | /* IPC state */ |
| 119 | // IPC |
| 208 | 120 | UINT8 m_keylatch; |
| 209 | 121 | int m_ipl; |
| 210 | 122 | int m_comdata_to_ipc; |
| 211 | 123 | int m_baudx4; |
| 212 | 124 | |
| 213 | | // Trump card & Sandy superdisk |
| 214 | | DECLARE_READ8_MEMBER( disk_io_r ); |
| 215 | | DECLARE_WRITE8_MEMBER( disk_io_w ); |
| 216 | | DECLARE_READ8_MEMBER( trump_card_rom_r ); |
| 217 | | DECLARE_READ8_MEMBER( cart_rom_r ); |
| 218 | | |
| 219 | | void trump_card_set_control(UINT8 data); |
| 220 | | void sandy_set_control(UINT8 data); |
| 221 | | void sandy_print_char(UINT8 data); |
| 222 | | |
| 223 | | UINT8 m_disk_type; |
| 224 | | int m_disk_io_base; |
| 225 | | UINT8 m_disk_io_byte; |
| 226 | | UINT8 m_printer_char; |
| 227 | | DECLARE_READ_LINE_MEMBER(disk_io_dden_r); |
| 228 | | DECLARE_WRITE_LINE_MEMBER(disk_io_intrq_w); |
| 229 | | DECLARE_WRITE_LINE_MEMBER(disk_io_drq_w); |
| 230 | | |
| 231 | | DECLARE_WRITE_LINE_MEMBER( sandy_printer_busy ); |
| 232 | | |
| 233 | | // QIMI or Sandy mouse |
| 234 | | void mouse_tick(); |
| 235 | | |
| 236 | | DECLARE_READ8_MEMBER( qimi_io_r ); |
| 237 | | DECLARE_WRITE8_MEMBER( qimi_io_w ); |
| 238 | | |
| 239 | | UINT8 m_mouse_int; |
| 240 | | |
| 241 | | emu_timer *m_mouse_timer; |
| 242 | | |
| 243 | | UINT8 m_ql_mouse_x; |
| 244 | | UINT8 m_ql_mouse_y; |
| 245 | | |
| 246 | | protected: |
| 247 | | virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); |
| 248 | | |
| 125 | // QIMI |
| 126 | bool m_qimi_enabled; |
| 249 | 127 | }; |
| 250 | 128 | |
| 251 | 129 | #endif |
trunk/src/mess/drivers/ql.c
| r30837 | r30838 | |
| 1 | 1 | // license:BSD-3-Clause |
| 2 | | // copyright-holders:Curt Coder |
| 2 | // copyright-holders:Curt Coder, Phill Harvey-Smith |
| 3 | 3 | /* |
| 4 | 4 | |
| 5 | 5 | Sinclair QL |
| r30837 | r30838 | |
| 12 | 12 | |
| 13 | 13 | TODO: |
| 14 | 14 | |
| 15 | | - slotify cartridges |
| 15 | - QIMI/Sandy mice |
| 16 | 16 | - microdrive |
| 17 | 17 | - ZX8301 memory access slowdown |
| 18 | 18 | - use resnet.h to create palette |
| r30837 | r30838 | |
| 46 | 46 | |
| 47 | 47 | The trump card has some interesting memory mapping and re-mapping during initialisation which goes like this |
| 48 | 48 | |
| 49 | | On rest the card ram is mapped into the entire $40000-$fffff area, this is the official 512K expansion ram area |
| 49 | On reset the card ram is mapped into the entire $40000-$fffff area, this is the official 512K expansion ram area |
| 50 | 50 | plus the area set aside for addon card roms. The trump card onboard rom is also mapped in at $10000-$17fff. |
| 51 | 51 | |
| 52 | 52 | The main bios then performs a series of loops that initialise and size the ram, this will find either |
| r30837 | r30838 | |
| 74 | 74 | |
| 75 | 75 | */ |
| 76 | 76 | |
| 77 | | |
| 78 | 77 | #include "includes/ql.h" |
| 79 | | #include "debugger.h" |
| 80 | 78 | |
| 81 | | #define LOG_DISK_WRITE 0 |
| 82 | | #define LOG_DISK_READ 0 |
| 83 | 79 | |
| 84 | | void ql_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) |
| 80 | |
| 81 | //************************************************************************** |
| 82 | // ADDRESS DECODING |
| 83 | //************************************************************************** |
| 84 | |
| 85 | //------------------------------------------------- |
| 86 | // read - |
| 87 | //------------------------------------------------- |
| 88 | |
| 89 | READ8_MEMBER( ql_state::read ) |
| 85 | 90 | { |
| 86 | | switch (id) |
| 91 | UINT8 data = 0; |
| 92 | int cart_romoeh = 0; |
| 93 | int exp_romoeh = 0; |
| 94 | |
| 95 | if (offset < 0xc000) |
| 87 | 96 | { |
| 88 | | case TIMER_MOUSE_TICK: |
| 89 | | mouse_tick(); |
| 90 | | break; |
| 91 | | default: |
| 92 | | assert_always(FALSE, "Unknown id in ql_state::device_timer"); |
| 97 | data = m_rom->base()[offset]; |
| 93 | 98 | } |
| 99 | if (offset >= 0xc000 && offset < 0x10000) |
| 100 | { |
| 101 | cart_romoeh = 1; |
| 102 | } |
| 103 | if (offset >= 0x18000 && offset <= 0x18003) |
| 104 | { |
| 105 | data = m_zx8302->rtc_r(space, offset & 0x03); |
| 106 | } |
| 107 | if (offset == 0x18020) |
| 108 | { |
| 109 | data = m_zx8302->status_r(space, 0); |
| 110 | } |
| 111 | if (offset == 0x18021) |
| 112 | { |
| 113 | data = m_zx8302->irq_status_r(space, 0); |
| 114 | } |
| 115 | if (offset >= 0x18022 && offset <= 0x18023) |
| 116 | { |
| 117 | data = m_zx8302->mdv_track_r(space, offset & 0x01); |
| 118 | } |
| 119 | if (offset >= 0x20000 && offset < 0x40000) |
| 120 | { |
| 121 | data = m_zx8301->data_r(space, offset & 0x1ffff); |
| 122 | } |
| 123 | if (offset >= 0xc0000) |
| 124 | { |
| 125 | exp_romoeh = 1; |
| 126 | } |
| 127 | if (m_qimi_enabled && offset >= QIMI_IO_BASE && offset <= QIMI_IO_END) |
| 128 | { |
| 129 | data = m_qimi->read(space, offset - QIMI_IO_BASE); |
| 130 | } |
| 131 | |
| 132 | m_cart->romoeh_w(cart_romoeh); |
| 133 | data = m_cart->read(space, offset & 0x7fff, data); |
| 134 | m_cart->romoeh_w(0); |
| 135 | |
| 136 | m_exp->romoeh_w(exp_romoeh); |
| 137 | data = m_exp->read(space, offset, data); |
| 138 | m_exp->romoeh_w(0); |
| 139 | |
| 140 | return data; |
| 94 | 141 | } |
| 95 | 142 | |
| 143 | |
| 144 | //------------------------------------------------- |
| 145 | // write - |
| 146 | //------------------------------------------------- |
| 147 | |
| 148 | WRITE8_MEMBER( ql_state::write ) |
| 149 | { |
| 150 | if (offset >= 0x18000 && offset <= 0x18001) |
| 151 | { |
| 152 | m_zx8302->rtc_w(space, offset & 0x01, data); |
| 153 | } |
| 154 | if (offset == 0x18002) |
| 155 | { |
| 156 | m_zx8302->control_w(space, 0, data); |
| 157 | } |
| 158 | if (offset == 0x18003) |
| 159 | { |
| 160 | m_zx8302->ipc_command_w(space, 0, data); |
| 161 | } |
| 162 | if (offset == 0x18020) |
| 163 | { |
| 164 | m_zx8302->mdv_control_w(space, 0, data); |
| 165 | } |
| 166 | if (offset == 0x18021) |
| 167 | { |
| 168 | m_zx8302->irq_acknowledge_w(space, 0, data); |
| 169 | } |
| 170 | if (offset == 0x18022) |
| 171 | { |
| 172 | m_zx8302->data_w(space, 0, data); |
| 173 | } |
| 174 | if (offset == 0x18063) |
| 175 | { |
| 176 | m_zx8301->control_w(space, 0, data); |
| 177 | } |
| 178 | if (offset >= 0x20000 && offset < 0x40000) |
| 179 | { |
| 180 | m_zx8301->data_w(space, offset & 0x1ffff, data); |
| 181 | } |
| 182 | if (m_qimi_enabled && offset >= QIMI_IO_BASE && offset <= QIMI_IO_END) |
| 183 | { |
| 184 | m_qimi->write(space, offset - QIMI_IO_BASE, data); |
| 185 | } |
| 186 | |
| 187 | m_cart->romoeh_w(0); |
| 188 | m_cart->write(space, offset & 0x7fff, data); |
| 189 | |
| 190 | m_exp->romoeh_w(0); |
| 191 | m_exp->write(space, offset, data); |
| 192 | } |
| 193 | |
| 194 | |
| 195 | |
| 96 | 196 | //************************************************************************** |
| 97 | 197 | // INTELLIGENT PERIPHERAL CONTROLLER |
| 98 | 198 | //************************************************************************** |
| r30837 | r30838 | |
| 261 | 361 | return data; |
| 262 | 362 | } |
| 263 | 363 | |
| 264 | | READ8_MEMBER( ql_state::disk_io_r ) |
| 265 | | { |
| 266 | | UINT8 result = 0; |
| 267 | 364 | |
| 268 | | if(LOG_DISK_READ) |
| 269 | | logerror("%s DiskIO:Read of %08X\n",machine().describe_context(),m_disk_io_base+offset); |
| 270 | 365 | |
| 271 | | switch (offset) |
| 272 | | { |
| 273 | | case 0x0000 : result=m_fdc->read(space, offset); break; |
| 274 | | case 0x0001 : result=m_fdc->read(space, offset); break; |
| 275 | | case 0x0002 : result=m_fdc->read(space, offset); break; |
| 276 | | case 0x0003 : result=m_fdc->read(space, offset); break; |
| 277 | | case 0x000C : if(IS_SANDY_DISK(m_disk_type)) |
| 278 | | result = (m_mouse_int ^ MOUSE_DIRX) | m_mouseb->read() | 0x01; break; |
| 279 | | case 0x0010 : if(IS_SANDY_DISK(m_disk_type)) |
| 280 | | m_mouse_int &= ~MOUSE_INT_MASK; break; |
| 281 | | default : logerror("%s DiskIO undefined read : from %08X\n",machine().describe_context(),m_disk_io_base+offset); break; |
| 282 | | } |
| 283 | 366 | |
| 284 | | return result; |
| 285 | | } |
| 286 | | |
| 287 | | WRITE8_MEMBER( ql_state::disk_io_w ) |
| 288 | | { |
| 289 | | if(LOG_DISK_WRITE) |
| 290 | | logerror("%s DiskIO:Write %02X to %08X\n",machine().describe_context(),data,m_disk_io_base+offset); |
| 291 | | |
| 292 | | switch (offset) |
| 293 | | { |
| 294 | | case 0x0000 : m_fdc->write(space, offset, data); break; |
| 295 | | case 0x0001 : m_fdc->write(space, offset, data); break; |
| 296 | | case 0x0002 : m_fdc->write(space, offset, data); break; |
| 297 | | case 0x0003 : m_fdc->write(space, offset, data); break; |
| 298 | | case 0x0004 : if(IS_SANDY_DISK(m_disk_type)) |
| 299 | | sandy_set_control(data);break; |
| 300 | | case 0x0008 : if(IS_SANDY_DISK(m_disk_type)) |
| 301 | | sandy_print_char(data); break; |
| 302 | | case 0x0010 : if(IS_SANDY_DISK(m_disk_type)) |
| 303 | | m_mouse_int &= ~MOUSE_INT_MASK; break; |
| 304 | | case 0x2000 : if(m_disk_type==DISK_TYPE_TRUMP) |
| 305 | | trump_card_set_control(data);break; |
| 306 | | default : logerror("%s DiskIO undefined write : %02X to %08X\n",machine().describe_context(),data,m_disk_io_base+offset); break; |
| 307 | | } |
| 308 | | } |
| 309 | | |
| 310 | | READ8_MEMBER( ql_state::trump_card_rom_r ) |
| 311 | | { |
| 312 | | // If we have more than 640K them map extra ram into top 256K |
| 313 | | // else just map to unmap. |
| 314 | | if (m_ram->size()>(640*1024)) |
| 315 | | space.install_ram(0x0c0000, 0x0fffff, NULL); |
| 316 | | else |
| 317 | | space.unmap_readwrite(0x0c0000, 0x0fffff); |
| 318 | | |
| 319 | | // Setup trumcard rom mapped to rom so unlink us |
| 320 | | space.install_rom(0x010000, 0x018000, &memregion(M68008_TAG)->base()[TRUMP_ROM_BASE]); |
| 321 | | |
| 322 | | return memregion(M68008_TAG)->base()[TRUMP_ROM_BASE+offset]; |
| 323 | | } |
| 324 | | |
| 325 | | READ8_MEMBER( ql_state::cart_rom_r ) |
| 326 | | { |
| 327 | | // Setup trumcard rom mapped in at $c0000 |
| 328 | | space.install_rom(0x0c0000, 0x0c8000, &memregion(M68008_TAG)->base()[TRUMP_ROM_BASE]); |
| 329 | | |
| 330 | | // Setup cart rom to rom handler, so unlink us |
| 331 | | space.install_rom(0x0c000, 0x0ffff, &memregion(M68008_TAG)->base()[CART_ROM_BASE]); |
| 332 | | |
| 333 | | return memregion(M68008_TAG)->base()[CART_ROM_BASE+offset]; |
| 334 | | } |
| 335 | | |
| 336 | | void ql_state::trump_card_set_control(UINT8 data) |
| 337 | | { |
| 338 | | if(data & TRUMP_DRIVE0_MASK) |
| 339 | | m_fdc->set_drive(0); |
| 340 | | |
| 341 | | if(data & TRUMP_DRIVE1_MASK) |
| 342 | | m_fdc->set_drive(1); |
| 343 | | |
| 344 | | m_fdc->set_side((data & TRUMP_SIDE_MASK) >> TRUMP_SIDE_SHIFT); |
| 345 | | } |
| 346 | | |
| 347 | | void ql_state::sandy_set_control(UINT8 data) |
| 348 | | { |
| 349 | | //logerror("sandy_set_control:%02X\n",data); |
| 350 | | |
| 351 | | if(data & SANDY_DRIVE0_MASK) |
| 352 | | m_fdc->set_drive(0); |
| 353 | | |
| 354 | | if(data & SANDY_DRIVE1_MASK) |
| 355 | | m_fdc->set_drive(1); |
| 356 | | |
| 357 | | m_fdc->set_side((data & SANDY_SIDE_MASK) >> SANDY_SIDE_SHIFT); |
| 358 | | if ((data & SANDY_SIDE_MASK) && (LOG_DISK_READ | LOG_DISK_WRITE)) |
| 359 | | { |
| 360 | | logerror("Accessing side 1\n"); |
| 361 | | } |
| 362 | | |
| 363 | | if (m_printer->is_ready()) |
| 364 | | { |
| 365 | | if(data & SANDY_PRINTER_STROBE) |
| 366 | | m_printer->output(m_printer_char); |
| 367 | | |
| 368 | | if(data & SANDY_PRINTER_INTMASK) |
| 369 | | m_zx8302->extint_w(ASSERT_LINE); |
| 370 | | } |
| 371 | | |
| 372 | | m_disk_io_byte=data; |
| 373 | | } |
| 374 | | |
| 375 | | void ql_state::sandy_print_char(UINT8 data) |
| 376 | | { |
| 377 | | // latch the data until it's strobed out |
| 378 | | m_printer_char=data; |
| 379 | | |
| 380 | | // m_centronics->write(data); |
| 381 | | } |
| 382 | | |
| 383 | | WRITE_LINE_MEMBER( ql_state::sandy_printer_busy ) |
| 384 | | { |
| 385 | | if ((state == ASSERT_LINE) && (m_disk_io_byte & SANDY_PRINTER_INTMASK)) |
| 386 | | { |
| 387 | | logerror("sandy_print_char : triggering extint\n"); |
| 388 | | m_zx8302->extint_w(ASSERT_LINE); |
| 389 | | } |
| 390 | | } |
| 391 | | |
| 392 | | READ_LINE_MEMBER(ql_state::disk_io_dden_r) |
| 393 | | { |
| 394 | | if(IS_SANDY_DISK(m_disk_type)) |
| 395 | | return ((m_disk_io_byte & SANDY_DDEN_MASK) >> SANDY_DDEN_SHIFT); |
| 396 | | else |
| 397 | | return 0; |
| 398 | | } |
| 399 | | |
| 400 | | WRITE_LINE_MEMBER(ql_state::disk_io_intrq_w) |
| 401 | | { |
| 402 | | //logerror("DiskIO:intrq = %d\n",state); |
| 403 | | } |
| 404 | | |
| 405 | | WRITE_LINE_MEMBER(ql_state::disk_io_drq_w) |
| 406 | | { |
| 407 | | //logerror("DiskIO:drq = %d\n",state); |
| 408 | | } |
| 409 | | |
| 410 | | void ql_state::mouse_tick() |
| 411 | | { |
| 412 | | UINT8 x = m_mousex->read(); |
| 413 | | UINT8 y = m_mousey->read(); |
| 414 | | UINT8 do_int = 0; |
| 415 | | |
| 416 | | //m_mouse_int = 0; |
| 417 | | |
| 418 | | // Set X interupt flag and direction if x has changed |
| 419 | | if (x > m_ql_mouse_x) |
| 420 | | { |
| 421 | | m_mouse_int |= MOUSE_INTX; |
| 422 | | m_mouse_int |= MOUSE_DIRX; |
| 423 | | } |
| 424 | | else if (x < m_ql_mouse_x) |
| 425 | | { |
| 426 | | m_mouse_int |= MOUSE_INTX; |
| 427 | | m_mouse_int &= ~MOUSE_DIRX; |
| 428 | | } |
| 429 | | |
| 430 | | // Set Y interupt flag and direction if y has changed |
| 431 | | if (y > m_ql_mouse_y) |
| 432 | | { |
| 433 | | m_mouse_int |= MOUSE_INTY; |
| 434 | | m_mouse_int &= ~MOUSE_DIRY; |
| 435 | | } |
| 436 | | else if (y < m_ql_mouse_y) |
| 437 | | { |
| 438 | | m_mouse_int |= MOUSE_INTY; |
| 439 | | m_mouse_int |= MOUSE_DIRY; |
| 440 | | } |
| 441 | | |
| 442 | | // Update saved location |
| 443 | | m_ql_mouse_x = x; |
| 444 | | m_ql_mouse_y = y; |
| 445 | | |
| 446 | | // if it is a QIMI, then always do int if triggered. |
| 447 | | // if this is a Sandy mouse, only trigger an int if it is enabled in the mask register |
| 448 | | if (m_config->read() & QIMI_MOUSE) |
| 449 | | do_int = 1; |
| 450 | | else |
| 451 | | do_int = IS_SANDY_DISK(m_disk_type) && (m_disk_io_byte & SANDY_MOUSE_INTMASK); |
| 452 | | |
| 453 | | //logerror("m_mouse_int=%02X, MOUSE_INT_MASK=%02X, m_disk_io_byte=%02X, (m_disk_io_byte & SANDY_MOUSE_INTMASK)=%02x\n",m_mouse_int,MOUSE_INT_MASK,m_disk_io_byte,(m_disk_io_byte & SANDY_MOUSE_INTMASK)); |
| 454 | | |
| 455 | | // if mouse moved trigger external int |
| 456 | | if((m_mouse_int & MOUSE_INT_MASK) && do_int) |
| 457 | | { |
| 458 | | m_zx8302->extint_w(ASSERT_LINE); |
| 459 | | } |
| 460 | | } |
| 461 | | |
| 462 | | READ8_MEMBER( ql_state::qimi_io_r ) |
| 463 | | { |
| 464 | | UINT8 result = 0; |
| 465 | | UINT8 buttons; |
| 466 | | |
| 467 | | switch (offset) |
| 468 | | { |
| 469 | | // 0x1bf9c, button status |
| 470 | | case 0x00 : |
| 471 | | buttons = m_mouseb->read(); |
| 472 | | result = ((buttons & MOUSE_RIGHT) << 2) | ((buttons & MOUSE_LEFT) << 2); |
| 473 | | break; |
| 474 | | |
| 475 | | // 0x1bfbc, direction status |
| 476 | | case 0x20 : |
| 477 | | result = ((m_mouse_int & MOUSE_INTX) >> 5) | ((m_mouse_int & MOUSE_INTY) >> 1) | |
| 478 | | ((m_mouse_int & MOUSE_DIRX) >> 1) | ((m_mouse_int & MOUSE_DIRY) >> 4); |
| 479 | | break; |
| 480 | | case 0x22 : |
| 481 | | m_mouse_int &= ~MOUSE_INT_MASK; |
| 482 | | break; |
| 483 | | } |
| 484 | | |
| 485 | | return result; |
| 486 | | } |
| 487 | | |
| 488 | | WRITE8_MEMBER( ql_state::qimi_io_w ) |
| 489 | | { |
| 490 | | // write to 0x1bfbe resets int status |
| 491 | | if (offset == 0x22) |
| 492 | | { |
| 493 | | m_mouse_int = 0; |
| 494 | | } |
| 495 | | } |
| 496 | | |
| 497 | 367 | //************************************************************************** |
| 498 | 368 | // ADDRESS MAPS |
| 499 | 369 | //************************************************************************** |
| r30837 | r30838 | |
| 503 | 373 | //------------------------------------------------- |
| 504 | 374 | |
| 505 | 375 | static ADDRESS_MAP_START( ql_mem, AS_PROGRAM, 8, ql_state ) |
| 506 | | AM_RANGE(0x000000, 0x00bfff) AM_ROM // 48K System ROM |
| 507 | | AM_RANGE(0x00c000, 0x00ffff) AM_ROM AM_WRITENOP // 16K Cartridge ROM |
| 508 | | AM_RANGE(0x010000, 0x017fff) AM_UNMAP // Trump card ROM is mapped in here |
| 509 | | AM_RANGE(0x018000, 0x018003) AM_DEVREAD(ZX8302_TAG, zx8302_device, rtc_r) |
| 510 | | AM_RANGE(0x018000, 0x018001) AM_DEVWRITE(ZX8302_TAG, zx8302_device, rtc_w) |
| 511 | | AM_RANGE(0x018002, 0x018002) AM_DEVWRITE(ZX8302_TAG, zx8302_device, control_w) |
| 512 | | AM_RANGE(0x018003, 0x018003) AM_DEVWRITE(ZX8302_TAG, zx8302_device, ipc_command_w) |
| 513 | | AM_RANGE(0x018020, 0x018020) AM_DEVREADWRITE(ZX8302_TAG, zx8302_device, status_r, mdv_control_w) |
| 514 | | AM_RANGE(0x018021, 0x018021) AM_DEVREADWRITE(ZX8302_TAG, zx8302_device, irq_status_r, irq_acknowledge_w) |
| 515 | | AM_RANGE(0x018022, 0x018022) AM_DEVREADWRITE(ZX8302_TAG, zx8302_device, mdv_track_r, data_w) |
| 516 | | AM_RANGE(0x018023, 0x018023) AM_DEVREAD(ZX8302_TAG, zx8302_device, mdv_track_r) AM_WRITENOP |
| 517 | | AM_RANGE(0x018063, 0x018063) AM_DEVWRITE(ZX8301_TAG, zx8301_device, control_w) |
| 518 | | AM_RANGE(0x01c000, 0x01ffff) AM_UNMAP // 16K Expansion I/O |
| 519 | | AM_RANGE(0x020000, 0x03ffff) AM_DEVREADWRITE(ZX8301_TAG, zx8301_device, data_r, data_w) |
| 520 | | AM_RANGE(0x040000, 0x0fffff) AM_RAM |
| 376 | AM_RANGE(0x000000, 0x0fffff) AM_READWRITE(read, write) |
| 521 | 377 | ADDRESS_MAP_END |
| 522 | 378 | |
| 523 | 379 | |
| r30837 | r30838 | |
| 645 | 501 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_CODE(KEYCODE_SPACE) |
| 646 | 502 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(2) PORT_8WAY PORT_CODE(KEYCODE_DOWN) |
| 647 | 503 | |
| 648 | | |
| 649 | | PORT_START(QL_CONFIG_PORT) |
| 650 | | PORT_CONFNAME( QIMI_PORT_MASK, QIMI_NONE, "QIMI enabled") |
| 651 | | PORT_CONFSETTING( QIMI_NONE, "No" ) |
| 652 | | PORT_CONFSETTING( QIMI_MOUSE, "Yes" ) |
| 653 | | |
| 654 | | PORT_CONFNAME( DISK_TYPE_MASK, DISK_TYPE_NONE, "Disk interface select" ) |
| 655 | | PORT_CONFSETTING(DISK_TYPE_NONE, DEF_STR( None )) |
| 656 | | PORT_CONFSETTING(DISK_TYPE_TRUMP, "Miracle Trump card") |
| 657 | | PORT_CONFSETTING(DISK_TYPE_SANDY_SD, "Sandy Superdisk") |
| 658 | | PORT_CONFSETTING(DISK_TYPE_SANDY_SQB,"Sandy SuperQBoard") |
| 659 | | |
| 660 | | |
| 661 | | PORT_START(MOUSEX_TAG) |
| 662 | | PORT_BIT( 0xff, 0x00, IPT_MOUSE_X ) PORT_SENSITIVITY(50) PORT_KEYDELTA(5) PORT_MINMAX(0, 255) PORT_PLAYER(1) |
| 663 | | |
| 664 | | PORT_START(MOUSEY_TAG) |
| 665 | | PORT_BIT( 0xff, 0x00, IPT_MOUSE_Y ) PORT_SENSITIVITY(50) PORT_KEYDELTA(5) PORT_MINMAX(0, 255) PORT_PLAYER(1) |
| 666 | | |
| 667 | | PORT_START(MOUSEB_TAG) /* Mouse buttons */ |
| 668 | | PORT_BIT( MOUSE_RIGHT, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_NAME("Mouse Button 1") PORT_CODE(MOUSECODE_BUTTON1) |
| 669 | | PORT_BIT( MOUSE_LEFT, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_NAME("Mouse Button 2") PORT_CODE(MOUSECODE_BUTTON2) |
| 670 | | PORT_BIT( MOUSE_MIDDLE, IP_ACTIVE_LOW, IPT_BUTTON3) PORT_NAME("Mouse Button 3") PORT_CODE(MOUSECODE_BUTTON3) |
| 671 | | |
| 504 | PORT_START("config") |
| 505 | PORT_CONFNAME( 0x01, 0x00, "QL Internal Mouse Interface (QIMI)") |
| 506 | PORT_CONFSETTING( 0x00, DEF_STR( Off ) ) |
| 507 | PORT_CONFSETTING( 0x01, DEF_STR( On ) ) |
| 672 | 508 | INPUT_PORTS_END |
| 673 | 509 | |
| 674 | 510 | |
| r30837 | r30838 | |
| 886 | 722 | return m_mdv1->data2_r() | m_mdv2->data2_r(); |
| 887 | 723 | } |
| 888 | 724 | |
| 889 | | //------------------------------------------------- |
| 890 | | // floppy_interface ql_floppy_interface |
| 891 | | //------------------------------------------------- |
| 892 | 725 | |
| 893 | | static LEGACY_FLOPPY_OPTIONS_START( ql ) |
| 894 | | LEGACY_FLOPPY_OPTION(ql, "dsk", "SSDD 40 track disk image", basicdsk_identify_default, basicdsk_construct_default, NULL, |
| 895 | | HEADS([1]) |
| 896 | | TRACKS([40]) |
| 897 | | SECTORS([9]) |
| 898 | | SECTOR_LENGTH([512]) |
| 899 | | FIRST_SECTOR_ID([1])) |
| 900 | | LEGACY_FLOPPY_OPTION(ql, "dsk", "DSDD 40 track disk image", basicdsk_identify_default, basicdsk_construct_default, NULL, |
| 901 | | HEADS([2]) |
| 902 | | TRACKS([40]) |
| 903 | | SECTORS([9]) |
| 904 | | SECTOR_LENGTH([512]) |
| 905 | | FIRST_SECTOR_ID([1])) |
| 906 | | LEGACY_FLOPPY_OPTION(ql, "dsk", "DSDD 80 track disk image", basicdsk_identify_default, basicdsk_construct_default, NULL, |
| 907 | | HEADS([2]) |
| 908 | | TRACKS([80]) |
| 909 | | SECTORS([9]) |
| 910 | | SECTOR_LENGTH([512]) |
| 911 | | FIRST_SECTOR_ID([1])) |
| 912 | | LEGACY_FLOPPY_OPTION(ql, "dsk", "DSHD 80 track disk image", basicdsk_identify_default, basicdsk_construct_default, NULL, |
| 913 | | HEADS([2]) |
| 914 | | TRACKS([80]) |
| 915 | | SECTORS([18]) |
| 916 | | SECTOR_LENGTH([512]) |
| 917 | | FIRST_SECTOR_ID([1])) |
| 918 | | LEGACY_FLOPPY_OPTION(ql, "dsk", "DSED disk 80 track image", basicdsk_identify_default, basicdsk_construct_default, NULL, |
| 919 | | HEADS([2]) |
| 920 | | TRACKS([80]) |
| 921 | | SECTORS([40]) |
| 922 | | SECTOR_LENGTH([512]) |
| 923 | | FIRST_SECTOR_ID([1])) |
| 924 | | LEGACY_FLOPPY_OPTION(ql, "img", "QDOS 800KB disk image", basicdsk_identify_default, basicdsk_construct_default, NULL, |
| 925 | | HEADS([2]) |
| 926 | | TRACKS([80]) |
| 927 | | SECTORS([5]) |
| 928 | | SECTOR_LENGTH([1024]) |
| 929 | | FIRST_SECTOR_ID([1])) |
| 930 | | LEGACY_FLOPPY_OPTIONS_END |
| 931 | 726 | |
| 932 | | static const floppy_interface ql_floppy_interface = |
| 933 | | { |
| 934 | | FLOPPY_STANDARD_5_25_DSHD, |
| 935 | | LEGACY_FLOPPY_OPTIONS_NAME(ql), |
| 936 | | NULL |
| 937 | | }; |
| 938 | | |
| 939 | 727 | //************************************************************************** |
| 940 | 728 | // MACHINE INITIALIZATION |
| 941 | 729 | //************************************************************************** |
| 942 | 730 | |
| 943 | | //------------------------------------------------- |
| 944 | | // MACHINE_START( ql ) |
| 945 | | //------------------------------------------------- |
| 946 | | |
| 947 | | // |
| 948 | | // The 896K option is dealt with once the machine is up and running as |
| 949 | | // the Trump Card ROM is initally mapped in at $C0000-$C8000, as this is |
| 950 | | // officially the expansion card rom area. Once the Trump Card has initialised |
| 951 | | // it maps the last 256K of ram into this area (asuming that it has 768K |
| 952 | | // onboard). |
| 953 | | // |
| 954 | | |
| 955 | 731 | void ql_state::machine_start() |
| 956 | 732 | { |
| 957 | 733 | // register for state saving |
| r30837 | r30838 | |
| 959 | 735 | save_item(NAME(m_ipl)); |
| 960 | 736 | save_item(NAME(m_comdata_to_ipc)); |
| 961 | 737 | save_item(NAME(m_baudx4)); |
| 962 | | save_item(NAME(m_printer_char)); |
| 963 | | save_item(NAME(m_disk_io_byte)); |
| 964 | | |
| 965 | | // QIMI QL Internal Mouse Interface |
| 966 | | if (m_mousex) |
| 967 | | { |
| 968 | | m_mouse_timer = timer_alloc(TIMER_MOUSE_TICK); |
| 969 | | m_mouse_timer->adjust(attotime::zero, 0, attotime::from_hz(500)); |
| 970 | | } |
| 971 | 738 | } |
| 972 | 739 | |
| 973 | 740 | void ql_state::machine_reset() |
| 974 | 741 | { |
| 975 | | address_space &program = m_maincpu->space(AS_PROGRAM); |
| 742 | // QIMI |
| 743 | m_qimi_enabled = (m_config->read() & 0x01) ? true : false; |
| 744 | } |
| 976 | 745 | |
| 977 | | m_disk_type=m_config->read() & DISK_TYPE_MASK; |
| 978 | | logerror("disktype=%d\n",m_disk_type); |
| 979 | 746 | |
| 980 | | m_printer_char=0; |
| 981 | | m_disk_io_byte=0; |
| 982 | | m_mouse_int = 0; |
| 983 | 747 | |
| 984 | | logerror("Configuring RAM %d\n",m_ram->size() / 1024); |
| 985 | | |
| 986 | | // configure RAM |
| 987 | | switch (m_ram->size()) |
| 988 | | { |
| 989 | | case 128*1024: |
| 990 | | program.unmap_readwrite(0x040000, 0x0fffff); |
| 991 | | break; |
| 992 | | |
| 993 | | case 192*1024: |
| 994 | | program.unmap_readwrite(0x050000, 0x0fffff); |
| 995 | | break; |
| 996 | | |
| 997 | | case 256*1024: |
| 998 | | program.unmap_readwrite(0x060000, 0x0fffff); |
| 999 | | break; |
| 1000 | | |
| 1001 | | case 384*1024: |
| 1002 | | program.unmap_readwrite(0x080000, 0x0fffff); |
| 1003 | | break; |
| 1004 | | |
| 1005 | | case 640*1024: |
| 1006 | | program.unmap_readwrite(0x0c0000, 0x0fffff); |
| 1007 | | break; |
| 1008 | | } |
| 1009 | | |
| 1010 | | switch (m_disk_type) |
| 1011 | | { |
| 1012 | | case DISK_TYPE_SANDY_SD : |
| 1013 | | logerror("Configuring Sandy SuperDisk\n"); |
| 1014 | | program.install_rom(0x0c0000, 0x0c3fff, &memregion(M68008_TAG)->base()[SANDY_ROM_BASE_SD]); |
| 1015 | | program.install_read_handler(SANDY_IO_BASE, SANDY_IO_END, 0, 0, read8_delegate(FUNC(ql_state::disk_io_r), this)); |
| 1016 | | program.install_write_handler(SANDY_IO_BASE, SANDY_IO_END, 0, 0, write8_delegate(FUNC(ql_state::disk_io_w), this)); |
| 1017 | | m_disk_io_base=SANDY_IO_BASE; |
| 1018 | | break; |
| 1019 | | |
| 1020 | | case DISK_TYPE_SANDY_SQB : |
| 1021 | | logerror("Configuring Sandy SuperQBoard\n"); |
| 1022 | | program.install_rom(0x0c0000, 0x0c7fff, &memregion(M68008_TAG)->base()[SANDY_ROM_BASE_SQB]); |
| 1023 | | program.install_read_handler(SANDY_IO_BASE, SANDY_IO_END, 0, 0, read8_delegate(FUNC(ql_state::disk_io_r), this)); |
| 1024 | | program.install_write_handler(SANDY_IO_BASE, SANDY_IO_END, 0, 0, write8_delegate(FUNC(ql_state::disk_io_w), this)); |
| 1025 | | m_disk_io_base=SANDY_IO_BASE; |
| 1026 | | break; |
| 1027 | | |
| 1028 | | case DISK_TYPE_TRUMP : |
| 1029 | | logerror("Configuring TrumpCard\n"); |
| 1030 | | program.install_read_handler(CART_ROM_BASE, CART_ROM_END, 0, 0, read8_delegate(FUNC(ql_state::cart_rom_r), this)); |
| 1031 | | program.install_read_handler(TRUMP_ROM_MBASE, TRUMP_ROM_END, 0, 0, read8_delegate(FUNC(ql_state::trump_card_rom_r), this)); |
| 1032 | | program.install_read_handler(TRUMP_IO_BASE, TRUMP_IO_END, 0, 0, read8_delegate(FUNC(ql_state::disk_io_r), this)); |
| 1033 | | program.install_write_handler(TRUMP_IO_BASE, TRUMP_IO_END, 0, 0, write8_delegate(FUNC(ql_state::disk_io_w), this)); |
| 1034 | | m_disk_io_base=TRUMP_IO_BASE; |
| 1035 | | break; |
| 1036 | | } |
| 1037 | | |
| 1038 | | |
| 1039 | | // QIMI QL Internal Mouse Interface |
| 1040 | | if (m_config->read() & QIMI_MOUSE) |
| 1041 | | { |
| 1042 | | logerror("QIMI enabled\n"); |
| 1043 | | program.install_read_handler(QIMI_IO_BASE, QIMI_IO_END, 0, 0, read8_delegate(FUNC(ql_state::qimi_io_r), this)); |
| 1044 | | program.install_write_handler(QIMI_IO_BASE, QIMI_IO_END, 0, 0, write8_delegate(FUNC(ql_state::qimi_io_w), this)); |
| 1045 | | } |
| 1046 | | } |
| 1047 | | |
| 1048 | 748 | //************************************************************************** |
| 1049 | 749 | // MACHINE CONFIGURATION |
| 1050 | 750 | //************************************************************************** |
| r30837 | r30838 | |
| 1098 | 798 | MCFG_ZX8302_OUT_RAW2_CB(WRITELINE(ql_state, zx8302_raw2_w)) |
| 1099 | 799 | MCFG_ZX8302_IN_RAW2_CB(READLINE(ql_state, zx8302_raw2_r)) |
| 1100 | 800 | |
| 1101 | | MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(ql_floppy_interface) |
| 1102 | | |
| 1103 | | MCFG_DEVICE_ADD(WD1772_TAG, WD1772, 0) |
| 1104 | | MCFG_WD17XX_DEFAULT_DRIVE2_TAGS |
| 1105 | | MCFG_WD17XX_INTRQ_CALLBACK(WRITELINE(ql_state, disk_io_intrq_w)) |
| 1106 | | MCFG_WD17XX_DRQ_CALLBACK(WRITELINE(ql_state, disk_io_drq_w)) |
| 1107 | | MCFG_WD17XX_DDEN_CALLBACK(READLINE(ql_state, disk_io_dden_r)) |
| 1108 | | |
| 1109 | 801 | MCFG_MICRODRIVE_ADD(MDV_1) |
| 1110 | 802 | MCFG_MICRODRIVE_COMMS_OUT_CALLBACK(DEVWRITELINE(MDV_2, microdrive_image_device, comms_in_w)) |
| 1111 | 803 | MCFG_MICRODRIVE_ADD(MDV_2) |
| 804 | |
| 1112 | 805 | MCFG_RS232_PORT_ADD(RS232_A_TAG, default_rs232_devices, NULL) // wired as DCE |
| 1113 | 806 | MCFG_RS232_PORT_ADD(RS232_B_TAG, default_rs232_devices, NULL) // wired as DTE |
| 1114 | 807 | MCFG_RS232_CTS_HANDLER(DEVWRITELINE(ZX8302_TAG, zx8302_device, write_cts2)) |
| r30837 | r30838 | |
| 1121 | 814 | |
| 1122 | 815 | MCFG_QL_ROM_CARTRIDGE_SLOT_ADD("rom", ql_rom_cartridge_cards, NULL) |
| 1123 | 816 | |
| 1124 | | // cartridge |
| 1125 | | MCFG_CARTSLOT_ADD("cart") |
| 1126 | | MCFG_CARTSLOT_EXTENSION_LIST("bin,rom") |
| 1127 | | MCFG_CARTSLOT_NOT_MANDATORY |
| 1128 | | MCFG_CARTSLOT_INTERFACE("ql_cart") |
| 817 | MCFG_DEVICE_ADD(QIMI_TAG, QIMI, 0) |
| 1129 | 818 | |
| 1130 | 819 | // software lists |
| 1131 | 820 | MCFG_SOFTWARE_LIST_ADD("cart_list", "ql_cart") |
| r30837 | r30838 | |
| 1135 | 824 | // internal ram |
| 1136 | 825 | MCFG_RAM_ADD(RAM_TAG) |
| 1137 | 826 | MCFG_RAM_DEFAULT_SIZE("128K") |
| 1138 | | MCFG_RAM_EXTRA_OPTIONS("192K,256K,384K,640K,896K") |
| 1139 | | |
| 1140 | | // Parallel printer port on Sandy disk interface |
| 1141 | | MCFG_DEVICE_ADD(PRINTER_TAG, PRINTER, 0) |
| 1142 | 827 | MACHINE_CONFIG_END |
| 1143 | 828 | |
| 1144 | 829 | |
| r30837 | r30838 | |
| 1189 | 874 | //------------------------------------------------- |
| 1190 | 875 | |
| 1191 | 876 | ROM_START( ql ) |
| 1192 | | ROM_REGION( 0x28000, M68008_TAG, 0 ) |
| 877 | ROM_REGION( 0x10000, M68008_TAG, 0 ) |
| 1193 | 878 | ROM_DEFAULT_BIOS("js") |
| 1194 | 879 | ROM_SYSTEM_BIOS( 0, "fb", "v1.00 (FB)" ) |
| 1195 | 880 | ROMX_LOAD( "fb.ic33", 0x0000, 0x8000, NO_DUMP, ROM_BIOS(1) ) |
| r30837 | r30838 | |
| 1214 | 899 | ROMX_LOAD( "tyche.rom", 0x0000, 0x010000, CRC(8724b495) SHA1(5f33a1bc3f23fd09c31844b65bc3aca7616f180a), ROM_BIOS(7) ) |
| 1215 | 900 | ROM_SYSTEM_BIOS( 7, "min189", "Minerva v1.89" ) |
| 1216 | 901 | ROMX_LOAD( "minerva.rom", 0x0000, 0x00c000, BAD_DUMP CRC(930befe3) SHA1(84a99c4df13b97f90baf1ec8cb6c2e52e3e1bb4d), ROM_BIOS(8) ) |
| 1217 | | ROM_CART_LOAD("cart", 0xc000, 0x8000, ROM_MIRROR | ROM_OPTIONAL) |
| 1218 | 902 | |
| 1219 | | ROM_LOAD( "trumpcard-125.rom", TRUMP_ROM_BASE, 0x08000, CRC(938eaa46) SHA1(9b3458cf3a279ed86ba395dc45c8f26939d6c44d)) |
| 1220 | | ROM_LOAD( "sandysuperdisk.rom", SANDY_ROM_BASE_SD, 0x04000, CRC(b52077da) SHA1(bf531758145ffd083e01c1cf9c45d0e9264a3b53)) |
| 1221 | | ROM_LOAD( "sandy_disk_controller_v1.18y_1984.rom", SANDY_ROM_BASE_SQB, 0x08000, CRC(d02425be) SHA1(e730576e3e0c6a1acad042c09e15fc62a32d8fbd)) |
| 1222 | | |
| 1223 | 903 | ROM_REGION( 0x800, I8749_TAG, 0 ) |
| 1224 | 904 | ROM_LOAD( "ipc8049.ic24", 0x000, 0x800, CRC(6a0d1f20) SHA1(fcb1c97ee7c66e5b6d8fbb57c06fd2f6509f2e1b) ) |
| 1225 | 905 | |
| r30837 | r30838 | |
| 1236 | 916 | //------------------------------------------------- |
| 1237 | 917 | |
| 1238 | 918 | ROM_START( ql_us ) |
| 1239 | | ROM_REGION( 0x20000, M68008_TAG, 0 ) |
| 919 | ROM_REGION( 0xc000, M68008_TAG, 0 ) |
| 1240 | 920 | ROM_LOAD( "jsu.ic33", 0x0000, 0x8000, BAD_DUMP CRC(e397f49f) SHA1(c06f92eabaf3e6dd298c51cb7f7535d8ef0ef9c5) ) |
| 1241 | 921 | ROM_LOAD( "jsu.ic34", 0x8000, 0x4000, BAD_DUMP CRC(3debbacc) SHA1(9fbc3e42ec463fa42f9c535d63780ff53a9313ec) ) |
| 1242 | | ROM_CART_LOAD("cart", 0xc000, 0x8000, ROM_MIRROR | ROM_OPTIONAL) |
| 1243 | 922 | |
| 1244 | 923 | ROM_REGION( 0x800, I8749_TAG, 0 ) |
| 1245 | 924 | ROM_LOAD( "ipc8049.ic24", 0x000, 0x800, CRC(6a0d1f20) SHA1(fcb1c97ee7c66e5b6d8fbb57c06fd2f6509f2e1b) ) |
| r30837 | r30838 | |
| 1254 | 933 | //------------------------------------------------- |
| 1255 | 934 | |
| 1256 | 935 | ROM_START( ql_es ) |
| 1257 | | ROM_REGION( 0x20000, M68008_TAG, 0 ) |
| 936 | ROM_REGION( 0xc000, M68008_TAG, 0 ) |
| 1258 | 937 | ROM_LOAD( "mge.ic33", 0x0000, 0x8000, BAD_DUMP CRC(d5293bde) SHA1(bf5af7e53a472d4e9871f182210787d601db0634) ) |
| 1259 | 938 | ROM_LOAD( "mge.ic34", 0x8000, 0x4000, BAD_DUMP CRC(a694f8d7) SHA1(bd2868656008de85d7c191598588017ae8aa3339) ) |
| 1260 | | ROM_CART_LOAD("cart", 0xc000, 0x8000, ROM_MIRROR | ROM_OPTIONAL) |
| 1261 | 939 | |
| 1262 | 940 | ROM_REGION( 0x800, I8749_TAG, 0 ) |
| 1263 | 941 | ROM_LOAD( "ipc8049.ic24", 0x000, 0x800, CRC(6a0d1f20) SHA1(fcb1c97ee7c66e5b6d8fbb57c06fd2f6509f2e1b) ) |
| r30837 | r30838 | |
| 1272 | 950 | //------------------------------------------------- |
| 1273 | 951 | |
| 1274 | 952 | ROM_START( ql_fr ) |
| 1275 | | ROM_REGION( 0x20000, M68008_TAG, 0 ) |
| 953 | ROM_REGION( 0xc000, M68008_TAG, 0 ) |
| 1276 | 954 | ROM_LOAD( "mgf.ic33", 0x0000, 0x8000, NO_DUMP ) |
| 1277 | 955 | ROM_LOAD( "mgf.ic34", 0x8000, 0x4000, NO_DUMP ) |
| 1278 | | ROM_CART_LOAD("cart", 0xc000, 0x8000, ROM_MIRROR | ROM_OPTIONAL) |
| 1279 | 956 | |
| 1280 | 957 | ROM_REGION( 0x800, I8749_TAG, 0 ) |
| 1281 | 958 | ROM_LOAD( "ipc8049.ic24", 0x000, 0x800, CRC(6a0d1f20) SHA1(fcb1c97ee7c66e5b6d8fbb57c06fd2f6509f2e1b) ) |
| r30837 | r30838 | |
| 1290 | 967 | //------------------------------------------------- |
| 1291 | 968 | |
| 1292 | 969 | ROM_START( ql_de ) |
| 1293 | | ROM_REGION( 0x20000, M68008_TAG, 0 ) |
| 970 | ROM_REGION( 0xc000, M68008_TAG, 0 ) |
| 1294 | 971 | ROM_SYSTEM_BIOS( 0, "mg", "v1.10 (MG)" ) |
| 1295 | 972 | ROMX_LOAD( "mgg.ic33", 0x0000, 0x8000, BAD_DUMP CRC(b4e468fd) SHA1(cd02a3cd79af90d48b65077d0571efc2f12f146e), ROM_BIOS(1) ) |
| 1296 | 973 | ROMX_LOAD( "mgg.ic34", 0x8000, 0x4000, BAD_DUMP CRC(54959d40) SHA1(ffc0be9649f26019d7be82925c18dc699259877f), ROM_BIOS(1) ) |
| r30837 | r30838 | |
| 1299 | 976 | ROMX_LOAD( "mf.ic34", 0x8000, 0x4000, BAD_DUMP CRC(5974616b) SHA1(c3603768c08535c25f077eed02fb80128aff13d9), ROM_BIOS(2) ) |
| 1300 | 977 | ROM_SYSTEM_BIOS( 2, "ultramg", "Ultrasoft" ) |
| 1301 | 978 | ROMX_LOAD( "ultramg.rom", 0x0000, 0x00c000, BAD_DUMP CRC(ad12463b) SHA1(0561b3bc7ce090f3101b2142ee957c18c250eefa), ROM_BIOS(3) ) |
| 1302 | | ROM_CART_LOAD("cart", 0xc000, 0x8000, ROM_MIRROR | ROM_OPTIONAL) |
| 1303 | 979 | |
| 1304 | 980 | ROM_REGION( 0x800, I8749_TAG, 0 ) |
| 1305 | 981 | ROM_LOAD( "ipc8049.ic24", 0x000, 0x800, CRC(6a0d1f20) SHA1(fcb1c97ee7c66e5b6d8fbb57c06fd2f6509f2e1b) ) |
| r30837 | r30838 | |
| 1314 | 990 | //------------------------------------------------- |
| 1315 | 991 | |
| 1316 | 992 | ROM_START( ql_it ) |
| 1317 | | ROM_REGION( 0x20000, M68008_TAG, 0 ) |
| 993 | ROM_REGION( 0xc000, M68008_TAG, 0 ) |
| 1318 | 994 | ROM_LOAD( "mgi.ic33", 0x0000, 0x8000, BAD_DUMP CRC(d5293bde) SHA1(bf5af7e53a472d4e9871f182210787d601db0634) ) |
| 1319 | 995 | ROM_LOAD( "mgi.ic34", 0x8000, 0x4000, BAD_DUMP CRC(a2fdfb83) SHA1(162b1052737500f3c13497cdf0f813ba006bdae9) ) |
| 1320 | | ROM_CART_LOAD("cart", 0xc000, 0x8000, ROM_MIRROR | ROM_OPTIONAL) |
| 1321 | 996 | |
| 1322 | 997 | ROM_REGION( 0x800, I8749_TAG, 0 ) |
| 1323 | 998 | ROM_LOAD( "ipc8049.ic24", 0x000, 0x800, CRC(6a0d1f20) SHA1(fcb1c97ee7c66e5b6d8fbb57c06fd2f6509f2e1b) ) |
| r30837 | r30838 | |
| 1332 | 1007 | //------------------------------------------------- |
| 1333 | 1008 | |
| 1334 | 1009 | ROM_START( ql_se ) |
| 1335 | | ROM_REGION( 0x20000, M68008_TAG, 0 ) |
| 1010 | ROM_REGION( 0xc000, M68008_TAG, 0 ) |
| 1336 | 1011 | ROM_LOAD( "mgs.ic33", 0x0000, 0x8000, NO_DUMP ) |
| 1337 | 1012 | ROM_LOAD( "mgs.ic34", 0x8000, 0x4000, NO_DUMP ) |
| 1338 | | ROM_CART_LOAD("cart", 0xc000, 0x8000, ROM_MIRROR | ROM_OPTIONAL) |
| 1339 | 1013 | |
| 1340 | 1014 | ROM_REGION( 0x800, I8749_TAG, 0 ) |
| 1341 | 1015 | ROM_LOAD( "ipc8049.ic24", 0x000, 0x800, CRC(6a0d1f20) SHA1(fcb1c97ee7c66e5b6d8fbb57c06fd2f6509f2e1b) ) |
| r30837 | r30838 | |
| 1350 | 1024 | //------------------------------------------------- |
| 1351 | 1025 | |
| 1352 | 1026 | ROM_START( ql_gr ) |
| 1353 | | ROM_REGION( 0x20000, M68008_TAG, 0 ) |
| 1027 | ROM_REGION( 0xc000, M68008_TAG, 0 ) |
| 1354 | 1028 | ROM_LOAD( "efp.ic33", 0x0000, 0x8000, BAD_DUMP CRC(eb181641) SHA1(43c1e0215cf540cbbda240b1048910ff55681059) ) |
| 1355 | 1029 | ROM_LOAD( "efp.ic34", 0x8000, 0x4000, BAD_DUMP CRC(4c3b34b7) SHA1(f9dc571d2d4f68520b306ecc7516acaeea69ec0d) ) |
| 1356 | | ROM_CART_LOAD("cart", 0xc000, 0x8000, ROM_MIRROR | ROM_OPTIONAL) |
| 1357 | 1030 | |
| 1358 | 1031 | ROM_REGION( 0x800, I8749_TAG, 0 ) |
| 1359 | 1032 | ROM_LOAD( "ipc8049.ic24", 0x000, 0x800, CRC(6a0d1f20) SHA1(fcb1c97ee7c66e5b6d8fbb57c06fd2f6509f2e1b) ) |
| r30837 | r30838 | |
| 1368 | 1041 | //------------------------------------------------- |
| 1369 | 1042 | |
| 1370 | 1043 | ROM_START( ql_dk ) |
| 1371 | | ROM_REGION( 0x20000, M68008_TAG, 0 ) |
| 1044 | ROM_REGION( 0xc000, M68008_TAG, 0 ) |
| 1372 | 1045 | ROM_LOAD( "mgd.ic33", 0x0000, 0x8000, BAD_DUMP CRC(f57755eb) SHA1(dc57939ffb8741e17967a1d2479c339750ec7ff6) ) |
| 1373 | 1046 | ROM_LOAD( "mgd.ic34", 0x8000, 0x4000, BAD_DUMP CRC(1892465a) SHA1(0ff3046b5276da6639d3fe79b22ae25cc265d540) ) |
| 1374 | | ROM_CART_LOAD("cart", 0xc000, 0x8000, ROM_MIRROR | ROM_OPTIONAL) |
| 1375 | 1047 | |
| 1376 | 1048 | ROM_REGION( 0x4000, "extra", 0 ) |
| 1377 | 1049 | ROM_LOAD( "extra.rom", 0x0000, 0x4000, NO_DUMP ) // located at 0x1c000 in M68008 memory map |
| r30837 | r30838 | |
| 1389 | 1061 | //------------------------------------------------- |
| 1390 | 1062 | |
| 1391 | 1063 | ROM_START( tonto ) |
| 1392 | | ROM_REGION( 0x400000, M68008_TAG, 0 ) |
| 1064 | ROM_REGION( 0x20000, M68008_TAG, 0 ) |
| 1393 | 1065 | ROM_LOAD( "xbaa02.ic4", 0x000000, 0x008000, CRC(86e7915b) SHA1(a4d8369052eaea93d2174cfd3b14e6cf777f54b4) ) |
| 1394 | 1066 | ROM_LOAD( "xbab03.ic5", 0x008000, 0x008000, CRC(97ef393c) SHA1(450c708e8dfbd42d939a9af6a72ef2a33a3dd3b5) ) |
| 1395 | 1067 | ROM_LOAD( "xbac02.ic6", 0x010000, 0x008000, CRC(a7950897) SHA1(7cd4d6e33a350420a9ebd5c1b32708c29cb20799) ) |
| r30837 | r30838 | |
| 1419 | 1091 | //------------------------------------------------- |
| 1420 | 1092 | |
| 1421 | 1093 | ROM_START( megaopd ) |
| 1422 | | ROM_REGION( 0x400000, M68008_TAG, 0 ) |
| 1094 | ROM_REGION( 0x20000, M68008_TAG, 0 ) |
| 1423 | 1095 | ROM_LOAD( "bios-1.rom", 0x000000, 0x008000, NO_DUMP ) |
| 1424 | 1096 | ROM_LOAD( "bios-2.rom", 0x008000, 0x008000, NO_DUMP ) |
| 1425 | 1097 | ROM_LOAD( "bios-3.rom", 0x010000, 0x008000, NO_DUMP ) |