trunk/src/mess/drivers/atm.c
| r20561 | r20562 | |
| 38 | 38 | DECLARE_WRITE8_MEMBER(atm_port_7ffd_w); |
| 39 | 39 | DIRECT_UPDATE_MEMBER(atm_direct); |
| 40 | 40 | DECLARE_MACHINE_RESET(atm); |
| 41 | | void atm_update_memory(); |
| 42 | 41 | protected: |
| 43 | 42 | required_device<cpu_device> m_maincpu; |
| 44 | 43 | required_memory_bank m_bank1; |
| r20561 | r20562 | |
| 49 | 48 | required_device<ram_device> m_ram; |
| 50 | 49 | private: |
| 51 | 50 | UINT8 *m_p_ram; |
| 51 | void atm_update_memory(); |
| 52 | 52 | }; |
| 53 | 53 | |
| 54 | 54 | |
| r20561 | r20562 | |
| 91 | 91 | |
| 92 | 92 | void atm_state::atm_update_memory() |
| 93 | 93 | { |
| 94 | | spectrum_state *state = machine().driver_data<spectrum_state>(); |
| 95 | 94 | UINT8 *messram = m_ram->pointer(); |
| 96 | 95 | |
| 97 | | state->m_screen_location = messram + ((state->m_port_7ffd_data & 8) ? (7<<14) : (5<<14)); |
| 96 | m_screen_location = messram + ((m_port_7ffd_data & 8) ? (7<<14) : (5<<14)); |
| 98 | 97 | |
| 99 | | m_bank4->set_base(messram + ((state->m_port_7ffd_data & 0x07) * 0x4000)); |
| 98 | m_bank4->set_base(messram + ((m_port_7ffd_data & 0x07) * 0x4000)); |
| 100 | 99 | |
| 101 | | if (m_beta->started() && betadisk_is_active(m_beta) && !( state->m_port_7ffd_data & 0x10 ) ) |
| 102 | | state->m_ROMSelection = 3; |
| 100 | if (m_beta->started() && betadisk_is_active(m_beta) && !( m_port_7ffd_data & 0x10 ) ) |
| 101 | m_ROMSelection = 3; |
| 103 | 102 | else |
| 104 | 103 | /* ROM switching */ |
| 105 | | state->m_ROMSelection = BIT(state->m_port_7ffd_data, 4) ; |
| 104 | m_ROMSelection = BIT(m_port_7ffd_data, 4) ; |
| 106 | 105 | |
| 107 | 106 | /* rom 0 is 128K rom, rom 1 is 48 BASIC */ |
| 108 | | m_bank1->set_base(&m_p_ram[0x10000 + (state->m_ROMSelection<<14)]); |
| 107 | m_bank1->set_base(&m_p_ram[0x10000 + (m_ROMSelection<<14)]); |
| 109 | 108 | } |
| 110 | 109 | |
| 111 | 110 | WRITE8_MEMBER(atm_state::atm_port_7ffd_w) |
| r20561 | r20562 | |
| 152 | 151 | |
| 153 | 152 | memset(messram,0,128*1024); |
| 154 | 153 | |
| 155 | | /* Bank 2 is always in 0x4000 - 0x7fff */ |
| 154 | /* Bank 5 is always in 0x4000 - 0x7fff */ |
| 156 | 155 | m_bank2->set_base(messram + (5<<14)); |
| 157 | 156 | |
| 158 | | /* Bank 3 is always in 0x8000 - 0xbfff */ |
| 157 | /* Bank 2 is always in 0x8000 - 0xbfff */ |
| 159 | 158 | m_bank3->set_base(messram + (2<<14)); |
| 160 | 159 | |
| 161 | 160 | m_port_7ffd_data = 0; |
trunk/src/mess/drivers/scorpion.c
| r20561 | r20562 | |
| 159 | 159 | { |
| 160 | 160 | public: |
| 161 | 161 | scorpion_state(const machine_config &mconfig, device_type type, const char *tag) |
| 162 | | : spectrum_state(mconfig, type, tag) { } |
| 162 | : spectrum_state(mconfig, type, tag) |
| 163 | , m_maincpu(*this, "maincpu") |
| 164 | , m_bank1(*this, "bank1") |
| 165 | , m_bank2(*this, "bank2") |
| 166 | , m_bank3(*this, "bank3") |
| 167 | , m_bank4(*this, "bank4") |
| 168 | , m_beta(*this, BETA_DISK_TAG) |
| 169 | , m_ram(*this, RAM_TAG) |
| 170 | { } |
| 163 | 171 | |
| 164 | 172 | DECLARE_DIRECT_UPDATE_MEMBER(scorpion_direct); |
| 165 | 173 | DECLARE_WRITE8_MEMBER(scorpion_0000_w); |
| r20561 | r20562 | |
| 168 | 176 | DECLARE_MACHINE_START(scorpion); |
| 169 | 177 | DECLARE_MACHINE_RESET(scorpion); |
| 170 | 178 | TIMER_DEVICE_CALLBACK_MEMBER(nmi_check_callback); |
| 179 | protected: |
| 180 | required_device<cpu_device> m_maincpu; |
| 181 | required_memory_bank m_bank1; |
| 182 | required_memory_bank m_bank2; |
| 183 | required_memory_bank m_bank3; |
| 184 | required_memory_bank m_bank4; |
| 185 | required_device<device_t> m_beta; |
| 186 | required_device<ram_device> m_ram; |
| 187 | private: |
| 188 | UINT8 *m_p_ram; |
| 189 | void scorpion_update_memory(); |
| 190 | |
| 171 | 191 | }; |
| 172 | 192 | |
| 173 | 193 | /****************************************************************************************************/ |
| r20561 | r20562 | |
| 198 | 218 | |
| 199 | 219 | /* rom 0=zx128, 1=zx48, 2 = service monitor, 3=tr-dos */ |
| 200 | 220 | |
| 201 | | static void scorpion_update_memory(running_machine &machine) |
| 221 | void scorpion_state::scorpion_update_memory() |
| 202 | 222 | { |
| 203 | | scorpion_state *state = machine.driver_data<scorpion_state>(); |
| 204 | | UINT8 *messram = machine.device<ram_device>(RAM_TAG)->pointer(); |
| 223 | UINT8 *messram = m_ram->pointer(); |
| 205 | 224 | |
| 206 | | state->m_screen_location = messram + ((state->m_port_7ffd_data & 8) ? (7<<14) : (5<<14)); |
| 225 | m_screen_location = messram + ((m_port_7ffd_data & 8) ? (7<<14) : (5<<14)); |
| 207 | 226 | |
| 208 | | state->membank("bank4")->set_base(messram + (((state->m_port_7ffd_data & 0x07) | ((state->m_port_1ffd_data & 0x10)>>1)) * 0x4000)); |
| 227 | m_bank4->set_base(messram + (((m_port_7ffd_data & 0x07) | ((m_port_1ffd_data & 0x10)>>1)) * 0x4000)); |
| 209 | 228 | |
| 210 | | if ((state->m_port_1ffd_data & 0x01)==0x01) |
| 229 | if ((m_port_1ffd_data & 0x01)==0x01) |
| 211 | 230 | { |
| 212 | | state->m_ram_0000 = messram+(8<<14); |
| 213 | | state->membank("bank1")->set_base(messram+(8<<14)); |
| 231 | m_ram_0000 = messram+(8<<14); |
| 232 | m_bank1->set_base(messram+(8<<14)); |
| 214 | 233 | logerror("RAM\n"); |
| 215 | 234 | } |
| 216 | 235 | else |
| 217 | 236 | { |
| 218 | | if ((state->m_port_1ffd_data & 0x02)==0x02) |
| 219 | | { |
| 220 | | state->m_ROMSelection = 2; |
| 221 | | } |
| 237 | if ((m_port_1ffd_data & 0x02)==0x02) |
| 238 | m_ROMSelection = 2; |
| 222 | 239 | else |
| 223 | | { |
| 224 | | state->m_ROMSelection = ((state->m_port_7ffd_data>>4) & 0x01) ? 1 : 0; |
| 225 | | } |
| 226 | | state->membank("bank1")->set_base(machine.root_device().memregion("maincpu")->base() + 0x010000 + (state->m_ROMSelection<<14)); |
| 240 | m_ROMSelection = BIT(m_port_7ffd_data, 4); |
| 241 | |
| 242 | m_bank1->set_base(&m_p_ram[0x10000 + (m_ROMSelection<<14)]); |
| 227 | 243 | } |
| 228 | | |
| 229 | | |
| 230 | 244 | } |
| 231 | 245 | |
| 232 | 246 | WRITE8_MEMBER(scorpion_state::scorpion_0000_w) |
| r20561 | r20562 | |
| 244 | 258 | |
| 245 | 259 | DIRECT_UPDATE_MEMBER(scorpion_state::scorpion_direct) |
| 246 | 260 | { |
| 247 | | device_t *beta = machine().device(BETA_DISK_TAG); |
| 248 | | UINT16 pc = machine().device("maincpu")->safe_pcbase(); |
| 261 | UINT16 pc = m_maincpu->device_t::safe_pcbase(); // works, but... |
| 249 | 262 | |
| 250 | 263 | m_ram_disabled_by_beta = 0; |
| 251 | | if (betadisk_is_active(beta)) |
| 264 | if (betadisk_is_active(m_beta) && (pc >= 0x4000)) |
| 252 | 265 | { |
| 253 | | if (pc >= 0x4000) |
| 254 | | { |
| 255 | | m_ROMSelection = ((m_port_7ffd_data>>4) & 0x01) ? 1 : 0; |
| 256 | | betadisk_disable(beta); |
| 257 | | m_ram_disabled_by_beta = 1; |
| 258 | | membank("bank1")->set_base(memregion("maincpu")->base() + 0x010000 + (m_ROMSelection<<14)); |
| 259 | | } |
| 266 | m_ROMSelection = BIT(m_port_7ffd_data, 4); |
| 267 | betadisk_disable(m_beta); |
| 268 | m_ram_disabled_by_beta = 1; |
| 269 | m_bank1->set_base(&m_p_ram[0x10000 + (m_ROMSelection<<14)]); |
| 260 | 270 | } |
| 261 | | else if (((pc & 0xff00) == 0x3d00) && (m_ROMSelection==1)) |
| 271 | else |
| 272 | if (((pc & 0xff00) == 0x3d00) && (m_ROMSelection==1)) |
| 262 | 273 | { |
| 263 | 274 | m_ROMSelection = 3; |
| 264 | | betadisk_enable(beta); |
| 275 | betadisk_enable(m_beta); |
| 265 | 276 | } |
| 277 | |
| 266 | 278 | if(address<=0x3fff) |
| 267 | 279 | { |
| 268 | 280 | m_ram_disabled_by_beta = 1; |
| 269 | | direct.explicit_configure(0x0000, 0x3fff, 0x3fff, machine().root_device().memregion("maincpu")->base() + 0x010000 + (m_ROMSelection<<14)); |
| 270 | | membank("bank1")->set_base(machine().root_device().memregion("maincpu")->base() + 0x010000 + (m_ROMSelection<<14)); |
| 281 | direct.explicit_configure(0x0000, 0x3fff, 0x3fff, &m_p_ram[0x10000 + (m_ROMSelection<<14)]); |
| 282 | m_bank1->set_base(&m_p_ram[0x10000 + (m_ROMSelection<<14)]); |
| 271 | 283 | return ~0; |
| 272 | 284 | } |
| 285 | |
| 273 | 286 | return address; |
| 274 | 287 | } |
| 275 | 288 | |
| r20561 | r20562 | |
| 278 | 291 | if ((machine().root_device().ioport("NMI")->read() & 1)==1) |
| 279 | 292 | { |
| 280 | 293 | m_port_1ffd_data |= 0x02; |
| 281 | | scorpion_update_memory(machine()); |
| 282 | | machine().device("maincpu")->execute().set_input_line(INPUT_LINE_NMI, PULSE_LINE); |
| 294 | scorpion_update_memory(); |
| 295 | m_maincpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE); |
| 283 | 296 | } |
| 284 | 297 | } |
| 285 | 298 | |
| r20561 | r20562 | |
| 293 | 306 | m_port_7ffd_data = data; |
| 294 | 307 | |
| 295 | 308 | /* update memory */ |
| 296 | | scorpion_update_memory(machine()); |
| 309 | scorpion_update_memory(); |
| 297 | 310 | } |
| 298 | 311 | |
| 299 | 312 | WRITE8_MEMBER(scorpion_state::scorpion_port_1ffd_w) |
| 300 | 313 | { |
| 301 | 314 | m_port_1ffd_data = data; |
| 302 | | scorpion_update_memory(machine()); |
| 315 | scorpion_update_memory(); |
| 303 | 316 | } |
| 304 | 317 | |
| 305 | 318 | static ADDRESS_MAP_START (scorpion_io, AS_IO, 8, scorpion_state ) |
| r20561 | r20562 | |
| 319 | 332 | |
| 320 | 333 | MACHINE_RESET_MEMBER(scorpion_state,scorpion) |
| 321 | 334 | { |
| 322 | | UINT8 *messram = machine().device<ram_device>(RAM_TAG)->pointer(); |
| 323 | | device_t *beta = machine().device(BETA_DISK_TAG); |
| 324 | | address_space &space = machine().device("maincpu")->memory().space(AS_PROGRAM); |
| 335 | UINT8 *messram = m_ram->pointer(); |
| 336 | address_space &space = m_maincpu->space(AS_PROGRAM); |
| 337 | m_p_ram = memregion("maincpu")->base(); |
| 325 | 338 | |
| 326 | 339 | m_ram_0000 = NULL; |
| 327 | 340 | space.install_read_bank(0x0000, 0x3fff, "bank1"); |
| 328 | 341 | space.install_write_handler(0x0000, 0x3fff, write8_delegate(FUNC(scorpion_state::scorpion_0000_w),this)); |
| 329 | 342 | |
| 330 | | betadisk_disable(beta); |
| 331 | | betadisk_clear_status(beta); |
| 343 | betadisk_disable(m_beta); |
| 344 | betadisk_clear_status(m_beta); |
| 332 | 345 | space.set_direct_update_handler(direct_update_delegate(FUNC(scorpion_state::scorpion_direct), this)); |
| 333 | 346 | |
| 334 | 347 | memset(messram,0,256*1024); |
| 335 | 348 | |
| 336 | 349 | /* Bank 5 is always in 0x4000 - 0x7fff */ |
| 337 | | membank("bank2")->set_base(messram + (5<<14)); |
| 350 | m_bank2->set_base(messram + (5<<14)); |
| 338 | 351 | |
| 339 | 352 | /* Bank 2 is always in 0x8000 - 0xbfff */ |
| 340 | | membank("bank3")->set_base(messram + (2<<14)); |
| 353 | m_bank3->set_base(messram + (2<<14)); |
| 341 | 354 | |
| 342 | 355 | m_port_7ffd_data = 0; |
| 343 | 356 | m_port_1ffd_data = 0; |
| 344 | | scorpion_update_memory(machine()); |
| 357 | scorpion_update_memory(); |
| 345 | 358 | } |
| 346 | 359 | MACHINE_START_MEMBER(scorpion_state,scorpion) |
| 347 | 360 | { |
| r20561 | r20562 | |
| 509 | 522 | ROM_CART_LOAD("cart", 0x0000, 0x4000, ROM_NOCLEAR | ROM_NOMIRROR | ROM_OPTIONAL) |
| 510 | 523 | ROM_END |
| 511 | 524 | |
| 512 | | /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME */ |
| 525 | /* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME */ |
| 513 | 526 | COMP( 1994, scorpio, spec128, 0, scorpion, spec_plus, driver_device, 0, "Zonov and Co.", "Scorpion ZS-256", GAME_NOT_WORKING ) |
| 514 | 527 | COMP( 1991, profi, spec128, 0, profi, spec_plus, driver_device, 0, "Kondor and Kramis", "Profi", GAME_NOT_WORKING ) |
| 515 | 528 | COMP( 1998, kay1024, spec128, 0, scorpion, spec_plus, driver_device, 0, "NEMO", "Kay 1024", GAME_NOT_WORKING ) |