trunk/src/mess/machine/superpet.c
| r0 | r20746 | |
| 1 | /********************************************************************** |
| 2 | |
| 3 | Commodore SuperPET emulation |
| 4 | |
| 5 | Copyright MESS Team. |
| 6 | Visit http://mamedev.org for licensing and usage restrictions. |
| 7 | |
| 8 | **********************************************************************/ |
| 9 | |
| 10 | #include "superpet.h" |
| 11 | |
| 12 | |
| 13 | |
| 14 | //************************************************************************** |
| 15 | // MACROS/CONSTANTS |
| 16 | //************************************************************************** |
| 17 | |
| 18 | #define M6809_TAG "u4" |
| 19 | #define M6551_TAG "u23" |
| 20 | #define MOS6702_TAG "u2" |
| 21 | |
| 22 | |
| 23 | |
| 24 | //************************************************************************** |
| 25 | // DEVICE DEFINITIONS |
| 26 | //************************************************************************** |
| 27 | |
| 28 | const device_type SUPERPET = &device_creator<superpet_device>; |
| 29 | |
| 30 | |
| 31 | //------------------------------------------------- |
| 32 | // ROM( superpet ) |
| 33 | //------------------------------------------------- |
| 34 | |
| 35 | ROM_START( superpet ) |
| 36 | ROM_REGION( 0x7000, M6809_TAG, 0 ) |
| 37 | ROM_LOAD( "901898-01.u17", 0x1000, 0x1000, CRC(728a998b) SHA1(0414b3ab847c8977eb05c2fcc72efcf2f9d92871) ) |
| 38 | ROM_LOAD( "901898-02.u18", 0x2000, 0x1000, CRC(6beb7c62) SHA1(df154939b934d0aeeb376813ec1ba0d43c2a3378) ) |
| 39 | ROM_LOAD( "901898-03.u19", 0x3000, 0x1000, CRC(5db4983d) SHA1(6c5b0cce97068f8841112ba6d5cd8e568b562fa3) ) |
| 40 | ROM_LOAD( "901898-04.u20", 0x4000, 0x1000, CRC(f55fc559) SHA1(b42a2050a319a1ffca7868a8d8d635fadd37ec37) ) |
| 41 | ROM_LOAD( "901897-01.u21", 0x5000, 0x0800, CRC(b2cee903) SHA1(e8ce8347451a001214a5e71a13081b38b4be23bc) ) |
| 42 | ROM_LOAD( "901898-05.u22", 0x6000, 0x1000, CRC(f42df0cb) SHA1(9b4a5134d20345171e7303445f87c4e0b9addc96) ) |
| 43 | ROM_END |
| 44 | |
| 45 | |
| 46 | //------------------------------------------------- |
| 47 | // rom_region - device-specific ROM region |
| 48 | //------------------------------------------------- |
| 49 | |
| 50 | const rom_entry *superpet_device::device_rom_region() const |
| 51 | { |
| 52 | return ROM_NAME( superpet ); |
| 53 | } |
| 54 | |
| 55 | |
| 56 | //------------------------------------------------- |
| 57 | // ADDRESS_MAP( superpet_mem ) |
| 58 | //------------------------------------------------- |
| 59 | |
| 60 | static ADDRESS_MAP_START( superpet_mem, AS_PROGRAM, 8, superpet_device ) |
| 61 | AM_RANGE(0x0000, 0xffff) AM_READWRITE(read, write) |
| 62 | ADDRESS_MAP_END |
| 63 | |
| 64 | |
| 65 | //------------------------------------------------- |
| 66 | // MACHINE_CONFIG_FRAGMENT( superpet ) |
| 67 | //------------------------------------------------- |
| 68 | |
| 69 | static MACHINE_CONFIG_FRAGMENT( superpet ) |
| 70 | MCFG_CPU_ADD(M6809_TAG, M6809, XTAL_16MHz/16) |
| 71 | MCFG_CPU_PROGRAM_MAP(superpet_mem) |
| 72 | |
| 73 | MCFG_ACIA6551_ADD(M6551_TAG) // XTAL_1_8432MHz |
| 74 | MCFG_MOS6702_ADD(MOS6702_TAG, XTAL_16MHz/16) |
| 75 | MACHINE_CONFIG_END |
| 76 | |
| 77 | |
| 78 | //------------------------------------------------- |
| 79 | // machine_config_additions - device-specific |
| 80 | // machine configurations |
| 81 | //------------------------------------------------- |
| 82 | |
| 83 | machine_config_constructor superpet_device::device_mconfig_additions() const |
| 84 | { |
| 85 | return MACHINE_CONFIG_NAME( superpet ); |
| 86 | } |
| 87 | |
| 88 | |
| 89 | //------------------------------------------------- |
| 90 | // INPUT_PORTS( superpet ) |
| 91 | //------------------------------------------------- |
| 92 | |
| 93 | static INPUT_PORTS_START( superpet ) |
| 94 | PORT_START("SW1") |
| 95 | |
| 96 | PORT_START("SW2") |
| 97 | INPUT_PORTS_END |
| 98 | |
| 99 | |
| 100 | //------------------------------------------------- |
| 101 | // input_ports - device-specific input ports |
| 102 | //------------------------------------------------- |
| 103 | |
| 104 | ioport_constructor superpet_device::device_input_ports() const |
| 105 | { |
| 106 | return INPUT_PORTS_NAME( superpet ); |
| 107 | } |
| 108 | |
| 109 | |
| 110 | |
| 111 | //************************************************************************** |
| 112 | // INLINE HELPERS |
| 113 | //************************************************************************** |
| 114 | |
| 115 | //------------------------------------------------- |
| 116 | // update_cpu - |
| 117 | //------------------------------------------------- |
| 118 | |
| 119 | inline void superpet_device::update_cpu(int cpu) |
| 120 | { |
| 121 | if (cpu) |
| 122 | { |
| 123 | // 6502 active |
| 124 | m_maincpu->set_input_line(INPUT_LINE_HALT, ASSERT_LINE); |
| 125 | machine().firstcpu->set_input_line(INPUT_LINE_HALT, CLEAR_LINE); |
| 126 | } |
| 127 | else |
| 128 | { |
| 129 | // 6809 active |
| 130 | m_maincpu->set_input_line(INPUT_LINE_HALT, CLEAR_LINE); |
| 131 | machine().firstcpu->set_input_line(INPUT_LINE_HALT, ASSERT_LINE); |
| 132 | } |
| 133 | } |
| 134 | |
| 135 | |
| 136 | |
| 137 | //************************************************************************** |
| 138 | // LIVE DEVICE |
| 139 | //************************************************************************** |
| 140 | |
| 141 | //------------------------------------------------- |
| 142 | // superpet_device - constructor |
| 143 | //------------------------------------------------- |
| 144 | |
| 145 | superpet_device::superpet_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : |
| 146 | device_t(mconfig, SUPERPET, "SuperPET", tag, owner, clock), |
| 147 | device_pet_expansion_card_interface(mconfig, *this), |
| 148 | m_maincpu(*this, M6809_TAG), |
| 149 | m_acia(*this, M6551_TAG), |
| 150 | m_dongle(*this, MOS6702_TAG), |
| 151 | m_rom(*this, M6809_TAG), |
| 152 | m_ram(*this, "ram"), |
| 153 | m_sw1(*this, "SW1"), |
| 154 | m_sw2(*this, "SW2"), |
| 155 | m_system(0), |
| 156 | m_bank(0), |
| 157 | m_sel9_rom(0), |
| 158 | m_pet_irq(CLEAR_LINE), |
| 159 | m_acia_irq(CLEAR_LINE) |
| 160 | { |
| 161 | } |
| 162 | |
| 163 | |
| 164 | //------------------------------------------------- |
| 165 | // device_start - device-specific startup |
| 166 | //------------------------------------------------- |
| 167 | |
| 168 | void superpet_device::device_start() |
| 169 | { |
| 170 | // allocate memory |
| 171 | m_ram.allocate(0x10000); |
| 172 | |
| 173 | // state saving |
| 174 | save_item(NAME(m_system)); |
| 175 | save_item(NAME(m_bank)); |
| 176 | save_item(NAME(m_sel9_rom)); |
| 177 | } |
| 178 | |
| 179 | |
| 180 | //------------------------------------------------- |
| 181 | // device_reset - device-specific reset |
| 182 | //------------------------------------------------- |
| 183 | |
| 184 | void superpet_device::device_reset() |
| 185 | { |
| 186 | m_maincpu->reset(); |
| 187 | m_acia->reset(); |
| 188 | m_dongle->reset(); |
| 189 | |
| 190 | m_system = 0; |
| 191 | m_bank = 0; |
| 192 | m_sel9_rom = 0; |
| 193 | |
| 194 | update_cpu(BIT(m_system, 0)); |
| 195 | } |
| 196 | |
| 197 | |
| 198 | //------------------------------------------------- |
| 199 | // pet_norom_r - NO ROM read |
| 200 | //------------------------------------------------- |
| 201 | |
| 202 | int superpet_device::pet_norom_r(address_space &space, offs_t offset, int sel) |
| 203 | { |
| 204 | return BIT(m_system, 0); |
| 205 | } |
| 206 | |
| 207 | |
| 208 | //------------------------------------------------- |
| 209 | // pet_bd_r - buffered data read |
| 210 | //------------------------------------------------- |
| 211 | |
| 212 | UINT8 superpet_device::pet_bd_r(address_space &space, offs_t offset, UINT8 data, int sel) |
| 213 | { |
| 214 | int norom = pet_norom_r(space, offset, sel); |
| 215 | |
| 216 | switch (sel) |
| 217 | { |
| 218 | case SEL9: |
| 219 | if (m_sel9_rom) |
| 220 | { |
| 221 | data = m_rom->base()[offset - 0x9000]; |
| 222 | } |
| 223 | else |
| 224 | { |
| 225 | data = m_ram[((m_bank & 0x0f) << 12) | (offset & 0xfff)]; |
| 226 | } |
| 227 | break; |
| 228 | |
| 229 | case SELA: case SELB: case SELC: case SELD: case SELF: |
| 230 | if (!norom) |
| 231 | { |
| 232 | data = m_rom->base()[offset - 0x9000]; |
| 233 | } |
| 234 | break; |
| 235 | |
| 236 | case SELE: |
| 237 | if (!norom && !BIT(offset, 11)) |
| 238 | { |
| 239 | data = m_rom->base()[offset - 0x9000]; |
| 240 | } |
| 241 | break; |
| 242 | } |
| 243 | |
| 244 | switch (offset) |
| 245 | { |
| 246 | case 0xefe0: |
| 247 | case 0xefe1: |
| 248 | case 0xefe2: |
| 249 | case 0xefe3: |
| 250 | data = m_dongle->read(space, offset & 0x03); |
| 251 | break; |
| 252 | |
| 253 | case 0xeff0: |
| 254 | case 0xeff1: |
| 255 | case 0xeff2: |
| 256 | case 0xeff3: |
| 257 | data = m_acia->read(space, offset & 0x03); |
| 258 | break; |
| 259 | } |
| 260 | |
| 261 | return data; |
| 262 | } |
| 263 | |
| 264 | |
| 265 | //------------------------------------------------- |
| 266 | // pet_bd_w - buffered data write |
| 267 | //------------------------------------------------- |
| 268 | |
| 269 | void superpet_device::pet_bd_w(address_space &space, offs_t offset, UINT8 data, int sel) |
| 270 | { |
| 271 | switch (sel) |
| 272 | { |
| 273 | case SEL9: |
| 274 | if (!m_sel9_rom && BIT(m_system, 1)) |
| 275 | { |
| 276 | m_ram[((m_bank & 0x0f) << 12) | (offset & 0xfff)] = data; |
| 277 | } |
| 278 | break; |
| 279 | } |
| 280 | |
| 281 | switch (offset) |
| 282 | { |
| 283 | case 0xefe0: |
| 284 | case 0xefe1: |
| 285 | case 0xefe2: |
| 286 | case 0xefe3: |
| 287 | m_dongle->write(space, offset & 0x03, data); |
| 288 | printf("6702 %u %02x\n", offset & 0x03, data); |
| 289 | break; |
| 290 | |
| 291 | case 0xeff0: |
| 292 | case 0xeff1: |
| 293 | case 0xeff2: |
| 294 | case 0xeff3: |
| 295 | m_acia->write(space, offset & 0x03, data); |
| 296 | break; |
| 297 | |
| 298 | case 0xeff8: |
| 299 | case 0xeff9: |
| 300 | if (BIT(m_bank, 7)) |
| 301 | { |
| 302 | /* |
| 303 | |
| 304 | bit description |
| 305 | |
| 306 | 0 SW2 CPU (0=6809, 1=6502) |
| 307 | 1 SW1 RAM (0=read only, 1=read/write) |
| 308 | 2 |
| 309 | 3 DIAG |
| 310 | 4 |
| 311 | 5 |
| 312 | 6 |
| 313 | 7 |
| 314 | |
| 315 | */ |
| 316 | |
| 317 | m_system = data; |
| 318 | update_cpu(BIT(m_system, 0)); |
| 319 | printf("SYSTEM %02x\n", data); |
| 320 | } |
| 321 | break; |
| 322 | |
| 323 | case 0xeffc: |
| 324 | case 0xeffd: |
| 325 | /* |
| 326 | |
| 327 | bit description |
| 328 | |
| 329 | 0 A0 |
| 330 | 1 A1 |
| 331 | 2 A2 |
| 332 | 3 SEL A |
| 333 | 4 J1 pin 40 |
| 334 | 5 SEL B |
| 335 | 6 J1 pin 39 |
| 336 | 7 BIT 7 |
| 337 | |
| 338 | */ |
| 339 | |
| 340 | m_bank = data; |
| 341 | printf("BANK %02x\n", data); |
| 342 | break; |
| 343 | } |
| 344 | } |
| 345 | |
| 346 | |
| 347 | //------------------------------------------------- |
| 348 | // pet_diag_r - DIAG read |
| 349 | //------------------------------------------------- |
| 350 | |
| 351 | int superpet_device::pet_diag_r() |
| 352 | { |
| 353 | return BIT(m_system, 3); |
| 354 | } |
| 355 | |
| 356 | |
| 357 | //------------------------------------------------- |
| 358 | // pet_irq_w - IRQ write |
| 359 | //------------------------------------------------- |
| 360 | |
| 361 | void superpet_device::pet_irq_w(int state) |
| 362 | { |
| 363 | m_pet_irq = state; |
| 364 | |
| 365 | //m_maincpu->set_input_line(M6809_IRQ_LINE, m_pet_irq || m_acia_irq); |
| 366 | } |
| 367 | |
| 368 | |
| 369 | //------------------------------------------------- |
| 370 | // read - |
| 371 | //------------------------------------------------- |
| 372 | |
| 373 | READ8_MEMBER( superpet_device::read ) |
| 374 | { |
| 375 | return m_slot->dma_bd_r(offset); |
| 376 | } |
| 377 | |
| 378 | |
| 379 | //------------------------------------------------- |
| 380 | // write - |
| 381 | //------------------------------------------------- |
| 382 | |
| 383 | WRITE8_MEMBER( superpet_device::write ) |
| 384 | { |
| 385 | m_slot->dma_bd_w(offset, data); |
| 386 | } |
trunk/src/mess/machine/superpet.h
| r0 | r20746 | |
| 1 | /********************************************************************** |
| 2 | |
| 3 | Commodore SuperPET emulation |
| 4 | |
| 5 | Copyright MESS Team. |
| 6 | Visit http://mamedev.org for licensing and usage restrictions. |
| 7 | |
| 8 | **********************************************************************/ |
| 9 | |
| 10 | #pragma once |
| 11 | |
| 12 | #ifndef __SUPERPET__ |
| 13 | #define __SUPERPET__ |
| 14 | |
| 15 | |
| 16 | #include "emu.h" |
| 17 | #include "cpu/m6809/m6809.h" |
| 18 | #include "machine/6551acia.h" |
| 19 | #include "machine/mos6702.h" |
| 20 | #include "machine/petexp.h" |
| 21 | |
| 22 | |
| 23 | |
| 24 | //************************************************************************** |
| 25 | // TYPE DEFINITIONS |
| 26 | //************************************************************************** |
| 27 | |
| 28 | // ======================> superpet_device |
| 29 | |
| 30 | class superpet_device : public device_t, |
| 31 | public device_pet_expansion_card_interface |
| 32 | { |
| 33 | public: |
| 34 | // construction/destruction |
| 35 | superpet_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 36 | |
| 37 | // optional information overrides |
| 38 | virtual const rom_entry *device_rom_region() const; |
| 39 | virtual machine_config_constructor device_mconfig_additions() const; |
| 40 | virtual ioport_constructor device_input_ports() const; |
| 41 | |
| 42 | DECLARE_READ8_MEMBER( read ); |
| 43 | DECLARE_WRITE8_MEMBER( write ); |
| 44 | |
| 45 | protected: |
| 46 | // device-level overrides |
| 47 | virtual void device_config_complete() { m_shortname = "pet_superpet"; } |
| 48 | virtual void device_start(); |
| 49 | virtual void device_reset(); |
| 50 | |
| 51 | // device_pet_expansion_card_interface overrides |
| 52 | virtual int pet_norom_r(address_space &space, offs_t offset, int sel); |
| 53 | virtual UINT8 pet_bd_r(address_space &space, offs_t offset, UINT8 data, int sel); |
| 54 | virtual void pet_bd_w(address_space &space, offs_t offset, UINT8 data, int sel); |
| 55 | virtual int pet_diag_r(); |
| 56 | virtual void pet_irq_w(int state); |
| 57 | |
| 58 | enum |
| 59 | { |
| 60 | SEL0 = 0, |
| 61 | SEL1, |
| 62 | SEL2, |
| 63 | SEL3, |
| 64 | SEL4, |
| 65 | SEL5, |
| 66 | SEL6, |
| 67 | SEL7, |
| 68 | SEL8, |
| 69 | SEL9, |
| 70 | SELA, |
| 71 | SELB, |
| 72 | SELC, |
| 73 | SELD, |
| 74 | SELE, |
| 75 | SELF |
| 76 | }; |
| 77 | |
| 78 | private: |
| 79 | required_device<cpu_device> m_maincpu; |
| 80 | required_device<acia6551_device> m_acia; |
| 81 | required_device<mos6702_device> m_dongle; |
| 82 | required_memory_region m_rom; |
| 83 | optional_shared_ptr<UINT8> m_ram; |
| 84 | required_ioport m_sw1; |
| 85 | required_ioport m_sw2; |
| 86 | |
| 87 | inline void update_cpu(int cpu); |
| 88 | |
| 89 | UINT8 m_system; |
| 90 | UINT8 m_bank; |
| 91 | int m_sel9_rom; |
| 92 | int m_pet_irq; |
| 93 | int m_acia_irq; |
| 94 | }; |
| 95 | |
| 96 | |
| 97 | // device type definition |
| 98 | extern const device_type SUPERPET; |
| 99 | |
| 100 | |
| 101 | #endif |
trunk/src/mess/machine/petexp.c
| r20745 | r20746 | |
| 72 | 72 | |
| 73 | 73 | |
| 74 | 74 | //------------------------------------------------- |
| 75 | // device_config_complete - perform any |
| 76 | // operations now that the configuration is |
| 77 | // complete |
| 78 | //------------------------------------------------- |
| 79 | |
| 80 | void pet_expansion_slot_device::device_config_complete() |
| 81 | { |
| 82 | // inherit a copy of the static data |
| 83 | const pet_expansion_slot_interface *intf = reinterpret_cast<const pet_expansion_slot_interface *>(static_config()); |
| 84 | if (intf != NULL) |
| 85 | { |
| 86 | *static_cast<pet_expansion_slot_interface *>(this) = *intf; |
| 87 | } |
| 88 | |
| 89 | // or initialize to defaults if none provided |
| 90 | else |
| 91 | { |
| 92 | memset(&m_in_dma_bd_cb, 0, sizeof(m_in_dma_bd_cb)); |
| 93 | memset(&m_out_dma_bd_cb, 0, sizeof(m_out_dma_bd_cb)); |
| 94 | } |
| 95 | } |
| 96 | |
| 97 | |
| 98 | //------------------------------------------------- |
| 75 | 99 | // device_start - device-specific startup |
| 76 | 100 | //------------------------------------------------- |
| 77 | 101 | |
| 78 | 102 | void pet_expansion_slot_device::device_start() |
| 79 | 103 | { |
| 80 | 104 | m_card = dynamic_cast<device_pet_expansion_card_interface *>(get_card_device()); |
| 105 | |
| 106 | // resolve callbacks |
| 107 | m_in_dma_bd_func.resolve(m_in_dma_bd_cb, *this); |
| 108 | m_out_dma_bd_func.resolve(m_out_dma_bd_cb, *this); |
| 81 | 109 | } |
| 82 | 110 | |
| 83 | 111 | |
| r20745 | r20746 | |
| 105 | 133 | |
| 106 | 134 | |
| 107 | 135 | //------------------------------------------------- |
| 108 | | // read - cartridge data read |
| 136 | // read - buffered data read |
| 109 | 137 | //------------------------------------------------- |
| 110 | 138 | |
| 111 | 139 | UINT8 pet_expansion_slot_device::read(address_space &space, offs_t offset, UINT8 data, int sel) |
| r20745 | r20746 | |
| 120 | 148 | |
| 121 | 149 | |
| 122 | 150 | //------------------------------------------------- |
| 123 | | // write - cartridge data write |
| 151 | // write - buffered data write |
| 124 | 152 | //------------------------------------------------- |
| 125 | 153 | |
| 126 | 154 | void pet_expansion_slot_device::write(address_space &space, offs_t offset, UINT8 data, int sel) |
| r20745 | r20746 | |
| 133 | 161 | |
| 134 | 162 | |
| 135 | 163 | //------------------------------------------------- |
| 164 | // diag_r - DIAG read |
| 165 | //------------------------------------------------- |
| 166 | |
| 167 | READ_LINE_MEMBER( pet_expansion_slot_device::diag_r ) |
| 168 | { |
| 169 | return m_card ? m_card->pet_diag_r() : 1; |
| 170 | } |
| 171 | |
| 172 | |
| 173 | //------------------------------------------------- |
| 174 | // irq_w - IRQ write |
| 175 | //------------------------------------------------- |
| 176 | |
| 177 | WRITE_LINE_MEMBER( pet_expansion_slot_device::irq_w ) |
| 178 | { |
| 179 | if (m_card) m_card->pet_irq_w(state); |
| 180 | } |
| 181 | |
| 182 | |
| 183 | //------------------------------------------------- |
| 184 | // dma_bd_r - DMA read |
| 185 | //------------------------------------------------- |
| 186 | |
| 187 | UINT8 pet_expansion_slot_device::dma_bd_r(offs_t offset) |
| 188 | { |
| 189 | return m_in_dma_bd_func(offset); |
| 190 | } |
| 191 | |
| 192 | |
| 193 | //------------------------------------------------- |
| 194 | // dma_bd_w - DMA write |
| 195 | //------------------------------------------------- |
| 196 | |
| 197 | void pet_expansion_slot_device::dma_bd_w(offs_t offset, UINT8 data) |
| 198 | { |
| 199 | m_out_dma_bd_func(offset, data); |
| 200 | } |
| 201 | |
| 202 | |
| 203 | //------------------------------------------------- |
| 136 | 204 | // phi2 - system clock frequency |
| 137 | 205 | //------------------------------------------------- |
| 138 | 206 | |
trunk/src/mess/machine/petexp.h
| r20745 | r20746 | |
| 30 | 30 | // INTERFACE CONFIGURATION MACROS |
| 31 | 31 | //************************************************************************** |
| 32 | 32 | |
| 33 | | #define MCFG_PET_EXPANSION_SLOT_ADD(_tag, _clock, _slot_intf, _def_slot, _def_inp) \ |
| 33 | #define PET_EXPANSION_INTERFACE(_name) \ |
| 34 | const pet_expansion_slot_interface (_name) = |
| 35 | |
| 36 | |
| 37 | #define MCFG_PET_EXPANSION_SLOT_ADD(_tag, _clock, _config, _slot_intf, _def_slot, _def_inp) \ |
| 34 | 38 | MCFG_DEVICE_ADD(_tag, PET_EXPANSION_SLOT, _clock) \ |
| 39 | MCFG_DEVICE_CONFIG(_config) \ |
| 35 | 40 | MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, _def_inp, false) |
| 36 | 41 | |
| 37 | 42 | |
| r20745 | r20746 | |
| 40 | 45 | // TYPE DEFINITIONS |
| 41 | 46 | //************************************************************************** |
| 42 | 47 | |
| 48 | // ======================> pet_expansion_slot_interface |
| 49 | |
| 50 | struct pet_expansion_slot_interface |
| 51 | { |
| 52 | devcb_read8 m_in_dma_bd_cb; |
| 53 | devcb_write8 m_out_dma_bd_cb; |
| 54 | }; |
| 55 | |
| 56 | |
| 43 | 57 | // ======================> pet_expansion_slot_device |
| 44 | 58 | |
| 45 | 59 | class device_pet_expansion_card_interface; |
| 46 | 60 | |
| 47 | 61 | class pet_expansion_slot_device : public device_t, |
| 48 | | public device_slot_interface |
| 62 | public device_slot_interface, |
| 63 | public pet_expansion_slot_interface |
| 49 | 64 | { |
| 50 | 65 | public: |
| 51 | 66 | // construction/destruction |
| r20745 | r20746 | |
| 56 | 71 | int norom_r(address_space &space, offs_t offset, int sel); |
| 57 | 72 | UINT8 read(address_space &space, offs_t offset, UINT8 data, int sel); |
| 58 | 73 | void write(address_space &space, offs_t offset, UINT8 data, int sel); |
| 74 | DECLARE_READ_LINE_MEMBER( diag_r ); |
| 75 | DECLARE_WRITE_LINE_MEMBER( irq_w ); |
| 59 | 76 | |
| 60 | 77 | // cartridge interface |
| 78 | UINT8 dma_bd_r(offs_t offset); |
| 79 | void dma_bd_w(offs_t offset, UINT8 data); |
| 61 | 80 | int phi2(); |
| 62 | 81 | |
| 63 | 82 | protected: |
| 64 | 83 | // device-level overrides |
| 65 | | virtual void device_config_complete() { m_shortname = "petexp"; } |
| 84 | virtual void device_config_complete(); |
| 66 | 85 | virtual void device_start(); |
| 67 | 86 | virtual void device_reset(); |
| 68 | 87 | |
| 69 | 88 | device_pet_expansion_card_interface *m_card; |
| 89 | |
| 90 | devcb_resolved_read8 m_in_dma_bd_func; |
| 91 | devcb_resolved_write8 m_out_dma_bd_func; |
| 70 | 92 | }; |
| 71 | 93 | |
| 72 | 94 | |
| r20745 | r20746 | |
| 86 | 108 | virtual int pet_norom_r(address_space &space, offs_t offset, int sel) { return 1; } |
| 87 | 109 | virtual UINT8 pet_bd_r(address_space &space, offs_t offset, UINT8 data, int sel) { return data; }; |
| 88 | 110 | virtual void pet_bd_w(address_space &space, offs_t offset, UINT8 data, int sel) { }; |
| 111 | virtual int pet_diag_r() { return 1; } |
| 112 | virtual void pet_irq_w(int state) { } |
| 89 | 113 | |
| 90 | 114 | pet_expansion_slot_device *m_slot; |
| 91 | 115 | }; |
trunk/src/mess/drivers/pet2001.c
| r20745 | r20746 | |
| 134 | 134 | |
| 135 | 135 | - accurate video timing for non-CRTC models |
| 136 | 136 | - PET 4000-12 (40 column CRTC models) |
| 137 | - High Speed Graphics board |
| 138 | - keyboard layouts |
| 139 | - Swedish |
| 140 | - German |
| 137 | 141 | - SuperPET |
| 142 | - 6809 |
| 143 | - OS/9 MMU |
| 138 | 144 | - 8096 |
| 139 | 145 | - 64k expansion |
| 140 | 146 | - 8296 |
| r20745 | r20746 | |
| 161 | 167 | int irq = m_via_irq || m_pia1a_irq || m_pia1b_irq || m_pia2a_irq || m_pia2b_irq || m_exp_irq; |
| 162 | 168 | |
| 163 | 169 | m_maincpu->set_input_line(M6502_IRQ_LINE, irq); |
| 170 | m_exp->irq_w(irq); |
| 164 | 171 | } |
| 165 | 172 | |
| 166 | 173 | |
| r20745 | r20746 | |
| 704 | 711 | data |= m_ieee->eoi_r() << 6; |
| 705 | 712 | |
| 706 | 713 | // diagnostic jumper |
| 707 | | data |= 0x80; |
| 714 | data |= m_exp->diag_r() << 7; |
| 708 | 715 | |
| 709 | 716 | return data; |
| 710 | 717 | } |
| r20745 | r20746 | |
| 894 | 901 | |
| 895 | 902 | |
| 896 | 903 | //------------------------------------------------- |
| 904 | // PET_EXPANSION_INTERFACE( exp_intf ) |
| 905 | //------------------------------------------------- |
| 906 | |
| 907 | static PET_EXPANSION_INTERFACE( exp_intf ) |
| 908 | { |
| 909 | DEVCB_DRIVER_MEMBER(pet_state, read), |
| 910 | DEVCB_DRIVER_MEMBER(pet_state, write) |
| 911 | }; |
| 912 | |
| 913 | |
| 914 | //------------------------------------------------- |
| 897 | 915 | // PET_USER_PORT_INTERFACE( user_intf ) |
| 898 | 916 | //------------------------------------------------- |
| 899 | 917 | |
| r20745 | r20746 | |
| 1186 | 1204 | MCFG_CBM_IEEE488_ADD(ieee488_intf, "c4040") |
| 1187 | 1205 | MCFG_PET_DATASSETTE_PORT_ADD(PET_DATASSETTE_PORT_TAG, datassette_intf, cbm_datassette_devices, "c2n", NULL) |
| 1188 | 1206 | MCFG_PET_DATASSETTE_PORT_ADD(PET_DATASSETTE_PORT2_TAG, datassette2_intf, cbm_datassette_devices, NULL, NULL) |
| 1189 | | MCFG_PET_EXPANSION_SLOT_ADD(PET_EXPANSION_SLOT_TAG, XTAL_8MHz/8, pet_expansion_cards, NULL, NULL) |
| 1207 | MCFG_PET_EXPANSION_SLOT_ADD(PET_EXPANSION_SLOT_TAG, XTAL_8MHz/8, exp_intf, pet_expansion_cards, NULL, NULL) |
| 1190 | 1208 | MCFG_PET_USER_PORT_ADD(PET_USER_PORT_TAG, user_intf, pet_user_port_cards, NULL, NULL) |
| 1191 | 1209 | MCFG_QUICKLOAD_ADD("quickload", cbm_pet, "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS) |
| 1192 | 1210 | |
| r20745 | r20746 | |
| 1462 | 1480 | MCFG_CBM_IEEE488_ADD(ieee488_intf, "c8050") |
| 1463 | 1481 | MCFG_PET_DATASSETTE_PORT_ADD(PET_DATASSETTE_PORT_TAG, datassette_intf, cbm_datassette_devices, "c2n", NULL) |
| 1464 | 1482 | MCFG_PET_DATASSETTE_PORT_ADD(PET_DATASSETTE_PORT2_TAG, datassette2_intf, cbm_datassette_devices, NULL, NULL) |
| 1465 | | MCFG_PET_EXPANSION_SLOT_ADD(PET_EXPANSION_SLOT_TAG, XTAL_16MHz/16, pet_expansion_cards, NULL, NULL) |
| 1483 | MCFG_PET_EXPANSION_SLOT_ADD(PET_EXPANSION_SLOT_TAG, XTAL_16MHz/16, exp_intf, pet_expansion_cards, NULL, NULL) |
| 1466 | 1484 | MCFG_PET_USER_PORT_ADD(PET_USER_PORT_TAG, user_intf, pet_user_port_cards, NULL, NULL) |
| 1467 | 1485 | MCFG_QUICKLOAD_ADD("quickload", cbm_pet, "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS) |
| 1468 | 1486 | |
| r20745 | r20746 | |
| 1485 | 1503 | // MACHINE_CONFIG( superpet ) |
| 1486 | 1504 | //------------------------------------------------- |
| 1487 | 1505 | |
| 1488 | | static MACHINE_CONFIG_DERIVED_CLASS( superpet, pet80, superpet_state ) |
| 1489 | | MCFG_RAM_ADD(RAM_TAG) |
| 1490 | | MCFG_RAM_DEFAULT_SIZE("96K") |
| 1506 | static MACHINE_CONFIG_DERIVED_CLASS( superpet, pet8032, superpet_state ) |
| 1507 | MCFG_DEVICE_REMOVE(PET_EXPANSION_SLOT_TAG) |
| 1508 | MCFG_PET_EXPANSION_SLOT_ADD(PET_EXPANSION_SLOT_TAG, XTAL_16MHz/16, exp_intf, pet_expansion_cards, "superpet", NULL) |
| 1491 | 1509 | |
| 1492 | 1510 | MCFG_SOFTWARE_LIST_ADD("flop_list2", "superpet_flop") |
| 1493 | 1511 | MACHINE_CONFIG_END |
| r20745 | r20746 | |
| 1750 | 1768 | ROM_LOAD( "901465-23.ud10", 0x2000, 0x1000, CRC(ae3deac0) SHA1(975ee25e28ff302879424587e5fb4ba19f403adc) ) // BASIC 4 |
| 1751 | 1769 | ROM_LOAD( "901465-20.ud9", 0x3000, 0x1000, CRC(0fc17b9c) SHA1(242f98298931d21eaacb55fe635e44b7fc192b0a) ) // BASIC 4 |
| 1752 | 1770 | ROM_LOAD( "901465-21.ud8", 0x4000, 0x1000, CRC(36d91855) SHA1(1bb236c72c726e8fb029c68f9bfa5ee803faf0a8) ) // BASIC 4 |
| 1753 | | ROM_LOAD( "swedish.bin", 0x5000, 0x0800, CRC(75901dd7) SHA1(2ead0d83255a344a42bb786428353ca48d446d03) ) // It had a label "8000-UD7, SCREEN-04" |
| 1771 | ROM_LOAD( "8000-ud7, screen-04.ud7", 0x5000, 0x0800, CRC(75901dd7) SHA1(2ead0d83255a344a42bb786428353ca48d446d03) ) |
| 1754 | 1772 | ROM_LOAD( "901465-22.ud6", 0x6000, 0x1000, CRC(cc5298a1) SHA1(96a0fa56e0c937da92971d9c99d504e44e898806) ) // Kernal |
| 1755 | 1773 | |
| 1756 | 1774 | ROM_REGION( 0x800, "charom", 0 ) |
| r20745 | r20746 | |
| 1769 | 1787 | ROM_LOAD( "901465-23.ud10", 0x2000, 0x1000, CRC(ae3deac0) SHA1(975ee25e28ff302879424587e5fb4ba19f403adc) ) // BASIC 4 |
| 1770 | 1788 | ROM_LOAD( "901465-20.ud9", 0x3000, 0x1000, CRC(0fc17b9c) SHA1(242f98298931d21eaacb55fe635e44b7fc192b0a) ) // BASIC 4 |
| 1771 | 1789 | ROM_LOAD( "901465-21.ud8", 0x4000, 0x1000, CRC(36d91855) SHA1(1bb236c72c726e8fb029c68f9bfa5ee803faf0a8) ) // BASIC 4 |
| 1772 | | ROM_LOAD( "901474-03.ud7", 0x5000, 0x0800, CRC(5674dd5e) SHA1(c605fa343fd77c73cbe1e0e9567e2f014f6e7e30) ) // Screen Editor (80 columns, CRTC 60Hz, Business Keyb) |
| 1790 | ROM_LOAD( "901474-04.ud7", 0x5000, 0x0800, CRC(abb000e7) SHA1(66887061b6c4ebef7d6efb90af9afd5e2c3b08ba) ) // Screen Editor (80 columns, CRTC 50Hz, Business Keyb) |
| 1773 | 1791 | ROM_LOAD( "901465-22.ud6", 0x6000, 0x1000, CRC(cc5298a1) SHA1(96a0fa56e0c937da92971d9c99d504e44e898806) ) // Kernal |
| 1774 | 1792 | |
| 1775 | | ROM_REGION( 0x7000, M6809_TAG, 0 ) |
| 1776 | | ROM_LOAD( "901898-01.u17", 0x1000, 0x1000, CRC(728a998b) SHA1(0414b3ab847c8977eb05c2fcc72efcf2f9d92871) ) |
| 1777 | | ROM_LOAD( "901898-02.u18", 0x2000, 0x1000, CRC(6beb7c62) SHA1(df154939b934d0aeeb376813ec1ba0d43c2a3378) ) |
| 1778 | | ROM_LOAD( "901898-03.u19", 0x3000, 0x1000, CRC(5db4983d) SHA1(6c5b0cce97068f8841112ba6d5cd8e568b562fa3) ) |
| 1779 | | ROM_LOAD( "901898-04.u20", 0x4000, 0x1000, CRC(f55fc559) SHA1(b42a2050a319a1ffca7868a8d8d635fadd37ec37) ) |
| 1780 | | ROM_LOAD( "901897-01.u21", 0x5000, 0x0800, CRC(b2cee903) SHA1(e8ce8347451a001214a5e71a13081b38b4be23bc) ) |
| 1781 | | ROM_LOAD( "901898-05.u22", 0x6000, 0x1000, CRC(f42df0cb) SHA1(9b4a5134d20345171e7303445f87c4e0b9addc96) ) |
| 1782 | | |
| 1783 | | ROM_REGION( 0x800, "charom", 0 ) |
| 1784 | | ROM_LOAD( "901447-10.ua3", 0x000, 0x800, CRC(d8408674) SHA1(0157a2d55b7ac4eaeb38475889ebeea52e2593db) ) // Character Generator |
| 1793 | ROM_REGION( 0x1000, "charom", 0 ) |
| 1794 | ROM_LOAD( "901640-01.ua3", 0x0000, 0x1000, CRC(ee8229c4) SHA1(bf346f11595a3e65e55d6aeeaa2c0cec807b66c7) ) |
| 1785 | 1795 | ROM_END |
| 1786 | 1796 | |
| 1787 | 1797 | #define rom_mmf9000 rom_superpet |
| 1788 | 1798 | |
| 1789 | 1799 | |
| 1790 | 1800 | //------------------------------------------------- |
| 1801 | // ROM( mmf9000_se ) |
| 1802 | //------------------------------------------------- |
| 1803 | |
| 1804 | ROM_START( mmf9000_se ) |
| 1805 | ROM_REGION( 0x7000, M6502_TAG, 0 ) |
| 1806 | ROM_CART_LOAD( "9000", 0x0000, 0x1000, ROM_MIRROR ) |
| 1807 | ROM_CART_LOAD( "a000", 0x1000, 0x1000, ROM_MIRROR ) |
| 1808 | ROM_LOAD( "901465-23.ud10", 0x2000, 0x1000, CRC(ae3deac0) SHA1(975ee25e28ff302879424587e5fb4ba19f403adc) ) // BASIC 4 |
| 1809 | ROM_LOAD( "901465-20.ud9", 0x3000, 0x1000, CRC(0fc17b9c) SHA1(242f98298931d21eaacb55fe635e44b7fc192b0a) ) // BASIC 4 |
| 1810 | ROM_LOAD( "901465-21.ud8", 0x4000, 0x1000, CRC(36d91855) SHA1(1bb236c72c726e8fb029c68f9bfa5ee803faf0a8) ) // BASIC 4 |
| 1811 | ROM_LOAD( "8000-ud7, screen-04.ud7", 0x5000, 0x0800, CRC(75901dd7) SHA1(2ead0d83255a344a42bb786428353ca48d446d03) ) |
| 1812 | ROM_LOAD( "901465-22.ud6", 0x6000, 0x1000, CRC(cc5298a1) SHA1(96a0fa56e0c937da92971d9c99d504e44e898806) ) // Kernal |
| 1813 | |
| 1814 | ROM_REGION( 0x1000, "charom", 0 ) |
| 1815 | ROM_LOAD( "901640-01 skand.gen.ua3", 0x0000, 0x1000, CRC(da1cd630) SHA1(35f472114ff001259bdbae073ae041b0759e32cb) ) |
| 1816 | ROM_END |
| 1817 | |
| 1818 | |
| 1819 | //------------------------------------------------- |
| 1791 | 1820 | // ROM( cbm8296 ) |
| 1792 | 1821 | //------------------------------------------------- |
| 1793 | 1822 | |
| r20745 | r20746 | |
| 1895 | 1924 | COMP( 1981, cbm8032_se, pet8032, 0, pet8032, petb_se, driver_device, 0, "Commodore Business Machines", "CBM 8032 (Sweden/Finland)", GAME_SUPPORTS_SAVE ) |
| 1896 | 1925 | COMP( 1981, superpet, pet8032, 0, superpet, petb, driver_device, 0, "Commodore Business Machines", "SuperPET SP-9000", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) |
| 1897 | 1926 | COMP( 1981, mmf9000, pet8032, 0, superpet, petb, driver_device, 0, "Commodore Business Machines", "MicroMainFrame 9000", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) |
| 1927 | COMP( 1981, mmf9000_se, pet8032, 0, superpet, petb_se, driver_device, 0, "Commodore Business Machines", "MicroMainFrame 9000 (Sweden/Finland)", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) |
| 1898 | 1928 | COMP( 1981, cbm8096, pet8032, 0, cbm8096, petb, driver_device, 0, "Commodore Business Machines", "CBM 8096", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) |
| 1899 | 1929 | COMP( 1984, cbm8296, 0, 0, cbm8296, petb, driver_device, 0, "Commodore Business Machines", "CBM 8296", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) |
| 1900 | 1930 | COMP( 1984, cbm8296d, cbm8296, 0, cbm8296d, petb, driver_device, 0, "Commodore Business Machines", "CBM 8296D", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE ) |