Previous | 199869 Revisions | Next |
r17964 Monday 17th September, 2012 at 08:22:16 UTC by Aaron Giles |
---|
Memory handler normalization, part 2. Change legacy read/write handlers to take an address_space & instead of an address_space *. Also update pretty much all other functions to take a reference where appropriate. [Aaron Giles] |
[src/emu] | devcb.c memconv.h memory.c memory.h |
[src/emu/cpu/dsp56k] | dsp56mem.c |
[src/emu/cpu/g65816] | g65816.c g65816op.h |
[src/emu/cpu/h6280] | h6280.c |
[src/emu/cpu/h83002] | h8_16.c h8_8.c |
[src/emu/cpu/lh5801] | 5801tbl.c |
[src/emu/cpu/m37710] | m37710.c |
[src/emu/cpu/m6502] | m4510.c m6502.c m6509.c mincce02.h |
[src/emu/cpu/m6800] | m6800.c |
[src/emu/cpu/m68000] | 68307bus.c 68307ser.c 68307sim.c 68307sim.h 68307tmu.c 68340dma.c 68340ser.c 68340sim.c 68340tmu.c m68000.h m68kcpu.c |
[src/emu/cpu/mips] | r3000.c |
[src/emu/cpu/powerpc] | ppc.c ppc403.c ppc_mem.c ppccom.c |
[src/emu/cpu/se3208] | se3208.c |
[src/emu/cpu/sh2] | sh2comn.c sh2drc.c |
[src/emu/cpu/sh4] | sh3comn.c sh4comn.c |
[src/emu/cpu/tlcs90] | tlcs90.c |
[src/emu/cpu/tlcs900] | tlcs900.c |
[src/emu/cpu/tms32051] | tms32051.c |
[src/emu/cpu/tms34010] | 34010gfx.c tms34010.c tms34010.h |
[src/emu/cpu/tms7000] | tms7000.c |
[src/emu/cpu/tms9900] | 99xxcore.h |
[src/emu/debug] | debugcmd.c debugcpu.c debugcpu.h dvdisasm.c dvmemory.c |
[src/emu/machine] | 53c810.c 8042kbdc.c amigafdc.c k056230.c latch8.c pc16552d.c s3c2400.c s3c2410.c s3c2440.c s3c24xx.c tmp68301.c v3021.c |
[src/emu/sound] | awacs.c awacs.h nile.c pokey.c spu.c vrender0.c |
[src/emu/video] | hd63484.c pc_cga.c pc_vga.c pc_vga.h tms34061.c tms34061.h |
[src/mame/audio] | 8080bw.c amiga.c atarijsa.c cage.c cage.h carnival.c cclimber.c dcs.c depthch.c gorf.c invinco.c irem.c mario.c namco52.c namco54.c pulsar.c seibu.c snes_snd.c snk6502.c t5182.c taito_en.c taitosnd.c targ.c timeplt.c trackfld.c turbo.c vicdual.c wow.c |
[src/mame/drivers] | 39in1.c aleck64.c appoooh.c aristmk5.c armedf.c astrocde.c astrocorp.c atarigt.c atarisy2.c atarisy4.c atetris.c atvtrack.c badlands.c balsente.c beathead.c berzerk.c bfcobra.c bfm_sc2.c bfm_sc4h.c btime.c bzone.c cabal.c calchase.c calorie.c cave.c cham24.c chihiro.c chinagat.c cmmb.c combatsc.c commando.c coolpool.c coolridr.c cps2.c cps3.c crystal.c cshooter.c csplayh5.c darkmist.c ddenlovr.c dec0.c dec8.c decocass.c discoboy.c dkong.c eolith.c eolith16.c eolithsp.c exidy.c exterm.c famibox.c fcrash.c firebeat.c flstory.c foodf.c freekick.c funworld.c gaelco.c galaga.c galaxian.c galivan.c galpanic.c gamtor.c gauntlet.c gladiatr.c gsword.c guab.c hng64.c homedata.c hshavoc.c hyprduel.c jack.c jalmah.c jpmsys5.c kaneko16.c kchamp.c kickgoal.c klax.c konamigx.c konamim2.c kyugo.c ladybug.c liberate.c macrossp.c magictg.c magtouch.c mainevt.c mappy.c mario.c mediagx.c megadrvb.c megaplay.c megatech.c metalmx.c metro.c midqslvr.c midvunit.c missile.c mitchell.c model2.c model3.c mouser.c mpu3.c mpu4hw.c mpu4vid.c mquake.c multigam.c mystwarr.c namcona1.c namcos11.c namcos12.c namcos21.c namcos23.c naomi.c nbmj9195.c neodrvr.c neogeo.c ninjakd2.c niyanpai.c nmk16.c nyny.c ojankohs.c omegrace.c opwolf.c pacman.c pangofun.c panicr.c pastelg.c pcat_dyn.c pcat_nit.c pcktgal.c pengo.c photoply.c pipedrm.c playch10.c plygonet.c pntnpuzl.c polepos.c powerbal.c progolf.c pturn.c queen.c quizpun2.c r2dx_v33.c raiden2.c rallyx.c redclash.c renegade.c safarir.c saturn.c savquest.c seattle.c segac2.c segag80r.c segag80v.c segas16a.c segas16b.c segas24.c segas32.c segaxbd.c seibuspi.c seicross.c seta.c sf.c shootout.c sigmab52.c skimaxx.c sothello.c spacefb.c srumbler.c ssfindo.c starwars.c su2000.c subsino2.c suna16.c suna8.c superqix.c supertnk.c suprgolf.c system1.c system16.c taito_l.c taitojc.c taitopjc.c taitowlf.c tasman.c tcl.c tiamc1.c tickee.c tigeroad.c tmnt.c toki.c trackfld.c trvquest.c vamphalf.c vcombat.c vega.c vegaeo.c vegas.c vendetta.c vicdual.c viper.c voyager.c vsnes.c williams.c wiz.c xtheball.c xtom3d.c zaxxon.c |
[src/mame/includes] | artmagic.h atari.h atarigt.h btoads.h eolithsp.h exterm.h gaelcrpt.h harddriv.h hyprduel.h jpmimpct.h metro.h midtunit.h midyunit.h model3.h nb1414m4.h nbmj9195.h neogeo.h ojankohs.h pastelg.h segaorun.h segas16b.h segas18.h slapstic.h williams.h |
[src/mame/machine] | acitya.c amiga.c archimds.c asic65.c asteroid.c atari.c atarigen.c bagman.c balsente.c bonzeadv.c cchip.c cclimber.c cd32.c cdi070.c cps2crpt.c cx4fn.c cx4oam.c dc.c deco102.c decocass.c decoprot.c fddebug.c gaelcrpt.c galaxold.c harddriv.c kabuki.c kaneko_calc3.c konami1.c konppc.c m68kfmly.c maniach.c mc8123.c mcr68.c md_cart.c megacd.c megadriv.c megasvp.c megavdp.c mhavoc.c micro3d.c midwayic.c midwayic.h midwunit.c midxunit.c model1.c namco50.c namco53.c namcoio.c namcos1.c namcos2.c naomi.c nb1413m3.c nb1414m4.c neoboot.c neoprot.c nmk004.c pcecommn.c pcshare.c pgmprot.c pgmprot1.c pgmprot2.c pgmprot3.c pgmprot4.c pgmprot5.c pgmprot6.c psx.c scramble.c scudsp.c scudsp.h segacrp2.c segacrpt.c segamsys.c segas32.c seicop.c slapstic.c slikshot.c smpc.c snes.c snes7110.c snesbsx.c snescx4.c snesrtc.c snessdd1.c stfight.c stvcd.c stvprot.c tait8741.c taitoio.c taitosj.c theglobp.c twincobr.c williams.c wrally.c xevious.c |
[src/mame/video] | amiga.c antic.c artmagic.c astrocde.c atari.c atarig1.c atarig42.c atarigx2.c atarisy1.c atarisy2.c avgdvg.c badlands.c baraduke.c bfm_adr2.c bfm_dm01.c blstroid.c bosco.c btoads.c capbowl.c cave.c cischeat.c combatsc.c cyberbal.c dc.c decocass.c digdug.c dogfgt.c exterm.c fastfred.c fuukifg2.c fuukifg3.c galpani2.c galpanic.c gauntlet.c gtia.c gtia.h gticlub.c harddriv.c hng64.c homedata.c hyhoo.c itech8.c jpmimpct.c konamiic.c konicdev.c leland.c lordgun.c mcd212.c megasys1.c midtunit.c midyunit.c midzeus2.c model3.c namcos1.c namcos2.c namcos22.c namcos86.c nbmj8688.c nbmj9195.c neogeo.c ojankohs.c pastelg.c popeye.c ppu2c0x.c ppu2c0x.h redclash.c segaic16.c segas32.c simpsons.c skullxbo.c skydiver.c snes.c stvvdp1.c stvvdp2.c taito_b.c taitoic.c toaplan1.c toobin.c vdc.c vindictr.c vrender0.c williams.c xevious.c ygv608.c |
[src/mess/drivers] | a2600.c a5105.c amiga.c apexc.c apollo.c aquarius.c astrocde.c atm.c avigo.c b16.c basic52.c bebox.c bigbord2.c bullet.c c128.c c64.c cd2650.c d6800.c dc.c dmv.c enterp.c esq5505.c fk1.c fm7.c fmtowns.c gba.c gp32.c homelab.c indiana.c instruct.c ip22.c itt3030.c lynx.c mc10.c megadriv.c mikromik.c mmodular.c nanos.c nc.c nes.c next.c ng_aes.c p8k.c palm.c pc6001.c pc88va.c pc9801.c pce220.c pcw.c pcw16.c pentagon.c pipbug.c psion.c psx.c px4.c qx10.c samcoupe.c sc2.c scorpion.c spc1000.c spec128.c specpls3.c spectrum.c super6.c timex.c trs80m2.c tvc.c vc4000.c vidbrain.c vii.c vt520.c vtech1.c x07.c x1.c x1twin.c x68k.c |
[src/mess/formats] | ace_ace.c cbm_snqk.c m65_snqk.c spec_snqk.c z80bin.c |
[src/mess/includes] | samcoupe.h |
[src/mess/machine] | 990_hd.c a7800.c aim65.c amigacd.c amigacrt.c amstr_pc.c amstrad.c apollo.c apple1.c apple2.c apple2gs.c apple3.c at.c ataricrt.c b2m.c bebox.c c64.c c65.c cgenie.c comx_clm.c concept.c corvushd.c cpc_ssa1.c dccons.c dgn_beta.c europc.c galaxy.c gb.c hd63450.c hec2hrp.c hecdisk2.c hp48.c intv.c iq151_staper.c isa.c kaypro.c kc.c lisa.c llc.c lux21046.c lviv.c lynx.c mac.c mbc55x.c mbee.c mboard.c microtan.c mpc105.c msx_slot.c mz700.c nes.c nes_ines.c nes_mmc.c nes_pcb.c northbridge.c nubus.c oric.c orion.c osborne1.c partner.c pc.c pc1350.c pc1403.c pc_fdc.c pc_joy.c pc_joy.h pecom.c pet.c pk8020.c pmd85.c pokemini.c poly88.c pp01.c primo.c radio86.c rmnimbus.c s3c44b0.c samcoupe.c sgi.c sms.c snescart.c sorcerer.c special.c tandy1t.c tf20.c thomflop.c thomson.c ti85.c trs80.c upd71071.c vector06.c vtech2.c wswan.c x68k_neptunex.c x68k_scsiext.c z80ne.c zx.c |
[src/mess/video] | a7800.c ac1.c apple3.c bbc.c cgenie.c cirrus.c dai.c dgn_beta.c epnick.c galaxy.c gb.c gf4500.c hp48.c intv.c iq151_grafik.c irisha.c isa_cga.c isa_svga_cirrus.c isa_svga_s3.c isa_svga_tseng.c isa_vga.c isa_vga_ati.c kramermc.c newport.c nubus_cb264.c oric.c pc1251.c pc1350.c pc1401.c pc1403.c pc_aga.c pc_t1t.c stic.c ti85.c x68k.c |
r17963 | r17964 | |
---|---|---|
112 | 112 | #else |
113 | 113 | |
114 | 114 | if (((data ^ state->m_last_sound_a) & 0x1e) && (state->m_last_sound_a & 0x1e) != 0x1e) |
115 | space | |
115 | space.machine().scheduler().timer_set(attotime::from_hz(20000), FUNC(update_sound_a), data); | |
116 | 116 | else |
117 | 117 | update_sound_a(data); |
118 | 118 |
r17963 | r17964 | |
---|---|---|
114 | 114 | { |
115 | 115 | UINT8 data = offset >> 8; |
116 | 116 | #if USE_FAKE_VOTRAX |
117 | astrocde_state *state = space->machine().driver_data<astrocde_state>(); | |
118 | samples_device *samples = space->machine().device<samples_device>("samples"); | |
117 | astrocde_state *state = space.machine().driver_data<astrocde_state>(); | |
118 | samples_device *samples = space.machine().device<samples_device>("samples"); | |
119 | 119 | int Phoneme, Intonation; |
120 | 120 | int i = 0; |
121 | 121 | offset &= 0xff; |
r17963 | r17964 | |
172 | 172 | } |
173 | 173 | } |
174 | 174 | #else |
175 | votrax_sc01_device *votrax = space->machine().device<votrax_sc01_device>("votrax"); | |
176 | votrax->inflection_w(*space, 0, data >> 6); | |
177 | votrax->write(*space, 0, data); | |
175 | votrax_sc01_device *votrax = space.machine().device<votrax_sc01_device>("votrax"); | |
176 | votrax->inflection_w(space, 0, data >> 6); | |
177 | votrax->write(space, 0, data); | |
178 | 178 | #endif |
179 | 179 | |
180 | 180 | /* Note : We should really also use volume in this as well as frequency */ |
r17963 | r17964 | |
---|---|---|
203 | 203 | |
204 | 204 | static READ8_HANDLER( jsa1_io_r ) |
205 | 205 | { |
206 | atarigen_state *atarigen = space | |
206 | atarigen_state *atarigen = space.machine().driver_data<atarigen_state>(); | |
207 | 207 | int result = 0xff; |
208 | 208 | |
209 | 209 | switch (offset & 0x206) |
r17963 | r17964 | |
227 | 227 | 0x02 = coin 2 |
228 | 228 | 0x01 = coin 1 |
229 | 229 | */ |
230 | result = space->machine().root_device().ioport("JSAI")->read(); | |
231 | if (!(space->machine().root_device().ioport(test_port)->read() & test_mask)) result ^= 0x80; | |
230 | result = space.machine().root_device().ioport("JSAI")->read(); | |
231 | if (!(space.machine().root_device().ioport(test_port)->read() & test_mask)) result ^= 0x80; | |
232 | 232 | if (atarigen->m_cpu_to_sound_ready) result ^= 0x40; |
233 | 233 | if (atarigen->m_sound_to_cpu_ready) result ^= 0x20; |
234 | 234 | if ((tms5220 != NULL) && (tms5220_readyq_r(tms5220) == 0)) |
r17963 | r17964 | |
269 | 269 | |
270 | 270 | case 0x200: /* /VOICE */ |
271 | 271 | if (tms5220 != NULL) |
272 | tms5220_data_w(tms5220, | |
272 | tms5220_data_w(tms5220, space, 0, data); | |
273 | 273 | break; |
274 | 274 | |
275 | 275 | case 0x202: /* /WRP */ |
r17963 | r17964 | |
298 | 298 | } |
299 | 299 | |
300 | 300 | /* reset the YM2151 if needed */ |
301 | if ((data&1) == 0) space | |
301 | if ((data&1) == 0) space.machine().device("ymsnd")->reset(); | |
302 | 302 | |
303 | 303 | /* coin counters */ |
304 | coin_counter_w(space->machine(), 1, (data >> 5) & 1); | |
305 | coin_counter_w(space->machine(), 0, (data >> 4) & 1); | |
304 | coin_counter_w(space.machine(), 1, (data >> 5) & 1); | |
305 | coin_counter_w(space.machine(), 0, (data >> 4) & 1); | |
306 | 306 | |
307 | 307 | /* update the bank */ |
308 | 308 | memcpy(bank_base, &bank_source_data[0x1000 * ((data >> 6) & 3)], 0x1000); |
r17963 | r17964 | |
318 | 318 | tms5220_volume = ((data >> 6) & 3) * 100 / 3; |
319 | 319 | pokey_volume = ((data >> 4) & 3) * 100 / 3; |
320 | 320 | ym2151_volume = ((data >> 1) & 7) * 100 / 7; |
321 | update_all_volumes(space | |
321 | update_all_volumes(space.machine()); | |
322 | 322 | break; |
323 | 323 | } |
324 | 324 | } |
r17963 | r17964 | |
333 | 333 | |
334 | 334 | static READ8_HANDLER( jsa2_io_r ) |
335 | 335 | { |
336 | atarigen_state *atarigen = space | |
336 | atarigen_state *atarigen = space.machine().driver_data<atarigen_state>(); | |
337 | 337 | int result = 0xff; |
338 | 338 | |
339 | 339 | switch (offset & 0x206) |
340 | 340 | { |
341 | 341 | case 0x000: /* /RDV */ |
342 | 342 | if (oki6295 != NULL) |
343 | result = oki6295->read( | |
343 | result = oki6295->read(space, offset); | |
344 | 344 | else |
345 | 345 | logerror("atarijsa: Unknown read at %04X\n", offset & 0x206); |
346 | 346 | break; |
r17963 | r17964 | |
360 | 360 | 0x02 = coin 2 |
361 | 361 | 0x01 = coin 1 |
362 | 362 | */ |
363 | result = space->machine().root_device().ioport("JSAII")->read(); | |
364 | if (!(space->machine().root_device().ioport(test_port)->read() & test_mask)) result ^= 0x80; | |
363 | result = space.machine().root_device().ioport("JSAII")->read(); | |
364 | if (!(space.machine().root_device().ioport(test_port)->read() & test_mask)) result ^= 0x80; | |
365 | 365 | if (atarigen->m_cpu_to_sound_ready) result ^= 0x40; |
366 | 366 | if (atarigen->m_sound_to_cpu_ready) result ^= 0x20; |
367 | 367 | break; |
r17963 | r17964 | |
398 | 398 | |
399 | 399 | case 0x200: /* /WRV */ |
400 | 400 | if (oki6295 != NULL) |
401 | oki6295->write( | |
401 | oki6295->write(space, offset, data); | |
402 | 402 | else |
403 | 403 | logerror("atarijsa: Unknown write (%02X) at %04X\n", data & 0xff, offset & 0x206); |
404 | 404 | break; |
r17963 | r17964 | |
419 | 419 | */ |
420 | 420 | |
421 | 421 | /* reset the YM2151 if needed */ |
422 | if ((data&1) == 0) space | |
422 | if ((data&1) == 0) space.machine().device("ymsnd")->reset(); | |
423 | 423 | |
424 | 424 | /* update the bank */ |
425 | 425 | memcpy(bank_base, &bank_source_data[0x1000 * ((data >> 6) & 3)], 0x1000); |
426 | 426 | |
427 | 427 | /* coin counters */ |
428 | coin_counter_w(space->machine(), 1, (data >> 5) & 1); | |
429 | coin_counter_w(space->machine(), 0, (data >> 4) & 1); | |
428 | coin_counter_w(space.machine(), 1, (data >> 5) & 1); | |
429 | coin_counter_w(space.machine(), 0, (data >> 4) & 1); | |
430 | 430 | |
431 | 431 | /* update the OKI frequency */ |
432 | 432 | if (oki6295 != NULL) |
r17963 | r17964 | |
443 | 443 | */ |
444 | 444 | ym2151_volume = ((data >> 1) & 7) * 100 / 7; |
445 | 445 | oki6295_volume = 50 + (data & 1) * 50; |
446 | update_all_volumes(space | |
446 | update_all_volumes(space.machine()); | |
447 | 447 | break; |
448 | 448 | } |
449 | 449 | } |
r17963 | r17964 | |
458 | 458 | |
459 | 459 | static READ8_HANDLER( jsa3_io_r ) |
460 | 460 | { |
461 | atarigen_state *atarigen = space | |
461 | atarigen_state *atarigen = space.machine().driver_data<atarigen_state>(); | |
462 | 462 | int result = 0xff; |
463 | 463 | |
464 | 464 | switch (offset & 0x206) |
465 | 465 | { |
466 | 466 | case 0x000: /* /RDV */ |
467 | 467 | if (oki6295 != NULL) |
468 | result = oki6295->read( | |
468 | result = oki6295->read(space, offset); | |
469 | 469 | break; |
470 | 470 | |
471 | 471 | case 0x002: /* /RDP */ |
r17963 | r17964 | |
483 | 483 | 0x02 = coin L (active high) |
484 | 484 | 0x01 = coin R (active high) |
485 | 485 | */ |
486 | result = space->machine().root_device().ioport("JSAIII")->read(); | |
487 | if (!(space->machine().root_device().ioport(test_port)->read() & test_mask)) result ^= 0x90; | |
486 | result = space.machine().root_device().ioport("JSAIII")->read(); | |
487 | if (!(space.machine().root_device().ioport(test_port)->read() & test_mask)) result ^= 0x90; | |
488 | 488 | if (atarigen->m_cpu_to_sound_ready) result ^= 0x40; |
489 | 489 | if (atarigen->m_sound_to_cpu_ready) result ^= 0x20; |
490 | 490 | break; |
r17963 | r17964 | |
511 | 511 | { |
512 | 512 | case 0x000: /* /RDV */ |
513 | 513 | overall_volume = data * 100 / 127; |
514 | update_all_volumes(space | |
514 | update_all_volumes(space.machine()); | |
515 | 515 | break; |
516 | 516 | |
517 | 517 | case 0x002: /* /RDP */ |
r17963 | r17964 | |
525 | 525 | |
526 | 526 | case 0x200: /* /WRV */ |
527 | 527 | if (oki6295 != NULL) |
528 | oki6295->write( | |
528 | oki6295->write(space, offset, data); | |
529 | 529 | break; |
530 | 530 | |
531 | 531 | case 0x202: /* /WRP */ |
r17963 | r17964 | |
544 | 544 | */ |
545 | 545 | |
546 | 546 | /* reset the YM2151 if needed */ |
547 | if ((data&1) == 0) space | |
547 | if ((data&1) == 0) space.machine().device("ymsnd")->reset(); | |
548 | 548 | |
549 | 549 | /* update the OKI bank */ |
550 | 550 | if (oki6295 != NULL) |
551 | space | |
551 | space.machine().root_device().membank("bank12")->set_entry((space.machine().root_device().membank("bank12")->entry() & 2) | ((data >> 1) & 1)); | |
552 | 552 | |
553 | 553 | /* update the bank */ |
554 | 554 | memcpy(bank_base, &bank_source_data[0x1000 * ((data >> 6) & 3)], 0x1000); |
555 | 555 | |
556 | 556 | /* coin counters */ |
557 | coin_counter_w(space->machine(), 1, (data >> 5) & 1); | |
558 | coin_counter_w(space->machine(), 0, (data >> 4) & 1); | |
557 | coin_counter_w(space.machine(), 1, (data >> 5) & 1); | |
558 | coin_counter_w(space.machine(), 0, (data >> 4) & 1); | |
559 | 559 | |
560 | 560 | /* update the OKI frequency */ |
561 | 561 | if (oki6295 != NULL) oki6295->set_pin7(data & 8); |
r17963 | r17964 | |
572 | 572 | |
573 | 573 | /* update the OKI bank */ |
574 | 574 | if (oki6295 != NULL) |
575 | space | |
575 | space.machine().root_device().membank("bank12")->set_entry((space.machine().root_device().membank("bank12")->entry() & 1) | ((data >> 3) & 2)); | |
576 | 576 | |
577 | 577 | /* update the volumes */ |
578 | 578 | ym2151_volume = ((data >> 1) & 7) * 100 / 7; |
579 | 579 | oki6295_volume = 50 + (data & 1) * 50; |
580 | update_all_volumes(space | |
580 | update_all_volumes(space.machine()); | |
581 | 581 | break; |
582 | 582 | } |
583 | 583 | } |
r17963 | r17964 | |
592 | 592 | |
593 | 593 | static READ8_HANDLER( jsa3s_io_r ) |
594 | 594 | { |
595 | atarigen_state *atarigen = space | |
595 | atarigen_state *atarigen = space.machine().driver_data<atarigen_state>(); | |
596 | 596 | int result = 0xff; |
597 | 597 | |
598 | 598 | switch (offset & 0x206) |
599 | 599 | { |
600 | 600 | case 0x000: /* /RDV */ |
601 | 601 | if (oki6295_l != NULL) |
602 | result = ((offset & 1) ? oki6295_r : oki6295_l)->read( | |
602 | result = ((offset & 1) ? oki6295_r : oki6295_l)->read(space, offset); | |
603 | 603 | break; |
604 | 604 | |
605 | 605 | case 0x002: /* /RDP */ |
r17963 | r17964 | |
617 | 617 | 0x02 = coin L (active high) |
618 | 618 | 0x01 = coin R (active high) |
619 | 619 | */ |
620 | result = space->machine().root_device().ioport("JSAIII")->read(); | |
621 | if (!(space->machine().root_device().ioport(test_port)->read() & test_mask)) result ^= 0x90; | |
620 | result = space.machine().root_device().ioport("JSAIII")->read(); | |
621 | if (!(space.machine().root_device().ioport(test_port)->read() & test_mask)) result ^= 0x90; | |
622 | 622 | if (atarigen->m_cpu_to_sound_ready) result ^= 0x40; |
623 | 623 | if (atarigen->m_sound_to_cpu_ready) result ^= 0x20; |
624 | 624 | break; |
r17963 | r17964 | |
645 | 645 | { |
646 | 646 | case 0x000: /* /RDV */ |
647 | 647 | overall_volume = data * 100 / 127; |
648 | update_all_volumes(space | |
648 | update_all_volumes(space.machine()); | |
649 | 649 | break; |
650 | 650 | |
651 | 651 | case 0x002: /* /RDP */ |
r17963 | r17964 | |
659 | 659 | |
660 | 660 | case 0x200: /* /WRV */ |
661 | 661 | if (oki6295_l != NULL) |
662 | ((offset & 1) ? oki6295_r : oki6295_l)->write( | |
662 | ((offset & 1) ? oki6295_r : oki6295_l)->write(space, 0, data); | |
663 | 663 | break; |
664 | 664 | |
665 | 665 | case 0x202: /* /WRP */ |
r17963 | r17964 | |
678 | 678 | */ |
679 | 679 | |
680 | 680 | /* reset the YM2151 if needed */ |
681 | if ((data&1) == 0) space | |
681 | if ((data&1) == 0) space.machine().device("ymsnd")->reset(); | |
682 | 682 | |
683 | 683 | /* update the OKI bank */ |
684 | space | |
684 | space.machine().root_device().membank("bank12")->set_entry((space.machine().root_device().membank("bank12")->entry() & 2) | ((data >> 1) & 1)); | |
685 | 685 | |
686 | 686 | /* update the bank */ |
687 | 687 | memcpy(bank_base, &bank_source_data[0x1000 * ((data >> 6) & 3)], 0x1000); |
688 | 688 | |
689 | 689 | /* coin counters */ |
690 | coin_counter_w(space->machine(), 1, (data >> 5) & 1); | |
691 | coin_counter_w(space->machine(), 0, (data >> 4) & 1); | |
690 | coin_counter_w(space.machine(), 1, (data >> 5) & 1); | |
691 | coin_counter_w(space.machine(), 0, (data >> 4) & 1); | |
692 | 692 | |
693 | 693 | /* update the OKI frequency */ |
694 | 694 | oki6295_l->set_pin7(data & 8); |
r17963 | r17964 | |
705 | 705 | */ |
706 | 706 | |
707 | 707 | /* update the OKI bank */ |
708 | space->machine().root_device().membank("bank12")->set_entry((space->machine().root_device().membank("bank12")->entry() & 1) | ((data >> 3) & 2)); | |
709 | space->machine().root_device().membank("bank14")->set_entry(data >> 6); | |
708 | space.machine().root_device().membank("bank12")->set_entry((space.machine().root_device().membank("bank12")->entry() & 1) | ((data >> 3) & 2)); | |
709 | space.machine().root_device().membank("bank14")->set_entry(data >> 6); | |
710 | 710 | |
711 | 711 | /* update the volumes */ |
712 | 712 | ym2151_volume = ((data >> 1) & 7) * 100 / 7; |
713 | 713 | oki6295_volume = 50 + (data & 1) * 50; |
714 | update_all_volumes(space | |
714 | update_all_volumes(space.machine()); | |
715 | 715 | break; |
716 | 716 | } |
717 | 717 | } |
r17963 | r17964 | |
---|---|---|
204 | 204 | } |
205 | 205 | |
206 | 206 | |
207 | void cage_reset_w(address_space | |
207 | void cage_reset_w(address_space &space, int state) | |
208 | 208 | { |
209 | 209 | cage_t *sndstate = &cage; |
210 | 210 | if (state) |
211 | cage_control_w(space | |
211 | cage_control_w(space.machine(), 0); | |
212 | 212 | sndstate->cpu->set_input_line(INPUT_LINE_RESET, state ? ASSERT_LINE : CLEAR_LINE); |
213 | 213 | } |
214 | 214 | |
r17963 | r17964 | |
246 | 246 | } |
247 | 247 | |
248 | 248 | |
249 | static void update_dma_state(address_space | |
249 | static void update_dma_state(address_space &space) | |
250 | 250 | { |
251 | 251 | cage_t *state = &cage; |
252 | 252 | UINT32 *tms32031_io_regs = state->tms32031_io_regs; |
r17963 | r17964 | |
272 | 272 | inc = (tms32031_io_regs[DMA_GLOBAL_CTL] >> 4) & 1; |
273 | 273 | for (i = 0; i < tms32031_io_regs[DMA_TRANSFER_COUNT]; i++) |
274 | 274 | { |
275 | sound_data[i % STACK_SOUND_BUFSIZE] = space | |
275 | sound_data[i % STACK_SOUND_BUFSIZE] = space.read_dword(addr * 4); | |
276 | 276 | addr += inc; |
277 | 277 | if (i % STACK_SOUND_BUFSIZE == STACK_SOUND_BUFSIZE - 1) |
278 | 278 | dmadac_transfer(&state->dmadac[0], DAC_BUFFER_CHANNELS, 1, DAC_BUFFER_CHANNELS, STACK_SOUND_BUFSIZE / DAC_BUFFER_CHANNELS, sound_data); |
r17963 | r17964 | |
410 | 410 | } |
411 | 411 | |
412 | 412 | if (LOG_32031_IOPORTS) |
413 | logerror("CAGE:%06X:%s read -> %08X\n", space | |
413 | logerror("CAGE:%06X:%s read -> %08X\n", space.device().safe_pc(), register_names[offset & 0x7f], result); | |
414 | 414 | return result; |
415 | 415 | } |
416 | 416 | |
r17963 | r17964 | |
423 | 423 | COMBINE_DATA(&tms32031_io_regs[offset]); |
424 | 424 | |
425 | 425 | if (LOG_32031_IOPORTS) |
426 | logerror("CAGE:%06X:%s write = %08X\n", space | |
426 | logerror("CAGE:%06X:%s write = %08X\n", space.device().safe_pc(), register_names[offset & 0x7f], tms32031_io_regs[offset]); | |
427 | 427 | |
428 | 428 | switch (offset) |
429 | 429 | { |
r17963 | r17964 | |
462 | 462 | case SPORT_GLOBAL_CTL: |
463 | 463 | case SPORT_TIMER_CTL: |
464 | 464 | case SPORT_TIMER_PERIOD: |
465 | update_serial(space | |
465 | update_serial(space.machine()); | |
466 | 466 | break; |
467 | 467 | } |
468 | 468 | } |
r17963 | r17964 | |
506 | 506 | { |
507 | 507 | cage_t *state = &cage; |
508 | 508 | if (LOG_COMM) |
509 | logerror("%06X:CAGE read command = %04X\n", space | |
509 | logerror("%06X:CAGE read command = %04X\n", space.device().safe_pc(), state->from_main); | |
510 | 510 | state->cpu_to_cage_ready = 0; |
511 | update_control_lines(space | |
511 | update_control_lines(space.machine()); | |
512 | 512 | state->cpu->set_input_line(TMS3203X_IRQ0, CLEAR_LINE); |
513 | 513 | return state->from_main; |
514 | 514 | } |
r17963 | r17964 | |
519 | 519 | if (LOG_COMM) |
520 | 520 | { |
521 | 521 | cage_t *state = &cage; |
522 | logerror("%06X:CAGE ack command = %04X\n", space | |
522 | logerror("%06X:CAGE ack command = %04X\n", space.device().safe_pc(), state->from_main); | |
523 | 523 | } |
524 | 524 | } |
525 | 525 | |
r17963 | r17964 | |
528 | 528 | { |
529 | 529 | cage_t *state = &cage; |
530 | 530 | if (LOG_COMM) |
531 | logerror("%06X:Data from CAGE = %04X\n", space->device().safe_pc(), data); | |
532 | driver_device *drvstate = space->machine().driver_data<driver_device>(); | |
533 | drvstate->soundlatch_word_w(*space, 0, data, mem_mask); | |
531 | logerror("%06X:Data from CAGE = %04X\n", space.device().safe_pc(), data); | |
532 | driver_device *drvstate = space.machine().driver_data<driver_device>(); | |
533 | drvstate->soundlatch_word_w(space, 0, data, mem_mask); | |
534 | 534 | state->cage_to_cpu_ready = 1; |
535 | update_control_lines(space | |
535 | update_control_lines(space.machine()); | |
536 | 536 | } |
537 | 537 | |
538 | 538 | |
r17963 | r17964 | |
548 | 548 | } |
549 | 549 | |
550 | 550 | |
551 | UINT16 cage_main_r(address_space | |
551 | UINT16 cage_main_r(address_space &space) | |
552 | 552 | { |
553 | 553 | cage_t *state = &cage; |
554 | driver_device *drvstate = space | |
554 | driver_device *drvstate = space.machine().driver_data<driver_device>(); | |
555 | 555 | if (LOG_COMM) |
556 | logerror("%s:main read data = %04X\n", space | |
556 | logerror("%s:main read data = %04X\n", space.machine().describe_context(), drvstate->soundlatch_word_r(space, 0, 0)); | |
557 | 557 | state->cage_to_cpu_ready = 0; |
558 | update_control_lines(space->machine()); | |
559 | return drvstate->soundlatch_word_r(*space, 0, 0xffff); | |
558 | update_control_lines(space.machine()); | |
559 | return drvstate->soundlatch_word_r(space, 0, 0xffff); | |
560 | 560 | } |
561 | 561 | |
562 | 562 | |
r17963 | r17964 | |
570 | 570 | } |
571 | 571 | |
572 | 572 | |
573 | void cage_main_w(address_space | |
573 | void cage_main_w(address_space &space, UINT16 data) | |
574 | 574 | { |
575 | 575 | if (LOG_COMM) |
576 | logerror("%s:Command to CAGE = %04X\n", space->machine().describe_context(), data); | |
577 | space->machine().scheduler().synchronize(FUNC(cage_deferred_w), data); | |
576 | logerror("%s:Command to CAGE = %04X\n", space.machine().describe_context(), data); | |
577 | space.machine().scheduler().synchronize(FUNC(cage_deferred_w), data); | |
578 | 578 | } |
579 | 579 | |
580 | 580 | |
r17963 | r17964 | |
637 | 637 | { |
638 | 638 | cage_t *state = &cage; |
639 | 639 | |
640 | space | |
640 | space.device().execute().eat_cycles(100); | |
641 | 641 | COMBINE_DATA(&state->speedup_ram[offset]); |
642 | 642 | } |
643 | 643 |
r17963 | r17964 | |
---|---|---|
78 | 78 | |
79 | 79 | static READ8_HANDLER( namco_52xx_K_r ) |
80 | 80 | { |
81 | namco_52xx_state *state = get_safe_token(space | |
81 | namco_52xx_state *state = get_safe_token(space.device().owner()); | |
82 | 82 | return state->m_latched_cmd & 0x0f; |
83 | 83 | } |
84 | 84 | |
85 | 85 | static READ8_HANDLER( namco_52xx_SI_r ) |
86 | 86 | { |
87 | namco_52xx_state *state = get_safe_token(space | |
87 | namco_52xx_state *state = get_safe_token(space.device().owner()); | |
88 | 88 | return state->m_si(0) ? 1 : 0; |
89 | 89 | } |
90 | 90 | |
91 | 91 | static READ8_HANDLER( namco_52xx_R0_r ) |
92 | 92 | { |
93 | namco_52xx_state *state = get_safe_token(space | |
93 | namco_52xx_state *state = get_safe_token(space.device().owner()); | |
94 | 94 | return state->m_romread(state->m_address) & 0x0f; |
95 | 95 | } |
96 | 96 | |
97 | 97 | static READ8_HANDLER( namco_52xx_R1_r ) |
98 | 98 | { |
99 | namco_52xx_state *state = get_safe_token(space | |
99 | namco_52xx_state *state = get_safe_token(space.device().owner()); | |
100 | 100 | return state->m_romread(state->m_address) >> 4; |
101 | 101 | } |
102 | 102 | |
103 | 103 | |
104 | 104 | static WRITE8_HANDLER( namco_52xx_P_w ) |
105 | 105 | { |
106 | namco_52xx_state *state = get_safe_token(space->device().owner()); | |
107 | discrete_sound_w(state->m_discrete, *space, NAMCO_52XX_P_DATA(state->m_basenode), data & 0x0f); | |
106 | namco_52xx_state *state = get_safe_token(space.device().owner()); | |
107 | discrete_sound_w(state->m_discrete, space, NAMCO_52XX_P_DATA(state->m_basenode), data & 0x0f); | |
108 | 108 | } |
109 | 109 | |
110 | 110 | static WRITE8_HANDLER( namco_52xx_R2_w ) |
111 | 111 | { |
112 | namco_52xx_state *state = get_safe_token(space | |
112 | namco_52xx_state *state = get_safe_token(space.device().owner()); | |
113 | 113 | state->m_address = (state->m_address & 0xfff0) | ((data & 0xf) << 0); |
114 | 114 | } |
115 | 115 | |
116 | 116 | static WRITE8_HANDLER( namco_52xx_R3_w ) |
117 | 117 | { |
118 | namco_52xx_state *state = get_safe_token(space | |
118 | namco_52xx_state *state = get_safe_token(space.device().owner()); | |
119 | 119 | state->m_address = (state->m_address & 0xff0f) | ((data & 0xf) << 4); |
120 | 120 | } |
121 | 121 | |
122 | 122 | static WRITE8_HANDLER( namco_52xx_O_w ) |
123 | 123 | { |
124 | namco_52xx_state *state = get_safe_token(space | |
124 | namco_52xx_state *state = get_safe_token(space.device().owner()); | |
125 | 125 | if (data & 0x10) |
126 | 126 | state->m_address = (state->m_address & 0x0fff) | ((data & 0xf) << 12); |
127 | 127 | else |
r17963 | r17964 | |
---|---|---|
12 | 12 | |
13 | 13 | void cage_init(running_machine &machine, offs_t speedup); |
14 | 14 | void cage_set_irq_handler(void (*irqhandler)(running_machine &, int)); |
15 | void cage_reset_w(address_space | |
15 | void cage_reset_w(address_space &space, int state); | |
16 | 16 | |
17 | UINT16 cage_main_r(address_space *space); | |
18 | void cage_main_w(address_space *space, UINT16 data); | |
17 | UINT16 cage_main_r(address_space &space); | |
18 | void cage_main_w(address_space &space, UINT16 data); | |
19 | 19 | |
20 | 20 | UINT16 cage_control_r(running_machine &machine); |
21 | 21 | void cage_control_w(running_machine &machine, UINT16 data); |
r17963 | r17964 | |
---|---|---|
55 | 55 | WRITE8_HANDLER( depthch_audio_w ) |
56 | 56 | { |
57 | 57 | static int port1State = 0; |
58 | samples_device *samples = space | |
58 | samples_device *samples = space.machine().device<samples_device>("samples"); | |
59 | 59 | int bitsChanged; |
60 | 60 | int bitsGoneHigh; |
61 | 61 | int bitsGoneLow; |
r17963 | r17964 | |
---|---|---|
109 | 109 | break; |
110 | 110 | |
111 | 111 | case 0x04: // port status |
112 | //logerror("taitosnd: Master issued control value %02x (PC = %08x) \n",data, space | |
112 | //logerror("taitosnd: Master issued control value %02x (PC = %08x) \n",data, space.device().safe_pc() ); | |
113 | 113 | /* this does a hi-lo transition to reset the sound cpu */ |
114 | 114 | if (data) |
115 | 115 | tc0140syt->slavecpu->execute().set_input_line(INPUT_LINE_RESET, ASSERT_LINE); |
r17963 | r17964 | |
240 | 240 | break; |
241 | 241 | |
242 | 242 | case 0x01: // mode #1 |
243 | //logerror("taitosnd: Slave cpu receives 0/1 : %01x%01x PC=%4x\n", tc0140syt->slavedata[1] , tc0140syt->slavedata[0],space | |
243 | //logerror("taitosnd: Slave cpu receives 0/1 : %01x%01x PC=%4x\n", tc0140syt->slavedata[1] , tc0140syt->slavedata[0],space.device().safe_pc()); | |
244 | 244 | tc0140syt->status &= ~TC0140SYT_PORT01_FULL; |
245 | 245 | res = tc0140syt->slavedata[tc0140syt->submode ++]; |
246 | 246 | break; |
r17963 | r17964 | |
---|---|---|
127 | 127 | WRITE8_HANDLER( carnival_audio_1_w ) |
128 | 128 | { |
129 | 129 | static int port1State = 0; |
130 | samples_device *samples = space | |
130 | samples_device *samples = space.machine().device<samples_device>("samples"); | |
131 | 131 | int bitsChanged; |
132 | 132 | int bitsGoneHigh; |
133 | 133 | int bitsGoneLow; |
r17963 | r17964 | |
206 | 206 | |
207 | 207 | WRITE8_HANDLER( carnival_audio_2_w ) |
208 | 208 | { |
209 | samples_device *samples = space | |
209 | samples_device *samples = space.machine().device<samples_device>("samples"); | |
210 | 210 | int bitsChanged; |
211 | 211 | int bitsGoneHigh; |
212 | 212 | int bitsGoneLow; |
r17963 | r17964 | |
236 | 236 | |
237 | 237 | if ( bitsGoneHigh & OUT_PORT_2_MUSIC_RESET ) |
238 | 238 | /* reset output is no longer asserted active low */ |
239 | space | |
239 | space.machine().device("audiocpu")->execute().set_input_line(INPUT_LINE_RESET, PULSE_LINE ); | |
240 | 240 | } |
241 | 241 | |
242 | 242 |
r17963 | r17964 | |
---|---|---|
64 | 64 | |
65 | 65 | static WRITE16_HANDLER( en_es5505_bank_w ) |
66 | 66 | { |
67 | UINT32 max_banks_this_game = (space | |
67 | UINT32 max_banks_this_game = (space.machine().root_device().memregion("ensoniq.0")->bytes()/0x200000)-1; | |
68 | 68 | |
69 | 69 | #if 0 |
70 | 70 | { |
r17963 | r17964 | |
76 | 76 | |
77 | 77 | /* mask out unused bits */ |
78 | 78 | data &= max_banks_this_game; |
79 | es5505_voice_bank_w(space | |
79 | es5505_voice_bank_w(space.machine().device("ensoniq"),offset,data<<20); | |
80 | 80 | } |
81 | 81 | |
82 | 82 | static WRITE16_HANDLER( en_volume_w ) |
83 | 83 | { |
84 | 84 | if (ACCESSING_BITS_8_15) |
85 | mb87078_data_w(space | |
85 | mb87078_data_w(space.machine().device("mb87078"), data >> 8, offset ^ 1); | |
86 | 86 | } |
87 | 87 | |
88 | 88 | |
r17963 | r17964 | |
94 | 94 | |
95 | 95 | static READ16_HANDLER( es5510_dsp_r ) |
96 | 96 | { |
97 | // logerror("%06x: DSP read offset %04x (data is %04x)\n",space | |
97 | // logerror("%06x: DSP read offset %04x (data is %04x)\n",space.device().safe_pc(),offset,es5510_dsp_ram[offset]); | |
98 | 98 | // if (es_tmp) return es5510_dsp_ram[offset]; |
99 | 99 | /* |
100 | 100 | switch (offset) { |
r17963 | r17964 | |
106 | 106 | */ |
107 | 107 | // offset<<=1; |
108 | 108 | |
109 | //if (offset<7 && es5510_dsp_ram[0]!=0xff) return space | |
109 | //if (offset<7 && es5510_dsp_ram[0]!=0xff) return space.machine().rand()%0xffff; | |
110 | 110 | |
111 | 111 | switch(offset) |
112 | 112 | { |
r17963 | r17964 | |
125 | 125 | |
126 | 126 | static WRITE16_HANDLER( es5510_dsp_w ) |
127 | 127 | { |
128 | UINT8 *snd_mem = (UINT8 *)space | |
128 | UINT8 *snd_mem = (UINT8 *)space.machine().root_device().memregion("ensoniq.0")->base(); | |
129 | 129 | |
130 | 130 | // if (offset>4 && offset!=0x80 && offset!=0xa0 && offset!=0xc0 && offset!=0xe0) |
131 | // logerror("%06x: DSP write offset %04x %04x\n",space | |
131 | // logerror("%06x: DSP write offset %04x %04x\n",space.device().safe_pc(),offset,data); | |
132 | 132 | |
133 | 133 | COMBINE_DATA(&es5510_dsp_ram[offset]); |
134 | 134 |
r17963 | r17964 | |
---|---|---|
104 | 104 | |
105 | 105 | void seibu_sound_decrypt(running_machine &machine,const char *cpu,int length) |
106 | 106 | { |
107 | address_space | |
107 | address_space &space = *machine.device(cpu)->memory().space(AS_PROGRAM); | |
108 | 108 | UINT8 *decrypt = auto_alloc_array(machine, UINT8, length); |
109 | 109 | UINT8 *rom = machine.root_device().memregion(cpu)->base(); |
110 | 110 | int i; |
111 | 111 | |
112 | space | |
112 | space.set_decrypted_region(0x0000, (length < 0x10000) ? (length - 1) : 0x1fff, decrypt); | |
113 | 113 | |
114 | 114 | for (i = 0;i < length;i++) |
115 | 115 | { |
r17963 | r17964 | |
296 | 296 | WRITE8_HANDLER( seibu_irq_clear_w ) |
297 | 297 | { |
298 | 298 | /* Denjin Makai and SD Gundam doesn't like this, it's tied to the rst18 ack ONLY so it could be related to it. */ |
299 | //update_irq_lines(space | |
299 | //update_irq_lines(space.machine(), VECTOR_INIT); | |
300 | 300 | } |
301 | 301 | |
302 | 302 | WRITE8_HANDLER( seibu_rst10_ack_w ) |
r17963 | r17964 | |
306 | 306 | |
307 | 307 | WRITE8_HANDLER( seibu_rst18_ack_w ) |
308 | 308 | { |
309 | update_irq_lines(space | |
309 | update_irq_lines(space.machine(), RST18_CLEAR); | |
310 | 310 | } |
311 | 311 | |
312 | 312 | void seibu_ym3812_irqhandler(device_t *device, int linestate) |
r17963 | r17964 | |
349 | 349 | |
350 | 350 | WRITE8_HANDLER( seibu_bank_w ) |
351 | 351 | { |
352 | space | |
352 | space.machine().root_device().membank("bank1")->set_entry(data & 1); | |
353 | 353 | } |
354 | 354 | |
355 | 355 | WRITE8_HANDLER( seibu_coin_w ) |
356 | 356 | { |
357 | coin_counter_w(space->machine(), 0,data & 1); | |
358 | coin_counter_w(space->machine(), 1,data & 2); | |
357 | coin_counter_w(space.machine(), 0,data & 1); | |
358 | coin_counter_w(space.machine(), 1,data & 2); | |
359 | 359 | } |
360 | 360 | |
361 | 361 | READ8_HANDLER( seibu_soundlatch_r ) |
r17963 | r17964 | |
382 | 382 | |
383 | 383 | READ16_HANDLER( seibu_main_word_r ) |
384 | 384 | { |
385 | //logerror("%06x: seibu_main_word_r(%x)\n",space | |
385 | //logerror("%06x: seibu_main_word_r(%x)\n",space.device().safe_pc(),offset); | |
386 | 386 | switch (offset) |
387 | 387 | { |
388 | 388 | case 2: |
r17963 | r17964 | |
391 | 391 | case 5: |
392 | 392 | return main2sub_pending ? 1 : 0; |
393 | 393 | default: |
394 | //logerror("%06x: seibu_main_word_r(%x)\n",space | |
394 | //logerror("%06x: seibu_main_word_r(%x)\n",space.device().safe_pc(),offset); | |
395 | 395 | return 0xffff; |
396 | 396 | } |
397 | 397 | } |
398 | 398 | |
399 | 399 | WRITE16_HANDLER( seibu_main_word_w ) |
400 | 400 | { |
401 | //printf("%06x: seibu_main_word_w(%x,%02x)\n",space | |
401 | //printf("%06x: seibu_main_word_w(%x,%02x)\n",space.device().safe_pc(),offset,data); | |
402 | 402 | if (ACCESSING_BITS_0_7) |
403 | 403 | { |
404 | 404 | switch (offset) |
r17963 | r17964 | |
408 | 408 | main2sub[offset] = data; |
409 | 409 | break; |
410 | 410 | case 4: |
411 | update_irq_lines(space | |
411 | update_irq_lines(space.machine(), RST18_ASSERT); | |
412 | 412 | break; |
413 | 413 | case 2: //Sengoku Mahjong writes here |
414 | 414 | case 6: |
r17963 | r17964 | |
417 | 417 | main2sub_pending = 1; |
418 | 418 | break; |
419 | 419 | default: |
420 | //logerror("%06x: seibu_main_word_w(%x,%02x)\n",space | |
420 | //logerror("%06x: seibu_main_word_w(%x,%02x)\n",space.device().safe_pc(),offset,data); | |
421 | 421 | break; |
422 | 422 | } |
423 | 423 | } |
r17963 | r17964 | |
440 | 440 | |
441 | 441 | // logerror("seibu_main_mustb_w: %x -> %x %x\n", data, main2sub[0], main2sub[1]); |
442 | 442 | |
443 | update_irq_lines(space | |
443 | update_irq_lines(space.machine(), RST18_ASSERT); | |
444 | 444 | } |
445 | 445 | |
446 | 446 | /***************************************************************************/ |
r17963 | r17964 | |
---|---|---|
1081 | 1081 | static WRITE16_HANDLER( dcs_data_bank_select_w ) |
1082 | 1082 | { |
1083 | 1083 | dcs.sounddata_bank = data & 0x7ff; |
1084 | space | |
1084 | space.machine().root_device().membank("databank")->set_entry(dcs.sounddata_bank % dcs.sounddata_banks); | |
1085 | 1085 | |
1086 | 1086 | /* bit 11 = sound board led */ |
1087 | 1087 | #if 0 |
1088 | set_led_status(space | |
1088 | set_led_status(space.machine(), 2, data & 0x800); | |
1089 | 1089 | #endif |
1090 | 1090 | } |
1091 | 1091 | |
r17963 | r17964 | |
1253 | 1253 | case 0: |
1254 | 1254 | sdrc.reg[0] = data; |
1255 | 1255 | if (diff & 0x1833) |
1256 | sdrc_remap_memory(space | |
1256 | sdrc_remap_memory(space.machine()); | |
1257 | 1257 | if (diff & 0x0380) |
1258 | sdrc_update_bank_pointers(space | |
1258 | sdrc_update_bank_pointers(space.machine()); | |
1259 | 1259 | break; |
1260 | 1260 | |
1261 | 1261 | /* offset 1 controls RAM mapping */ |
r17963 | r17964 | |
1263 | 1263 | sdrc.reg[1] = data; |
1264 | 1264 | //dmadac_enable(&dcs.dmadac[0], dcs.channels, SDRC_MUTE); |
1265 | 1265 | if (diff & 0x0003) |
1266 | sdrc_remap_memory(space | |
1266 | sdrc_remap_memory(space.machine()); | |
1267 | 1267 | break; |
1268 | 1268 | |
1269 | 1269 | /* offset 2 controls paging */ |
1270 | 1270 | case 2: |
1271 | 1271 | sdrc.reg[2] = data; |
1272 | 1272 | if (diff & 0x1fff) |
1273 | sdrc_update_bank_pointers(space | |
1273 | sdrc_update_bank_pointers(space.machine()); | |
1274 | 1274 | break; |
1275 | 1275 | |
1276 | 1276 | /* offset 3 controls security */ |
r17963 | r17964 | |
1352 | 1352 | dmadac_enable(&dcs.dmadac[0], dcs.channels, DSIO_MUTE); |
1353 | 1353 | |
1354 | 1354 | /* bit 0 resets the FIFO */ |
1355 | midway_ioasic_fifo_reset_w(space | |
1355 | midway_ioasic_fifo_reset_w(space.machine(), DSIO_EMPTY_FIFO ^ 1); | |
1356 | 1356 | break; |
1357 | 1357 | |
1358 | 1358 | /* offset 2 controls RAM pages */ |
1359 | 1359 | case 2: |
1360 | 1360 | dsio.reg[2] = data; |
1361 | space | |
1361 | space.machine().root_device().membank("databank")->set_entry(DSIO_DM_PG % dcs.sounddata_banks); | |
1362 | 1362 | break; |
1363 | 1363 | } |
1364 | 1364 | } |
r17963 | r17964 | |
1413 | 1413 | { |
1414 | 1414 | char buffer[10]; |
1415 | 1415 | sprintf(buffer, "dac%d", chan + 1); |
1416 | dcs.dmadac[chan] = space | |
1416 | dcs.dmadac[chan] = space.machine().device<dmadac_sound_device>(buffer); | |
1417 | 1417 | } |
1418 | 1418 | dmadac_enable(&dcs.dmadac[0], dcs.channels, enable); |
1419 | 1419 | if (dcs.channels < 6) |
1420 | 1420 | dmadac_enable(&dcs.dmadac[dcs.channels], 6 - dcs.channels, FALSE); |
1421 | recompute_sample_rate(space | |
1421 | recompute_sample_rate(space.machine()); | |
1422 | 1422 | } |
1423 | 1423 | break; |
1424 | 1424 | |
1425 | 1425 | /* offset 2 controls RAM pages */ |
1426 | 1426 | case 2: |
1427 | 1427 | dsio.reg[2] = data; |
1428 | space | |
1428 | space.machine().root_device().membank("databank")->set_entry(DENV_DM_PG % dcs.sounddata_bank); | |
1429 | 1429 | break; |
1430 | 1430 | |
1431 | 1431 | /* offset 3 controls FIFO reset */ |
1432 | 1432 | case 3: |
1433 | midway_ioasic_fifo_reset_w(space | |
1433 | midway_ioasic_fifo_reset_w(space.machine(), 1); | |
1434 | 1434 | break; |
1435 | 1435 | } |
1436 | 1436 | } |
r17963 | r17964 | |
1447 | 1447 | { |
1448 | 1448 | dsio_state &dsio = dcs.dsio; |
1449 | 1449 | if (LOG_DCS_TRANSFERS) |
1450 | logerror("%08X:IDMA_addr = %04X\n", space | |
1450 | logerror("%08X:IDMA_addr = %04X\n", space.device().safe_pc(), data); | |
1451 | 1451 | downcast<adsp2181_device *>(dcs.cpu)->idma_addr_w(data); |
1452 | 1452 | if (data == 0) |
1453 | 1453 | dsio.start_on_next_write = 2; |
r17963 | r17964 | |
1457 | 1457 | WRITE32_HANDLER( dsio_idma_data_w ) |
1458 | 1458 | { |
1459 | 1459 | dsio_state &dsio = dcs.dsio; |
1460 | UINT32 pc = space | |
1460 | UINT32 pc = space.device().safe_pc(); | |
1461 | 1461 | if (ACCESSING_BITS_0_15) |
1462 | 1462 | { |
1463 | 1463 | if (LOG_DCS_TRANSFERS) |
r17963 | r17964 | |
1483 | 1483 | UINT32 result; |
1484 | 1484 | result = downcast<adsp2181_device *>(dcs.cpu)->idma_data_r(); |
1485 | 1485 | if (LOG_DCS_TRANSFERS) |
1486 | logerror("%08X:IDMA_data_r(%04X) = %04X\n", space | |
1486 | logerror("%08X:IDMA_data_r(%04X) = %04X\n", space.device().safe_pc(), downcast<adsp2181_device *>(dcs.cpu)->idma_addr_r(), result); | |
1487 | 1487 | return result; |
1488 | 1488 | } |
1489 | 1489 | |
r17963 | r17964 | |
1607 | 1607 | static WRITE16_HANDLER( input_latch_ack_w ) |
1608 | 1608 | { |
1609 | 1609 | if (!dcs.last_input_empty && dcs.input_empty_cb) |
1610 | (*dcs.input_empty_cb)(space | |
1610 | (*dcs.input_empty_cb)(space.machine(), dcs.last_input_empty = 1); | |
1611 | 1611 | SET_INPUT_EMPTY(); |
1612 | 1612 | dcs.cpu->set_input_line(ADSP2105_IRQ2, CLEAR_LINE); |
1613 | 1613 | } |
r17963 | r17964 | |
1618 | 1618 | if (dcs.auto_ack) |
1619 | 1619 | input_latch_ack_w(space,0,0,0xffff); |
1620 | 1620 | if (LOG_DCS_IO) |
1621 | logerror("%08X:input_latch_r(%04X)\n", space | |
1621 | logerror("%08X:input_latch_r(%04X)\n", space.device().safe_pc(), dcs.input_data); | |
1622 | 1622 | return dcs.input_data; |
1623 | 1623 | } |
1624 | 1624 | |
r17963 | r17964 | |
1640 | 1640 | static WRITE16_HANDLER( output_latch_w ) |
1641 | 1641 | { |
1642 | 1642 | if (LOG_DCS_IO) |
1643 | logerror("%08X:output_latch_w(%04X) (empty=%d)\n", space->device().safe_pc(), data, IS_OUTPUT_EMPTY()); | |
1644 | space->machine().scheduler().synchronize(FUNC(latch_delayed_w), data); | |
1643 | logerror("%08X:output_latch_w(%04X) (empty=%d)\n", space.device().safe_pc(), data, IS_OUTPUT_EMPTY()); | |
1644 | space.machine().scheduler().synchronize(FUNC(latch_delayed_w), data); | |
1645 | 1645 | } |
1646 | 1646 | |
1647 | 1647 | |
r17963 | r17964 | |
1694 | 1694 | static WRITE16_HANDLER( output_control_w ) |
1695 | 1695 | { |
1696 | 1696 | if (LOG_DCS_IO) |
1697 | logerror("%04X:output_control = %04X\n", space->device().safe_pc(), data); | |
1698 | space->machine().scheduler().synchronize(FUNC(output_control_delayed_w), data); | |
1697 | logerror("%04X:output_control = %04X\n", space.device().safe_pc(), data); | |
1698 | space.machine().scheduler().synchronize(FUNC(output_control_delayed_w), data); | |
1699 | 1699 | } |
1700 | 1700 | |
1701 | 1701 | |
r17963 | r17964 | |
1858 | 1858 | break; |
1859 | 1859 | |
1860 | 1860 | case TIMER_COUNT_REG: |
1861 | update_timer_count(space | |
1861 | update_timer_count(space.machine()); | |
1862 | 1862 | result = dcs.control_regs[offset]; |
1863 | 1863 | break; |
1864 | 1864 | |
r17963 | r17964 | |
1880 | 1880 | /* bit 9 forces a reset */ |
1881 | 1881 | if (data & 0x0200) |
1882 | 1882 | { |
1883 | logerror("%04X:Rebooting DCS due to SYSCONTROL write\n", space | |
1883 | logerror("%04X:Rebooting DCS due to SYSCONTROL write\n", space.device().safe_pc()); | |
1884 | 1884 | dcs.cpu->set_input_line(INPUT_LINE_RESET, PULSE_LINE); |
1885 | dcs_boot(space | |
1885 | dcs_boot(space.machine()); | |
1886 | 1886 | dcs.control_regs[SYSCONTROL_REG] = 0; |
1887 | 1887 | } |
1888 | 1888 | |
r17963 | r17964 | |
1914 | 1914 | data = (data & 0xff) + 1; |
1915 | 1915 | if (data != dcs.timer_scale) |
1916 | 1916 | { |
1917 | update_timer_count(space | |
1917 | update_timer_count(space.machine()); | |
1918 | 1918 | dcs.timer_scale = data; |
1919 | reset_timer(space | |
1919 | reset_timer(space.machine()); | |
1920 | 1920 | } |
1921 | 1921 | break; |
1922 | 1922 | |
1923 | 1923 | case TIMER_COUNT_REG: |
1924 | 1924 | dcs.timer_start_count = data; |
1925 | reset_timer(space | |
1925 | reset_timer(space.machine()); | |
1926 | 1926 | break; |
1927 | 1927 | |
1928 | 1928 | case TIMER_PERIOD_REG: |
1929 | 1929 | if (data != dcs.timer_period) |
1930 | 1930 | { |
1931 | update_timer_count(space | |
1931 | update_timer_count(space.machine()); | |
1932 | 1932 | dcs.timer_period = data; |
1933 | reset_timer(space | |
1933 | reset_timer(space.machine()); | |
1934 | 1934 | } |
1935 | 1935 | break; |
1936 | 1936 | |
r17963 | r17964 | |
2076 | 2076 | static READ16_HANDLER( dcs_polling_r ) |
2077 | 2077 | { |
2078 | 2078 | if (dcs.polling_count++ > 5) |
2079 | space | |
2079 | space.device().execute().eat_cycles(10000); | |
2080 | 2080 | return *dcs.polling_base; |
2081 | 2081 | } |
2082 | 2082 | |
r17963 | r17964 | |
2137 | 2137 | machine.scheduler().timer_set(attotime::from_usec(1), FUNC(s1_ack_callback2), param); |
2138 | 2138 | return; |
2139 | 2139 | } |
2140 | output_latch_w(dcs.cpu->space(AS_PROGRAM), 0, 0x000a, 0xffff); | |
2140 | output_latch_w(*dcs.cpu->space(AS_PROGRAM), 0, 0x000a, 0xffff); | |
2141 | 2141 | } |
2142 | 2142 | |
2143 | 2143 | |
r17963 | r17964 | |
2149 | 2149 | machine.scheduler().timer_set(attotime::from_usec(1), FUNC(s1_ack_callback1), param); |
2150 | 2150 | return; |
2151 | 2151 | } |
2152 | output_latch_w(dcs.cpu->space(AS_PROGRAM), 0, param, 0xffff); | |
2152 | output_latch_w(*dcs.cpu->space(AS_PROGRAM), 0, param, 0xffff); | |
2153 | 2153 | |
2154 | 2154 | /* chain to the next word we need to write back */ |
2155 | 2155 | machine.scheduler().timer_set(attotime::from_usec(1), FUNC(s1_ack_callback2)); |
r17963 | r17964 | |
2281 | 2281 | |
2282 | 2282 | static TIMER_CALLBACK( s2_ack_callback ) |
2283 | 2283 | { |
2284 | address_space | |
2284 | address_space &space = *dcs.cpu->space(AS_PROGRAM); | |
2285 | 2285 | |
2286 | 2286 | /* if the output is full, stall for a usec */ |
2287 | 2287 | if (IS_OUTPUT_FULL()) |
r17963 | r17964 | |
---|---|---|
897 | 897 | |
898 | 898 | static void schaser_reinit_555_time_remain(_8080bw_state *state) |
899 | 899 | { |
900 | address_space | |
900 | address_space &space = *state->m_maincpu->space(AS_PROGRAM); | |
901 | 901 | state->m_schaser_effect_555_time_remain = attotime::from_double(state->m_schaser_effect_555_time_remain_savable); |
902 | state->schaser_sh_port_2_w( | |
902 | state->schaser_sh_port_2_w(space, 0, state->m_port_2_last_extra); | |
903 | 903 | } |
904 | 904 | |
905 | 905 | |
r17963 | r17964 | |
918 | 918 | |
919 | 919 | MACHINE_RESET_MEMBER(_8080bw_state,schaser_sh) |
920 | 920 | { |
921 | address_space | |
921 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
922 | 922 | |
923 | 923 | m_schaser_effect_555_is_low = 0; |
924 | 924 | m_schaser_effect_555_timer->adjust(attotime::never); |
925 | schaser_sh_port_1_w(*space, 0, 0); | |
926 | schaser_sh_port_2_w(*space, 0, 0); | |
925 | schaser_sh_port_1_w(space, 0, 0); | |
926 | schaser_sh_port_2_w(space, 0, 0); | |
927 | 927 | m_schaser_effect_555_time_remain = attotime::zero; |
928 | 928 | m_schaser_effect_555_time_remain_savable = m_schaser_effect_555_time_remain.as_double(); |
929 | 929 | } |
r17963 | r17964 | |
---|---|---|
61 | 61 | |
62 | 62 | WRITE8_HANDLER( targ_audio_1_w ) |
63 | 63 | { |
64 | samples_device *samples = space | |
64 | samples_device *samples = space.machine().device<samples_device>("samples"); | |
65 | 65 | |
66 | 66 | /* CPU music */ |
67 | 67 | if ((data & 0x01) != (port_1_last & 0x01)) |
68 | space | |
68 | space.machine().device<dac_device>("dac")->write_unsigned8((data & 0x01) * 0xff); | |
69 | 69 | |
70 | 70 | /* shot */ |
71 | 71 | if (FALLING_EDGE(0x02) && !samples->playing(0)) samples->start(0,1); |
r17963 | r17964 | |
114 | 114 | { |
115 | 115 | if ((data & 0x01) && !(port_2_last & 0x01)) |
116 | 116 | { |
117 | samples_device *samples = space->machine().device<samples_device>("samples"); | |
118 | UINT8 *prom = space->machine().root_device().memregion("targ")->base(); | |
117 | samples_device *samples = space.machine().device<samples_device>("samples"); | |
118 | UINT8 *prom = space.machine().root_device().memregion("targ")->base(); | |
119 | 119 | |
120 | 120 | tone_pointer = (tone_pointer + 1) & 0x0f; |
121 | 121 | |
r17963 | r17964 | |
128 | 128 | |
129 | 129 | WRITE8_HANDLER( spectar_audio_2_w ) |
130 | 130 | { |
131 | samples_device *samples = space | |
131 | samples_device *samples = space.machine().device<samples_device>("samples"); | |
132 | 132 | adjust_sample(samples, data); |
133 | 133 | } |
134 | 134 |
r17963 | r17964 | |
---|---|---|
65 | 65 | WRITE8_HANDLER( invinco_audio_w ) |
66 | 66 | { |
67 | 67 | static int port2State = 0; |
68 | samples_device *samples = space | |
68 | samples_device *samples = space.machine().device<samples_device>("samples"); | |
69 | 69 | int bitsChanged; |
70 | 70 | //int bitsGoneHigh; |
71 | 71 | int bitsGoneLow; |
r17963 | r17964 | |
108 | 108 | } |
109 | 109 | |
110 | 110 | #if 0 |
111 | logerror("Went LO: %02X %04X\n", bitsGoneLow, space | |
111 | logerror("Went LO: %02X %04X\n", bitsGoneLow, space.device().safe_pc()); | |
112 | 112 | #endif |
113 | 113 | } |
r17963 | r17964 | |
---|---|---|
87 | 87 | |
88 | 88 | WRITE8_HANDLER( pulsar_audio_1_w ) |
89 | 89 | { |
90 | samples_device *samples = space | |
90 | samples_device *samples = space.machine().device<samples_device>("samples"); | |
91 | 91 | int bitsChanged; |
92 | 92 | //int bitsGoneHigh; |
93 | 93 | int bitsGoneLow; |
r17963 | r17964 | |
138 | 138 | |
139 | 139 | WRITE8_HANDLER( pulsar_audio_2_w ) |
140 | 140 | { |
141 | samples_device *samples = space | |
141 | samples_device *samples = space.machine().device<samples_device>("samples"); | |
142 | 142 | static int port2State = 0; |
143 | 143 | int bitsChanged; |
144 | 144 | int bitsGoneHigh; |
r17963 | r17964 | |
---|---|---|
105 | 105 | { |
106 | 106 | UINT8 data = offset >> 8; |
107 | 107 | #if USE_FAKE_VOTRAX |
108 | astrocde_state *state = space->machine().driver_data<astrocde_state>(); | |
109 | samples_device *samples = space->machine().device<samples_device>("samples"); | |
108 | astrocde_state *state = space.machine().driver_data<astrocde_state>(); | |
109 | samples_device *samples = space.machine().device<samples_device>("samples"); | |
110 | 110 | int Phoneme/*, Intonation*/; |
111 | 111 | int i = 0; |
112 | 112 | offset &= 0xff; |
r17963 | r17964 | |
166 | 166 | } |
167 | 167 | } |
168 | 168 | #else |
169 | votrax_sc01_device *votrax = space->machine().device<votrax_sc01_device>("votrax"); | |
170 | votrax->inflection_w(*space, 0, data >> 6); | |
171 | votrax->write(*space, 0, data); | |
169 | votrax_sc01_device *votrax = space.machine().device<votrax_sc01_device>("votrax"); | |
170 | votrax->inflection_w(space, 0, data >> 6); | |
171 | votrax->write(space, 0, data); | |
172 | 172 | #endif |
173 | 173 | |
174 | 174 | /* Note : We should really also use volume in this as well as frequency */ |
r17963 | r17964 | |
---|---|---|
144 | 144 | |
145 | 145 | WRITE8_HANDLER( timeplt_sh_irqtrigger_w ) |
146 | 146 | { |
147 | device_t *audio = space | |
147 | device_t *audio = space.machine().device("timeplt_audio"); | |
148 | 148 | timeplt_audio_state *state = get_safe_token(audio); |
149 | 149 | |
150 | 150 | if (state->m_last_irq_state == 0 && data) |
r17963 | r17964 | |
---|---|---|
76 | 76 | |
77 | 77 | static TIMER_CALLBACK( signal_irq ) |
78 | 78 | { |
79 | amiga_custom_w(machine.device("maincpu")->memory().space(AS_PROGRAM), REG_INTREQ, 0x8000 | (0x80 << param), 0xffff); | |
79 | amiga_custom_w(*machine.device("maincpu")->memory().space(AS_PROGRAM), REG_INTREQ, 0x8000 | (0x80 << param), 0xffff); | |
80 | 80 | } |
81 | 81 | |
82 | 82 |
r17963 | r17964 | |
---|---|---|
71 | 71 | |
72 | 72 | READ8_HANDLER( trackfld_sh_timer_r ) |
73 | 73 | { |
74 | UINT32 clock = space | |
74 | UINT32 clock = space.machine().device<cpu_device>("audiocpu")->total_cycles() / TIMER_RATE; | |
75 | 75 | |
76 | 76 | return clock & 0xF; |
77 | 77 | } |
r17963 | r17964 | |
104 | 104 | |
105 | 105 | READ8_HANDLER( hyperspt_sh_timer_r ) |
106 | 106 | { |
107 | device_t *audio = space | |
107 | device_t *audio = space.machine().device("trackfld_audio"); | |
108 | 108 | trackfld_audio_state *state = get_safe_token(audio); |
109 | 109 | UINT32 clock = state->m_audiocpu->total_cycles() / TIMER_RATE; |
110 | 110 | |
r17963 | r17964 | |
142 | 142 | |
143 | 143 | WRITE8_HANDLER( konami_sh_irqtrigger_w ) |
144 | 144 | { |
145 | device_t *audio = space | |
145 | device_t *audio = space.machine().device("trackfld_audio"); | |
146 | 146 | trackfld_audio_state *state = get_safe_token(audio); |
147 | 147 | if (state->m_last_irq == 0 && data) |
148 | 148 | { |
r17963 | r17964 | |
---|---|---|
77 | 77 | |
78 | 78 | static READ8_HANDLER( namco_54xx_K_r ) |
79 | 79 | { |
80 | namco_54xx_state *state = get_safe_token(space | |
80 | namco_54xx_state *state = get_safe_token(space.device().owner()); | |
81 | 81 | return state->m_latched_cmd >> 4; |
82 | 82 | } |
83 | 83 | |
84 | 84 | static READ8_HANDLER( namco_54xx_R0_r ) |
85 | 85 | { |
86 | namco_54xx_state *state = get_safe_token(space | |
86 | namco_54xx_state *state = get_safe_token(space.device().owner()); | |
87 | 87 | return state->m_latched_cmd & 0x0f; |
88 | 88 | } |
89 | 89 | |
90 | 90 | |
91 | 91 | static WRITE8_HANDLER( namco_54xx_O_w ) |
92 | 92 | { |
93 | namco_54xx_state *state = get_safe_token(space | |
93 | namco_54xx_state *state = get_safe_token(space.device().owner()); | |
94 | 94 | UINT8 out = (data & 0x0f); |
95 | 95 | if (data & 0x10) |
96 | discrete_sound_w(state->m_discrete, | |
96 | discrete_sound_w(state->m_discrete, space, NAMCO_54XX_1_DATA(state->m_basenode), out); | |
97 | 97 | else |
98 | discrete_sound_w(state->m_discrete, | |
98 | discrete_sound_w(state->m_discrete, space, NAMCO_54XX_0_DATA(state->m_basenode), out); | |
99 | 99 | } |
100 | 100 | |
101 | 101 | static WRITE8_HANDLER( namco_54xx_R1_w ) |
102 | 102 | { |
103 | namco_54xx_state *state = get_safe_token(space | |
103 | namco_54xx_state *state = get_safe_token(space.device().owner()); | |
104 | 104 | UINT8 out = (data & 0x0f); |
105 | 105 | |
106 | discrete_sound_w(state->m_discrete, | |
106 | discrete_sound_w(state->m_discrete, space, NAMCO_54XX_2_DATA(state->m_basenode), out); | |
107 | 107 | } |
108 | 108 | |
109 | 109 |
r17963 | r17964 | |
---|---|---|
676 | 676 | |
677 | 677 | WRITE8_HANDLER( sasuke_sound_w ) |
678 | 678 | { |
679 | device_t *device = space | |
679 | device_t *device = space.machine().device("snk6502"); | |
680 | 680 | snk6502_sound_state *state = get_safe_token(device); |
681 | 681 | samples_device *samples = state->m_samples; |
682 | 682 | TONE *tone_channels = state->m_tone_channels; |
r17963 | r17964 | |
746 | 746 | |
747 | 747 | WRITE8_HANDLER( satansat_sound_w ) |
748 | 748 | { |
749 | device_t *device = space | |
749 | device_t *device = space.machine().device("snk6502"); | |
750 | 750 | snk6502_sound_state *state = get_safe_token(device); |
751 | 751 | samples_device *samples = state->m_samples; |
752 | 752 | TONE *tone_channels = state->m_tone_channels; |
r17963 | r17964 | |
813 | 813 | |
814 | 814 | WRITE8_HANDLER( vanguard_sound_w ) |
815 | 815 | { |
816 | device_t *device = space | |
816 | device_t *device = space.machine().device("snk6502"); | |
817 | 817 | snk6502_sound_state *state = get_safe_token(device); |
818 | 818 | samples_device *samples = state->m_samples; |
819 | 819 | TONE *tone_channels = state->m_tone_channels; |
r17963 | r17964 | |
863 | 863 | } |
864 | 864 | |
865 | 865 | /* SHOT B */ |
866 | sn76477_enable_w(space | |
866 | sn76477_enable_w(space.machine().device("sn76477.2"), (data & 0x40) ? 0 : 1); | |
867 | 867 | |
868 | 868 | state->m_LastPort1 = data; |
869 | 869 | break; |
r17963 | r17964 | |
914 | 914 | |
915 | 915 | WRITE8_HANDLER( fantasy_sound_w ) |
916 | 916 | { |
917 | device_t *device = space | |
917 | device_t *device = space.machine().device("snk6502"); | |
918 | 918 | snk6502_sound_state *state = get_safe_token(device); |
919 | 919 | TONE *tone_channels = state->m_tone_channels; |
920 | 920 | |
r17963 | r17964 | |
957 | 957 | } |
958 | 958 | |
959 | 959 | /* BOMB */ |
960 | discrete_sound_w(space | |
960 | discrete_sound_w(space.machine().device("discrete"), space, FANTASY_BOMB_EN, data & 0x80); | |
961 | 961 | |
962 | 962 | state->m_LastPort1 = data; |
963 | 963 | break; |
r17963 | r17964 | |
1021 | 1021 | /* select tune in ROM based on sound command byte */ |
1022 | 1022 | tone_channels[2].base = 0x1000 + ((data & 0x70) << 4); |
1023 | 1023 | tone_channels[2].mask = 0xff; |
1024 | snk6502_state *state = space->machine().driver_data<snk6502_state>(); | |
1025 | state->snk6502_flipscreen_w(*space, 0, data); | |
1024 | snk6502_state *state = space.machine().driver_data<snk6502_state>(); | |
1025 | state->snk6502_flipscreen_w(space, 0, data); | |
1026 | 1026 | break; |
1027 | 1027 | } |
1028 | 1028 | } |
r17963 | r17964 | |
1220 | 1220 | 0x054ce |
1221 | 1221 | }; |
1222 | 1222 | |
1223 | snk6502_speech_w(space | |
1223 | snk6502_speech_w(space.machine(), data, vanguard_table, 2); | |
1224 | 1224 | } |
1225 | 1225 | |
1226 | 1226 | WRITE8_HANDLER( fantasy_speech_w ) |
r17963 | r17964 | |
1245 | 1245 | 0 |
1246 | 1246 | }; |
1247 | 1247 | |
1248 | snk6502_speech_w(space | |
1248 | snk6502_speech_w(space.machine(), data, fantasy_table, 0); | |
1249 | 1249 | } |
1250 | 1250 | |
1251 | 1251 |
r17963 | r17964 | |
---|---|---|
74 | 74 | if (data == 0) |
75 | 75 | return; |
76 | 76 | |
77 | cclimber_play_sample(space | |
77 | cclimber_play_sample(space.machine(), 32 * sample_num,sample_freq,sample_volume); | |
78 | 78 | } |
79 | 79 | |
80 | 80 |
r17963 | r17964 | |
---|---|---|
219 | 219 | |
220 | 220 | WRITE8_HANDLER( t5182_sound_irq_w ) |
221 | 221 | { |
222 | space | |
222 | space.machine().scheduler().synchronize(FUNC(setirq_callback), CPU_ASSERT); | |
223 | 223 | } |
224 | 224 | |
225 | 225 | static WRITE8_HANDLER( t5182_ym2151_irq_ack_w ) |
226 | 226 | { |
227 | space | |
227 | space.machine().scheduler().synchronize(FUNC(setirq_callback), YM2151_ACK); | |
228 | 228 | } |
229 | 229 | |
230 | 230 | static WRITE8_HANDLER( t5182_cpu_irq_ack_w ) |
231 | 231 | { |
232 | space | |
232 | space.machine().scheduler().synchronize(FUNC(setirq_callback), CPU_CLEAR); | |
233 | 233 | } |
234 | 234 | |
235 | 235 | static void t5182_ym2151_irq_handler(device_t *device, int irq) |
r17963 | r17964 | |
---|---|---|
144 | 144 | |
145 | 145 | WRITE8_HANDLER( frogs_audio_w ) |
146 | 146 | { |
147 | samples_device *samples = space->machine().device<samples_device>("samples"); | |
148 | device_t *discrete = space->machine().device("discrete"); | |
147 | samples_device *samples = space.machine().device<samples_device>("samples"); | |
148 | device_t *discrete = space.machine().device("discrete"); | |
149 | 149 | static int last_croak = 0; |
150 | 150 | static int last_buzzz = 0; |
151 | 151 | int new_croak = data & 0x08; |
152 | 152 | int new_buzzz = data & 0x10; |
153 | 153 | |
154 | // discrete_sound_w(discrete, *space, FROGS_HOP_EN, data & 0x01); | |
155 | // discrete_sound_w(discrete, *space, FROGS_JUMP_EN, data & 0x02); | |
156 | discrete_sound_w(discrete, *space, FROGS_TONGUE_EN, data & 0x04); | |
157 | // discrete_sound_w(discrete, *space, FROGS_CAPTURE_EN, data & 0x08); | |
158 | // discrete_sound_w(discrete, *space, FROGS_FLY_EN, data & 0x10); | |
159 | // discrete_sound_w(discrete, *space, FROGS_SPLASH_EN, data & 0x80); | |
154 | // discrete_sound_w(discrete, space, FROGS_HOP_EN, data & 0x01); | |
155 | // discrete_sound_w(discrete, space, FROGS_JUMP_EN, data & 0x02); | |
156 | discrete_sound_w(discrete, space, FROGS_TONGUE_EN, data & 0x04); | |
157 | // discrete_sound_w(discrete, space, FROGS_CAPTURE_EN, data & 0x08); | |
158 | // discrete_sound_w(discrete, space, FROGS_FLY_EN, data & 0x10); | |
159 | // discrete_sound_w(discrete, space, FROGS_SPLASH_EN, data & 0x80); | |
160 | 160 | |
161 | 161 | if (data & 0x01) |
162 | 162 | samples->start(3, 3); // Hop |
r17963 | r17964 | |
461 | 461 | |
462 | 462 | WRITE8_HANDLER( headon_audio_w ) |
463 | 463 | { |
464 | device_t *discrete = space | |
464 | device_t *discrete = space.machine().device("discrete"); | |
465 | 465 | if (discrete == NULL) |
466 | 466 | return; |
467 | discrete_sound_w(discrete, *space, HEADON_HISPEED_PC_EN, data & 0x01); | |
468 | discrete_sound_w(discrete, *space, HEADON_SCREECH1_EN, data & 0x02); | |
469 | discrete_sound_w(discrete, *space, HEADON_CRASH_EN, data & 0x04); | |
470 | discrete_sound_w(discrete, *space, HEADON_HISPEED_CC_EN, data & 0x08); | |
471 | discrete_sound_w(discrete, *space, HEADON_SCREECH2_EN, data & 0x10); | |
472 | discrete_sound_w(discrete, *space, HEADON_BONUS_EN, data & 0x20); | |
473 | discrete_sound_w(discrete, *space, HEADON_CAR_ON_EN, data & 0x40); | |
467 | discrete_sound_w(discrete, space, HEADON_HISPEED_PC_EN, data & 0x01); | |
468 | discrete_sound_w(discrete, space, HEADON_SCREECH1_EN, data & 0x02); | |
469 | discrete_sound_w(discrete, space, HEADON_CRASH_EN, data & 0x04); | |
470 | discrete_sound_w(discrete, space, HEADON_HISPEED_CC_EN, data & 0x08); | |
471 | discrete_sound_w(discrete, space, HEADON_SCREECH2_EN, data & 0x10); | |
472 | discrete_sound_w(discrete, space, HEADON_BONUS_EN, data & 0x20); | |
473 | discrete_sound_w(discrete, space, HEADON_CAR_ON_EN, data & 0x40); | |
474 | 474 | |
475 | 475 | } |
476 | 476 | |
477 | 477 | WRITE8_HANDLER( invho2_audio_w ) |
478 | 478 | { |
479 | device_t *discrete = space | |
479 | device_t *discrete = space.machine().device("discrete"); | |
480 | 480 | if (discrete == NULL) |
481 | 481 | return; |
482 | discrete_sound_w(discrete, *space, HEADON_HISPEED_PC_EN, data & 0x10); | |
483 | discrete_sound_w(discrete, *space, HEADON_SCREECH1_EN, data & 0x08); | |
484 | discrete_sound_w(discrete, *space, HEADON_CRASH_EN, data & 0x80); | |
485 | discrete_sound_w(discrete, *space, HEADON_HISPEED_CC_EN, data & 0x40); | |
486 | discrete_sound_w(discrete, *space, HEADON_SCREECH2_EN, data & 0x04); | |
487 | discrete_sound_w(discrete, *space, HEADON_BONUS_EN, data & 0x02); | |
488 | discrete_sound_w(discrete, *space, HEADON_CAR_ON_EN, data & 0x20); | |
482 | discrete_sound_w(discrete, space, HEADON_HISPEED_PC_EN, data & 0x10); | |
483 | discrete_sound_w(discrete, space, HEADON_SCREECH1_EN, data & 0x08); | |
484 | discrete_sound_w(discrete, space, HEADON_CRASH_EN, data & 0x80); | |
485 | discrete_sound_w(discrete, space, HEADON_HISPEED_CC_EN, data & 0x40); | |
486 | discrete_sound_w(discrete, space, HEADON_SCREECH2_EN, data & 0x04); | |
487 | discrete_sound_w(discrete, space, HEADON_BONUS_EN, data & 0x02); | |
488 | discrete_sound_w(discrete, space, HEADON_CAR_ON_EN, data & 0x20); | |
489 | 489 | |
490 | 490 | } |
491 | 491 |
r17963 | r17964 | |
---|---|---|
63 | 63 | |
64 | 64 | WRITE8_HANDLER( irem_sound_cmd_w ) |
65 | 65 | { |
66 | driver_device *drvstate = space | |
66 | driver_device *drvstate = space.machine().driver_data<driver_device>(); | |
67 | 67 | if ((data & 0x80) == 0) |
68 | drvstate->soundlatch_byte_w( | |
68 | drvstate->soundlatch_byte_w(space, 0, data & 0x7f); | |
69 | 69 | else |
70 | space | |
70 | space.machine().device("iremsound")->execute().set_input_line(0, ASSERT_LINE); | |
71 | 71 | } |
72 | 72 | |
73 | 73 | |
r17963 | r17964 | |
181 | 181 | |
182 | 182 | static WRITE8_HANDLER( sound_irq_ack_w ) |
183 | 183 | { |
184 | space | |
184 | space.machine().device("iremsound")->execute().set_input_line(0, CLEAR_LINE); | |
185 | 185 | } |
186 | 186 | |
187 | 187 |
r17963 | r17964 | |
---|---|---|
1125 | 1125 | case 0x5: /* Port 1 */ |
1126 | 1126 | case 0x6: /* Port 2 */ |
1127 | 1127 | case 0x7: /* Port 3 */ |
1128 | // mame_printf_debug("SPC: rd %02x @ %d, PC=%x\n", spc700->port_in[offset - 4], offset - 4, space | |
1128 | // mame_printf_debug("SPC: rd %02x @ %d, PC=%x\n", spc700->port_in[offset - 4], offset - 4, space.device().safe_pc()); | |
1129 | 1129 | return spc700->port_in[offset - 4]; |
1130 | 1130 | case 0x8: //normal RAM, can be read even if the ram disabled flag ($f0 bit 1) is active |
1131 | 1131 | case 0x9: |
r17963 | r17964 | |
1194 | 1194 | case 0x5: /* Port 1 */ |
1195 | 1195 | case 0x6: /* Port 2 */ |
1196 | 1196 | case 0x7: /* Port 3 */ |
1197 | // mame_printf_debug("SPC: %02x to APU @ %d (PC=%x)\n", data, offset & 3, space | |
1197 | // mame_printf_debug("SPC: %02x to APU @ %d (PC=%x)\n", data, offset & 3, space.device().safe_pc()); | |
1198 | 1198 | spc700->port_out[offset - 4] = data; |
1199 | 1199 | device->machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(20)); |
1200 | 1200 | break; |
r17963 | r17964 | |
---|---|---|
437 | 437 | static SOUND_RESET( mario ) |
438 | 438 | { |
439 | 439 | mario_state *state = machine.driver_data<mario_state>(); |
440 | address_space | |
440 | address_space &space = *machine.device("audiocpu")->memory().space(AS_PROGRAM); | |
441 | 441 | |
442 | 442 | #if USE_8039 |
443 | 443 | set_ea(machine, 1); |
444 | 444 | #endif |
445 | 445 | |
446 | 446 | /* FIXME: convert to latch8 */ |
447 | state->soundlatch_clear_byte_w(*space, 0, 0); | |
448 | state->soundlatch2_clear_byte_w(*space, 0, 0); | |
449 | state->soundlatch3_clear_byte_w(*space, 0, 0); | |
450 | state->soundlatch4_clear_byte_w(*space, 0, 0); | |
451 | state->I8035_P1_W(*space, 0x00); /* Input port */ | |
452 | I8035_P2_W(*space, 0xff); /* Port is in high impedance state after reset */ | |
447 | state->soundlatch_clear_byte_w(space, 0, 0); | |
448 | state->soundlatch2_clear_byte_w(space, 0, 0); | |
449 | state->soundlatch3_clear_byte_w(space, 0, 0); | |
450 | state->soundlatch4_clear_byte_w(space, 0, 0); | |
451 | state->I8035_P1_W(space, 0x00); /* Input port */ | |
452 | I8035_P2_W(space, 0xff); /* Port is in high impedance state after reset */ | |
453 | 453 | |
454 | 454 | state->m_last = 0; |
455 | 455 | } |
r17963 | r17964 | |
---|---|---|
275 | 275 | } |
276 | 276 | } |
277 | 277 | |
278 | static UINT32 dsp_compute_condition( address_space | |
278 | static UINT32 dsp_compute_condition( address_space &space, UINT32 condition ) | |
279 | 279 | { |
280 | saturn_state *state = space | |
280 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
281 | 281 | UINT32 result = 0; |
282 | 282 | |
283 | 283 | switch( condition & 0xf ) |
r17963 | r17964 | |
333 | 333 | return 0; |
334 | 334 | } |
335 | 335 | |
336 | UINT32 dsp_prg_ctrl_r(address_space | |
336 | UINT32 dsp_prg_ctrl_r(address_space &space) | |
337 | 337 | { |
338 | saturn_state *state = space | |
338 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
339 | 339 | |
340 | 340 | return (state->m_scu_regs[0x80/4] & 0x06ff8000) | (dsp_reg.pc & 0xff); |
341 | 341 | } |
342 | 342 | |
343 | void dsp_prg_ctrl_w(address_space | |
343 | void dsp_prg_ctrl_w(address_space &space, UINT32 data) | |
344 | 344 | { |
345 | saturn_state *state = space | |
345 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
346 | 346 | |
347 | 347 | if(LEF) dsp_reg.pc = (data & 0xff); |
348 | 348 | if(EXF) dsp_execute_program(space); |
r17963 | r17964 | |
394 | 394 | return data; |
395 | 395 | } |
396 | 396 | |
397 | static void dsp_operation(address_space | |
397 | static void dsp_operation(address_space &space) | |
398 | 398 | { |
399 | saturn_state *state = space | |
399 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
400 | 400 | INT64 i1,i2; |
401 | 401 | INT32 i3; |
402 | 402 | int update_ct[4] = {0,0,0,0}; |
r17963 | r17964 | |
597 | 597 | |
598 | 598 | } |
599 | 599 | |
600 | static void dsp_move_immediate( address_space | |
600 | static void dsp_move_immediate( address_space &space ) | |
601 | 601 | { |
602 | 602 | UINT32 value; |
603 | 603 | |
r17963 | r17964 | |
619 | 619 | } |
620 | 620 | |
621 | 621 | |
622 | static void dsp_dma( address_space | |
622 | static void dsp_dma( address_space &space ) | |
623 | 623 | { |
624 | saturn_state *state = space | |
624 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
625 | 625 | |
626 | 626 | UINT8 hold = (opcode & 0x4000) >> 14; |
627 | 627 | UINT32 add = (opcode & 0x38000) >> 15; |
r17963 | r17964 | |
681 | 681 | |
682 | 682 | if ( source >= 0x06000000 && source <= 0x060fffff ) |
683 | 683 | { |
684 | data = space | |
684 | data = space.read_dword(source ); | |
685 | 685 | } |
686 | 686 | else |
687 | 687 | { |
688 | data = (space | |
688 | data = (space.read_word(source)<<16) | space.read_word(source+2); | |
689 | 689 | //popmessage( "Bad DSP DMA mem read = %08X", source ); |
690 | 690 | #if DEBUG_DSP |
691 | 691 | //fprintf( log_file, "/*Bad DSP DMA mem read = %08X*/\n", source ); |
r17963 | r17964 | |
718 | 718 | #endif |
719 | 719 | for ( counter = 0; counter < transfer_cnt; counter++ ) |
720 | 720 | { |
721 | space | |
721 | space.write_dword(dest, dsp_get_mem_source_dma( dsp_mem, counter ) ); | |
722 | 722 | dest += add; |
723 | 723 | } |
724 | 724 | |
r17963 | r17964 | |
732 | 732 | T0F_0; |
733 | 733 | } |
734 | 734 | |
735 | static void dsp_jump( address_space | |
735 | static void dsp_jump( address_space &space ) | |
736 | 736 | { |
737 | 737 | if ( opcode & 0x3f80000 ) |
738 | 738 | { |
r17963 | r17964 | |
761 | 761 | EF_1; |
762 | 762 | } |
763 | 763 | |
764 | static void dsp_end( address_space | |
764 | static void dsp_end( address_space &dmaspace ) | |
765 | 765 | { |
766 | saturn_state *state = dmaspace | |
766 | saturn_state *state = dmaspace.machine().driver_data<saturn_state>(); | |
767 | 767 | |
768 | 768 | if(opcode & 0x08000000) |
769 | 769 | { |
770 | 770 | /*ENDI*/ |
771 | dmaspace | |
771 | dmaspace.machine().scheduler().timer_set(attotime::from_usec(300), FUNC(dsp_ended)); | |
772 | 772 | } |
773 | 773 | |
774 | 774 | EXF_0; /* END / ENDI */ |
r17963 | r17964 | |
827 | 827 | } |
828 | 828 | #endif |
829 | 829 | |
830 | void dsp_execute_program(address_space | |
830 | void dsp_execute_program(address_space &dmaspace) | |
831 | 831 | { |
832 | 832 | UINT32 cycles_run = 0; |
833 | 833 | UINT8 cont = 1; |
r17963 | r17964 | |
---|---|---|
63 | 63 | |
64 | 64 | READ8_HANDLER( battles_customio0_r ) |
65 | 65 | { |
66 | logerror("CPU0 %04x: custom I/O Read = %02x\n",space | |
66 | logerror("CPU0 %04x: custom I/O Read = %02x\n",space.device().safe_pc(),battles_customio_command); | |
67 | 67 | return battles_customio_command; |
68 | 68 | } |
69 | 69 | |
r17963 | r17964 | |
71 | 71 | { |
72 | 72 | int return_data; |
73 | 73 | |
74 | if( space | |
74 | if( space.device().safe_pc() == 0xAE ){ | |
75 | 75 | /* CPU4 0xAA - 0xB9 : waiting for MB8851 ? */ |
76 | 76 | return_data = ( (battles_customio_command & 0x10) << 3) |
77 | 77 | | 0x00 |
r17963 | r17964 | |
81 | 81 | | 0x60 |
82 | 82 | | (battles_customio_prev_command & 0x0f); |
83 | 83 | } |
84 | logerror("CPU3 %04x: custom I/O Read = %02x\n",space | |
84 | logerror("CPU3 %04x: custom I/O Read = %02x\n",space.device().safe_pc(),return_data); | |
85 | 85 | |
86 | 86 | return return_data; |
87 | 87 | } |
r17963 | r17964 | |
89 | 89 | |
90 | 90 | WRITE8_HANDLER( battles_customio0_w ) |
91 | 91 | { |
92 | timer_device *timer = space | |
92 | timer_device *timer = space.machine().device<timer_device>("battles_nmi"); | |
93 | 93 | |
94 | logerror("CPU0 %04x: custom I/O Write = %02x\n",space | |
94 | logerror("CPU0 %04x: custom I/O Write = %02x\n",space.device().safe_pc(),data); | |
95 | 95 | |
96 | 96 | battles_customio_command = data; |
97 | 97 | battles_customio_command_count = 0; |
r17963 | r17964 | |
108 | 108 | |
109 | 109 | WRITE8_HANDLER( battles_customio3_w ) |
110 | 110 | { |
111 | logerror("CPU3 %04x: custom I/O Write = %02x\n",space | |
111 | logerror("CPU3 %04x: custom I/O Write = %02x\n",space.device().safe_pc(),data); | |
112 | 112 | |
113 | 113 | battles_customio_command = data; |
114 | 114 | } |
r17963 | r17964 | |
117 | 117 | |
118 | 118 | READ8_HANDLER( battles_customio_data0_r ) |
119 | 119 | { |
120 | logerror("CPU0 %04x: custom I/O parameter %02x Read = %02x\n",space | |
120 | logerror("CPU0 %04x: custom I/O parameter %02x Read = %02x\n",space.device().safe_pc(),offset,battles_customio_data); | |
121 | 121 | |
122 | 122 | return battles_customio_data; |
123 | 123 | } |
124 | 124 | |
125 | 125 | READ8_HANDLER( battles_customio_data3_r ) |
126 | 126 | { |
127 | logerror("CPU3 %04x: custom I/O parameter %02x Read = %02x\n",space | |
127 | logerror("CPU3 %04x: custom I/O parameter %02x Read = %02x\n",space.device().safe_pc(),offset,battles_customio_data); | |
128 | 128 | return battles_customio_data; |
129 | 129 | } |
130 | 130 | |
131 | 131 | |
132 | 132 | WRITE8_HANDLER( battles_customio_data0_w ) |
133 | 133 | { |
134 | logerror("CPU0 %04x: custom I/O parameter %02x Write = %02x\n",space | |
134 | logerror("CPU0 %04x: custom I/O parameter %02x Write = %02x\n",space.device().safe_pc(),offset,data); | |
135 | 135 | battles_customio_data = data; |
136 | 136 | } |
137 | 137 | |
138 | 138 | WRITE8_HANDLER( battles_customio_data3_w ) |
139 | 139 | { |
140 | logerror("CPU3 %04x: custom I/O parameter %02x Write = %02x\n",space | |
140 | logerror("CPU3 %04x: custom I/O parameter %02x Write = %02x\n",space.device().safe_pc(),offset,data); | |
141 | 141 | battles_customio_data = data; |
142 | 142 | } |
143 | 143 | |
144 | 144 | |
145 | 145 | WRITE8_HANDLER( battles_CPU4_coin_w ) |
146 | 146 | { |
147 | set_led_status(space->machine(), 0,data & 0x02); // Start 1 | |
148 | set_led_status(space->machine(), 1,data & 0x01); // Start 2 | |
147 | set_led_status(space.machine(), 0,data & 0x02); // Start 1 | |
148 | set_led_status(space.machine(), 1,data & 0x01); // Start 2 | |
149 | 149 | |
150 | coin_counter_w(space->machine(), 0,data & 0x20); | |
151 | coin_counter_w(space->machine(), 1,data & 0x10); | |
152 | coin_lockout_global_w(space->machine(), ~data & 0x04); | |
150 | coin_counter_w(space.machine(), 0,data & 0x20); | |
151 | coin_counter_w(space.machine(), 1,data & 0x10); | |
152 | coin_lockout_global_w(space.machine(), ~data & 0x04); | |
153 | 153 | } |
154 | 154 | |
155 | 155 | |
156 | 156 | WRITE8_HANDLER( battles_noise_sound_w ) |
157 | 157 | { |
158 | logerror("CPU3 %04x: 50%02x Write = %02x\n",space | |
158 | logerror("CPU3 %04x: 50%02x Write = %02x\n",space.device().safe_pc(),offset,data); | |
159 | 159 | if( (battles_sound_played == 0) && (data == 0xFF) ){ |
160 | samples_device *samples = space | |
160 | samples_device *samples = space.machine().device<samples_device>("samples"); | |
161 | 161 | if( customio[0] == 0x40 ){ |
162 | 162 | samples->start(0, 0); |
163 | 163 | } |
r17963 | r17964 | |
174 | 174 | switch ( offset ) |
175 | 175 | { |
176 | 176 | default: |
177 | case 0: return ~BITSWAP8(space->machine().root_device().ioport("IN0H")->read(),7,6,5,4,2,3,1,0); | |
178 | case 1: return ~space->machine().root_device().ioport("IN1L")->read(); | |
179 | case 2: return ~space->machine().root_device().ioport("IN1H")->read(); | |
180 | case 3: return ~space->machine().root_device().ioport("IN0L")->read(); | |
177 | case 0: return ~BITSWAP8(space.machine().root_device().ioport("IN0H")->read(),7,6,5,4,2,3,1,0); | |
178 | case 1: return ~space.machine().root_device().ioport("IN1L")->read(); | |
179 | case 2: return ~space.machine().root_device().ioport("IN1H")->read(); | |
180 | case 3: return ~space.machine().root_device().ioport("IN0L")->read(); | |
181 | 181 | } |
182 | 182 | } |
183 | 183 |
r17963 | r17964 | |
---|---|---|
60 | 60 | }; |
61 | 61 | |
62 | 62 | |
63 | address_space | |
63 | address_space &space = *machine.device(cputag)->memory().space(AS_PROGRAM); | |
64 | 64 | UINT8 *rom = machine.root_device().memregion(cputag)->base(); |
65 | 65 | UINT8 *decrypted = auto_alloc_array(machine, UINT8, 0x8000); |
66 | 66 | |
67 | space | |
67 | space.set_decrypted_region(0x0000, 0x7fff, decrypted); | |
68 | 68 | |
69 | 69 | |
70 | 70 | for (A = 0x0000;A < 0x8000;A++) |
r17963 | r17964 | |
---|---|---|
1 | 1 | /*SCU DSP stuff*/ |
2 | 2 | |
3 | void dsp_prg_ctrl_w(address_space | |
3 | void dsp_prg_ctrl_w(address_space &space, UINT32 data); | |
4 | 4 | void dsp_prg_data(UINT32 data); |
5 | 5 | void dsp_ram_addr_ctrl(UINT32 data); |
6 | 6 | void dsp_ram_addr_w(UINT32 data); |
7 | UINT32 dsp_prg_ctrl_r(address_space | |
7 | UINT32 dsp_prg_ctrl_r(address_space &space); | |
8 | 8 | UINT32 dsp_ram_addr_r(void); |
9 | void dsp_execute_program(address_space | |
9 | void dsp_execute_program(address_space &dmaspace); | |
10 | 10 |
r17963 | r17964 | |
---|---|---|
112 | 112 | return tc0220ioc->read_7(0); |
113 | 113 | |
114 | 114 | default: |
115 | //logerror("PC %06x: warning - read TC0220IOC address %02x\n",space | |
115 | //logerror("PC %06x: warning - read TC0220IOC address %02x\n",space.device().safe_pc(),offset); | |
116 | 116 | return 0xff; |
117 | 117 | } |
118 | 118 | } |
r17963 | r17964 | |
137 | 137 | coin_counter_w(device->machine(), 1, data & 0x08); |
138 | 138 | |
139 | 139 | //if (data & 0xf0) |
140 | //logerror("PC %06x: warning - write %02x to TC0220IOC address %02x\n",space | |
140 | //logerror("PC %06x: warning - write %02x to TC0220IOC address %02x\n",space.device().safe_pc(),data,offset); | |
141 | 141 | |
142 | 142 | break; |
143 | 143 | |
144 | 144 | default: |
145 | //logerror("PC %06x: warning - write %02x to TC0220IOC address %02x\n",space | |
145 | //logerror("PC %06x: warning - write %02x to TC0220IOC address %02x\n",space.device().safe_pc(),data,offset); | |
146 | 146 | break; |
147 | 147 | } |
148 | 148 | } |
r17963 | r17964 | |
268 | 268 | return tc0510nio->read_7(0); |
269 | 269 | |
270 | 270 | default: |
271 | //logerror("PC %06x: warning - read TC0510NIO address %02x\n",space | |
271 | //logerror("PC %06x: warning - read TC0510NIO address %02x\n",space.device().safe_pc(),offset); | |
272 | 272 | return 0xff; |
273 | 273 | } |
274 | 274 | } |
r17963 | r17964 | |
293 | 293 | break; |
294 | 294 | |
295 | 295 | default: |
296 | //logerror("PC %06x: warning - write %02x to TC0510NIO address %02x\n",space | |
296 | //logerror("PC %06x: warning - write %02x to TC0510NIO address %02x\n",space.device().safe_pc(),data,offset); | |
297 | 297 | break; |
298 | 298 | } |
299 | 299 | } |
r17963 | r17964 | |
310 | 310 | else |
311 | 311 | { |
312 | 312 | /* driftout writes the coin counters here - bug? */ |
313 | //logerror("CPU #0 PC %06x: warning - write to MSB of TC0510NIO address %02x\n",space | |
313 | //logerror("CPU #0 PC %06x: warning - write to MSB of TC0510NIO address %02x\n",space.device().safe_pc(),offset); | |
314 | 314 | tc0510nio_w(device, space, offset, (data >> 8) & 0xff); |
315 | 315 | } |
316 | 316 | } |
r17963 | r17964 | |
418 | 418 | return tc0640fio->read_7(0); |
419 | 419 | |
420 | 420 | default: |
421 | //logerror("PC %06x: warning - read TC0640FIO address %02x\n",space | |
421 | //logerror("PC %06x: warning - read TC0640FIO address %02x\n",space.device().safe_pc(),offset); | |
422 | 422 | return 0xff; |
423 | 423 | } |
424 | 424 | } |
r17963 | r17964 | |
443 | 443 | break; |
444 | 444 | |
445 | 445 | default: |
446 | //logerror("PC %06x: warning - write %02x to TC0640FIO address %02x\n",space | |
446 | //logerror("PC %06x: warning - write %02x to TC0640FIO address %02x\n",space.device().safe_pc(),data,offset); | |
447 | 447 | break; |
448 | 448 | } |
449 | 449 | } |
r17963 | r17964 | |
460 | 460 | else |
461 | 461 | { |
462 | 462 | tc0640fio_w(device, space, offset, (data >> 8) & 0xff); |
463 | //logerror("CPU #0 PC %06x: warning - write to MSB of TC0640FIO address %02x\n",space | |
463 | //logerror("CPU #0 PC %06x: warning - write to MSB of TC0640FIO address %02x\n",space.device().safe_pc(),offset); | |
464 | 464 | } |
465 | 465 | } |
466 | 466 | |
r17963 | r17964 | |
476 | 476 | else |
477 | 477 | { |
478 | 478 | tc0640fio_w(device, space, offset, data & 0xff); |
479 | //logerror("CPU #0 PC %06x: warning - write to LSB of TC0640FIO address %02x\n",space | |
479 | //logerror("CPU #0 PC %06x: warning - write to LSB of TC0640FIO address %02x\n",space.device().safe_pc(),offset); | |
480 | 480 | } |
481 | 481 | } |
482 | 482 |
r17963 | r17964 | |
---|---|---|
1067 | 1067 | { |
1068 | 1068 | if (ACCESSING_BITS_0_7) |
1069 | 1069 | { |
1070 | //logerror("%06x: NMK004_w %02x\n",space | |
1070 | //logerror("%06x: NMK004_w %02x\n",space.device().safe_pc(),data); | |
1071 | 1071 | NMK004_state.from_main = data & 0xff; |
1072 | 1072 | } |
1073 | 1073 | } |
r17963 | r17964 | |
1077 | 1077 | //static int last; |
1078 | 1078 | int res = NMK004_state.to_main; |
1079 | 1079 | |
1080 | //if (res != last) logerror("%06x: NMK004_r %02x\n",space | |
1080 | //if (res != last) logerror("%06x: NMK004_r %02x\n",space.device().safe_pc(),res); | |
1081 | 1081 | //last = res; |
1082 | 1082 | |
1083 | 1083 | return res; |
r17963 | r17964 | |
---|---|---|
769 | 769 | } |
770 | 770 | |
771 | 771 | static void spc7110_mmio_write(running_machine &machine, UINT32 addr, UINT8 data); |
772 | static UINT8 spc7110_mmio_read(address_space | |
772 | static UINT8 spc7110_mmio_read(address_space &space, UINT32 addr); | |
773 | 773 | static void spc7110_update_time(running_machine &machine, UINT8 offset); |
774 | 774 | |
775 | 775 | enum RTC_State |
r17963 | r17964 | |
1068 | 1068 | } |
1069 | 1069 | } |
1070 | 1070 | |
1071 | static UINT8 spc7110_mmio_read(address_space | |
1071 | static UINT8 spc7110_mmio_read(address_space &space, UINT32 addr) | |
1072 | 1072 | { |
1073 | running_machine &machine = space | |
1073 | running_machine &machine = space.machine(); | |
1074 | 1074 | UINT8 *ROM = machine.root_device().memregion("cart")->base(); |
1075 | 1075 | |
1076 | 1076 | addr &= 0xffff; |
r17963 | r17964 | |
1641 | 1641 | } |
1642 | 1642 | } |
1643 | 1643 | |
1644 | static UINT8 spc7110_bank7_read(address_space | |
1644 | static UINT8 spc7110_bank7_read(address_space &space, UINT32 offset) | |
1645 | 1645 | { |
1646 | UINT8 *ROM = space | |
1646 | UINT8 *ROM = space.machine().root_device().memregion("cart")->base(); | |
1647 | 1647 | UINT32 addr = offset & 0x0fffff; |
1648 | 1648 | |
1649 | 1649 | switch (offset & 0xf00000) |
r17963 | r17964 | |
---|---|---|
114 | 114 | |
115 | 115 | static READ32_HANDLER( twcup98_prot_r ) |
116 | 116 | { |
117 | UINT32 *ROM = (UINT32 *)space | |
117 | UINT32 *ROM = (UINT32 *)space.machine().root_device().memregion("abus")->base(); | |
118 | 118 | |
119 | 119 | if(a_bus[0] & 0x00010000)//protection calculation is activated |
120 | 120 | { |
121 | 121 | if(offset == 3) |
122 | 122 | { |
123 | logerror("A-Bus control protection read at %06x with data = %08x\n",space | |
123 | logerror("A-Bus control protection read at %06x with data = %08x\n",space.device().safe_pc(),a_bus[3]); | |
124 | 124 | #ifdef MAME_DEBUG |
125 | popmessage("Prot read at %06x with data = %08x",space | |
125 | popmessage("Prot read at %06x with data = %08x",space.device().safe_pc(),a_bus[3]); | |
126 | 126 | #endif |
127 | 127 | switch(a_bus[3]) |
128 | 128 | { |
r17963 | r17964 | |
141 | 141 | static WRITE32_HANDLER ( twcup98_prot_w ) |
142 | 142 | { |
143 | 143 | COMBINE_DATA(&a_bus[offset]); |
144 | logerror("A-Bus control protection write at %06x: [%02x] <- %08x\n",space | |
144 | logerror("A-Bus control protection write at %06x: [%02x] <- %08x\n",space.device().safe_pc(),offset,data); | |
145 | 145 | if(offset == 3) |
146 | 146 | { |
147 | 147 | logerror("MAIN : %08x DATA : %08x\n",a_bus[3],a_bus[2]); |
r17963 | r17964 | |
173 | 173 | |
174 | 174 | static READ32_HANDLER( sss_prot_r ) |
175 | 175 | { |
176 | UINT32 *ROM = (UINT32 *)space | |
176 | UINT32 *ROM = (UINT32 *)space.machine().root_device().memregion("abus")->base(); | |
177 | 177 | |
178 | 178 | if(a_bus[0] & 0x00010000)//protection calculation is activated |
179 | 179 | { |
180 | 180 | if(offset == 3) |
181 | 181 | { |
182 | logerror("A-Bus control protection read at %06x with data = %08x\n",space | |
182 | logerror("A-Bus control protection read at %06x with data = %08x\n",space.device().safe_pc(),a_bus[3]); | |
183 | 183 | #ifdef MAME_DEBUG |
184 | popmessage("Prot read at %06x with data = %08x",space | |
184 | popmessage("Prot read at %06x with data = %08x",space.device().safe_pc(),a_bus[3]); | |
185 | 185 | #endif |
186 | 186 | switch(a_bus[3]) |
187 | 187 | { |
r17963 | r17964 | |
208 | 208 | static WRITE32_HANDLER ( sss_prot_w ) |
209 | 209 | { |
210 | 210 | COMBINE_DATA(&a_bus[offset]); |
211 | logerror("A-Bus control protection write at %06x: [%02x] <- %08x\n",space | |
211 | logerror("A-Bus control protection write at %06x: [%02x] <- %08x\n",space.device().safe_pc(),offset,data); | |
212 | 212 | if(offset == 3) |
213 | 213 | { |
214 | 214 | //logerror("MAIN : %08x DATA : %08x\n",a_bus[3],a_bus[2]); |
r17963 | r17964 | |
238 | 238 | |
239 | 239 | static READ32_HANDLER( rsgun_prot_r ) |
240 | 240 | { |
241 | UINT32 *ROM = (UINT32 *)space | |
241 | UINT32 *ROM = (UINT32 *)space.machine().root_device().memregion("abus")->base(); | |
242 | 242 | |
243 | 243 | if(a_bus[0] & 0x00010000)//protection calculation is activated |
244 | 244 | { |
245 | 245 | if(offset == 3) |
246 | 246 | { |
247 | logerror("A-Bus control protection read at %06x with data = %08x\n",space | |
247 | logerror("A-Bus control protection read at %06x with data = %08x\n",space.device().safe_pc(),a_bus[3]); | |
248 | 248 | #ifdef MAME_DEBUG |
249 | popmessage("Prot read at %06x with data = %08x",space | |
249 | popmessage("Prot read at %06x with data = %08x",space.device().safe_pc(),a_bus[3]); | |
250 | 250 | #endif |
251 | 251 | switch(a_bus[3]) |
252 | 252 | { |
r17963 | r17964 | |
278 | 278 | static WRITE32_HANDLER ( rsgun_prot_w ) |
279 | 279 | { |
280 | 280 | COMBINE_DATA(&a_bus[offset]); |
281 | logerror("A-Bus control protection write at %06x: [%02x] <- %08x\n",space | |
281 | logerror("A-Bus control protection write at %06x: [%02x] <- %08x\n",space.device().safe_pc(),offset,data); | |
282 | 282 | if(offset == 3) |
283 | 283 | { |
284 | 284 | //logerror("MAIN : %08x DATA : %08x\n",a_bus[3],a_bus[2]); |
r17963 | r17964 | |
313 | 313 | |
314 | 314 | static READ32_HANDLER( elandore_prot_r ) |
315 | 315 | { |
316 | UINT32 *ROM = (UINT32 *)space | |
316 | UINT32 *ROM = (UINT32 *)space.machine().root_device().memregion("abus")->base(); | |
317 | 317 | |
318 | 318 | if(a_bus[0] & 0x00010000)//protection calculation is activated |
319 | 319 | { |
320 | 320 | if(offset == 3) |
321 | 321 | { |
322 | logerror("A-Bus control protection read at %06x with data = %08x\n",space | |
322 | logerror("A-Bus control protection read at %06x with data = %08x\n",space.device().safe_pc(),a_bus[3]); | |
323 | 323 | #ifdef MAME_DEBUG |
324 | popmessage("Prot read at %06x with data = %08x",space | |
324 | popmessage("Prot read at %06x with data = %08x",space.device().safe_pc(),a_bus[3]); | |
325 | 325 | #endif |
326 | 326 | switch(a_bus[3]) |
327 | 327 | { |
r17963 | r17964 | |
349 | 349 | static WRITE32_HANDLER ( elandore_prot_w ) |
350 | 350 | { |
351 | 351 | COMBINE_DATA(&a_bus[offset]); |
352 | logerror("A-Bus control protection write at %06x: [%02x] <- %08x\n",space | |
352 | logerror("A-Bus control protection write at %06x: [%02x] <- %08x\n",space.device().safe_pc(),offset,data); | |
353 | 353 | if(offset == 3) |
354 | 354 | { |
355 | 355 | /* a bus value 2 seed is used too here. */ |
r17963 | r17964 | |
420 | 420 | |
421 | 421 | static READ32_HANDLER( ffreveng_prot_r ) |
422 | 422 | { |
423 | UINT32 *ROM = (UINT32 *)space | |
423 | UINT32 *ROM = (UINT32 *)space.machine().root_device().memregion("abus")->base(); | |
424 | 424 | |
425 | 425 | if(a_bus[0] & 0x00010000)//protection calculation is activated |
426 | 426 | { |
427 | 427 | if(offset == 3) |
428 | 428 | { |
429 | logerror("A-Bus control protection read at %06x with data = %08x\n",space | |
429 | logerror("A-Bus control protection read at %06x with data = %08x\n",space.device().safe_pc(),a_bus[3]); | |
430 | 430 | #ifdef MAME_DEBUG |
431 | popmessage("Prot read at %06x with data = %08x",space | |
431 | popmessage("Prot read at %06x with data = %08x",space.device().safe_pc(),a_bus[3]); | |
432 | 432 | #endif |
433 | 433 | switch(a_bus[3]) |
434 | 434 | { |
r17963 | r17964 | |
455 | 455 | static WRITE32_HANDLER ( ffreveng_prot_w ) |
456 | 456 | { |
457 | 457 | COMBINE_DATA(&a_bus[offset]); |
458 | logerror("A-Bus control protection write at %06x: [%02x] <- %08x\n",space | |
458 | logerror("A-Bus control protection write at %06x: [%02x] <- %08x\n",space.device().safe_pc(),offset,data); | |
459 | 459 | if(offset == 3) |
460 | 460 | { |
461 | 461 | //logerror("MAIN : %08x DATA : %08x\n",a_bus[3],a_bus[2]); |
r17963 | r17964 | |
485 | 485 | if ( offset == 3 && ctrl_index != -1 ) |
486 | 486 | { |
487 | 487 | UINT32 data = 0; |
488 | UINT32 *prot_data = (UINT32 *)space | |
488 | UINT32 *prot_data = (UINT32 *)space.machine().root_device().memregion("user2")->base(); | |
489 | 489 | |
490 | 490 | data = prot_data[ctrl_index++]; |
491 | 491 | |
492 | if ( ctrl_index >= space | |
492 | if ( ctrl_index >= space.machine().root_device().memregion("user2")->bytes()/4 ) | |
493 | 493 | { |
494 | 494 | ctrl_index = -1; |
495 | 495 | } |
r17963 | r17964 | |
533 | 533 | { |
534 | 534 | // the offsets written to the protection device definitely only refer to 2 of the roms |
535 | 535 | // it's a fair assumption to say that only those 2 are connected to the protection device |
536 | UINT8 *ROM = (UINT8 *)space | |
536 | UINT8 *ROM = (UINT8 *)space.machine().root_device().memregion("abus")->base()+0x1000000; | |
537 | 537 | |
538 | 538 | if (offset==2) |
539 | 539 | { |
r17963 | r17964 | |
554 | 554 | } |
555 | 555 | else |
556 | 556 | { |
557 | logerror("%06x Decathlete prot R offset %04x mask %08x regs %08x, %08x, %08x, %08x\n",space | |
557 | logerror("%06x Decathlete prot R offset %04x mask %08x regs %08x, %08x, %08x, %08x\n",space.device().safe_pc(), offset, mem_mask, decathlt_protregs[0], decathlt_protregs[1], decathlt_protregs[2], decathlt_protregs[3]); | |
558 | 558 | } |
559 | 559 | |
560 | 560 | return decathlt_protregs[offset]; |
r17963 | r17964 | |
---|---|---|
138 | 138 | |
139 | 139 | void asic65_reset(running_machine &machine, int state) |
140 | 140 | { |
141 | address_space | |
141 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
142 | 142 | |
143 | 143 | /* rom-based means reset and clear states */ |
144 | 144 | if (asic65.cpu != NULL) |
r17963 | r17964 | |
191 | 191 | /* rom-based use a deferred write mechanism */ |
192 | 192 | if (asic65.type == ASIC65_ROMBASED) |
193 | 193 | { |
194 | space->machine().scheduler().synchronize(FUNC(m68k_asic65_deferred_w), data | (offset << 16)); | |
195 | space->machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(20)); | |
194 | space.machine().scheduler().synchronize(FUNC(m68k_asic65_deferred_w), data | (offset << 16)); | |
195 | space.machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(20)); | |
196 | 196 | return; |
197 | 197 | } |
198 | 198 | |
r17963 | r17964 | |
211 | 211 | else |
212 | 212 | { |
213 | 213 | int command = (data < MAX_COMMANDS) ? command_map[asic65.type][data] : OP_UNKNOWN; |
214 | if (asic65.log) fprintf(asic65.log, "\n(%06X)%c%04X:", space | |
214 | if (asic65.log) fprintf(asic65.log, "\n(%06X)%c%04X:", space.device().safe_pcbase(), (command == OP_UNKNOWN) ? '*' : ' ', data); | |
215 | 215 | |
216 | 216 | /* set the command number and reset the parameter/result indices */ |
217 | 217 | asic65.command = data; |
r17963 | r17964 | |
230 | 230 | if (asic65.type == ASIC65_ROMBASED) |
231 | 231 | { |
232 | 232 | asic65._68full = 0; |
233 | space | |
233 | space.machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(5)); | |
234 | 234 | return asic65._68data; |
235 | 235 | } |
236 | 236 | |
r17963 | r17964 | |
448 | 448 | /* bit 14 = 68FULL */ |
449 | 449 | /* bit 13 = XFLG */ |
450 | 450 | /* bit 12 = controlled by jumper */ |
451 | space | |
451 | space.machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(5)); | |
452 | 452 | return (asic65.tfull << 15) | (asic65._68full << 14) | (asic65.xflg << 13) | 0x0000; |
453 | 453 | } |
454 | 454 | else |
r17963 | r17964 | |
501 | 501 | static READ16_HANDLER( asci65_get_bio ) |
502 | 502 | { |
503 | 503 | if (!asic65.tfull) |
504 | space | |
504 | space.device().execute().spin_until_interrupt(); | |
505 | 505 | return asic65.tfull ? CLEAR_LINE : ASSERT_LINE; |
506 | 506 | } |
507 | 507 |
r17963 | r17964 | |
---|---|---|
27 | 27 | |
28 | 28 | static READ64_HANDLER( naomi_biose_idle_skip_r ) |
29 | 29 | { |
30 | if (space->device().safe_pc()==0xc04173c) | |
31 | space->device().execute().spin_until_time(attotime::from_usec(500)); | |
32 | //space->device().execute().spin_until_interrupt(); | |
30 | if (space.device().safe_pc()==0xc04173c) | |
31 | space.device().execute().spin_until_time(attotime::from_usec(500)); | |
32 | //space.device().execute().spin_until_interrupt(); | |
33 | 33 | // else |
34 | // printf("%08x\n", space | |
34 | // printf("%08x\n", space.device().safe_pc()); | |
35 | 35 | |
36 | return space | |
36 | return space.machine().driver_data<dc_state>()->dc_ram[0x2ad238/8]; | |
37 | 37 | } |
38 | 38 | |
39 | 39 | static READ64_HANDLER( naomi_biosh_idle_skip_r ) |
40 | 40 | { |
41 | if (space->device().safe_pc()==0xc045ffc) | |
42 | space->device().execute().spin_until_time(attotime::from_usec(500)); | |
41 | if (space.device().safe_pc()==0xc045ffc) | |
42 | space.device().execute().spin_until_time(attotime::from_usec(500)); | |
43 | 43 | |
44 | // printf("%08x\n", space | |
44 | // printf("%08x\n", space.device().safe_pc()); | |
45 | 45 | |
46 | return space | |
46 | return space.machine().driver_data<dc_state>()->dc_ram[0x2b0600/8]; | |
47 | 47 | } |
48 | 48 | |
49 | 49 | static READ64_HANDLER( naomi2_biose_idle_skip_r ) |
50 | 50 | { |
51 | if (space->device().safe_pc()==0xc04637c) | |
52 | space->device().execute().spin_until_time(attotime::from_usec(500)); | |
53 | //space->device().execute().spin_until_interrupt(); | |
51 | if (space.device().safe_pc()==0xc04637c) | |
52 | space.device().execute().spin_until_time(attotime::from_usec(500)); | |
53 | //space.device().execute().spin_until_interrupt(); | |
54 | 54 | // else |
55 | // printf("%08x\n", space | |
55 | // printf("%08x\n", space.device().safe_pc()); | |
56 | 56 | |
57 | return space | |
57 | return space.machine().driver_data<dc_state>()->dc_ram[0x2b0600/8]; | |
58 | 58 | } |
59 | 59 | |
60 | 60 | static UINT8 asciihex_to_dec(UINT8 in) |
r17963 | r17964 | |
242 | 242 | |
243 | 243 | static READ64_HANDLER( naomigd_ggxxsla_idle_skip_r ) |
244 | 244 | { |
245 | if (space->device().safe_pc()==0x0c0c9adc) | |
246 | space->device().execute().spin_until_time(attotime::from_usec(500)); | |
245 | if (space.device().safe_pc()==0x0c0c9adc) | |
246 | space.device().execute().spin_until_time(attotime::from_usec(500)); | |
247 | 247 | |
248 | return space | |
248 | return space.machine().driver_data<dc_state>()->dc_ram[0x1aae18/8]; | |
249 | 249 | } |
250 | 250 | |
251 | 251 | DRIVER_INIT_MEMBER(dc_state,ggxxsla) |
r17963 | r17964 | |
256 | 256 | |
257 | 257 | static READ64_HANDLER( naomigd_ggxx_idle_skip_r ) |
258 | 258 | { |
259 | if (space->device().safe_pc()==0xc0b5c3c) // or 0xc0bab0c | |
260 | space->device().execute().spin_until_time(attotime::from_usec(500)); | |
259 | if (space.device().safe_pc()==0xc0b5c3c) // or 0xc0bab0c | |
260 | space.device().execute().spin_until_time(attotime::from_usec(500)); | |
261 | 261 | |
262 | return space | |
262 | return space.machine().driver_data<dc_state>()->dc_ram[0x1837b8/8]; | |
263 | 263 | } |
264 | 264 | |
265 | 265 | |
r17963 | r17964 | |
271 | 271 | |
272 | 272 | static READ64_HANDLER( naomigd_ggxxrl_idle_skip_r ) |
273 | 273 | { |
274 | if (space->device().safe_pc()==0xc0b84bc) // or 0xc0bab0c | |
275 | space->device().execute().spin_until_time(attotime::from_usec(500)); | |
274 | if (space.device().safe_pc()==0xc0b84bc) // or 0xc0bab0c | |
275 | space.device().execute().spin_until_time(attotime::from_usec(500)); | |
276 | 276 | |
277 | //printf("%08x\n", space | |
277 | //printf("%08x\n", space.device().safe_pc()); | |
278 | 278 | |
279 | return space | |
279 | return space.machine().driver_data<dc_state>()->dc_ram[0x18d6c8/8]; | |
280 | 280 | } |
281 | 281 | |
282 | 282 | DRIVER_INIT_MEMBER(dc_state,ggxxrl) |
r17963 | r17964 | |
288 | 288 | /* at least speeds up the annoying copyright screens ;-) */ |
289 | 289 | static READ64_HANDLER( naomigd_sfz3ugd_idle_skip_r ) |
290 | 290 | { |
291 | if (space->device().safe_pc()==0xc36a2dc) | |
292 | space->device().execute().spin_until_time(attotime::from_usec(500)); | |
291 | if (space.device().safe_pc()==0xc36a2dc) | |
292 | space.device().execute().spin_until_time(attotime::from_usec(500)); | |
293 | 293 | |
294 | return space | |
294 | return space.machine().driver_data<dc_state>()->dc_ram[0x5dc900/8]; | |
295 | 295 | } |
296 | 296 | |
297 | 297 | DRIVER_INIT_MEMBER(dc_state,sfz3ugd) |
r17963 | r17964 | |
333 | 333 | |
334 | 334 | static READ64_HANDLER( hotd2_idle_skip_r ) |
335 | 335 | { |
336 | if (space->device().safe_pc()==0xc0cfcbc) | |
337 | space->device().execute().spin_until_time(attotime::from_usec(500)); | |
338 | //space->device().execute().spin_until_interrupt(); | |
336 | if (space.device().safe_pc()==0xc0cfcbc) | |
337 | space.device().execute().spin_until_time(attotime::from_usec(500)); | |
338 | //space.device().execute().spin_until_interrupt(); | |
339 | 339 | // else |
340 | // printf("%08x\n", space | |
340 | // printf("%08x\n", space.device().safe_pc()); | |
341 | 341 | |
342 | return space | |
342 | return space.machine().driver_data<dc_state>()->dc_ram[0xa25fb8/8]; | |
343 | 343 | } |
344 | 344 | |
345 | 345 | DRIVER_INIT_MEMBER(dc_state,hotd2) |
r17963 | r17964 | |
---|---|---|
134 | 134 | void asteroid_state::machine_reset() |
135 | 135 | { |
136 | 136 | asteroid_bank_switch_w(*machine().device("maincpu")->memory().space(AS_PROGRAM), 0, 0); |
137 | avgdvg_reset_w(machine().device("maincpu")->memory().space(AS_PROGRAM), 0, 0); | |
137 | avgdvg_reset_w(*machine().device("maincpu")->memory().space(AS_PROGRAM), 0, 0); | |
138 | 138 | } |
r17963 | r17964 | |
---|---|---|
148 | 148 | |
149 | 149 | READ16_HANDLER( tmp68301_address_decoder_r ) |
150 | 150 | { |
151 | LOG(("PC %08X: TMP68301_address_decoder_r (%08X)\n", space | |
151 | LOG(("PC %08X: TMP68301_address_decoder_r (%08X)\n", space.device().safe_pc(), (0xfffc00 + (offset * 2)))); | |
152 | 152 | |
153 | 153 | return tmp68301_address_decoder[offset]; |
154 | 154 | } |
155 | 155 | |
156 | 156 | WRITE16_HANDLER( tmp68301_address_decoder_w ) |
157 | 157 | { |
158 | LOG(("PC %08X: TMP68301_address_decoder_w (%08X = %04X)\n", space | |
158 | LOG(("PC %08X: TMP68301_address_decoder_w (%08X = %04X)\n", space.device().safe_pc(), (0xfffc00 + (offset * 2)), data)); | |
159 | 159 | |
160 | 160 | tmp68301_address_decoder[offset] = data; |
161 | 161 | } |
162 | 162 | |
163 | 163 | READ16_HANDLER( tmp68301_interrupt_controller_r ) |
164 | 164 | { |
165 | LOG(("PC %08X: TMP68301_interrupt_controller_r (%08X)\n", space | |
165 | LOG(("PC %08X: TMP68301_interrupt_controller_r (%08X)\n", space.device().safe_pc(), (0xfffc80 + (offset * 2)))); | |
166 | 166 | |
167 | 167 | return tmp68301_interrupt_controller[offset]; |
168 | 168 | } |
169 | 169 | |
170 | 170 | WRITE16_HANDLER( tmp68301_interrupt_controller_w ) |
171 | 171 | { |
172 | LOG(("PC %08X: TMP68301_interrupt_controller_w (%08X = %04X)\n", space | |
172 | LOG(("PC %08X: TMP68301_interrupt_controller_w (%08X = %04X)\n", space.device().safe_pc(), (0xfffc80 + (offset * 2)), data)); | |
173 | 173 | |
174 | 174 | tmp68301_interrupt_controller[offset] = data; |
175 | 175 | } |
176 | 176 | |
177 | 177 | READ16_HANDLER( tmp68301_parallel_interface_r ) |
178 | 178 | { |
179 | LOG(("PC %08X: TMP68301_parallel_interface_r (%08X)\n", space | |
179 | LOG(("PC %08X: TMP68301_parallel_interface_r (%08X)\n", space.device().safe_pc(), (0xfffd00 + (offset * 2)))); | |
180 | 180 | |
181 | 181 | return tmp68301_parallel_interface[offset]; |
182 | 182 | } |
183 | 183 | |
184 | 184 | WRITE16_HANDLER( tmp68301_parallel_interface_w ) |
185 | 185 | { |
186 | LOG(("PC %08X: TMP68301_parallel_interface_w (%08X = %04X)\n", space | |
186 | LOG(("PC %08X: TMP68301_parallel_interface_w (%08X = %04X)\n", space.device().safe_pc(), (0xfffd00 + (offset * 2)), data)); | |
187 | 187 | |
188 | 188 | tmp68301_parallel_interface[offset] = data; |
189 | 189 | } |
190 | 190 | |
191 | 191 | READ16_HANDLER( tmp68301_serial_interface_r ) |
192 | 192 | { |
193 | LOG(("PC %08X: TMP68301_serial_interface_r (%08X)\n", space | |
193 | LOG(("PC %08X: TMP68301_serial_interface_r (%08X)\n", space.device().safe_pc(), (0xfffd80 + (offset * 2)))); | |
194 | 194 | |
195 | 195 | return tmp68301_serial_interface[offset]; |
196 | 196 | } |
197 | 197 | |
198 | 198 | WRITE16_HANDLER( tmp68301_serial_interface_w ) |
199 | 199 | { |
200 | LOG(("PC %08X: TMP68301_serial_interface_w (%08X = %04X)\n", space | |
200 | LOG(("PC %08X: TMP68301_serial_interface_w (%08X = %04X)\n", space.device().safe_pc(), (0xfffd80 + (offset * 2)), data)); | |
201 | 201 | |
202 | 202 | tmp68301_serial_interface[offset] = data; |
203 | 203 | } |
204 | 204 | |
205 | 205 | READ16_HANDLER( tmp68301_timer_r ) |
206 | 206 | { |
207 | LOG(("PC %08X: TMP68301_timer_r (%08X)\n", space | |
207 | LOG(("PC %08X: TMP68301_timer_r (%08X)\n", space.device().safe_pc(), (0xfffe00 + (offset * 2)))); | |
208 | 208 | |
209 | 209 | return tmp68301_timer[offset]; |
210 | 210 | } |
211 | 211 | |
212 | 212 | WRITE16_HANDLER( tmp68301_timer_w ) |
213 | 213 | { |
214 | LOG(("PC %08X: TMP68301_timer_w (%08X = %04X)\n", space | |
214 | LOG(("PC %08X: TMP68301_timer_w (%08X = %04X)\n", space.device().safe_pc(), (0xfffe00 + (offset * 2)), data)); | |
215 | 215 | |
216 | 216 | tmp68301_timer[offset] = data; |
217 | 217 | } |
r17963 | r17964 | |
---|---|---|
82 | 82 | |
83 | 83 | void mhavoc_state::machine_reset() |
84 | 84 | { |
85 | address_space | |
85 | address_space &space = *machine().device("alpha")->memory().space(AS_PROGRAM); | |
86 | 86 | m_has_gamma_cpu = (machine().device("gamma") != NULL); |
87 | 87 | |
88 | 88 | membank("bank1")->configure_entry(0, m_zram0); |
r17963 | r17964 | |
90 | 90 | membank("bank2")->configure_entries(0, 4, memregion("alpha")->base() + 0x10000, 0x2000); |
91 | 91 | |
92 | 92 | /* reset RAM/ROM banks to 0 */ |
93 | mhavoc_ram_banksel_w(*space, 0, 0); | |
94 | mhavoc_rom_banksel_w(*space, 0, 0); | |
93 | mhavoc_ram_banksel_w(space, 0, 0); | |
94 | mhavoc_rom_banksel_w(space, 0, 0); | |
95 | 95 | |
96 | 96 | /* reset alpha comm status */ |
97 | 97 | m_alpha_data = 0; |
r17963 | r17964 | |
---|---|---|
260 | 260 | } |
261 | 261 | |
262 | 262 | |
263 | static void toaplan0_coin_dsp_w(address_space | |
263 | static void toaplan0_coin_dsp_w(address_space &space, int offset, int data) | |
264 | 264 | { |
265 | twincobr_state *state = space | |
265 | twincobr_state *state = space.machine().driver_data<twincobr_state>(); | |
266 | 266 | if (data > 1) |
267 | LOG(("%s:Writing %08x to %08x.\n",space | |
267 | LOG(("%s:Writing %08x to %08x.\n",space.machine().describe_context(),data,toaplan_port_type[state->m_toaplan_main_cpu] - offset)); | |
268 | 268 | switch (data) { |
269 | case 0x08: coin_counter_w(space->machine(), 0,0); break; | |
270 | case 0x09: coin_counter_w(space->machine(), 0,1); break; | |
271 | case 0x0a: coin_counter_w(space->machine(), 1,0); break; | |
272 | case 0x0b: coin_counter_w(space->machine(), 1,1); break; | |
273 | case 0x0c: coin_lockout_w(space->machine(), 0,1); break; | |
274 | case 0x0d: coin_lockout_w(space->machine(), 0,0); break; | |
275 | case 0x0e: coin_lockout_w(space->machine(), 1,1); break; | |
276 | case 0x0f: coin_lockout_w(space->machine(), 1,0); break; | |
269 | case 0x08: coin_counter_w(space.machine(), 0,0); break; | |
270 | case 0x09: coin_counter_w(space.machine(), 0,1); break; | |
271 | case 0x0a: coin_counter_w(space.machine(), 1,0); break; | |
272 | case 0x0b: coin_counter_w(space.machine(), 1,1); break; | |
273 | case 0x0c: coin_lockout_w(space.machine(), 0,1); break; | |
274 | case 0x0d: coin_lockout_w(space.machine(), 0,0); break; | |
275 | case 0x0e: coin_lockout_w(space.machine(), 1,1); break; | |
276 | case 0x0f: coin_lockout_w(space.machine(), 1,0); break; | |
277 | 277 | /****** The following apply to Flying Shark/Wardner only ******/ |
278 | 278 | case 0x00: /* This means assert the INT line to the DSP */ |
279 | 279 | LOG(("Turning DSP on and main CPU off\n")); |
280 | space->machine().device("dsp")->execute().set_input_line(INPUT_LINE_HALT, CLEAR_LINE); | |
281 | space->machine().device("dsp")->execute().set_input_line(0, ASSERT_LINE); /* TMS32010 INT */ | |
282 | space->machine().device("maincpu")->execute().set_input_line(INPUT_LINE_HALT, ASSERT_LINE); | |
280 | space.machine().device("dsp")->execute().set_input_line(INPUT_LINE_HALT, CLEAR_LINE); | |
281 | space.machine().device("dsp")->execute().set_input_line(0, ASSERT_LINE); /* TMS32010 INT */ | |
282 | space.machine().device("maincpu")->execute().set_input_line(INPUT_LINE_HALT, ASSERT_LINE); | |
283 | 283 | break; |
284 | 284 | case 0x01: /* This means inhibit the INT line to the DSP */ |
285 | 285 | LOG(("Turning DSP off\n")); |
286 | space->machine().device("dsp")->execute().set_input_line(0, CLEAR_LINE); /* TMS32010 INT */ | |
287 | space->machine().device("dsp")->execute().set_input_line(INPUT_LINE_HALT, ASSERT_LINE); | |
286 | space.machine().device("dsp")->execute().set_input_line(0, CLEAR_LINE); /* TMS32010 INT */ | |
287 | space.machine().device("dsp")->execute().set_input_line(INPUT_LINE_HALT, ASSERT_LINE); | |
288 | 288 | break; |
289 | 289 | } |
290 | 290 | } |
r17963 | r17964 | |
294 | 294 | { |
295 | 295 | if (ACCESSING_BITS_0_7) |
296 | 296 | { |
297 | toaplan0_coin_dsp_w( | |
297 | toaplan0_coin_dsp_w(space, offset, data & 0xff); | |
298 | 298 | } |
299 | 299 | } |
300 | 300 | |
301 | 301 | WRITE8_MEMBER(twincobr_state::twincobr_coin_w) |
302 | 302 | { |
303 | toaplan0_coin_dsp_w( | |
303 | toaplan0_coin_dsp_w(space, offset, data); | |
304 | 304 | } |
305 | 305 | |
306 | 306 | WRITE8_MEMBER(twincobr_state::wardner_coin_dsp_w) |
307 | 307 | { |
308 | toaplan0_coin_dsp_w( | |
308 | toaplan0_coin_dsp_w(space, offset, data); | |
309 | 309 | } |
310 | 310 | |
311 | 311 |
r17963 | r17964 | |
---|---|---|
56 | 56 | if (d & 0x000f) { *dst &= ~0x000f; *dst |= d & 0x000f; } |
57 | 57 | } |
58 | 58 | |
59 | static UINT32 pm_io(address_space | |
59 | static UINT32 pm_io(address_space &space, int reg, int write, UINT32 d) | |
60 | 60 | { |
61 | mdsvp_state *state = space | |
61 | mdsvp_state *state = space.machine().driver_data<mdsvp_state>(); | |
62 | 62 | if (state->m_emu_status & SSP_PMC_SET) |
63 | 63 | { |
64 | 64 | state->m_pmac_read[write ? reg + 6 : reg] = state->m_pmc.d; |
r17963 | r17964 | |
71 | 71 | state->m_emu_status &= ~SSP_PMC_HAVE_ADDR; |
72 | 72 | } |
73 | 73 | |
74 | if (reg == 4 || (space | |
74 | if (reg == 4 || (space.device().state().state_int(SSP_ST) & 0x60)) | |
75 | 75 | { |
76 | 76 | #define CADDR ((((mode<<16)&0x7f0000)|addr)<<1) |
77 | 77 | UINT16 *dram = (UINT16 *)state->m_dram; |
r17963 | r17964 | |
112 | 112 | int addr = state->m_pmac_read[reg]&0xffff; |
113 | 113 | if ((mode & 0xfff0) == 0x0800) // ROM, inc 1, verified to be correct |
114 | 114 | { |
115 | UINT16 *ROM = (UINT16 *) space | |
115 | UINT16 *ROM = (UINT16 *) space.machine().root_device().memregion("maincpu")->base(); | |
116 | 116 | state->m_pmac_read[reg] += 1; |
117 | 117 | d = ROM[addr|((mode&0xf)<<16)]; |
118 | 118 | } |
r17963 | r17964 | |
141 | 141 | |
142 | 142 | static READ16_HANDLER( read_PM0 ) |
143 | 143 | { |
144 | mdsvp_state *state = space | |
144 | mdsvp_state *state = space.machine().driver_data<mdsvp_state>(); | |
145 | 145 | UINT32 d = pm_io(space, 0, 0, 0); |
146 | 146 | if (d != (UINT32)-1) return d; |
147 | 147 | d = state->m_XST2; |
r17963 | r17964 | |
151 | 151 | |
152 | 152 | static WRITE16_HANDLER( write_PM0 ) |
153 | 153 | { |
154 | mdsvp_state *state = space | |
154 | mdsvp_state *state = space.machine().driver_data<mdsvp_state>(); | |
155 | 155 | UINT32 r = pm_io(space, 0, 1, data); |
156 | 156 | if (r != (UINT32)-1) return; |
157 | 157 | state->m_XST2 = data; // ? |
r17963 | r17964 | |
189 | 189 | |
190 | 190 | static READ16_HANDLER( read_XST ) |
191 | 191 | { |
192 | mdsvp_state *state = space | |
192 | mdsvp_state *state = space.machine().driver_data<mdsvp_state>(); | |
193 | 193 | UINT32 d = pm_io(space, 3, 0, 0); |
194 | 194 | if (d != (UINT32)-1) return d; |
195 | 195 | |
r17963 | r17964 | |
198 | 198 | |
199 | 199 | static WRITE16_HANDLER( write_XST ) |
200 | 200 | { |
201 | mdsvp_state *state = space | |
201 | mdsvp_state *state = space.machine().driver_data<mdsvp_state>(); | |
202 | 202 | UINT32 r = pm_io(space, 3, 1, data); |
203 | 203 | if (r != (UINT32)-1) return; |
204 | 204 | |
r17963 | r17964 | |
218 | 218 | |
219 | 219 | static READ16_HANDLER( read_PMC ) |
220 | 220 | { |
221 | mdsvp_state *state = space | |
221 | mdsvp_state *state = space.machine().driver_data<mdsvp_state>(); | |
222 | 222 | if (state->m_emu_status & SSP_PMC_HAVE_ADDR) { |
223 | 223 | state->m_emu_status |= SSP_PMC_SET; |
224 | 224 | state->m_emu_status &= ~SSP_PMC_HAVE_ADDR; |
r17963 | r17964 | |
231 | 231 | |
232 | 232 | static WRITE16_HANDLER( write_PMC ) |
233 | 233 | { |
234 | mdsvp_state *state = space | |
234 | mdsvp_state *state = space.machine().driver_data<mdsvp_state>(); | |
235 | 235 | if (state->m_emu_status & SSP_PMC_HAVE_ADDR) { |
236 | 236 | state->m_emu_status |= SSP_PMC_SET; |
237 | 237 | state->m_emu_status &= ~SSP_PMC_HAVE_ADDR; |
r17963 | r17964 | |
244 | 244 | |
245 | 245 | static READ16_HANDLER( read_AL ) |
246 | 246 | { |
247 | mdsvp_state *state = space | |
247 | mdsvp_state *state = space.machine().driver_data<mdsvp_state>(); | |
248 | 248 | state->m_emu_status &= ~(SSP_PMC_SET|SSP_PMC_HAVE_ADDR); |
249 | 249 | return 0; |
250 | 250 | } |
r17963 | r17964 | |
257 | 257 | |
258 | 258 | static READ16_HANDLER( svp_68k_io_r ) |
259 | 259 | { |
260 | mdsvp_state *state = space | |
260 | mdsvp_state *state = space.machine().driver_data<mdsvp_state>(); | |
261 | 261 | UINT32 d; |
262 | 262 | switch (offset) |
263 | 263 | { |
r17963 | r17964 | |
273 | 273 | |
274 | 274 | static WRITE16_HANDLER( svp_68k_io_w ) |
275 | 275 | { |
276 | mdsvp_state *state = space | |
276 | mdsvp_state *state = space.machine().driver_data<mdsvp_state>(); | |
277 | 277 | switch (offset) |
278 | 278 | { |
279 | 279 | // 0xa15000, 0xa15002 |
r17963 | r17964 | |
288 | 288 | static READ16_HANDLER( svp_68k_cell1_r ) |
289 | 289 | { |
290 | 290 | // this is rewritten 68k test code |
291 | mdsvp_state *state = space | |
291 | mdsvp_state *state = space.machine().driver_data<mdsvp_state>(); | |
292 | 292 | UINT32 a1 = offset; |
293 | 293 | a1 = (a1 & 0x7001) | ((a1 & 0x3e) << 6) | ((a1 & 0xfc0) >> 5); |
294 | 294 | return ((UINT16 *)state->m_dram)[a1]; |
r17963 | r17964 | |
297 | 297 | static READ16_HANDLER( svp_68k_cell2_r ) |
298 | 298 | { |
299 | 299 | // this is rewritten 68k test code |
300 | mdsvp_state *state = space | |
300 | mdsvp_state *state = space.machine().driver_data<mdsvp_state>(); | |
301 | 301 | UINT32 a1 = offset; |
302 | 302 | a1 = (a1 & 0x7801) | ((a1 & 0x1e) << 6) | ((a1 & 0x7e0) >> 4); |
303 | 303 | return ((UINT16 *)state->m_dram)[a1]; |
r17963 | r17964 | |
333 | 333 | |
334 | 334 | static READ16_HANDLER( svp_speedup_r ) |
335 | 335 | { |
336 | space | |
336 | space.device().execute().spin_until_time(attotime::from_usec(100)); | |
337 | 337 | return 0x0425; |
338 | 338 | } |
339 | 339 |
r17963 | r17964 | |
---|---|---|
139 | 139 | |
140 | 140 | static UINT16 kof10thExtraRAMB[0x01000]; |
141 | 141 | |
142 | static void kof10thBankswitch(address_space | |
142 | static void kof10thBankswitch(address_space &space, UINT16 nBank) | |
143 | 143 | { |
144 | 144 | UINT32 bank = 0x100000 + ((nBank & 7) << 20); |
145 | 145 | if (bank >= 0x700000) |
r17963 | r17964 | |
155 | 155 | static WRITE16_HANDLER( kof10th_custom_w ) |
156 | 156 | { |
157 | 157 | if (!kof10thExtraRAMB[0xFFE]) { // Write to RAM bank A |
158 | UINT16 *prom = (UINT16*)space | |
158 | UINT16 *prom = (UINT16*)space.machine().root_device().memregion( "maincpu" )->base(); | |
159 | 159 | COMBINE_DATA(&prom[(0xE0000/2) + (offset & 0xFFFF)]); |
160 | 160 | } else { // Write S data on-the-fly |
161 | UINT8 *srom = space | |
161 | UINT8 *srom = space.machine().root_device().memregion( "fixed" )->base(); | |
162 | 162 | srom[offset] = BITSWAP8(data,7,6,0,4,3,2,1,5); |
163 | 163 | } |
164 | 164 | } |
r17963 | r17964 | |
169 | 169 | if (offset == 0x5FFF8) { // Standard bankswitch |
170 | 170 | kof10thBankswitch(space, data); |
171 | 171 | } else if (offset == 0x5FFFC && kof10thExtraRAMB[0xFFC] != data) { // Special bankswitch |
172 | UINT8 *src = space | |
172 | UINT8 *src = space.machine().root_device().memregion( "maincpu" )->base(); | |
173 | 173 | memcpy (src + 0x10000, src + ((data & 1) ? 0x810000 : 0x710000), 0xcffff); |
174 | 174 | } |
175 | 175 | COMBINE_DATA(&kof10thExtraRAMB[offset & 0xFFF]); |
r17963 | r17964 | |
702 | 702 | |
703 | 703 | static READ16_HANDLER( mslug5_prot_r ) |
704 | 704 | { |
705 | logerror("PC %06x: access protected\n",space | |
705 | logerror("PC %06x: access protected\n",space.device().safe_pc()); | |
706 | 706 | return 0xa0; |
707 | 707 | } |
708 | 708 | |
709 | 709 | static WRITE16_HANDLER ( ms5plus_bankswitch_w ) |
710 | 710 | { |
711 | 711 | int bankaddress; |
712 | logerror("offset: %06x PC %06x: set banking %04x\n",offset,space | |
712 | logerror("offset: %06x PC %06x: set banking %04x\n",offset,space.device().safe_pc(),data); | |
713 | 713 | if ((offset == 0)&&(data == 0xa0)) |
714 | 714 | { |
715 | 715 | bankaddress=0xa0; |
716 | 716 | neogeo_set_main_cpu_bank_address(space, bankaddress); |
717 | logerror("offset: %06x PC %06x: set banking %04x\n\n",offset,space | |
717 | logerror("offset: %06x PC %06x: set banking %04x\n\n",offset,space.device().safe_pc(),bankaddress); | |
718 | 718 | } |
719 | 719 | else if(offset == 2) |
720 | 720 | { |
r17963 | r17964 | |
722 | 722 | //data=data&7; |
723 | 723 | bankaddress=data*0x100000; |
724 | 724 | neogeo_set_main_cpu_bank_address(space, bankaddress); |
725 | logerror("offset: %06x PC %06x: set banking %04x\n\n",offset,space | |
725 | logerror("offset: %06x PC %06x: set banking %04x\n\n",offset,space.device().safe_pc(),bankaddress); | |
726 | 726 | } |
727 | 727 | } |
728 | 728 | |
r17963 | r17964 | |
924 | 924 | UINT8* cr = (UINT8 *)kof2003_tbl; |
925 | 925 | UINT32 address = (cr[BYTE_XOR_LE(0x1ff3)]<<16)|(cr[BYTE_XOR_LE(0x1ff2)]<<8)|cr[BYTE_XOR_LE(0x1ff1)]; |
926 | 926 | UINT8 prt = cr[BYTE_XOR_LE(0x1ff2)]; |
927 | UINT8* mem = (UINT8 *)space | |
927 | UINT8* mem = (UINT8 *)space.machine().root_device().memregion("maincpu")->base(); | |
928 | 928 | |
929 | 929 | cr[BYTE_XOR_LE(0x1ff0)] = 0xa0; |
930 | 930 | cr[BYTE_XOR_LE(0x1ff1)] &= 0xfe; |
r17963 | r17964 | |
942 | 942 | UINT8* cr = (UINT8 *)kof2003_tbl; |
943 | 943 | UINT32 address = (cr[BYTE_XOR_LE(0x1ff3)]<<16)|(cr[BYTE_XOR_LE(0x1ff2)]<<8)|cr[BYTE_XOR_LE(0x1ff0)]; |
944 | 944 | UINT8 prt = cr[BYTE_XOR_LE(0x1ff2)]; |
945 | UINT8* mem = (UINT8 *)space | |
945 | UINT8* mem = (UINT8 *)space.machine().root_device().memregion("maincpu")->base(); | |
946 | 946 | |
947 | 947 | cr[BYTE_XOR_LE(0x1ff0)] &= 0xfe; |
948 | 948 | cr[BYTE_XOR_LE(0x1ff3)] &= 0x7f; |
r17963 | r17964 | |
---|---|---|
1935 | 1935 | case 0x90022: |
1936 | 1936 | case 0x90024: |
1937 | 1937 | case 0x90026: |
1938 | cd_writeWord(space | |
1938 | cd_writeWord(space.machine(), offset, data>>16); | |
1939 | 1939 | break; |
1940 | 1940 | |
1941 | 1941 | default: |
r17963 | r17964 | |
---|---|---|
48 | 48 | static void bsx_update_memory_map(void) |
49 | 49 | { |
50 | 50 | bsx_state.ram_source = BIT(bsx_state.cart_regs[0x01], 7) ? SNES_BSX_PRAM : SNES_BSX_FLASH; |
51 | // UINT8 *RAM = (bsx_state.cart_regs[0x01] & 0x80) == 0x00 ? space | |
51 | // UINT8 *RAM = (bsx_state.cart_regs[0x01] & 0x80) == 0x00 ? space.machine().root_device().memregion("flash")->base() : bsx_state.pram; | |
52 | 52 | |
53 | 53 | logerror("BSX: updated memory map, current RAM: %d", bsx_state.ram_source); |
54 | 54 | if (!BIT(bsx_state.cart_regs[0x02], 7)) |
r17963 | r17964 | |
149 | 149 | #ifdef UNUSED_FUNCTION |
150 | 150 | static READ8_HANDLER( bsx_flash_read ) |
151 | 151 | { |
152 | UINT8 *FLASH = space | |
152 | UINT8 *FLASH = space.machine().root_device().memregion("flash")->base(); | |
153 | 153 | |
154 | 154 | if (offset == 0x0002) |
155 | 155 | { |
r17963 | r17964 | |
---|---|---|
461 | 461 | namcoio_state *namcoio = get_safe_token(device); |
462 | 462 | offset &= 0x3f; |
463 | 463 | |
464 | // LOG(("%04x: I/O read: mode %d, offset %d = %02x\n", space | |
464 | // LOG(("%04x: I/O read: mode %d, offset %d = %02x\n", space.device().safe_pc(), offset / 16, namcoio_ram[(offset & 0x30) + 8], offset & 0x0f, namcoio_ram[offset]&0x0f)); | |
465 | 465 | |
466 | 466 | return 0xf0 | namcoio->ram[offset]; |
467 | 467 | } |
r17963 | r17964 | |
472 | 472 | offset &= 0x3f; |
473 | 473 | data &= 0x0f; // RAM is 4-bit wide |
474 | 474 | |
475 | // LOG(("%04x: I/O write %d: offset %d = %02x\n", space | |
475 | // LOG(("%04x: I/O write %d: offset %d = %02x\n", space.device().safe_pc(), offset / 16, offset & 0x0f, data)); | |
476 | 476 | |
477 | 477 | namcoio->ram[offset] = data; |
478 | 478 | } |
r17963 | r17964 | |
---|---|---|
42 | 42 | |
43 | 43 | UINT8 *konami1_decode(running_machine &machine, const char *cpu) |
44 | 44 | { |
45 | address_space | |
45 | address_space &space = *machine.device(cpu)->memory().space(AS_PROGRAM); | |
46 | 46 | const UINT8 *rom = machine.root_device().memregion(cpu)->base(); |
47 | 47 | int size = machine.root_device().memregion(cpu)->bytes(); |
48 | 48 | int A; |
49 | 49 | |
50 | 50 | UINT8 *decrypted = auto_alloc_array(machine, UINT8, size); |
51 | space | |
51 | space.set_decrypted_region(0x0000, 0xffff, decrypted); | |
52 | 52 | |
53 | 53 | for (A = 0;A < size;A++) |
54 | 54 | { |
r17963 | r17964 | |
---|---|---|
12 | 12 | |
13 | 13 | /* hardware elements of 1Mbytes physical memory space */ |
14 | 14 | |
15 | INLINE UINT8 bank_r(address_space | |
15 | INLINE UINT8 bank_r(address_space &space, offs_t offset, int bank) | |
16 | 16 | { |
17 | namcos1_state *state = space | |
17 | namcos1_state *state = space.machine().driver_data<namcos1_state>(); | |
18 | 18 | return (*state->m_active_bank[bank].bank_handler_r )(space, offset + state->m_active_bank[bank].bank_offset); |
19 | 19 | } |
20 | 20 | |
r17963 | r17964 | |
35 | 35 | static READ8_HANDLER( bank15_r ) { return bank_r(space, offset, 14); } |
36 | 36 | static READ8_HANDLER( bank16_r ) { return bank_r(space, offset, 15); } |
37 | 37 | |
38 | INLINE void bank_w(address_space | |
38 | INLINE void bank_w(address_space &space, offs_t offset, UINT8 data, int bank) | |
39 | 39 | { |
40 | namcos1_state *state = space | |
40 | namcos1_state *state = space.machine().driver_data<namcos1_state>(); | |
41 | 41 | (*state->m_active_bank[bank].bank_handler_w )(space, offset + state->m_active_bank[bank].bank_offset, data); |
42 | 42 | } |
43 | 43 | |
r17963 | r17964 | |
88 | 88 | |
89 | 89 | static READ8_HANDLER( no_key_r ) |
90 | 90 | { |
91 | popmessage("CPU %s PC %08x: keychip read %04x\n", space | |
91 | popmessage("CPU %s PC %08x: keychip read %04x\n", space.device().tag(), space.device().safe_pc(), offset); | |
92 | 92 | return 0; |
93 | 93 | } |
94 | 94 | |
95 | 95 | static WRITE8_HANDLER( no_key_w ) |
96 | 96 | { |
97 | popmessage("CPU %s PC %08x: keychip write %04x=%02x\n", space | |
97 | popmessage("CPU %s PC %08x: keychip write %04x=%02x\n", space.device().tag(), space.device().safe_pc(), offset, data); | |
98 | 98 | } |
99 | 99 | |
100 | 100 | |
r17963 | r17964 | |
199 | 199 | */ |
200 | 200 | static READ8_HANDLER( key_type1_r ) |
201 | 201 | { |
202 | namcos1_state *state = space->machine().driver_data<namcos1_state>(); | |
203 | // logerror("CPU %s PC %04x: keychip read %04x\n", space->device().tag(), space->device().safe_pc(), offset); | |
202 | namcos1_state *state = space.machine().driver_data<namcos1_state>(); | |
203 | // logerror("CPU %s PC %04x: keychip read %04x\n", space.device().tag(), space.device().safe_pc(), offset); | |
204 | 204 | |
205 | 205 | if (offset < 3) |
206 | 206 | { |
r17963 | r17964 | |
231 | 231 | |
232 | 232 | static WRITE8_HANDLER( key_type1_w ) |
233 | 233 | { |
234 | namcos1_state *state = space->machine().driver_data<namcos1_state>(); | |
235 | // logerror("CPU %s PC %04x: keychip write %04x=%02x\n", space->device().tag(), space->device().safe_pc(), offset, data); | |
234 | namcos1_state *state = space.machine().driver_data<namcos1_state>(); | |
235 | // logerror("CPU %s PC %04x: keychip write %04x=%02x\n", space.device().tag(), space.device().safe_pc(), offset, data); | |
236 | 236 | |
237 | 237 | if (offset < 4) |
238 | 238 | state->m_key[offset] = data; |
r17963 | r17964 | |
384 | 384 | |
385 | 385 | static READ8_HANDLER( key_type2_r ) |
386 | 386 | { |
387 | namcos1_state *state = space->machine().driver_data<namcos1_state>(); | |
388 | // logerror("CPU %s PC %04x: keychip read %04x\n", space->device().tag(), space->device().safe_pc(), offset); | |
387 | namcos1_state *state = space.machine().driver_data<namcos1_state>(); | |
388 | // logerror("CPU %s PC %04x: keychip read %04x\n", space.device().tag(), space.device().safe_pc(), offset); | |
389 | 389 | |
390 | 390 | state->m_key_numerator_high_word = 0; |
391 | 391 | |
r17963 | r17964 | |
404 | 404 | |
405 | 405 | static WRITE8_HANDLER( key_type2_w ) |
406 | 406 | { |
407 | namcos1_state *state = space->machine().driver_data<namcos1_state>(); | |
408 | // logerror("CPU %s PC %04x: keychip write %04x=%02x\n", space->device().tag(), space->device().safe_pc(), offset, data); | |
407 | namcos1_state *state = space.machine().driver_data<namcos1_state>(); | |
408 | // logerror("CPU %s PC %04x: keychip write %04x=%02x\n", space.device().tag(), space.device().safe_pc(), offset, data); | |
409 | 409 | |
410 | 410 | if (offset < 5) |
411 | 411 | { |
r17963 | r17964 | |
512 | 512 | |
513 | 513 | static READ8_HANDLER( key_type3_r ) |
514 | 514 | { |
515 | namcos1_state *state = space | |
515 | namcos1_state *state = space.machine().driver_data<namcos1_state>(); | |
516 | 516 | int op; |
517 | 517 | |
518 | // logerror("CPU %s PC %04x: keychip read %04x\n", space | |
518 | // logerror("CPU %s PC %04x: keychip read %04x\n", space.device().tag(), space.device().safe_pc(), offset); | |
519 | 519 | |
520 | 520 | /* I need to handle blastoff's read from 0858. The game previously writes to 0858, |
521 | 521 | using it as temporary storage, so maybe it expects to act as RAM, however |
r17963 | r17964 | |
526 | 526 | op = (offset & 0x70) >> 4; |
527 | 527 | |
528 | 528 | if (op == state->m_key_reg) return state->m_key_id; |
529 | if (op == state->m_key_rng) return space | |
529 | if (op == state->m_key_rng) return space.machine().rand(); | |
530 | 530 | if (op == state->m_key_swap4) return (state->m_key[state->m_key_swap4_arg] << 4) | (state->m_key[state->m_key_swap4_arg] >> 4); |
531 | 531 | if (op == state->m_key_bottom4) return (offset << 4) | (state->m_key[state->m_key_swap4_arg] & 0x0f); |
532 | 532 | if (op == state->m_key_top4) return (offset << 4) | (state->m_key[state->m_key_swap4_arg] >> 4); |
533 | 533 | |
534 | popmessage("CPU %s PC %08x: keychip read %04x", space | |
534 | popmessage("CPU %s PC %08x: keychip read %04x", space.device().tag(), space.device().safe_pc(), offset); | |
535 | 535 | |
536 | 536 | return 0; |
537 | 537 | } |
538 | 538 | |
539 | 539 | static WRITE8_HANDLER( key_type3_w ) |
540 | 540 | { |
541 | namcos1_state *state = space->machine().driver_data<namcos1_state>(); | |
542 | // logerror("CPU %s PC %04x: keychip write %04x=%02x\n", space->device().tag(), space->device().safe_pc(), offset, data); | |
541 | namcos1_state *state = space.machine().driver_data<namcos1_state>(); | |
542 | // logerror("CPU %s PC %04x: keychip write %04x=%02x\n", space.device().tag(), space.device().safe_pc(), offset, data); | |
543 | 543 | |
544 | 544 | state->m_key[(offset & 0x70) >> 4] = data; |
545 | 545 | } |
r17963 | r17964 | |
605 | 605 | |
606 | 606 | static READ8_HANDLER( soundram_r ) |
607 | 607 | { |
608 | namcos1_state *state = space | |
608 | namcos1_state *state = space.machine().driver_data<namcos1_state>(); | |
609 | 609 | if (offset < 0x1000) |
610 | 610 | { |
611 | 611 | offset &= 0x3ff; |
612 | 612 | |
613 | 613 | /* CUS 30 */ |
614 | return namcos1_cus30_r(space | |
614 | return namcos1_cus30_r(space.machine().device("namco"),space,offset); | |
615 | 615 | } |
616 | 616 | else |
617 | 617 | { |
r17963 | r17964 | |
624 | 624 | |
625 | 625 | static WRITE8_HANDLER( soundram_w ) |
626 | 626 | { |
627 | namcos1_state *state = space | |
627 | namcos1_state *state = space.machine().driver_data<namcos1_state>(); | |
628 | 628 | if (offset < 0x1000) |
629 | 629 | { |
630 | 630 | offset &= 0x3ff; |
631 | 631 | |
632 | 632 | /* CUS 30 */ |
633 | namcos1_cus30_w(space | |
633 | namcos1_cus30_w(space.machine().device("namco"),space,offset,data); | |
634 | 634 | } |
635 | 635 | else |
636 | 636 | { |
r17963 | r17964 | |
646 | 646 | |
647 | 647 | static WRITE8_HANDLER( rom_w ) |
648 | 648 | { |
649 | logerror("CPU %s PC %04x: warning - write %02x to rom address %04x\n", space | |
649 | logerror("CPU %s PC %04x: warning - write %02x to rom address %04x\n", space.device().tag(), space.device().safe_pc(), data, offset); | |
650 | 650 | } |
651 | 651 | |
652 | 652 | /* error handlers */ |
653 | 653 | static READ8_HANDLER( unknown_r ) |
654 | 654 | { |
655 | logerror("CPU %s PC %04x: warning - read from unknown chip\n", space->device().tag(), space->device().safe_pc() ); | |
656 | // popmessage("CPU %s PC %04x: read from unknown chip", space->device().tag(), space->device().safe_pc() ); | |
655 | logerror("CPU %s PC %04x: warning - read from unknown chip\n", space.device().tag(), space.device().safe_pc() ); | |
656 | // popmessage("CPU %s PC %04x: read from unknown chip", space.device().tag(), space.device().safe_pc() ); | |
657 | 657 | return 0; |
658 | 658 | } |
659 | 659 | |
660 | 660 | static WRITE8_HANDLER( unknown_w ) |
661 | 661 | { |
662 | logerror("CPU %s PC %04x: warning - wrote to unknown chip\n", space->device().tag(), space->device().safe_pc() ); | |
663 | // popmessage("CPU %s PC %04x: wrote to unknown chip", space->device().tag(), space->device().safe_pc() ); | |
662 | logerror("CPU %s PC %04x: warning - wrote to unknown chip\n", space.device().tag(), space.device().safe_pc() ); | |
663 | // popmessage("CPU %s PC %04x: wrote to unknown chip", space.device().tag(), space.device().safe_pc() ); | |
664 | 664 | } |
665 | 665 | |
666 | 666 | /* Main bankswitching routine */ |
r17963 | r17964 | |
672 | 672 | "bank9", "bank10", "bank11", "bank12", "bank13", "bank14", "bank15", "bank16" |
673 | 673 | }; |
674 | 674 | static const char *const cputags[] = { "maincpu", "sub" }; |
675 | address_space | |
675 | address_space &space = *machine.device(cputags[(banknum >> 3) & 1])->memory().space(AS_PROGRAM); | |
676 | 676 | int bankstart = (banknum & 7) * 0x2000; |
677 | 677 | |
678 | 678 | /* for BANK handlers , memory direct and OP-code base */ |
r17963 | r17964 | |
683 | 683 | if (!handler->bank_handler_r) |
684 | 684 | { |
685 | 685 | if (state->m_active_bank[banknum].bank_handler_r) |
686 | space | |
686 | space.install_read_bank(bankstart, bankstart + 0x1fff, banktags[banknum]); | |
687 | 687 | } |
688 | 688 | else |
689 | 689 | { |
690 | 690 | if (!state->m_active_bank[banknum].bank_handler_r) |
691 | space | |
691 | space.install_legacy_read_handler(bankstart, bankstart + 0x1fff, io_bank_handler_r[banknum].func, io_bank_handler_r[banknum].name); | |
692 | 692 | } |
693 | 693 | |
694 | 694 | /* write handlers (except for the 0xe000-0xffff range) */ |
r17963 | r17964 | |
697 | 697 | if (!handler->bank_handler_w) |
698 | 698 | { |
699 | 699 | if (state->m_active_bank[banknum].bank_handler_w) |
700 | space | |
700 | space.install_write_bank(bankstart, bankstart + 0x1fff, banktags[banknum]); | |
701 | 701 | } |
702 | 702 | else |
703 | 703 | { |
704 | 704 | if (!state->m_active_bank[banknum].bank_handler_r) |
705 | space | |
705 | space.install_legacy_write_handler(bankstart, bankstart + 0x1fff, io_bank_handler_w[banknum].func, io_bank_handler_w[banknum].name); | |
706 | 706 | } |
707 | 707 | } |
708 | 708 | |
r17963 | r17964 | |
1281 | 1281 | int ret; |
1282 | 1282 | |
1283 | 1283 | if (!qnum) |
1284 | ret = (space | |
1284 | ret = (space.machine().root_device().ioport("CONTROL0")->read()&0x90) | qstrobe | (space.machine().root_device().ioport("PADDLE0")->read()&0x0f); | |
1285 | 1285 | else |
1286 | ret = (space | |
1286 | ret = (space.machine().root_device().ioport("CONTROL0")->read()&0x90) | qstrobe | (space.machine().root_device().ioport("PADDLE1")->read()&0x0f); | |
1287 | 1287 | |
1288 | 1288 | qstrobe ^= 0x40; |
1289 | 1289 | |
r17963 | r17964 | |
1294 | 1294 | int ret; |
1295 | 1295 | |
1296 | 1296 | if (!qnum) |
1297 | ret = (space | |
1297 | ret = (space.machine().root_device().ioport("CONTROL1")->read()&0x90) | qnum | (space.machine().root_device().ioport("PADDLE0")->read()>>4); | |
1298 | 1298 | else |
1299 | ret = (space | |
1299 | ret = (space.machine().root_device().ioport("CONTROL1")->read()&0x90) | qnum | (space.machine().root_device().ioport("PADDLE1")->read()>>4); | |
1300 | 1300 | |
1301 | 1301 | if (!qstrobe) qnum ^= 0x20; |
1302 | 1302 | |
r17963 | r17964 | |
1326 | 1326 | { |
1327 | 1327 | int inp = input_count; |
1328 | 1328 | |
1329 | if (inp == 4) res = space | |
1329 | if (inp == 4) res = space.machine().root_device().ioport("CONTROL0")->read(); | |
1330 | 1330 | else |
1331 | 1331 | { |
1332 | 1332 | char portname[40]; |
r17963 | r17964 | |
1335 | 1335 | static int counter[4]; |
1336 | 1336 | |
1337 | 1337 | sprintf(portname,"IN%d",inp); /* IN0-IN3 */ |
1338 | res = space | |
1338 | res = space.machine().root_device().ioport(portname)->read(); | |
1339 | 1339 | if (res & 0x80) |
1340 | 1340 | { |
1341 | 1341 | if (counter[inp] >= 0) |
r17963 | r17964 | |
1359 | 1359 | counter[inp] = -1; |
1360 | 1360 | #else |
1361 | 1361 | sprintf(portname,"IN%d",inp); /* IN0-IN3 */ |
1362 | res = space | |
1362 | res = space.machine().root_device().ioport(portname)->read(); | |
1363 | 1363 | if (res & 1) res = 0x7f; /* weak */ |
1364 | 1364 | else if (res & 2) res = 0x48; /* medium */ |
1365 | 1365 | else if (res & 4) res = 0x40; /* strong */ |
r17963 | r17964 | |
1370 | 1370 | } |
1371 | 1371 | else |
1372 | 1372 | { |
1373 | res = space | |
1373 | res = space.machine().root_device().ioport("CONTROL1")->read() & 0x8f; | |
1374 | 1374 | |
1375 | 1375 | /* the strobe cannot happen too often, otherwise the MCU will waste too |
1376 | 1376 | much time reading the inputs and won't have enough cycles to play two |
r17963 | r17964 | |
1412 | 1412 | |
1413 | 1413 | if (offset == 0) |
1414 | 1414 | { |
1415 | res = (space | |
1415 | res = (space.machine().root_device().ioport("CONTROL0")->read() & 0x80) | stored_input[0]; | |
1416 | 1416 | |
1417 | 1417 | return res; |
1418 | 1418 | } |
1419 | 1419 | else |
1420 | 1420 | { |
1421 | res = space | |
1421 | res = space.machine().root_device().ioport("CONTROL1")->read() & 0x80; | |
1422 | 1422 | |
1423 | 1423 | /* the strobe cannot happen too often, otherwise the MCU will waste too |
1424 | 1424 | much time reading the inputs and won't have enough cycles to play two |
r17963 | r17964 | |
1433 | 1433 | switch (input_count) |
1434 | 1434 | { |
1435 | 1435 | case 0: |
1436 | stored_input[0] = space->machine().root_device().ioport("IN0")->read() & 0x1f; | |
1437 | stored_input[1] = (space->machine().root_device().ioport("IN3")->read() & 0x07) << 3; | |
1436 | stored_input[0] = space.machine().root_device().ioport("IN0")->read() & 0x1f; | |
1437 | stored_input[1] = (space.machine().root_device().ioport("IN3")->read() & 0x07) << 3; | |
1438 | 1438 | break; |
1439 | 1439 | |
1440 | 1440 | case 3: |
1441 | stored_input[0] = space | |
1441 | stored_input[0] = space.machine().root_device().ioport("IN2")->read() & 0x1f; | |
1442 | 1442 | break; |
1443 | 1443 | |
1444 | 1444 | case 4: |
1445 | stored_input[0] = space->machine().root_device().ioport("IN1")->read() & 0x1f; | |
1446 | stored_input[1] = space->machine().root_device().ioport("IN3")->read() & 0x18; | |
1445 | stored_input[0] = space.machine().root_device().ioport("IN1")->read() & 0x1f; | |
1446 | stored_input[1] = space.machine().root_device().ioport("IN3")->read() & 0x18; | |
1447 | 1447 | break; |
1448 | 1448 | |
1449 | 1449 | default: |
r17963 | r17964 | |
---|---|---|
58 | 58 | |
59 | 59 | static READ32_HANDLER( pgm_arm7_type1_protlatch_r ) |
60 | 60 | { |
61 | pgm_arm_type1_state *state = space | |
61 | pgm_arm_type1_state *state = space.machine().driver_data<pgm_arm_type1_state>(); | |
62 | 62 | |
63 | space | |
63 | space.machine().scheduler().synchronize(); // force resync | |
64 | 64 | |
65 | 65 | return (state->m_pgm_arm_type1_highlatch_68k_w << 16) | (state->m_pgm_arm_type1_lowlatch_68k_w); |
66 | 66 | } |
67 | 67 | |
68 | 68 | static WRITE32_HANDLER( pgm_arm7_type1_protlatch_w ) |
69 | 69 | { |
70 | pgm_arm_type1_state *state = space | |
70 | pgm_arm_type1_state *state = space.machine().driver_data<pgm_arm_type1_state>(); | |
71 | 71 | |
72 | space | |
72 | space.machine().scheduler().synchronize(); // force resync | |
73 | 73 | |
74 | 74 | if (ACCESSING_BITS_16_31) |
75 | 75 | { |
r17963 | r17964 | |
85 | 85 | |
86 | 86 | static READ16_HANDLER( pgm_arm7_type1_68k_protlatch_r ) |
87 | 87 | { |
88 | pgm_arm_type1_state *state = space | |
88 | pgm_arm_type1_state *state = space.machine().driver_data<pgm_arm_type1_state>(); | |
89 | 89 | |
90 | space | |
90 | space.machine().scheduler().synchronize(); // force resync | |
91 | 91 | |
92 | 92 | switch (offset) |
93 | 93 | { |
r17963 | r17964 | |
99 | 99 | |
100 | 100 | static WRITE16_HANDLER( pgm_arm7_type1_68k_protlatch_w ) |
101 | 101 | { |
102 | pgm_arm_type1_state *state = space | |
102 | pgm_arm_type1_state *state = space.machine().driver_data<pgm_arm_type1_state>(); | |
103 | 103 | |
104 | space | |
104 | space.machine().scheduler().synchronize(); // force resync | |
105 | 105 | |
106 | 106 | switch (offset) |
107 | 107 | { |
r17963 | r17964 | |
117 | 117 | |
118 | 118 | static READ16_HANDLER( pgm_arm7_type1_ram_r ) |
119 | 119 | { |
120 | pgm_arm_type1_state *state = space | |
120 | pgm_arm_type1_state *state = space.machine().driver_data<pgm_arm_type1_state>(); | |
121 | 121 | UINT16 *share16 = reinterpret_cast<UINT16 *>(state->m_arm7_shareram.target()); |
122 | 122 | |
123 | 123 | if (PGMARM7LOGERROR) |
124 | logerror("M68K: ARM7 Shared RAM Read: %04x = %04x (%08x) (%06x)\n", BYTE_XOR_LE(offset), share16[BYTE_XOR_LE(offset)], mem_mask, space | |
124 | logerror("M68K: ARM7 Shared RAM Read: %04x = %04x (%08x) (%06x)\n", BYTE_XOR_LE(offset), share16[BYTE_XOR_LE(offset)], mem_mask, space.device().safe_pc()); | |
125 | 125 | return share16[BYTE_XOR_LE(offset << 1)]; |
126 | 126 | } |
127 | 127 | |
128 | 128 | static WRITE16_HANDLER( pgm_arm7_type1_ram_w ) |
129 | 129 | { |
130 | pgm_arm_type1_state *state = space | |
130 | pgm_arm_type1_state *state = space.machine().driver_data<pgm_arm_type1_state>(); | |
131 | 131 | UINT16 *share16 = reinterpret_cast<UINT16 *>(state->m_arm7_shareram.target()); |
132 | 132 | |
133 | 133 | if (PGMARM7LOGERROR) |
134 | logerror("M68K: ARM7 Shared RAM Write: %04x = %04x (%04x) (%06x)\n", BYTE_XOR_LE(offset), data, mem_mask, space | |
134 | logerror("M68K: ARM7 Shared RAM Write: %04x = %04x (%04x) (%06x)\n", BYTE_XOR_LE(offset), data, mem_mask, space.device().safe_pc()); | |
135 | 135 | COMBINE_DATA(&share16[BYTE_XOR_LE(offset << 1)]); |
136 | 136 | } |
137 | 137 | |
r17963 | r17964 | |
140 | 140 | |
141 | 141 | static READ32_HANDLER( pgm_arm7_type1_unk_r ) |
142 | 142 | { |
143 | pgm_arm_type1_state *state = space | |
143 | pgm_arm_type1_state *state = space.machine().driver_data<pgm_arm_type1_state>(); | |
144 | 144 | return state->m_pgm_arm_type1_counter++; |
145 | 145 | } |
146 | 146 | |
r17963 | r17964 | |
151 | 151 | |
152 | 152 | static READ32_HANDLER( pgm_arm7_type1_shareram_r ) |
153 | 153 | { |
154 | pgm_arm_type1_state *state = space | |
154 | pgm_arm_type1_state *state = space.machine().driver_data<pgm_arm_type1_state>(); | |
155 | 155 | |
156 | 156 | if (PGMARM7LOGERROR) |
157 | logerror("ARM7: ARM7 Shared RAM Read: %04x = %08x (%08x) (%06x)\n", offset << 2, state->m_arm7_shareram[offset], mem_mask, space | |
157 | logerror("ARM7: ARM7 Shared RAM Read: %04x = %08x (%08x) (%06x)\n", offset << 2, state->m_arm7_shareram[offset], mem_mask, space.device().safe_pc()); | |
158 | 158 | return state->m_arm7_shareram[offset]; |
159 | 159 | } |
160 | 160 | |
161 | 161 | static WRITE32_HANDLER( pgm_arm7_type1_shareram_w ) |
162 | 162 | { |
163 | pgm_arm_type1_state *state = space | |
163 | pgm_arm_type1_state *state = space.machine().driver_data<pgm_arm_type1_state>(); | |
164 | 164 | |
165 | 165 | if (PGMARM7LOGERROR) |
166 | logerror("ARM7: ARM7 Shared RAM Write: %04x = %08x (%08x) (%06x)\n", offset << 2, data, mem_mask, space | |
166 | logerror("ARM7: ARM7 Shared RAM Write: %04x = %08x (%08x) (%06x)\n", offset << 2, data, mem_mask, space.device().safe_pc()); | |
167 | 167 | COMBINE_DATA(&state->m_arm7_shareram[offset]); |
168 | 168 | } |
169 | 169 | |
r17963 | r17964 | |
271 | 271 | |
272 | 272 | static READ16_HANDLER( kovsh_fake_region_r ) |
273 | 273 | { |
274 | pgm_arm_type1_state *state = space | |
274 | pgm_arm_type1_state *state = space.machine().driver_data<pgm_arm_type1_state>(); | |
275 | 275 | int regionhack = state->ioport("RegionHack")->read(); |
276 | 276 | if (regionhack != 0xff) return regionhack; |
277 | 277 | |
r17963 | r17964 | |
301 | 301 | /* Fake remapping of ASIC commands to the ones used by KOVSH due to the lack of the real ARM rom for this set */ |
302 | 302 | WRITE16_HANDLER( kovshp_asic27a_write_word ) |
303 | 303 | { |
304 | pgm_arm_type1_state *state = space | |
304 | pgm_arm_type1_state *state = space.machine().driver_data<pgm_arm_type1_state>(); | |
305 | 305 | |
306 | 306 | switch (offset) |
307 | 307 | { |
r17963 | r17964 | |
519 | 519 | |
520 | 520 | static READ16_HANDLER( pgm_arm7_type1_sim_r ) |
521 | 521 | { |
522 | pgm_arm_type1_state *state = space | |
522 | pgm_arm_type1_state *state = space.machine().driver_data<pgm_arm_type1_state>(); | |
523 | 523 | |
524 | 524 | if (offset == 0) |
525 | 525 | { |
r17963 | r17964 | |
561 | 561 | break; |
562 | 562 | |
563 | 563 | case 0x67: // set high bits |
564 | // printf("%06x command %02x | %04x\n", space | |
564 | // printf("%06x command %02x | %04x\n", space.device().safe_pc(), state->m_ddp3lastcommand, state->m_value0); | |
565 | 565 | state->m_valueresponse = 0x880000; |
566 | 566 | state->m_curslots = (state->m_value0 & 0xff00)>>8; |
567 | 567 | state->m_slots[state->m_curslots] = (state->m_value0 & 0x00ff) << 16; |
568 | 568 | break; |
569 | 569 | |
570 | 570 | case 0xe5: // set low bits for operation? |
571 | // printf("%06x command %02x | %04x\n", space | |
571 | // printf("%06x command %02x | %04x\n", space.device().safe_pc(), state->m_ddp3lastcommand, state->m_value0); | |
572 | 572 | state->m_valueresponse = 0x880000; |
573 | 573 | state->m_slots[state->m_curslots] |= (state->m_value0 & 0xffff); |
574 | 574 | break; |
575 | 575 | |
576 | 576 | |
577 | 577 | case 0x8e: // read back result of operations |
578 | // printf("%06x command %02x | %04x\n", space | |
578 | // printf("%06x command %02x | %04x\n", space.device().safe_pc(), state->m_ddp3lastcommand, state->m_value0); | |
579 | 579 | state->m_valueresponse = state->m_slots[state->m_value0&0xff]; |
580 | 580 | break; |
581 | 581 | |
r17963 | r17964 | |
1349 | 1349 | |
1350 | 1350 | static WRITE16_HANDLER( pgm_arm7_type1_sim_w ) |
1351 | 1351 | { |
1352 | pgm_arm_type1_state *state = space->machine().driver_data<pgm_arm_type1_state>(); | |
1353 | int pc = space->device().safe_pc(); | |
1352 | pgm_arm_type1_state *state = space.machine().driver_data<pgm_arm_type1_state>(); | |
1353 | int pc = space.device().safe_pc(); | |
1354 | 1354 | |
1355 | 1355 | if (offset == 0) |
1356 | 1356 | { |
r17963 | r17964 | |
1387 | 1387 | static READ16_HANDLER( pgm_arm7_type1_sim_protram_r ) |
1388 | 1388 | { |
1389 | 1389 | if (offset == 4) |
1390 | return space | |
1390 | return space.machine().root_device().ioport("Region")->read(); | |
1391 | 1391 | |
1392 | 1392 | return 0x0000; |
1393 | 1393 | } |
1394 | 1394 | |
1395 | 1395 | static READ16_HANDLER( pstars_arm7_type1_sim_protram_r ) |
1396 | 1396 | { |
1397 | pgm_arm_type1_state *state = space | |
1397 | pgm_arm_type1_state *state = space.machine().driver_data<pgm_arm_type1_state>(); | |
1398 | 1398 | |
1399 | 1399 | if (offset == 4) //region |
1400 | 1400 | return state->ioport("Region")->read(); |
r17963 | r17964 | |
---|---|---|
137 | 137 | |
138 | 138 | void balsente_state::machine_reset() |
139 | 139 | { |
140 | address_space | |
140 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
141 | 141 | int numbanks; |
142 | 142 | |
143 | 143 | /* reset counters; counter 2's gate is tied high */ |
r17963 | r17964 | |
163 | 163 | m_grudge_steering_result = 0; |
164 | 164 | |
165 | 165 | /* reset the 6850 chips */ |
166 | balsente_m6850_w(*space, 0, 3); | |
167 | balsente_m6850_sound_w(*space, 0, 3); | |
166 | balsente_m6850_w(space, 0, 3); | |
167 | balsente_m6850_sound_w(space, 0, 3); | |
168 | 168 | |
169 | 169 | /* reset the noise generator */ |
170 | 170 | memset(m_noise_position, 0, sizeof(m_noise_position)); |
r17963 | r17964 | |
---|---|---|
84 | 84 | |
85 | 85 | static WRITE16_HANDLER( megadriv_68k_z80_bank_write ) |
86 | 86 | { |
87 | //logerror("%06x: 68k writing bit to bank register %01x\n", space | |
87 | //logerror("%06x: 68k writing bit to bank register %01x\n", space.device().safe_pc(),data&0x01); | |
88 | 88 | megadriv_z80_bank_w(data&0x01); |
89 | 89 | } |
90 | 90 | |
91 | 91 | static WRITE8_HANDLER(megadriv_z80_z80_bank_w) |
92 | 92 | { |
93 | //logerror("%04x: z80 writing bit to bank register %01x\n", space | |
93 | //logerror("%04x: z80 writing bit to bank register %01x\n", space.device().safe_pc(),data&0x01); | |
94 | 94 | megadriv_z80_bank_w(data&0x01); |
95 | 95 | } |
96 | 96 | |
r17963 | r17964 | |
413 | 413 | D0 : Bit 0 of version number |
414 | 414 | */ |
415 | 415 | |
416 | //return (space | |
416 | //return (space.machine().rand()&0x0f0f)|0xf0f0;//0x0000; | |
417 | 417 | switch (offset) |
418 | 418 | { |
419 | 419 | case 0: |
420 | logerror("%06x read version register\n", space | |
420 | logerror("%06x read version register\n", space.device().safe_pc()); | |
421 | 421 | retdata = megadrive_region_export<<7 | // Export |
422 | 422 | megadrive_region_pal<<6 | // NTSC |
423 | 423 | (sega_cd_connected?0x00:0x20) | // 0x20 = no sega cd |
r17963 | r17964 | |
434 | 434 | case 0x2: |
435 | 435 | case 0x3: |
436 | 436 | // retdata = megadrive_io_read_data_port(offset-1); |
437 | retdata = megadrive_io_read_data_port_ptr(space | |
437 | retdata = megadrive_io_read_data_port_ptr(space.machine(), offset-1); | |
438 | 438 | break; |
439 | 439 | |
440 | 440 | case 0x4: |
r17963 | r17964 | |
532 | 532 | case 0x2: |
533 | 533 | case 0x3: |
534 | 534 | // megadrive_io_write_data_port(offset-1,data); |
535 | megadrive_io_write_data_port_ptr(space | |
535 | megadrive_io_write_data_port_ptr(space.machine(), offset-1,data); | |
536 | 536 | break; |
537 | 537 | |
538 | 538 | case 0x4: |
539 | 539 | case 0x5: |
540 | 540 | case 0x6: |
541 | megadrive_io_write_ctrl_port(space | |
541 | megadrive_io_write_ctrl_port(space.machine(),offset-4,data); | |
542 | 542 | break; |
543 | 543 | |
544 | 544 | /* Serial I/O Registers */ |
545 | 545 | |
546 | case 0x7: megadrive_io_write_tx_port(space->machine(),0,data); break; | |
547 | case 0x8: megadrive_io_write_rx_port(space->machine(),0,data); break; | |
548 | case 0x9: megadrive_io_write_sctrl_port(space->machine(),0,data); break; | |
546 | case 0x7: megadrive_io_write_tx_port(space.machine(),0,data); break; | |
547 | case 0x8: megadrive_io_write_rx_port(space.machine(),0,data); break; | |
548 | case 0x9: megadrive_io_write_sctrl_port(space.machine(),0,data); break; | |
549 | 549 | |
550 | case 0xa: megadrive_io_write_tx_port(space->machine(),1,data); break; | |
551 | case 0xb: megadrive_io_write_rx_port(space->machine(),1,data); break; | |
552 | case 0xc: megadrive_io_write_sctrl_port(space->machine(),1,data); break; | |
550 | case 0xa: megadrive_io_write_tx_port(space.machine(),1,data); break; | |
551 | case 0xb: megadrive_io_write_rx_port(space.machine(),1,data); break; | |
552 | case 0xc: megadrive_io_write_sctrl_port(space.machine(),1,data); break; | |
553 | 553 | |
554 | case 0xd: megadrive_io_write_tx_port(space->machine(),2,data); break; | |
555 | case 0xe: megadrive_io_write_rx_port(space->machine(),2,data); break; | |
556 | case 0xf: megadrive_io_write_sctrl_port(space->machine(),2,data); break; | |
554 | case 0xd: megadrive_io_write_tx_port(space.machine(),2,data); break; | |
555 | case 0xe: megadrive_io_write_rx_port(space.machine(),2,data); break; | |
556 | case 0xf: megadrive_io_write_sctrl_port(space.machine(),2,data); break; | |
557 | 557 | } |
558 | 558 | } |
559 | 559 | |
r17963 | r17964 | |
601 | 601 | } |
602 | 602 | else |
603 | 603 | { |
604 | logerror("%06x: 68000 attempting to access Z80 (read) address space without bus\n", space->device().safe_pc()); | |
605 | return space->machine().rand(); | |
604 | logerror("%06x: 68000 attempting to access Z80 (read) address space without bus\n", space.device().safe_pc()); | |
605 | return space.machine().rand(); | |
606 | 606 | } |
607 | 607 | } |
608 | 608 | |
r17963 | r17964 | |
628 | 628 | } |
629 | 629 | else |
630 | 630 | { |
631 | logerror("%06x: 68000 attempting to access Z80 (write) address space without bus\n", space | |
631 | logerror("%06x: 68000 attempting to access Z80 (write) address space without bus\n", space.device().safe_pc()); | |
632 | 632 | } |
633 | 633 | } |
634 | 634 | |
r17963 | r17964 | |
644 | 644 | the value is never zero. Time Killers is the most fussy, and doesn't like the |
645 | 645 | read_next_instruction function from system16, so I just return a random value |
646 | 646 | in the unused bits */ |
647 | UINT16 nextvalue = space | |
647 | UINT16 nextvalue = space.machine().rand();//read_next_instruction(space)&0xff00; | |
648 | 648 | |
649 | 649 | |
650 | 650 | /* Check if the 68k has the z80 bus */ |
r17963 | r17964 | |
653 | 653 | if (genz80.z80_has_bus || genz80.z80_is_reset) retvalue = nextvalue | 0x0100; |
654 | 654 | else retvalue = (nextvalue & 0xfeff); |
655 | 655 | |
656 | //logerror("%06x: 68000 check z80 Bus (byte MSB access) returning %04x mask %04x\n", space | |
656 | //logerror("%06x: 68000 check z80 Bus (byte MSB access) returning %04x mask %04x\n", space.device().safe_pc(),retvalue, mem_mask); | |
657 | 657 | return retvalue; |
658 | 658 | |
659 | 659 | } |
660 | 660 | else if (!ACCESSING_BITS_8_15) // is this valid? |
661 | 661 | { |
662 | //logerror("%06x: 68000 check z80 Bus (byte LSB access) %04x\n", space | |
662 | //logerror("%06x: 68000 check z80 Bus (byte LSB access) %04x\n", space.device().safe_pc(),mem_mask); | |
663 | 663 | if (genz80.z80_has_bus || genz80.z80_is_reset) retvalue = 0x0001; |
664 | 664 | else retvalue = 0x0000; |
665 | 665 | |
r17963 | r17964 | |
667 | 667 | } |
668 | 668 | else |
669 | 669 | { |
670 | //logerror("%06x: 68000 check z80 Bus (word access) %04x\n", space | |
670 | //logerror("%06x: 68000 check z80 Bus (word access) %04x\n", space.device().safe_pc(),mem_mask); | |
671 | 671 | if (genz80.z80_has_bus || genz80.z80_is_reset) retvalue = nextvalue | 0x0100; |
672 | 672 | else retvalue = (nextvalue & 0xfeff); |
673 | 673 | |
674 | // mame_printf_debug("%06x: 68000 check z80 Bus (word access) %04x %04x\n", space | |
674 | // mame_printf_debug("%06x: 68000 check z80 Bus (word access) %04x %04x\n", space.device().safe_pc(),mem_mask, retvalue); | |
675 | 675 | return retvalue; |
676 | 676 | } |
677 | 677 | } |
r17963 | r17964 | |
708 | 708 | { |
709 | 709 | if (data & 0x0100) |
710 | 710 | { |
711 | //logerror("%06x: 68000 request z80 Bus (byte MSB access) %04x %04x\n", space | |
711 | //logerror("%06x: 68000 request z80 Bus (byte MSB access) %04x %04x\n", space.device().safe_pc(),data,mem_mask); | |
712 | 712 | genz80.z80_has_bus = 0; |
713 | 713 | } |
714 | 714 | else |
715 | 715 | { |
716 | //logerror("%06x: 68000 return z80 Bus (byte MSB access) %04x %04x\n", space | |
716 | //logerror("%06x: 68000 return z80 Bus (byte MSB access) %04x %04x\n", space.device().safe_pc(),data,mem_mask); | |
717 | 717 | genz80.z80_has_bus = 1; |
718 | 718 | } |
719 | 719 | } |
r17963 | r17964 | |
721 | 721 | { |
722 | 722 | if (data & 0x0001) |
723 | 723 | { |
724 | //logerror("%06x: 68000 request z80 Bus (byte LSB access) %04x %04x\n", space | |
724 | //logerror("%06x: 68000 request z80 Bus (byte LSB access) %04x %04x\n", space.device().safe_pc(),data,mem_mask); | |
725 | 725 | genz80.z80_has_bus = 0; |
726 | 726 | } |
727 | 727 | else |
728 | 728 | { |
729 | //logerror("%06x: 68000 return z80 Bus (byte LSB access) %04x %04x\n", space | |
729 | //logerror("%06x: 68000 return z80 Bus (byte LSB access) %04x %04x\n", space.device().safe_pc(),data,mem_mask); | |
730 | 730 | genz80.z80_has_bus = 1; |
731 | 731 | } |
732 | 732 | } |
r17963 | r17964 | |
734 | 734 | { |
735 | 735 | if (data & 0x0100) |
736 | 736 | { |
737 | //logerror("%06x: 68000 request z80 Bus (word access) %04x %04x\n", space | |
737 | //logerror("%06x: 68000 request z80 Bus (word access) %04x %04x\n", space.device().safe_pc(),data,mem_mask); | |
738 | 738 | genz80.z80_has_bus = 0; |
739 | 739 | } |
740 | 740 | else |
741 | 741 | { |
742 | //logerror("%06x: 68000 return z80 Bus (byte LSB access) %04x %04x\n", space | |
742 | //logerror("%06x: 68000 return z80 Bus (byte LSB access) %04x %04x\n", space.device().safe_pc(),data,mem_mask); | |
743 | 743 | genz80.z80_has_bus = 1; |
744 | 744 | } |
745 | 745 | } |
746 | 746 | |
747 | 747 | /* If the z80 is running, sync the z80 execution state */ |
748 | 748 | if ( ! genz80.z80_is_reset ) |
749 | space | |
749 | space.machine().scheduler().timer_set( attotime::zero, FUNC(megadriv_z80_run_state )); | |
750 | 750 | } |
751 | 751 | |
752 | 752 | static WRITE16_HANDLER ( megadriv_68k_req_z80_reset ) |
r17963 | r17964 | |
755 | 755 | { |
756 | 756 | if (data & 0x0100) |
757 | 757 | { |
758 | //logerror("%06x: 68000 clear z80 reset (byte MSB access) %04x %04x\n", space | |
758 | //logerror("%06x: 68000 clear z80 reset (byte MSB access) %04x %04x\n", space.device().safe_pc(),data,mem_mask); | |
759 | 759 | genz80.z80_is_reset = 0; |
760 | 760 | } |
761 | 761 | else |
762 | 762 | { |
763 | //logerror("%06x: 68000 start z80 reset (byte MSB access) %04x %04x\n", space | |
763 | //logerror("%06x: 68000 start z80 reset (byte MSB access) %04x %04x\n", space.device().safe_pc(),data,mem_mask); | |
764 | 764 | genz80.z80_is_reset = 1; |
765 | 765 | } |
766 | 766 | } |
r17963 | r17964 | |
768 | 768 | { |
769 | 769 | if (data & 0x0001) |
770 | 770 | { |
771 | //logerror("%06x: 68000 clear z80 reset (byte LSB access) %04x %04x\n", space | |
771 | //logerror("%06x: 68000 clear z80 reset (byte LSB access) %04x %04x\n", space.device().safe_pc(),data,mem_mask); | |
772 | 772 | genz80.z80_is_reset = 0; |
773 | 773 | } |
774 | 774 | else |
775 | 775 | { |
776 | //logerror("%06x: 68000 start z80 reset (byte LSB access) %04x %04x\n", space | |
776 | //logerror("%06x: 68000 start z80 reset (byte LSB access) %04x %04x\n", space.device().safe_pc(),data,mem_mask); | |
777 | 777 | genz80.z80_is_reset = 1; |
778 | 778 | } |
779 | 779 | } |
r17963 | r17964 | |
781 | 781 | { |
782 | 782 | if (data & 0x0100) |
783 | 783 | { |
784 | //logerror("%06x: 68000 clear z80 reset (word access) %04x %04x\n", space | |
784 | //logerror("%06x: 68000 clear z80 reset (word access) %04x %04x\n", space.device().safe_pc(),data,mem_mask); | |
785 | 785 | genz80.z80_is_reset = 0; |
786 | 786 | } |
787 | 787 | else |
788 | 788 | { |
789 | //logerror("%06x: 68000 start z80 reset (byte LSB access) %04x %04x\n", space | |
789 | //logerror("%06x: 68000 start z80 reset (byte LSB access) %04x %04x\n", space.device().safe_pc(),data,mem_mask); | |
790 | 790 | genz80.z80_is_reset = 1; |
791 | 791 | } |
792 | 792 | } |
793 | space | |
793 | space.machine().scheduler().timer_set( attotime::zero, FUNC(megadriv_z80_run_state )); | |
794 | 794 | } |
795 | 795 | |
796 | 796 | |
r17963 | r17964 | |
800 | 800 | // z80 area of the 68k if games misbehave |
801 | 801 | static READ8_HANDLER( z80_read_68k_banked_data ) |
802 | 802 | { |
803 | address_space *space68k = space | |
803 | address_space *space68k = space.machine().device<legacy_cpu_device>("maincpu")->space(); | |
804 | 804 | UINT8 ret = space68k->read_byte(genz80.z80_bank_addr+offset); |
805 | 805 | return ret; |
806 | 806 | } |
807 | 807 | |
808 | 808 | static WRITE8_HANDLER( z80_write_68k_banked_data ) |
809 | 809 | { |
810 | address_space *space68k = space | |
810 | address_space *space68k = space.machine().device<legacy_cpu_device>("maincpu")->space(); | |
811 | 811 | space68k->write_byte(genz80.z80_bank_addr+offset,data); |
812 | 812 | } |
813 | 813 | |
r17963 | r17964 | |
820 | 820 | case 0x13: |
821 | 821 | case 0x15: |
822 | 822 | case 0x17: |
823 | sn76496_w(space | |
823 | sn76496_w(space.machine().device("snsnd"), space, 0, data); | |
824 | 824 | break; |
825 | 825 | |
826 | 826 | default: |
r17963 | r17964 | |
834 | 834 | static READ8_HANDLER( megadriv_z80_vdp_read ) |
835 | 835 | { |
836 | 836 | mame_printf_debug("megadriv_z80_vdp_read %02x\n",offset); |
837 | return space | |
837 | return space.machine().rand(); | |
838 | 838 | } |
839 | 839 | |
840 | 840 | static READ8_HANDLER( megadriv_z80_unmapped_read ) |
r17963 | r17964 | |
---|---|---|
36 | 36 | |
37 | 37 | void taitosj_state::machine_reset() |
38 | 38 | { |
39 | address_space | |
39 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
40 | 40 | /* set the default ROM bank (many games only have one bank and */ |
41 | 41 | /* never write to the bank selector register) */ |
42 | taitosj_bankswitch_w( | |
42 | taitosj_bankswitch_w(space, 0, 0); | |
43 | 43 | |
44 | 44 | |
45 | 45 | m_zaccept = 1; |
r17963 | r17964 | |
---|---|---|
377 | 377 | |
378 | 378 | void mc8123_decrypt_rom(running_machine &machine, const char *cpu, const char *keyrgn, const char *bankname, int numbanks) |
379 | 379 | { |
380 | address_space | |
380 | address_space &space = *machine.device(cpu)->memory().space(AS_PROGRAM); | |
381 | 381 | int fixed_length = numbanks == 1 ? 0xc000 : 0x8000; |
382 | 382 | UINT8 *decrypted1 = auto_alloc_array(machine, UINT8, fixed_length); |
383 | 383 | UINT8 *decrypted2 = numbanks > 1 ? auto_alloc_array(machine, UINT8, 0x4000 * numbanks) : 0; |
r17963 | r17964 | |
385 | 385 | UINT8 *key = machine.root_device().memregion(keyrgn)->base(); |
386 | 386 | int A, bank; |
387 | 387 | |
388 | space | |
388 | space.set_decrypted_region(0x0000, fixed_length-1, decrypted1); | |
389 | 389 | |
390 | 390 | for (A = 0x0000;A < fixed_length;A++) |
391 | 391 | { |
r17963 | r17964 | |
---|---|---|
261 | 261 | static void amiga_m68k_reset(device_t *device) |
262 | 262 | { |
263 | 263 | amiga_state *state = device->machine().driver_data<amiga_state>(); |
264 | address_space | |
264 | address_space &space = *device->memory().space(AS_PROGRAM); | |
265 | 265 | |
266 | logerror("Executed RESET at PC=%06x\n", space | |
266 | logerror("Executed RESET at PC=%06x\n", space.device().safe_pc()); | |
267 | 267 | |
268 | 268 | /* Initialize the various chips */ |
269 | 269 | device->machine().device("cia_0")->reset(); |
r17963 | r17964 | |
274 | 274 | /* set the overlay bit */ |
275 | 275 | if ( IS_AGA(state->m_intf) ) |
276 | 276 | { |
277 | space | |
277 | space.write_byte( 0xbfa001, 1 ); | |
278 | 278 | } |
279 | 279 | else |
280 | 280 | { |
r17963 | r17964 | |
318 | 318 | if (scanline == 0) |
319 | 319 | { |
320 | 320 | /* signal VBLANK IRQ */ |
321 | amiga_custom_w(machine.device("maincpu")->memory().space(AS_PROGRAM), REG_INTREQ, 0x8000 | INTENA_VERTB, 0xffff); | |
321 | amiga_custom_w(*machine.device("maincpu")->memory().space(AS_PROGRAM), REG_INTREQ, 0x8000 | INTENA_VERTB, 0xffff); | |
322 | 322 | |
323 | 323 | /* clock the first CIA TOD */ |
324 | 324 | mos6526_tod_w(cia_0, 1); |
r17963 | r17964 | |
939 | 939 | CUSTOM_REG(REG_DMACON) &= ~0x4000; |
940 | 940 | |
941 | 941 | /* signal an interrupt */ |
942 | amiga_custom_w(machine.device("maincpu")->memory().space(AS_PROGRAM), REG_INTREQ, 0x8000 | INTENA_BLIT, 0xffff); | |
942 | amiga_custom_w(*machine.device("maincpu")->memory().space(AS_PROGRAM), REG_INTREQ, 0x8000 | INTENA_BLIT, 0xffff); | |
943 | 943 | |
944 | 944 | /* reset the blitter timer */ |
945 | 945 | state->m_blitter_timer->reset( ); |
r17963 | r17964 | |
953 | 953 | * |
954 | 954 | *************************************/ |
955 | 955 | |
956 | static void blitter_setup(address_space | |
956 | static void blitter_setup(address_space &space) | |
957 | 957 | { |
958 | amiga_state *state = space | |
958 | amiga_state *state = space.machine().driver_data<amiga_state>(); | |
959 | 959 | int ticks, width, height, blittime; |
960 | 960 | |
961 | 961 | /* is there another blitting in progress? */ |
962 | 962 | if (CUSTOM_REG(REG_DMACON) & 0x4000) |
963 | 963 | { |
964 | logerror("%s - This program is playing tricks with the blitter\n", space | |
964 | logerror("%s - This program is playing tricks with the blitter\n", space.machine().describe_context() ); | |
965 | 965 | return; |
966 | 966 | } |
967 | 967 | |
r17963 | r17964 | |
994 | 994 | if ( CUSTOM_REG(REG_DMACON) & 0x0400 ) |
995 | 995 | { |
996 | 996 | /* simulate the 68k not running while the blit is going */ |
997 | space | |
997 | space.device().execute().adjust_icount(-(blittime/2) ); | |
998 | 998 | |
999 | 999 | blittime = BLITTER_NASTY_DELAY; |
1000 | 1000 | } |
r17963 | r17964 | |
1007 | 1007 | CUSTOM_REG(REG_DMACON) |= 0x4000; |
1008 | 1008 | |
1009 | 1009 | /* set a timer */ |
1010 | state->m_blitter_timer->adjust( downcast<cpu_device *>(&space | |
1010 | state->m_blitter_timer->adjust( downcast<cpu_device *>(&space.device())->cycles_to_attotime( blittime )); | |
1011 | 1011 | } |
1012 | 1012 | |
1013 | 1013 | |
r17963 | r17964 | |
1027 | 1027 | /* offsets 0000-07ff reference CIA B, and are accessed via the MSB */ |
1028 | 1028 | if ((offset & 0x0800) == 0) |
1029 | 1029 | { |
1030 | cia = space | |
1030 | cia = space.machine().device("cia_1"); | |
1031 | 1031 | shift = 8; |
1032 | 1032 | } |
1033 | 1033 | |
1034 | 1034 | /* offsets 0800-0fff reference CIA A, and are accessed via the LSB */ |
1035 | 1035 | else |
1036 | 1036 | { |
1037 | cia = space | |
1037 | cia = space.machine().device("cia_0"); | |
1038 | 1038 | shift = 0; |
1039 | 1039 | } |
1040 | 1040 | |
1041 | 1041 | /* handle the reads */ |
1042 | data = mos6526_r(cia, | |
1042 | data = mos6526_r(cia, space, offset >> 7); | |
1043 | 1043 | |
1044 | 1044 | if (LOG_CIA) |
1045 | logerror("%06x:cia_%c_read(%03x) = %04x & %04x\n", space | |
1045 | logerror("%06x:cia_%c_read(%03x) = %04x & %04x\n", space.device().safe_pc(), 'A' + ((~offset & 0x0800) >> 11), offset * 2, data << shift, mem_mask); | |
1046 | 1046 | |
1047 | 1047 | return data << shift; |
1048 | 1048 | } |
r17963 | r17964 | |
1060 | 1060 | device_t *cia; |
1061 | 1061 | |
1062 | 1062 | if (LOG_CIA) |
1063 | logerror("%06x:cia_%c_write(%03x) = %04x & %04x\n", space | |
1063 | logerror("%06x:cia_%c_write(%03x) = %04x & %04x\n", space.device().safe_pc(), 'A' + ((~offset & 0x0800) >> 11), offset * 2, data, mem_mask); | |
1064 | 1064 | |
1065 | 1065 | /* offsets 0000-07ff reference CIA B, and are accessed via the MSB */ |
1066 | 1066 | if ((offset & 0x0800) == 0) |
1067 | 1067 | { |
1068 | 1068 | if (!ACCESSING_BITS_8_15) |
1069 | 1069 | return; |
1070 | cia = space | |
1070 | cia = space.machine().device("cia_1"); | |
1071 | 1071 | data >>= 8; |
1072 | 1072 | } |
1073 | 1073 | |
r17963 | r17964 | |
1076 | 1076 | { |
1077 | 1077 | if (!ACCESSING_BITS_0_7) |
1078 | 1078 | return; |
1079 | cia = space | |
1079 | cia = space.machine().device("cia_0"); | |
1080 | 1080 | data &= 0xff; |
1081 | 1081 | } |
1082 | 1082 | |
1083 | 1083 | /* handle the writes */ |
1084 | mos6526_w(cia, | |
1084 | mos6526_w(cia, space, offset >> 7, (UINT8) data); | |
1085 | 1085 | } |
1086 | 1086 | |
1087 | 1087 | |
r17963 | r17964 | |
1094 | 1094 | |
1095 | 1095 | void amiga_cia_0_irq(device_t *device, int state) |
1096 | 1096 | { |
1097 | amiga_custom_w(device->machine().device("maincpu")->memory().space(AS_PROGRAM), REG_INTREQ, (state ? 0x8000 : 0x0000) | INTENA_PORTS, 0xffff); | |
1097 | amiga_custom_w(*device->machine().device("maincpu")->memory().space(AS_PROGRAM), REG_INTREQ, (state ? 0x8000 : 0x0000) | INTENA_PORTS, 0xffff); | |
1098 | 1098 | } |
1099 | 1099 | |
1100 | 1100 | |
1101 | 1101 | void amiga_cia_1_irq(device_t *device, int state) |
1102 | 1102 | { |
1103 | amiga_custom_w(device->machine().device("maincpu")->memory().space(AS_PROGRAM), REG_INTREQ, (state ? 0x8000 : 0x0000) | INTENA_EXTER, 0xffff); | |
1103 | amiga_custom_w(*device->machine().device("maincpu")->memory().space(AS_PROGRAM), REG_INTREQ, (state ? 0x8000 : 0x0000) | INTENA_EXTER, 0xffff); | |
1104 | 1104 | } |
1105 | 1105 | |
1106 | 1106 | |
r17963 | r17964 | |
1152 | 1152 | |
1153 | 1153 | READ16_HANDLER( amiga_custom_r ) |
1154 | 1154 | { |
1155 | amiga_state *state = space | |
1155 | amiga_state *state = space.machine().driver_data<amiga_state>(); | |
1156 | 1156 | UINT16 temp; |
1157 | 1157 | |
1158 | 1158 | switch (offset & 0xff) |
r17963 | r17964 | |
1165 | 1165 | |
1166 | 1166 | case REG_VPOSR: |
1167 | 1167 | CUSTOM_REG(REG_VPOSR) &= 0xff00; |
1168 | CUSTOM_REG(REG_VPOSR) |= amiga_gethvpos(*space | |
1168 | CUSTOM_REG(REG_VPOSR) |= amiga_gethvpos(*space.machine().primary_screen) >> 16; | |
1169 | 1169 | return CUSTOM_REG(REG_VPOSR); |
1170 | 1170 | |
1171 | 1171 | case REG_VHPOSR: |
1172 | return amiga_gethvpos(*space | |
1172 | return amiga_gethvpos(*space.machine().primary_screen) & 0xffff; | |
1173 | 1173 | |
1174 | 1174 | case REG_SERDATR: |
1175 | 1175 | CUSTOM_REG(REG_SERDATR) &= ~0x4000; |
r17963 | r17964 | |
1178 | 1178 | |
1179 | 1179 | case REG_JOY0DAT: |
1180 | 1180 | if (state->m_intf->joy0dat_r != NULL) |
1181 | return (*state->m_intf->joy0dat_r)(space | |
1181 | return (*state->m_intf->joy0dat_r)(space.machine()); | |
1182 | 1182 | return state->ioport("JOY0DAT")->read_safe(0xffff); |
1183 | 1183 | |
1184 | 1184 | case REG_JOY1DAT: |
1185 | 1185 | if (state->m_intf->joy1dat_r != NULL) |
1186 | return (*state->m_intf->joy1dat_r)(space | |
1186 | return (*state->m_intf->joy1dat_r)(space.machine()); | |
1187 | 1187 | return state->ioport("JOY1DAT")->read_safe(0xffff); |
1188 | 1188 | |
1189 | 1189 | case REG_POTGOR: |
r17963 | r17964 | |
1196 | 1196 | return state->ioport("POT1DAT")->read_safe(0x0000); |
1197 | 1197 | |
1198 | 1198 | case REG_DSKBYTR: |
1199 | return space | |
1199 | return space.machine().device<amiga_fdc>("fdc")->dskbytr_r(); | |
1200 | 1200 | |
1201 | 1201 | case REG_INTENAR: |
1202 | 1202 | return CUSTOM_REG(REG_INTENA); |
r17963 | r17964 | |
1205 | 1205 | return CUSTOM_REG(REG_INTREQ); |
1206 | 1206 | |
1207 | 1207 | case REG_COPJMP1: |
1208 | amiga_copper_setpc(space | |
1208 | amiga_copper_setpc(space.machine(), CUSTOM_REG_LONG(REG_COP1LCH)); | |
1209 | 1209 | break; |
1210 | 1210 | |
1211 | 1211 | case REG_COPJMP2: |
1212 | amiga_copper_setpc(space | |
1212 | amiga_copper_setpc(space.machine(), CUSTOM_REG_LONG(REG_COP2LCH)); | |
1213 | 1213 | break; |
1214 | 1214 | |
1215 | 1215 | case REG_CLXDAT: |
r17963 | r17964 | |
1221 | 1221 | return CUSTOM_REG(REG_DENISEID); |
1222 | 1222 | |
1223 | 1223 | case REG_DSKPTH: |
1224 | return space | |
1224 | return space.machine().device<amiga_fdc>("fdc")->dskpth_r(); | |
1225 | 1225 | |
1226 | 1226 | case REG_DSKPTL: |
1227 | return space | |
1227 | return space.machine().device<amiga_fdc>("fdc")->dskptl_r(); | |
1228 | 1228 | } |
1229 | 1229 | |
1230 | 1230 | if (LOG_CUSTOM) |
1231 | logerror("%06X:read from custom %s\n", space | |
1231 | logerror("%06X:read from custom %s\n", space.device().safe_pc(), amiga_custom_names[offset & 0xff]); | |
1232 | 1232 | |
1233 | 1233 | return 0xffff; |
1234 | 1234 | } |
r17963 | r17964 | |
1249 | 1249 | CUSTOM_REG(REG_SERDATR) |= 0x3000; |
1250 | 1250 | |
1251 | 1251 | /* signal an interrupt */ |
1252 | amiga_custom_w(machine.device("maincpu")->memory().space(AS_PROGRAM), REG_INTREQ, 0x8000 | INTENA_TBE, 0xffff); | |
1252 | amiga_custom_w(*machine.device("maincpu")->memory().space(AS_PROGRAM), REG_INTREQ, 0x8000 | INTENA_TBE, 0xffff); | |
1253 | 1253 | } |
1254 | 1254 | |
1255 | 1255 | |
1256 | 1256 | WRITE16_HANDLER( amiga_custom_w ) |
1257 | 1257 | { |
1258 | amiga_state *state = space | |
1258 | amiga_state *state = space.machine().driver_data<amiga_state>(); | |
1259 | 1259 | device_t *cia_0; |
1260 | 1260 | device_t *cia_1; |
1261 | 1261 | UINT16 temp; |
1262 | 1262 | offset &= 0xff; |
1263 | 1263 | |
1264 | 1264 | if (LOG_CUSTOM) |
1265 | logerror("%06X:write to custom %s = %04X\n", space | |
1265 | logerror("%06X:write to custom %s = %04X\n", space.device().safe_pc(), amiga_custom_names[offset & 0xff], data); | |
1266 | 1266 | |
1267 | 1267 | switch (offset) |
1268 | 1268 | { |
r17963 | r17964 | |
1274 | 1274 | break; |
1275 | 1275 | |
1276 | 1276 | case REG_DSKSYNC: |
1277 | space | |
1277 | space.machine().device<amiga_fdc>("fdc")->dsksync_w(data); | |
1278 | 1278 | break; |
1279 | 1279 | |
1280 | 1280 | case REG_DSKPTH: |
1281 | space | |
1281 | space.machine().device<amiga_fdc>("fdc")->dskpth_w(data); | |
1282 | 1282 | break; |
1283 | 1283 | |
1284 | 1284 | case REG_DSKPTL: |
1285 | space | |
1285 | space.machine().device<amiga_fdc>("fdc")->dskptl_w(data); | |
1286 | 1286 | break; |
1287 | 1287 | |
1288 | 1288 | case REG_DSKLEN: |
1289 | space | |
1289 | space.machine().device<amiga_fdc>("fdc")->dsklen_w(data); | |
1290 | 1290 | break; |
1291 | 1291 | |
1292 | 1292 | case REG_POTGO: |
1293 | 1293 | if (state->m_intf->potgo_w != NULL) |
1294 | (*state->m_intf->potgo_w)(space | |
1294 | (*state->m_intf->potgo_w)(space.machine(), data); | |
1295 | 1295 | break; |
1296 | 1296 | |
1297 | 1297 | case REG_SERDAT: |
1298 | 1298 | if (state->m_intf->serdat_w != NULL) |
1299 | (*state->m_intf->serdat_w)(space | |
1299 | (*state->m_intf->serdat_w)(space.machine(), data); | |
1300 | 1300 | CUSTOM_REG(REG_SERDATR) &= ~0x3000; |
1301 | space | |
1301 | space.machine().scheduler().timer_set(amiga_get_serial_char_period(space.machine()), FUNC(finish_serial_write)); | |
1302 | 1302 | break; |
1303 | 1303 | |
1304 | 1304 | case REG_BLTSIZE: |
r17963 | r17964 | |
1342 | 1342 | |
1343 | 1343 | case REG_SPR0PTL: case REG_SPR1PTL: case REG_SPR2PTL: case REG_SPR3PTL: |
1344 | 1344 | case REG_SPR4PTL: case REG_SPR5PTL: case REG_SPR6PTL: case REG_SPR7PTL: |
1345 | amiga_sprite_dma_reset(space | |
1345 | amiga_sprite_dma_reset(space.machine(), (offset - REG_SPR0PTL) / 2); | |
1346 | 1346 | break; |
1347 | 1347 | |
1348 | 1348 | case REG_SPR0CTL: case REG_SPR1CTL: case REG_SPR2CTL: case REG_SPR3CTL: |
1349 | 1349 | case REG_SPR4CTL: case REG_SPR5CTL: case REG_SPR6CTL: case REG_SPR7CTL: |
1350 | 1350 | /* disable comparitor on writes here */ |
1351 | amiga_sprite_enable_comparitor(space | |
1351 | amiga_sprite_enable_comparitor(space.machine(), (offset - REG_SPR0CTL) / 4, FALSE); | |
1352 | 1352 | break; |
1353 | 1353 | |
1354 | 1354 | case REG_SPR0DATA: case REG_SPR1DATA: case REG_SPR2DATA: case REG_SPR3DATA: |
1355 | 1355 | case REG_SPR4DATA: case REG_SPR5DATA: case REG_SPR6DATA: case REG_SPR7DATA: |
1356 | 1356 | /* enable comparitor on writes here */ |
1357 | amiga_sprite_enable_comparitor(space | |
1357 | amiga_sprite_enable_comparitor(space.machine(), (offset - REG_SPR0DATA) / 4, TRUE); | |
1358 | 1358 | break; |
1359 | 1359 | |
1360 | 1360 | case REG_COP1LCH: case REG_COP2LCH: |
r17963 | r17964 | |
1362 | 1362 | break; |
1363 | 1363 | |
1364 | 1364 | case REG_COPJMP1: |
1365 | amiga_copper_setpc(space | |
1365 | amiga_copper_setpc(space.machine(), CUSTOM_REG_LONG(REG_COP1LCH)); | |
1366 | 1366 | break; |
1367 | 1367 | |
1368 | 1368 | case REG_COPJMP2: |
1369 | amiga_copper_setpc(space | |
1369 | amiga_copper_setpc(space.machine(), CUSTOM_REG_LONG(REG_COP2LCH)); | |
1370 | 1370 | break; |
1371 | 1371 | |
1372 | 1372 | case REG_DDFSTRT: |
r17963 | r17964 | |
1389 | 1389 | /* bits BBUSY (14) and BZERO (13) are read-only */ |
1390 | 1390 | data &= 0x9fff; |
1391 | 1391 | data = (data & 0x8000) ? (CUSTOM_REG(offset) | (data & 0x7fff)) : (CUSTOM_REG(offset) & ~(data & 0x7fff)); |
1392 | space | |
1392 | space.machine().device<amiga_fdc>("fdc")->dmacon_set(data); | |
1393 | 1393 | |
1394 | 1394 | /* if 'blitter-nasty' has been turned on and we have a blit pending, reschedule it */ |
1395 | 1395 | if ( ( data & 0x400 ) && ( CUSTOM_REG(REG_DMACON) & 0x4000 ) ) |
1396 | state->m_blitter_timer->adjust( downcast<cpu_device *>(&space | |
1396 | state->m_blitter_timer->adjust( downcast<cpu_device *>(&space.device())->cycles_to_attotime( BLITTER_NASTY_DELAY )); | |
1397 | 1397 | |
1398 | 1398 | break; |
1399 | 1399 | |
r17963 | r17964 | |
1404 | 1404 | CUSTOM_REG(offset) = data; |
1405 | 1405 | |
1406 | 1406 | if ( temp & 0x8000 ) /* if we're enabling irq's, delay a bit */ |
1407 | state->m_irq_timer->adjust( downcast<cpu_device *>(&space | |
1407 | state->m_irq_timer->adjust( downcast<cpu_device *>(&space.device())->cycles_to_attotime( AMIGA_IRQ_DELAY_CYCLES )); | |
1408 | 1408 | else /* if we're disabling irq's, process right away */ |
1409 | update_irqs(space | |
1409 | update_irqs(space.machine()); | |
1410 | 1410 | break; |
1411 | 1411 | |
1412 | 1412 | case REG_INTREQ: |
r17963 | r17964 | |
1416 | 1416 | CUSTOM_REG(REG_SERDATR) &= ~0x8000; |
1417 | 1417 | |
1418 | 1418 | data = (data & 0x8000) ? (CUSTOM_REG(offset) | (data & 0x7fff)) : (CUSTOM_REG(offset) & ~(data & 0x7fff)); |
1419 | cia_0 = space->machine().device("cia_0"); | |
1420 | cia_1 = space->machine().device("cia_1"); | |
1419 | cia_0 = space.machine().device("cia_0"); | |
1420 | cia_1 = space.machine().device("cia_1"); | |
1421 | 1421 | if ( mos6526_irq_r( cia_0 ) ) data |= INTENA_PORTS; |
1422 | 1422 | if ( mos6526_irq_r( cia_1 ) ) data |= INTENA_EXTER; |
1423 | 1423 | CUSTOM_REG(offset) = data; |
1424 | 1424 | |
1425 | 1425 | if ( temp & 0x8000 ) /* if we're generating irq's, delay a bit */ |
1426 | state->m_irq_timer->adjust( space | |
1426 | state->m_irq_timer->adjust( space.machine().device<cpu_device>("maincpu")->cycles_to_attotime( AMIGA_IRQ_DELAY_CYCLES )); | |
1427 | 1427 | else /* if we're clearing irq's, process right away */ |
1428 | update_irqs(space | |
1428 | update_irqs(space.machine()); | |
1429 | 1429 | break; |
1430 | 1430 | |
1431 | 1431 | case REG_ADKCON: |
1432 | 1432 | amiga_audio_update(state->m_sound_device); |
1433 | 1433 | data = (data & 0x8000) ? (CUSTOM_REG(offset) | (data & 0x7fff)) : (CUSTOM_REG(offset) & ~(data & 0x7fff)); |
1434 | space | |
1434 | space.machine().device<amiga_fdc>("fdc")->adkcon_set(data); | |
1435 | 1435 | break; |
1436 | 1436 | |
1437 | 1437 | case REG_AUD0LCL: case REG_AUD0LCH: case REG_AUD0LEN: case REG_AUD0PER: case REG_AUD0VOL: |
r17963 | r17964 | |
1469 | 1469 | case REG_COLOR28: case REG_COLOR29: case REG_COLOR30: case REG_COLOR31: |
1470 | 1470 | if (IS_AGA(state->m_intf)) |
1471 | 1471 | { |
1472 | amiga_aga_palette_write(space | |
1472 | amiga_aga_palette_write(space.machine(), offset - REG_COLOR00, data); | |
1473 | 1473 | } |
1474 | 1474 | else |
1475 | 1475 | { |
r17963 | r17964 | |
1480 | 1480 | case REG_DIWSTRT: |
1481 | 1481 | case REG_DIWSTOP: |
1482 | 1482 | if (IS_AGA(state->m_intf)) |
1483 | amiga_aga_diwhigh_written(space | |
1483 | amiga_aga_diwhigh_written(space.machine(), 0); | |
1484 | 1484 | break; |
1485 | 1485 | case REG_DIWHIGH: |
1486 | 1486 | if (IS_AGA(state->m_intf)) |
1487 | amiga_aga_diwhigh_written(space | |
1487 | amiga_aga_diwhigh_written(space.machine(), 1); | |
1488 | 1488 | break; |
1489 | 1489 | |
1490 | 1490 | default: |
r17963 | r17964 | |
1509 | 1509 | void amiga_serial_in_w(running_machine &machine, UINT16 data) |
1510 | 1510 | { |
1511 | 1511 | amiga_state *state = machine.driver_data<amiga_state>(); |
1512 | address_space | |
1512 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
1513 | 1513 | int mask = (CUSTOM_REG(REG_SERPER) & 0x8000) ? 0x1ff : 0xff; |
1514 | 1514 | |
1515 | 1515 | /* copy the data to the low 8 bits of SERDATR and set RBF */ |
r17963 | r17964 | |
1600 | 1600 | |
1601 | 1601 | READ16_HANDLER( amiga_autoconfig_r ) |
1602 | 1602 | { |
1603 | amiga_state *state = space | |
1603 | amiga_state *state = space.machine().driver_data<amiga_state>(); | |
1604 | 1604 | autoconfig_device *cur_autoconfig = state->m_cur_autoconfig; |
1605 | 1605 | UINT8 byte; |
1606 | 1606 | int i; |
r17963 | r17964 | |
1716 | 1716 | case 0x40/4: |
1717 | 1717 | byte = 0x00; |
1718 | 1718 | if (cur_autoconfig->device.int_control_r) |
1719 | byte = (*cur_autoconfig->device.int_control_r)(space | |
1719 | byte = (*cur_autoconfig->device.int_control_r)(space.machine()); | |
1720 | 1720 | break; |
1721 | 1721 | |
1722 | 1722 | default: |
r17963 | r17964 | |
1739 | 1739 | |
1740 | 1740 | WRITE16_HANDLER( amiga_autoconfig_w ) |
1741 | 1741 | { |
1742 | amiga_state *state = space | |
1742 | amiga_state *state = space.machine().driver_data<amiga_state>(); | |
1743 | 1743 | autoconfig_device *cur_autoconfig = state->m_cur_autoconfig; |
1744 | 1744 | int move_to_next = FALSE; |
1745 | 1745 | |
r17963 | r17964 | |
1777 | 1777 | { |
1778 | 1778 | logerror("Install to %06X\n", cur_autoconfig->base); |
1779 | 1779 | if (cur_autoconfig->base && cur_autoconfig->device.install) |
1780 | (*cur_autoconfig->device.install)(space | |
1780 | (*cur_autoconfig->device.install)(space.machine(), cur_autoconfig->base); | |
1781 | 1781 | state->m_cur_autoconfig = cur_autoconfig->next; |
1782 | 1782 | } |
1783 | 1783 | } |
r17963 | r17964 | |
---|---|---|
24 | 24 | |
25 | 25 | static READ16_HANDLER( fatfury2_protection_16_r ) |
26 | 26 | { |
27 | neogeo_state *state = space | |
27 | neogeo_state *state = space.machine().driver_data<neogeo_state>(); | |
28 | 28 | UINT16 res = state->m_fatfury2_prot_data >> 24; |
29 | 29 | |
30 | 30 | switch (offset) |
r17963 | r17964 | |
42 | 42 | return ((res & 0xf0) >> 4) | ((res & 0x0f) << 4); |
43 | 43 | |
44 | 44 | default: |
45 | logerror("unknown protection read at pc %06x, offset %08x\n", space | |
45 | logerror("unknown protection read at pc %06x, offset %08x\n", space.device().safe_pc(), offset << 1); | |
46 | 46 | return 0; |
47 | 47 | } |
48 | 48 | } |
r17963 | r17964 | |
50 | 50 | |
51 | 51 | static WRITE16_HANDLER( fatfury2_protection_16_w ) |
52 | 52 | { |
53 | neogeo_state *state = space | |
53 | neogeo_state *state = space.machine().driver_data<neogeo_state>(); | |
54 | 54 | |
55 | 55 | switch (offset) |
56 | 56 | { |
r17963 | r17964 | |
89 | 89 | break; |
90 | 90 | |
91 | 91 | default: |
92 | logerror("unknown protection write at pc %06x, offset %08x, data %02x\n", space | |
92 | logerror("unknown protection write at pc %06x, offset %08x, data %02x\n", space.device().safe_pc(), offset, data); | |
93 | 93 | break; |
94 | 94 | } |
95 | 95 | } |
r17963 | r17964 | |
119 | 119 | static WRITE16_HANDLER ( kof98_prot_w ) |
120 | 120 | { |
121 | 121 | /* info from razoola */ |
122 | UINT16* mem16 = (UINT16*)space | |
122 | UINT16* mem16 = (UINT16*)space.machine().root_device().memregion("maincpu")->base(); | |
123 | 123 | |
124 | 124 | switch (data) |
125 | 125 | { |
126 | 126 | case 0x0090: |
127 | logerror ("%06x kof98 - protection 0x0090 old %04x %04x\n", space | |
127 | logerror ("%06x kof98 - protection 0x0090 old %04x %04x\n", space.device().safe_pc(), mem16[0x100/2], mem16[0x102/2]); | |
128 | 128 | mem16[0x100/2] = 0x00c2; |
129 | 129 | mem16[0x102/2] = 0x00fd; |
130 | 130 | break; |
131 | 131 | |
132 | 132 | case 0x00f0: |
133 | logerror ("%06x kof98 - protection 0x00f0 old %04x %04x\n", space | |
133 | logerror ("%06x kof98 - protection 0x00f0 old %04x %04x\n", space.device().safe_pc(), mem16[0x100/2], mem16[0x102/2]); | |
134 | 134 | mem16[0x100/2] = 0x4e45; |
135 | 135 | mem16[0x102/2] = 0x4f2d; |
136 | 136 | break; |
137 | 137 | |
138 | 138 | default: // 00aa is written, but not needed? |
139 | logerror ("%06x kof98 - unknown protection write %04x\n", space | |
139 | logerror ("%06x kof98 - unknown protection write %04x\n", space.device().safe_pc(), data); | |
140 | 140 | break; |
141 | 141 | } |
142 | 142 | } |
r17963 | r17964 | |
375 | 375 | |
376 | 376 | static READ16_HANDLER( sma_random_r ) |
377 | 377 | { |
378 | neogeo_state *state = space | |
378 | neogeo_state *state = space.machine().driver_data<neogeo_state>(); | |
379 | 379 | UINT16 old = state->m_neogeo_rng; |
380 | 380 | |
381 | 381 | UINT16 newbit = ((state->m_neogeo_rng >> 2) ^ |
r17963 | r17964 | |
500 | 500 | } |
501 | 501 | |
502 | 502 | |
503 | static void pvc_write_bankswitch( address_space | |
503 | static void pvc_write_bankswitch( address_space &space ) | |
504 | 504 | { |
505 | neogeo_state *state = space | |
505 | neogeo_state *state = space.machine().driver_data<neogeo_state>(); | |
506 | 506 | UINT32 bankaddress; |
507 | 507 | |
508 | 508 | bankaddress = ((state->m_pvc_cartridge_ram[0xff8] >> 8)|(state->m_pvc_cartridge_ram[0xff9] << 8)); |
r17963 | r17964 | |
515 | 515 | |
516 | 516 | static READ16_HANDLER( pvc_prot_r ) |
517 | 517 | { |
518 | neogeo_state *state = space | |
518 | neogeo_state *state = space.machine().driver_data<neogeo_state>(); | |
519 | 519 | return state->m_pvc_cartridge_ram[offset]; |
520 | 520 | } |
521 | 521 | |
522 | 522 | |
523 | 523 | static WRITE16_HANDLER( pvc_prot_w ) |
524 | 524 | { |
525 | neogeo_state *state = space | |
525 | neogeo_state *state = space.machine().driver_data<neogeo_state>(); | |
526 | 526 | |
527 | 527 | COMBINE_DATA(&state->m_pvc_cartridge_ram[offset] ); |
528 | 528 | if (offset == 0xff0) |
529 | pvc_prot1(space | |
529 | pvc_prot1(space.machine()); | |
530 | 530 | else if(offset >= 0xff4 && offset <= 0xff5) |
531 | pvc_prot2(space | |
531 | pvc_prot2(space.machine()); | |
532 | 532 | else if(offset >= 0xff8) |
533 | 533 | pvc_write_bankswitch(space); |
534 | 534 | } |
r17963 | r17964 | |
---|---|---|
360 | 360 | |
361 | 361 | READ16_MEMBER(midwunit_state::midwunit_security_r) |
362 | 362 | { |
363 | return midway_serial_pic_r( | |
363 | return midway_serial_pic_r(space); | |
364 | 364 | } |
365 | 365 | |
366 | 366 | |
367 | 367 | WRITE16_MEMBER(midwunit_state::midwunit_security_w) |
368 | 368 | { |
369 | 369 | if (offset == 0 && ACCESSING_BITS_0_7) |
370 | midway_serial_pic_w( | |
370 | midway_serial_pic_w(space, data); | |
371 | 371 | } |
372 | 372 | |
373 | 373 |
r17963 | r17964 | |
---|---|---|
170 | 170 | |
171 | 171 | static READ8_HANDLER( namco_50xx_K_r ) |
172 | 172 | { |
173 | namco_50xx_state *state = get_safe_token(space | |
173 | namco_50xx_state *state = get_safe_token(space.device().owner()); | |
174 | 174 | return state->m_latched_cmd >> 4; |
175 | 175 | } |
176 | 176 | |
177 | 177 | static READ8_HANDLER( namco_50xx_R0_r ) |
178 | 178 | { |
179 | namco_50xx_state *state = get_safe_token(space | |
179 | namco_50xx_state *state = get_safe_token(space.device().owner()); | |
180 | 180 | return state->m_latched_cmd & 0x0f; |
181 | 181 | } |
182 | 182 | |
183 | 183 | static READ8_HANDLER( namco_50xx_R2_r ) |
184 | 184 | { |
185 | namco_50xx_state *state = get_safe_token(space | |
185 | namco_50xx_state *state = get_safe_token(space.device().owner()); | |
186 | 186 | return state->m_latched_rw & 1; |
187 | 187 | } |
188 | 188 | |
r17963 | r17964 | |
190 | 190 | |
191 | 191 | static WRITE8_HANDLER( namco_50xx_O_w ) |
192 | 192 | { |
193 | namco_50xx_state *state = get_safe_token(space | |
193 | namco_50xx_state *state = get_safe_token(space.device().owner()); | |
194 | 194 | UINT8 out = (data & 0x0f); |
195 | 195 | if (data & 0x10) |
196 | 196 | state->m_portO = (state->m_portO & 0x0f) | (out << 4); |
r17963 | r17964 | |
---|---|---|
113 | 113 | |
114 | 114 | MACHINE_RESET_MEMBER(namcos2_shared_state,namcos2) |
115 | 115 | { |
116 | address_space | |
116 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
117 | 117 | mFinalLapProtCount = 0; |
118 | 118 | namcos2_mcu_analog_ctrl = 0; |
119 | 119 | namcos2_mcu_analog_data = 0xaa; |
r17963 | r17964 | |
154 | 154 | /* 68000 Shared memory area - Data ROM area */ |
155 | 155 | /*************************************************************/ |
156 | 156 | READ16_HANDLER( namcos2_68k_data_rom_r ){ |
157 | UINT16 *ROM = (UINT16 *)space | |
157 | UINT16 *ROM = (UINT16 *)space.machine().root_device().memregion("user1")->base(); | |
158 | 158 | return ROM[offset]; |
159 | 159 | } |
160 | 160 | |
r17963 | r17964 | |
229 | 229 | |
230 | 230 | READ16_HANDLER( namcos2_68k_key_r ) |
231 | 231 | { |
232 | switch (space | |
232 | switch (space.machine().driver_data<namcos2_shared_state>()->m_gametype) | |
233 | 233 | { |
234 | 234 | case NAMCOS2_ORDYNE: |
235 | 235 | switch(offset) |
r17963 | r17964 | |
340 | 340 | { |
341 | 341 | // case 3: return 0x142; |
342 | 342 | case 4: return 0x142; |
343 | // case 3: popmessage("blah %08x",space->device().safe_pc()); | |
344 | default: return space->machine().rand(); | |
343 | // case 3: popmessage("blah %08x",space.device().safe_pc()); | |
344 | default: return space.machine().rand(); | |
345 | 345 | } |
346 | 346 | break; |
347 | 347 | |
r17963 | r17964 | |
398 | 398 | |
399 | 399 | |
400 | 400 | |
401 | return space | |
401 | return space.machine().rand()&0xffff; | |
402 | 402 | } |
403 | 403 | |
404 | 404 | WRITE16_HANDLER( namcos2_68k_key_w ) |
405 | 405 | { |
406 | int gametype = space | |
406 | int gametype = space.machine().driver_data<namcos2_shared_state>()->m_gametype; | |
407 | 407 | if( gametype == NAMCOS2_MARVEL_LAND && offset == 5 ) |
408 | 408 | { |
409 | 409 | if (data == 0x615E) sendval = 1; |
r17963 | r17964 | |
464 | 464 | } |
465 | 465 | |
466 | 466 | static UINT16 |
467 | ReadWriteC148( address_space | |
467 | ReadWriteC148( address_space &space, offs_t offset, UINT16 data, int bWrite ) | |
468 | 468 | { |
469 | 469 | offs_t addr = ((offset * 2) + 0x1c0000) & 0x1fe000; |
470 | 470 | device_t *altcpu = NULL; |
r17963 | r17964 | |
472 | 472 | UINT16 *pC148RegAlt = NULL; |
473 | 473 | UINT16 result = 0; |
474 | 474 | |
475 | if (&space | |
475 | if (&space.device() == space.machine().device("maincpu")) | |
476 | 476 | { |
477 | 477 | pC148Reg = namcos2_68k_master_C148; |
478 | altcpu = space | |
478 | altcpu = space.machine().device("slave"); | |
479 | 479 | pC148RegAlt = namcos2_68k_slave_C148; |
480 | 480 | } |
481 | else if (&space | |
481 | else if (&space.device() == space.machine().device("slave")) | |
482 | 482 | { |
483 | 483 | pC148Reg = namcos2_68k_slave_C148; |
484 | altcpu = space | |
484 | altcpu = space.machine().device("maincpu"); | |
485 | 485 | pC148RegAlt = namcos2_68k_master_C148; |
486 | 486 | } |
487 | else if (&space | |
487 | else if (&space.device() == space.machine().device("gpu")) | |
488 | 488 | { |
489 | 489 | pC148Reg = namcos2_68k_gpu_C148; |
490 | altcpu = space | |
490 | altcpu = space.machine().device("maincpu"); | |
491 | 491 | pC148RegAlt = namcos2_68k_master_C148; |
492 | 492 | } |
493 | 493 | |
r17963 | r17964 | |
498 | 498 | // If writing an IRQ priority register, clear any pending IRQs. |
499 | 499 | // Dirt Fox and Winning Run require this behaviour |
500 | 500 | if (reg < 8) |
501 | space | |
501 | space.device().execute().set_input_line(pC148Reg[reg], CLEAR_LINE); | |
502 | 502 | |
503 | 503 | pC148Reg[reg] = data & 0x0007; |
504 | 504 | } |
r17963 | r17964 | |
541 | 541 | /* IRQ ack */ |
542 | 542 | case 0x1d6000: /* NAMCOS2_C148_CPUIRQ */ |
543 | 543 | // if( bWrite ) mame_printf_debug( "cpu(%d) RAM[0x%06x] = 0x%x\n", cpu, addr, data ); |
544 | space | |
544 | space.device().execute().set_input_line(pC148Reg[NAMCOS2_C148_CPUIRQ], CLEAR_LINE); | |
545 | 545 | break; |
546 | 546 | |
547 | 547 | case 0x1d8000: /* NAMCOS2_C148_EXIRQ */ |
548 | 548 | // if( bWrite ) mame_printf_debug( "cpu(%d) RAM[0x%06x] = 0x%x\n", cpu, addr, data ); |
549 | space | |
549 | space.device().execute().set_input_line(pC148Reg[NAMCOS2_C148_EXIRQ], CLEAR_LINE); | |
550 | 550 | break; |
551 | 551 | |
552 | 552 | case 0x1da000: /* NAMCOS2_C148_POSIRQ */ |
553 | 553 | // if( bWrite ) mame_printf_debug( "cpu(%d) RAM[0x%06x] = 0x%x\n", cpu, addr, data ); |
554 | space | |
554 | space.device().execute().set_input_line(pC148Reg[NAMCOS2_C148_POSIRQ], CLEAR_LINE); | |
555 | 555 | break; |
556 | 556 | |
557 | 557 | case 0x1dc000: /* NAMCOS2_C148_SERIRQ */ |
558 | 558 | // if( bWrite ) mame_printf_debug( "cpu(%d) RAM[0x%06x] = 0x%x\n", cpu, addr, data ); |
559 | space | |
559 | space.device().execute().set_input_line(pC148Reg[NAMCOS2_C148_SERIRQ], CLEAR_LINE); | |
560 | 560 | break; |
561 | 561 | |
562 | 562 | case 0x1de000: /* NAMCOS2_C148_VBLANKIRQ */ |
563 | space | |
563 | space.device().execute().set_input_line(pC148Reg[NAMCOS2_C148_VBLANKIRQ], CLEAR_LINE); | |
564 | 564 | break; |
565 | 565 | |
566 | 566 | |
r17963 | r17964 | |
569 | 569 | break; |
570 | 570 | |
571 | 571 | case 0x1e2000: /* Sound CPU Reset control */ |
572 | if (&space | |
572 | if (&space.device() == space.machine().device("maincpu")) /* ? */ | |
573 | 573 | { |
574 | 574 | if (data & 0x01) |
575 | 575 | { |
576 | 576 | /* Resume execution */ |
577 | space->machine().device("audiocpu")->execute().set_input_line(INPUT_LINE_RESET, CLEAR_LINE); | |
578 | space->device().execute().yield(); | |
577 | space.machine().device("audiocpu")->execute().set_input_line(INPUT_LINE_RESET, CLEAR_LINE); | |
578 | space.device().execute().yield(); | |
579 | 579 | } |
580 | 580 | else |
581 | 581 | { |
582 | 582 | /* Suspend execution */ |
583 | space | |
583 | space.machine().device("audiocpu")->execute().set_input_line(INPUT_LINE_RESET, ASSERT_LINE); | |
584 | 584 | } |
585 | 585 | if (namcos2_kickstart != NULL) |
586 | 586 | { |
587 | 587 | //printf( "dspkick=0x%x\n", data ); |
588 | 588 | if (data & 0x04) |
589 | 589 | { |
590 | (*namcos2_kickstart)(space | |
590 | (*namcos2_kickstart)(space.machine(), 1); | |
591 | 591 | } |
592 | 592 | } |
593 | 593 | } |
594 | 594 | break; |
595 | 595 | |
596 | 596 | case 0x1e4000: /* Alt 68000 & IO CPU Reset */ |
597 | if (&space | |
597 | if (&space.device() == space.machine().device("maincpu")) /* ? */ | |
598 | 598 | { |
599 | 599 | if (data & 0x01) |
600 | 600 | { /* Resume execution */ |
601 | ResetAllSubCPUs(space | |
601 | ResetAllSubCPUs(space.machine(), CLEAR_LINE); | |
602 | 602 | /* Give the new CPU an immediate slice of the action */ |
603 | space | |
603 | space.device().execute().yield(); | |
604 | 604 | } |
605 | 605 | else |
606 | 606 | { /* Suspend execution */ |
607 | ResetAllSubCPUs(space | |
607 | ResetAllSubCPUs(space.machine(), ASSERT_LINE); | |
608 | 608 | } |
609 | 609 | } |
610 | 610 | break; |
r17963 | r17964 | |
711 | 711 | |
712 | 712 | WRITE8_HANDLER( namcos2_sound_bankselect_w ) |
713 | 713 | { |
714 | UINT8 *RAM=space->machine().root_device().memregion("audiocpu")->base(); | |
715 | UINT32 max = (space->machine().root_device().memregion("audiocpu")->bytes() - 0x10000) / 0x4000; | |
714 | UINT8 *RAM=space.machine().root_device().memregion("audiocpu")->base(); | |
715 | UINT32 max = (space.machine().root_device().memregion("audiocpu")->bytes() - 0x10000) / 0x4000; | |
716 | 716 | int bank = ( data >> 4 ) % max; /* 991104.CAB */ |
717 | space | |
717 | space.machine().root_device().membank(BANKED_SOUND_ROM)->set_base(&RAM[ 0x10000 + ( 0x4000 * bank ) ] ); | |
718 | 718 | } |
719 | 719 | |
720 | 720 | /**************************************************************/ |
r17963 | r17964 | |
738 | 738 | switch((data>>2) & 0x07) |
739 | 739 | { |
740 | 740 | case 0: |
741 | namcos2_mcu_analog_data=space | |
741 | namcos2_mcu_analog_data=space.machine().root_device().ioport("AN0")->read(); | |
742 | 742 | break; |
743 | 743 | case 1: |
744 | namcos2_mcu_analog_data=space | |
744 | namcos2_mcu_analog_data=space.machine().root_device().ioport("AN1")->read(); | |
745 | 745 | break; |
746 | 746 | case 2: |
747 | namcos2_mcu_analog_data=space | |
747 | namcos2_mcu_analog_data=space.machine().root_device().ioport("AN2")->read(); | |
748 | 748 | break; |
749 | 749 | case 3: |
750 | namcos2_mcu_analog_data=space | |
750 | namcos2_mcu_analog_data=space.machine().root_device().ioport("AN3")->read(); | |
751 | 751 | break; |
752 | 752 | case 4: |
753 | namcos2_mcu_analog_data=space | |
753 | namcos2_mcu_analog_data=space.machine().root_device().ioport("AN4")->read(); | |
754 | 754 | break; |
755 | 755 | case 5: |
756 | namcos2_mcu_analog_data=space | |
756 | namcos2_mcu_analog_data=space.machine().root_device().ioport("AN5")->read(); | |
757 | 757 | break; |
758 | 758 | case 6: |
759 | namcos2_mcu_analog_data=space | |
759 | namcos2_mcu_analog_data=space.machine().root_device().ioport("AN6")->read(); | |
760 | 760 | break; |
761 | 761 | case 7: |
762 | namcos2_mcu_analog_data=space | |
762 | namcos2_mcu_analog_data=space.machine().root_device().ioport("AN7")->read(); | |
763 | 763 | break; |
764 | 764 | default: |
765 | 765 | output_set_value("anunk",data); |
r17963 | r17964 | |
776 | 776 | /* If the interrupt enable bit is set trigger an A/D IRQ */ |
777 | 777 | if(data & 0x20) |
778 | 778 | { |
779 | generic_pulse_irq_line(space | |
779 | generic_pulse_irq_line(space.machine().device("mcu"), HD63705_INT_ADCONV, 1); | |
780 | 780 | } |
781 | 781 | } |
782 | 782 | } |
r17963 | r17964 | |
817 | 817 | int data = 0; |
818 | 818 | |
819 | 819 | /* Read/convert the bits one at a time */ |
820 | if(space->machine().root_device().ioport("AN0")->read() > threshold) data |= 0x01; | |
821 | if(space->machine().root_device().ioport("AN1")->read() > threshold) data |= 0x02; | |
822 | if(space->machine().root_device().ioport("AN2")->read() > threshold) data |= 0x04; | |
823 | if(space->machine().root_device().ioport("AN3")->read() > threshold) data |= 0x08; | |
824 | if(space->machine().root_device().ioport("AN4")->read() > threshold) data |= 0x10; | |
825 | if(space->machine().root_device().ioport("AN5")->read() > threshold) data |= 0x20; | |
826 | if(space->machine().root_device().ioport("AN6")->read() > threshold) data |= 0x40; | |
827 | if(space->machine().root_device().ioport("AN7")->read() > threshold) data |= 0x80; | |
820 | if(space.machine().root_device().ioport("AN0")->read() > threshold) data |= 0x01; | |
821 | if(space.machine().root_device().ioport("AN1")->read() > threshold) data |= 0x02; | |
822 | if(space.machine().root_device().ioport("AN2")->read() > threshold) data |= 0x04; | |
823 | if(space.machine().root_device().ioport("AN3")->read() > threshold) data |= 0x08; | |
824 | if(space.machine().root_device().ioport("AN4")->read() > threshold) data |= 0x10; | |
825 | if(space.machine().root_device().ioport("AN5")->read() > threshold) data |= 0x20; | |
826 | if(space.machine().root_device().ioport("AN6")->read() > threshold) data |= 0x40; | |
827 | if(space.machine().root_device().ioport("AN7")->read() > threshold) data |= 0x80; | |
828 | 828 | |
829 | 829 | /* Return the result */ |
830 | 830 | return data; |
r17963 | r17964 | |
832 | 832 | |
833 | 833 | READ8_HANDLER( namcos2_input_port_0_r ) |
834 | 834 | { |
835 | int data = space | |
835 | int data = space.machine().root_device().ioport("MCUB")->read(); | |
836 | 836 | return data; |
837 | 837 | } |
838 | 838 | |
839 | 839 | READ8_HANDLER( namcos2_input_port_10_r ) |
840 | 840 | { |
841 | int data = space | |
841 | int data = space.machine().root_device().ioport("MCUH")->read(); | |
842 | 842 | return data; |
843 | 843 | } |
844 | 844 | |
845 | 845 | READ8_HANDLER( namcos2_input_port_12_r ) |
846 | 846 | { |
847 | int data = space | |
847 | int data = space.machine().root_device().ioport("MCUDI0")->read(); | |
848 | 848 | return data; |
849 | 849 | } |
r17963 | r17964 | |
---|---|---|
35 | 35 | |
36 | 36 | static READ32_HANDLER( arm7_latch_arm_r ) |
37 | 37 | { |
38 | pgm_arm_type2_state *state = space | |
38 | pgm_arm_type2_state *state = space.machine().driver_data<pgm_arm_type2_state>(); | |
39 | 39 | |
40 | 40 | state->m_prot->set_input_line(ARM7_FIRQ_LINE, CLEAR_LINE ); // guess |
41 | 41 | |
42 | 42 | if (PGMARM7LOGERROR) |
43 | logerror("ARM7: Latch read: %08x (%08x) (%06x)\n", state->m_kov2_latchdata_68k_w, mem_mask, space | |
43 | logerror("ARM7: Latch read: %08x (%08x) (%06x)\n", state->m_kov2_latchdata_68k_w, mem_mask, space.device().safe_pc()); | |
44 | 44 | return state->m_kov2_latchdata_68k_w; |
45 | 45 | } |
46 | 46 | |
47 | 47 | static WRITE32_HANDLER( arm7_latch_arm_w ) |
48 | 48 | { |
49 | pgm_arm_type2_state *state = space | |
49 | pgm_arm_type2_state *state = space.machine().driver_data<pgm_arm_type2_state>(); | |
50 | 50 | |
51 | 51 | if (PGMARM7LOGERROR) |
52 | logerror("ARM7: Latch write: %08x (%08x) (%06x)\n", data, mem_mask, space | |
52 | logerror("ARM7: Latch write: %08x (%08x) (%06x)\n", data, mem_mask, space.device().safe_pc()); | |
53 | 53 | |
54 | 54 | COMBINE_DATA(&state->m_kov2_latchdata_arm_w); |
55 | 55 | } |
56 | 56 | |
57 | 57 | static READ32_HANDLER( arm7_shareram_r ) |
58 | 58 | { |
59 | pgm_arm_type2_state *state = space | |
59 | pgm_arm_type2_state *state = space.machine().driver_data<pgm_arm_type2_state>(); | |
60 | 60 | |
61 | 61 | if (PGMARM7LOGERROR) |
62 | logerror("ARM7: ARM7 Shared RAM Read: %04x = %08x (%08x) (%06x)\n", offset << 2, state->m_arm7_shareram[offset], mem_mask, space | |
62 | logerror("ARM7: ARM7 Shared RAM Read: %04x = %08x (%08x) (%06x)\n", offset << 2, state->m_arm7_shareram[offset], mem_mask, space.device().safe_pc()); | |
63 | 63 | return state->m_arm7_shareram[offset]; |
64 | 64 | } |
65 | 65 | |
66 | 66 | static WRITE32_HANDLER( arm7_shareram_w ) |
67 | 67 | { |
68 | pgm_arm_type2_state *state = space | |
68 | pgm_arm_type2_state *state = space.machine().driver_data<pgm_arm_type2_state>(); | |
69 | 69 | |
70 | 70 | if (PGMARM7LOGERROR) |
71 | logerror("ARM7: ARM7 Shared RAM Write: %04x = %08x (%08x) (%06x)\n", offset << 2, data, mem_mask, space | |
71 | logerror("ARM7: ARM7 Shared RAM Write: %04x = %08x (%08x) (%06x)\n", offset << 2, data, mem_mask, space.device().safe_pc()); | |
72 | 72 | COMBINE_DATA(&state->m_arm7_shareram[offset]); |
73 | 73 | } |
74 | 74 | |
75 | 75 | static READ16_HANDLER( arm7_latch_68k_r ) |
76 | 76 | { |
77 | pgm_arm_type2_state *state = space | |
77 | pgm_arm_type2_state *state = space.machine().driver_data<pgm_arm_type2_state>(); | |
78 | 78 | |
79 | 79 | if (PGMARM7LOGERROR) |
80 | logerror("M68K: Latch read: %04x (%04x) (%06x)\n", state->m_kov2_latchdata_arm_w & 0x0000ffff, mem_mask, space | |
80 | logerror("M68K: Latch read: %04x (%04x) (%06x)\n", state->m_kov2_latchdata_arm_w & 0x0000ffff, mem_mask, space.device().safe_pc()); | |
81 | 81 | return state->m_kov2_latchdata_arm_w; |
82 | 82 | } |
83 | 83 | |
84 | 84 | static WRITE16_HANDLER( arm7_latch_68k_w ) |
85 | 85 | { |
86 | pgm_arm_type2_state *state = space | |
86 | pgm_arm_type2_state *state = space.machine().driver_data<pgm_arm_type2_state>(); | |
87 | 87 | |
88 | 88 | if (PGMARM7LOGERROR) |
89 | logerror("M68K: Latch write: %04x (%04x) (%06x)\n", data & 0x0000ffff, mem_mask, space | |
89 | logerror("M68K: Latch write: %04x (%04x) (%06x)\n", data & 0x0000ffff, mem_mask, space.device().safe_pc()); | |
90 | 90 | COMBINE_DATA(&state->m_kov2_latchdata_68k_w); |
91 | 91 | |
92 | 92 | state->m_prot->set_input_line(ARM7_FIRQ_LINE, ASSERT_LINE ); // guess |
r17963 | r17964 | |
94 | 94 | |
95 | 95 | static READ16_HANDLER( arm7_ram_r ) |
96 | 96 | { |
97 | pgm_arm_type2_state *state = space | |
97 | pgm_arm_type2_state *state = space.machine().driver_data<pgm_arm_type2_state>(); | |
98 | 98 | UINT16 *share16 = reinterpret_cast<UINT16 *>(state->m_arm7_shareram.target()); |
99 | 99 | |
100 | 100 | if (PGMARM7LOGERROR) |
101 | logerror("M68K: ARM7 Shared RAM Read: %04x = %04x (%08x) (%06x)\n", BYTE_XOR_LE(offset), share16[BYTE_XOR_LE(offset)], mem_mask, space | |
101 | logerror("M68K: ARM7 Shared RAM Read: %04x = %04x (%08x) (%06x)\n", BYTE_XOR_LE(offset), share16[BYTE_XOR_LE(offset)], mem_mask, space.device().safe_pc()); | |
102 | 102 | return share16[BYTE_XOR_LE(offset)]; |
103 | 103 | } |
104 | 104 | |
105 | 105 | static WRITE16_HANDLER( arm7_ram_w ) |
106 | 106 | { |
107 | pgm_arm_type2_state *state = space | |
107 | pgm_arm_type2_state *state = space.machine().driver_data<pgm_arm_type2_state>(); | |
108 | 108 | UINT16 *share16 = reinterpret_cast<UINT16 *>(state->m_arm7_shareram.target()); |
109 | 109 | |
110 | 110 | if (PGMARM7LOGERROR) |
111 | logerror("M68K: ARM7 Shared RAM Write: %04x = %04x (%04x) (%06x)\n", BYTE_XOR_LE(offset), data, mem_mask, space | |
111 | logerror("M68K: ARM7 Shared RAM Write: %04x = %04x (%04x) (%06x)\n", BYTE_XOR_LE(offset), data, mem_mask, space.device().safe_pc()); | |
112 | 112 | COMBINE_DATA(&share16[BYTE_XOR_LE(offset)]); |
113 | 113 | } |
114 | 114 | |
r17963 | r17964 | |
174 | 174 | |
175 | 175 | static WRITE32_HANDLER( kov2_arm_region_w ) |
176 | 176 | { |
177 | pgm_arm_type2_state *state = space->machine().driver_data<pgm_arm_type2_state>(); | |
178 | int pc = space->device().safe_pc(); | |
177 | pgm_arm_type2_state *state = space.machine().driver_data<pgm_arm_type2_state>(); | |
178 | int pc = space.device().safe_pc(); | |
179 | 179 | int regionhack = state->ioport("RegionHack")->read(); |
180 | 180 | if (pc==0x190 && regionhack != 0xff) data = (data & 0xffff0000) | (regionhack << 0); |
181 | 181 | COMBINE_DATA(&state->m_arm7_shareram[0x138/4]); |
r17963 | r17964 | |
227 | 227 | |
228 | 228 | static WRITE32_HANDLER( martmast_arm_region_w ) |
229 | 229 | { |
230 | pgm_arm_type2_state *state = space->machine().driver_data<pgm_arm_type2_state>(); | |
231 | int pc = space->device().safe_pc(); | |
230 | pgm_arm_type2_state *state = space.machine().driver_data<pgm_arm_type2_state>(); | |
231 | int pc = space.device().safe_pc(); | |
232 | 232 | int regionhack = state->ioport("RegionHack")->read(); |
233 | 233 | if (pc==0x170 && regionhack != 0xff) data = (data & 0xffff0000) | (regionhack << 0); |
234 | 234 | COMBINE_DATA(&state->m_arm7_shareram[0x138/4]); |
r17963 | r17964 | |
248 | 248 | |
249 | 249 | static WRITE32_HANDLER( ddp2_arm_region_w ) |
250 | 250 | { |
251 | pgm_arm_type2_state *state = space->machine().driver_data<pgm_arm_type2_state>(); | |
252 | int pc = space->device().safe_pc(); | |
251 | pgm_arm_type2_state *state = space.machine().driver_data<pgm_arm_type2_state>(); | |
252 | int pc = space.device().safe_pc(); | |
253 | 253 | int regionhack = state->ioport("RegionHack")->read(); |
254 | 254 | if (pc==0x0174 && regionhack != 0xff) data = (data & 0x0000ffff) | (regionhack << 16); |
255 | 255 | COMBINE_DATA(&state->m_arm7_shareram[0x0]); |
r17963 | r17964 | |
257 | 257 | |
258 | 258 | static READ32_HANDLER( ddp2_speedup_r ) |
259 | 259 | { |
260 | pgm_arm_type2_state *state = space->machine().driver_data<pgm_arm_type2_state>(); | |
261 | int pc = space->device().safe_pc(); | |
260 | pgm_arm_type2_state *state = space.machine().driver_data<pgm_arm_type2_state>(); | |
261 | int pc = space.device().safe_pc(); | |
262 | 262 | UINT32 data = state->m_arm_ram[0x300c/4]; |
263 | 263 | |
264 | 264 | if (pc==0x080109b4) |
265 | 265 | { |
266 | 266 | /* if we've hit the loop where this is read and both values are 0 then the only way out is an interrupt */ |
267 | int r4 = (space | |
267 | int r4 = (space.device().state().state_int(ARM7_R4)); | |
268 | 268 | r4 += 0xe; |
269 | 269 | |
270 | 270 | if (r4==0x18002f9e) |
271 | 271 | { |
272 | 272 | UINT32 data2 = state->m_arm_ram[0x2F9C/4]&0xffff0000; |
273 | if ((data==0x00000000) && (data2==0x00000000)) space | |
273 | if ((data==0x00000000) && (data2==0x00000000)) space.device().execute().spin_until_interrupt(); | |
274 | 274 | } |
275 | 275 | } |
276 | 276 | |
r17963 | r17964 | |
279 | 279 | |
280 | 280 | static READ16_HANDLER( ddp2_main_speedup_r ) |
281 | 281 | { |
282 | pgm_state *state = space | |
282 | pgm_state *state = space.machine().driver_data<pgm_state>(); | |
283 | 283 | UINT16 data = state->m_mainram[0x0ee54/2]; |
284 | int pc = space | |
284 | int pc = space.device().safe_pc(); | |
285 | 285 | |
286 | if (pc == 0x149dce) space->device().execute().spin_until_interrupt(); | |
287 | if (pc == 0x149cfe) space->device().execute().spin_until_interrupt(); | |
286 | if (pc == 0x149dce) space.device().execute().spin_until_interrupt(); | |
287 | if (pc == 0x149cfe) space.device().execute().spin_until_interrupt(); | |
288 | 288 | |
289 | 289 | return data; |
290 | 290 |
r17963 | r17964 | |
---|---|---|
29 | 29 | #include "emu.h" |
30 | 30 | #include "includes/nb1414m4.h" |
31 | 31 | |
32 | static void nichibutsu_1414m4_dma(address_space | |
32 | static void nichibutsu_1414m4_dma(address_space &space,UINT16 src,UINT16 dst,UINT16 size, UINT8 condition,UINT8 *vram) | |
33 | 33 | { |
34 | UINT8 * data = (UINT8 *)space | |
34 | UINT8 * data = (UINT8 *)space.machine().root_device().memregion("blit_data")->base(); | |
35 | 35 | int i; |
36 | 36 | |
37 | 37 | for(i=0;i<size;i++) |
r17963 | r17964 | |
45 | 45 | } |
46 | 46 | } |
47 | 47 | |
48 | static void nichibutsu_1414m4_fill(address_space | |
48 | static void nichibutsu_1414m4_fill(address_space &space,UINT16 dst,UINT8 tile,UINT8 pal,UINT8 *vram) | |
49 | 49 | { |
50 | 50 | int i; |
51 | 51 | |
r17963 | r17964 | |
59 | 59 | } |
60 | 60 | } |
61 | 61 | |
62 | static void insert_coin_msg(address_space | |
62 | static void insert_coin_msg(address_space &space,UINT8 *vram) | |
63 | 63 | { |
64 | UINT8 * data = (UINT8 *)space | |
64 | UINT8 * data = (UINT8 *)space.machine().root_device().memregion("blit_data")->base(); | |
65 | 65 | int credit_count = (vram[0xf] & 0xff); |
66 | UINT8 fl_cond = space | |
66 | UINT8 fl_cond = space.machine().primary_screen->frame_number() & 0x10; /* for insert coin "flickering" */ | |
67 | 67 | UINT16 dst; |
68 | 68 | |
69 | 69 | if(credit_count == 0) |
r17963 | r17964 | |
80 | 80 | } |
81 | 81 | } |
82 | 82 | |
83 | static void credit_msg(address_space | |
83 | static void credit_msg(address_space &space,UINT8 *vram) | |
84 | 84 | { |
85 | UINT8 * data = (UINT8 *)space | |
85 | UINT8 * data = (UINT8 *)space.machine().root_device().memregion("blit_data")->base(); | |
86 | 86 | int credit_count = (vram[0xf] & 0xff); |
87 | UINT8 fl_cond = space | |
87 | UINT8 fl_cond = space.machine().primary_screen->frame_number() & 0x10; /* for insert coin "flickering" */ | |
88 | 88 | UINT16 dst; |
89 | 89 | |
90 | 90 | dst = ((data[0x023]<<8)|(data[0x024]&0xff)) & 0x3fff; |
r17963 | r17964 | |
107 | 107 | } |
108 | 108 | } |
109 | 109 | |
110 | static void kozure_score_msg(address_space | |
110 | static void kozure_score_msg(address_space &space,UINT16 dst,UINT8 src_base,UINT8 *vram) | |
111 | 111 | { |
112 | 112 | int i; |
113 | 113 | UINT8 first_digit; |
114 | 114 | UINT8 res; |
115 | UINT8 * data = (UINT8 *)space | |
115 | UINT8 * data = (UINT8 *)space.machine().root_device().memregion("blit_data")->base(); | |
116 | 116 | |
117 | 117 | first_digit = 0; |
118 | 118 | |
r17963 | r17964 | |
138 | 138 | |
139 | 139 | } |
140 | 140 | |
141 | static void nichibutsu_1414m4_0200(address_space | |
141 | static void nichibutsu_1414m4_0200(address_space &space, UINT16 mcu_cmd,UINT8 *vram) | |
142 | 142 | { |
143 | UINT8 * data = (UINT8 *)space | |
143 | UINT8 * data = (UINT8 *)space.machine().root_device().memregion("blit_data")->base(); | |
144 | 144 | UINT16 dst; |
145 | 145 | |
146 | 146 | dst = (data[0x330+((mcu_cmd & 0xf)*2)]<<8)|(data[0x331+((mcu_cmd & 0xf)*2)]&0xff); |
r17963 | r17964 | |
183 | 183 | [0x10] coinage B |
184 | 184 | [0x11] sound test num |
185 | 185 | */ |
186 | static void nichibutsu_1414m4_0600(address_space | |
186 | static void nichibutsu_1414m4_0600(address_space &space, UINT8 is2p,UINT8 *vram) | |
187 | 187 | { |
188 | UINT8 * data = (UINT8 *)space | |
188 | UINT8 * data = (UINT8 *)space.machine().root_device().memregion("blit_data")->base(); | |
189 | 189 | UINT16 dst; |
190 | 190 | int i; |
191 | 191 | |
r17963 | r17964 | |
239 | 239 | nichibutsu_1414m4_dma(space,0x310 + (((vram[0x06] >> (7-i)) & 1) * 6),dst + (i * 0x20),0x3,1,vram); |
240 | 240 | } |
241 | 241 | |
242 | static void nichibutsu_1414m4_0e00(address_space | |
242 | static void nichibutsu_1414m4_0e00(address_space &space,UINT16 mcu_cmd,UINT8 *vram) | |
243 | 243 | { |
244 | UINT8 * data = (UINT8 *)space | |
244 | UINT8 * data = (UINT8 *)space.machine().root_device().memregion("blit_data")->base(); | |
245 | 245 | UINT16 dst; |
246 | 246 | |
247 | 247 | dst = ((data[0xdf]<<8)|(data[0xe0]&0xff)) & 0x3fff; |
r17963 | r17964 | |
271 | 271 | } |
272 | 272 | } |
273 | 273 | |
274 | void nb_1414m4_exec(address_space | |
274 | void nb_1414m4_exec(address_space &space,UINT16 mcu_cmd,UINT8 *vram,UINT16 &scrollx,UINT16 &scrolly,tilemap_t *tilemap) | |
275 | 275 | { |
276 | 276 | /* latch fg scroll values */ |
277 | 277 | scrollx = (vram[0x0d] & 0xff) | ((vram[0x0e] & 0xff) << 8); |
r17963 | r17964 | |
---|---|---|
111 | 111 | |
112 | 112 | WRITE16_HANDLER( deco16_104_prot_w ) /* Wizard Fire */ |
113 | 113 | { |
114 | driver_device *state = space | |
114 | driver_device *state = space.machine().driver_data<driver_device>(); | |
115 | 115 | if (offset == (0x150 / 2)) |
116 | 116 | { |
117 | state->soundlatch_byte_w(*space, 0, data & 0xff); | |
118 | space->machine().device("audiocpu")->execute().set_input_line(0, HOLD_LINE); | |
117 | state->soundlatch_byte_w(space, 0, data & 0xff); | |
118 | space.machine().device("audiocpu")->execute().set_input_line(0, HOLD_LINE); | |
119 | 119 | return; |
120 | 120 | } |
121 | 121 | |
r17963 | r17964 | |
124 | 124 | && offset != (0x370 >> 1) && offset != (0x3c0 >> 1) && offset != (0x430 >> 1) && offset != (0x460 >> 1) |
125 | 125 | && offset != (0x5a0 >> 1) && offset != (0x5b0 >> 1) && offset != (0x6e0 >> 1) && offset != (0x7d0 >> 1) |
126 | 126 | ) |
127 | logerror("CONTROL PC %06x: warning - write protection memory address %04x %04x\n", space | |
127 | logerror("CONTROL PC %06x: warning - write protection memory address %04x %04x\n", space.device().safe_pc(), offset << 1, data); | |
128 | 128 | |
129 | 129 | COMBINE_DATA(&deco16_prot_ram[offset]); |
130 | 130 | } |
r17963 | r17964 | |
133 | 133 | { |
134 | 134 | switch (offset<<1) { |
135 | 135 | case 0x110: /* Player input */ |
136 | return space | |
136 | return space.machine().root_device().ioport("IN0")->read(); | |
137 | 137 | |
138 | 138 | case 0x36c: /* Coins */ |
139 | 139 | case 0x334: /* Probably also, c6, 2c0, 2e0, 4b2, 46a, 4da, rohga is 44c */ |
140 | return space | |
140 | return space.machine().root_device().ioport("IN1")->read(); | |
141 | 141 | case 0x0dc: |
142 | return space | |
142 | return space.machine().root_device().ioport("IN1")->read()<<4; | |
143 | 143 | |
144 | 144 | case 0x494: /* Dips */ |
145 | return space | |
145 | return space.machine().root_device().ioport("DSW1_2")->read(); | |
146 | 146 | |
147 | 147 | case 0x244: |
148 | 148 | return deco16_prot_ram[0]; |
r17963 | r17964 | |
223 | 223 | return ((deco16_prot_ram[0x460/2]&0x0007)<<13) | ((deco16_prot_ram[0x460/2]&0x0008)<<9); |
224 | 224 | } |
225 | 225 | |
226 | logerror("Deco Protection PC %06x: warning - read unmapped memory address %04x\n",space | |
226 | logerror("Deco Protection PC %06x: warning - read unmapped memory address %04x\n",space.device().safe_pc(),offset<<1); | |
227 | 227 | return 0; |
228 | 228 | } |
229 | 229 | |
r17963 | r17964 | |
231 | 231 | |
232 | 232 | WRITE16_HANDLER( deco16_60_prot_w ) /* Edward Randy */ |
233 | 233 | { |
234 | driver_device *state = space | |
234 | driver_device *state = space.machine().driver_data<driver_device>(); | |
235 | 235 | if (offset == (0x64 / 2)) |
236 | 236 | { |
237 | state->soundlatch_byte_w(*space, 0, data & 0xff); | |
238 | space->machine().device("audiocpu")->execute().set_input_line(0, HOLD_LINE); | |
237 | state->soundlatch_byte_w(space, 0, data & 0xff); | |
238 | space.machine().device("audiocpu")->execute().set_input_line(0, HOLD_LINE); | |
239 | 239 | } |
240 | 240 | |
241 | 241 | COMBINE_DATA(&deco16_prot_ram[offset]); |
r17963 | r17964 | |
252 | 252 | && offset!=0x40/2 && offset!=0x54/2 && offset!=0x56/2 && offset!=0x58/2 && offset!=0x6a/2 && offset!=0x2c/2 |
253 | 253 | && offset!=0 && offset!=0x34 && offset!=0x8a && offset!=0x8e && offset!=0x92 && offset!=0x96 |
254 | 254 | ) |
255 | logerror("Protection PC %06x: warning - write %04x to %04x\n",space | |
255 | logerror("Protection PC %06x: warning - write %04x to %04x\n",space.device().safe_pc(),data,offset<<1); | |
256 | 256 | |
257 | 257 | } |
258 | 258 | |
r17963 | r17964 | |
367 | 367 | |
368 | 368 | /* Player 1 & 2 controls, read in IRQ then written *back* to protection device */ |
369 | 369 | case 0x50: /* written to 9e byte */ |
370 | return space | |
370 | return space.machine().root_device().ioport("IN0")->read(); | |
371 | 371 | case 0x6f8: /* written to 76 byte */ |
372 | return (space | |
372 | return (space.machine().root_device().ioport("IN0")->read()>>8)|(space.machine().root_device().ioport("IN0")->read()<<8); /* byte swap IN0 */ | |
373 | 373 | |
374 | 374 | case 0x5c: /* After coin insert, high 0x8000 bit set starts game */ |
375 | 375 | return deco16_prot_ram[0x3b]; |
r17963 | r17964 | |
379 | 379 | return ((deco16_prot_ram[0x9e/2]&0xff00)>>8) | ((deco16_prot_ram[0x9e/2]&0x00ff)<<8); |
380 | 380 | |
381 | 381 | case 0xac: /* Dip switches */ |
382 | return space | |
382 | return space.machine().root_device().ioport("DSW")->read(); | |
383 | 383 | case 0xc2: |
384 | return space | |
384 | return space.machine().root_device().ioport("DSW")->read() ^ deco16_prot_ram[0x2c/2]; | |
385 | 385 | |
386 | 386 | case 0x5d4: /* The state of the dips last frame */ |
387 | 387 | return deco16_prot_ram[0x34/2]; |
r17963 | r17964 | |
393 | 393 | return (((deco16_prot_ram[0]&0xfff0)>>0) | ((deco16_prot_ram[0]&0x000c)>>2) | ((deco16_prot_ram[0]&0x0003)<<2)) & (~deco16_prot_ram[0x36/2]); |
394 | 394 | |
395 | 395 | case 0x76a: /* Coins */ |
396 | return space | |
396 | return space.machine().root_device().ioport("IN1")->read(); | |
397 | 397 | |
398 | 398 | case 0x284: /* Bit shifting with inverted mask register */ |
399 | 399 | return (((deco16_prot_ram[0x40/2]&0xfff0)>>0) | ((deco16_prot_ram[0x40/2]&0x0007)<<1) | ((deco16_prot_ram[0x40/2]&0x0008)>>3)) & (~deco16_prot_ram[0x36/2]); |
r17963 | r17964 | |
407 | 407 | return (((deco16_prot_ram[0x6a/2]&0x00f0)<<4) | ((deco16_prot_ram[0x6a/2]&0x0f00)<<4) | ((deco16_prot_ram[0x6a/2]&0x0007)<<5) | ((deco16_prot_ram[0x6a/2]&0x0008)<<1)) & (~deco16_prot_ram[0x36/2]); |
408 | 408 | |
409 | 409 | case 0x7d6: /* XOR IN0 */ |
410 | return space | |
410 | return space.machine().root_device().ioport("IN0")->read() ^ deco16_prot_ram[0x2c/2]; | |
411 | 411 | case 0x4b4: |
412 | 412 | return ((deco16_prot_ram[0x32/2]&0x00f0)<<8) | ((deco16_prot_ram[0x32/2]&0x000e)<<7) | ((deco16_prot_ram[0x32/2]&0x0001)<<11); |
413 | 413 | } |
414 | 414 | |
415 | logerror("Protection PC %06x: warning - read unmapped memory address %04x\n",space | |
415 | logerror("Protection PC %06x: warning - read unmapped memory address %04x\n",space.device().safe_pc(),offset*2); | |
416 | 416 | return 0; |
417 | 417 | } |
418 | 418 | |
r17963 | r17964 | |
422 | 422 | |
423 | 423 | WRITE16_HANDLER( deco16_66_prot_w ) /* Mutant Fighter */ |
424 | 424 | { |
425 | driver_device *state = space | |
425 | driver_device *state = space.machine().driver_data<driver_device>(); | |
426 | 426 | if (offset == (0x64 / 2)) |
427 | 427 | { |
428 | state->soundlatch_byte_w(*space, 0, data & 0xff); | |
429 | space->machine().device("audiocpu")->execute().set_input_line(0, HOLD_LINE); | |
428 | state->soundlatch_byte_w(space, 0, data & 0xff); | |
429 | space.machine().device("audiocpu")->execute().set_input_line(0, HOLD_LINE); | |
430 | 430 | return; |
431 | 431 | } |
432 | 432 | |
r17963 | r17964 | |
458 | 458 | && offset!=0xb6 && offset!=0xfa && offset!=0xe4 && offset!=0x3a && offset!=0x1e |
459 | 459 | && offset!=0x38 && offset!=0x92 && offset!=0xa2 && offset!=0x308 && offset!=0x40e |
460 | 460 | ) |
461 | logerror("Protection PC %06x: warning - write %04x to %04x\n",space | |
461 | logerror("Protection PC %06x: warning - write %04x to %04x\n",space.device().safe_pc(),data,offset); | |
462 | 462 | } |
463 | 463 | |
464 | 464 | READ16_HANDLER( deco16_66_prot_r ) /* Mutant Fighter */ |
r17963 | r17964 | |
470 | 470 | |
471 | 471 | switch (offset*2) { |
472 | 472 | case 0xac: /* Dip switches */ |
473 | return space | |
473 | return space.machine().root_device().ioport("DSW")->read(); | |
474 | 474 | case 0xc2: /* Dip switches */ |
475 | return space | |
475 | return space.machine().root_device().ioport("DSW")->read() ^ deco16_prot_ram[0x2c/2]; | |
476 | 476 | case 0x46: /* Coins */ |
477 | return space | |
477 | return space.machine().root_device().ioport("IN1")->read() ^ deco16_prot_ram[0x2c/2]; | |
478 | 478 | case 0x50: /* Player 1 & 2 input ports */ |
479 | return space | |
479 | return space.machine().root_device().ioport("IN0")->read(); | |
480 | 480 | case 0x63c: /* Player 1 & 2 input ports */ |
481 | return space | |
481 | return space.machine().root_device().ioport("IN0")->read() ^ deco16_prot_ram[0x2c/2]; | |
482 | 482 | |
483 | 483 | case 0x5f4: |
484 | 484 | return deco16_prot_ram[0x18/2]; |
r17963 | r17964 | |
556 | 556 | { |
557 | 557 | int ret=mutantf_port_0e_hack; |
558 | 558 | mutantf_port_0e_hack=0x800; |
559 | //logerror("Protection PC %06x: warning - read unknown memory address %04x\n",space | |
559 | //logerror("Protection PC %06x: warning - read unknown memory address %04x\n",space.device().safe_pc(),offset<<1); | |
560 | 560 | return ret; |
561 | 561 | } |
562 | 562 | |
r17963 | r17964 | |
564 | 564 | { |
565 | 565 | int ret=mutantf_port_6a_hack; |
566 | 566 | mutantf_port_6a_hack=0x2866; |
567 | //logerror("Protection PC %06x: warning - read unknown memory address %04x\n",space | |
567 | //logerror("Protection PC %06x: warning - read unknown memory address %04x\n",space.device().safe_pc(),offset<<1); | |
568 | 568 | return ret; |
569 | 569 | } |
570 | 570 | |
r17963 | r17964 | |
572 | 572 | { |
573 | 573 | int ret=mutantf_port_e8_hack; |
574 | 574 | mutantf_port_e8_hack=0x2401; |
575 | //logerror("Protection PC %06x: warning - read unknown memory address %04x\n",space | |
575 | //logerror("Protection PC %06x: warning - read unknown memory address %04x\n",space.device().safe_pc(),offset<<1); | |
576 | 576 | return ret; |
577 | 577 | } |
578 | 578 | |
579 | 579 | case 0xaa: /* ??? */ |
580 | //logerror("Protection PC %06x: warning - read unknown memory address %04x\n",space | |
580 | //logerror("Protection PC %06x: warning - read unknown memory address %04x\n",space.device().safe_pc(),offset<<1); | |
581 | 581 | return 0xc080; |
582 | 582 | |
583 | 583 | case 0x42: /* Strange, but consistent */ |
584 | //logerror("Protection PC %06x: warning - read unknown memory address %04x\n",space | |
584 | //logerror("Protection PC %06x: warning - read unknown memory address %04x\n",space.device().safe_pc(),offset<<1); | |
585 | 585 | return deco16_prot_ram[0x2c/2]^0x5302; |
586 | 586 | |
587 | 587 | case 0x48: /* Correct for test data, but I wonder if the 0x1800 is from an address, not a constant */ |
588 | //logerror("Protection PC %06x: warning - read unmapped memory address %04x\n",space | |
588 | //logerror("Protection PC %06x: warning - read unmapped memory address %04x\n",space.device().safe_pc(),offset<<1); | |
589 | 589 | return (0x1800) & (~deco16_prot_ram[0x36/2]); |
590 | 590 | |
591 | 591 | case 0x52: |
r17963 | r17964 | |
602 | 602 | popmessage("Deco66: Read unmapped port %04x\n",offset*2); |
603 | 603 | #endif |
604 | 604 | |
605 | logerror("Protection PC %06x: warning - read unmapped memory address %04x\n",space | |
605 | logerror("Protection PC %06x: warning - read unmapped memory address %04x\n",space.device().safe_pc(),offset<<1); | |
606 | 606 | return 0; |
607 | 607 | } |
608 | 608 | |
r17963 | r17964 | |
610 | 610 | |
611 | 611 | WRITE16_HANDLER( deco16_104_cninja_prot_w ) |
612 | 612 | { |
613 | driver_device *state = space | |
613 | driver_device *state = space.machine().driver_data<driver_device>(); | |
614 | 614 | if (offset == (0xa8 / 2)) |
615 | 615 | { |
616 | state->soundlatch_byte_w(*space, 0, data & 0xff); | |
617 | space->machine().device("audiocpu")->execute().set_input_line(0, HOLD_LINE); | |
616 | state->soundlatch_byte_w(space, 0, data & 0xff); | |
617 | space.machine().device("audiocpu")->execute().set_input_line(0, HOLD_LINE); | |
618 | 618 | return; |
619 | 619 | } |
620 | 620 | |
r17963 | r17964 | |
655 | 655 | return deco16_prot_ram[15]; |
656 | 656 | |
657 | 657 | case 0x36: /* Dip switches */ |
658 | return space | |
658 | return space.machine().root_device().ioport("DSW")->read(); | |
659 | 659 | |
660 | 660 | case 0x1c8: /* Coins */ |
661 | return space | |
661 | return space.machine().root_device().ioport("IN1")->read(); | |
662 | 662 | |
663 | 663 | case 0x22c: /* Player 1 & 2 input ports */ |
664 | return space | |
664 | return space.machine().root_device().ioport("IN0")->read(); | |
665 | 665 | } |
666 | 666 | |
667 | logerror("Protection PC %06x: warning - read unmapped memory address %04x\n",space | |
667 | logerror("Protection PC %06x: warning - read unmapped memory address %04x\n",space.device().safe_pc(),offset); | |
668 | 668 | return 0; |
669 | 669 | } |
670 | 670 | |
r17963 | r17964 | |
672 | 672 | |
673 | 673 | WRITE16_HANDLER( deco16_146_funkyjet_prot_w ) |
674 | 674 | { |
675 | driver_device *state = space | |
675 | driver_device *state = space.machine().driver_data<driver_device>(); | |
676 | 676 | COMBINE_DATA(&deco16_prot_ram[offset]); |
677 | 677 | |
678 | 678 | if (offset == (0x10a >> 1)) |
679 | 679 | { |
680 | state->soundlatch_byte_w(*space, 0, data & 0xff); | |
681 | space->machine().device("audiocpu")->execute().set_input_line(0, HOLD_LINE); | |
680 | state->soundlatch_byte_w(space, 0, data & 0xff); | |
681 | space.machine().device("audiocpu")->execute().set_input_line(0, HOLD_LINE); | |
682 | 682 | return; |
683 | 683 | } |
684 | 684 | } |
r17963 | r17964 | |
753 | 753 | return ((deco16_prot_ram[0x78e>>1]>>4)&0xff00) | (deco16_prot_ram[0x78e>>1]&0x000f) | ((deco16_prot_ram[0x78e>>1]<<8)&0xf000); |
754 | 754 | |
755 | 755 | case 0x00c >> 1: /* Player 1 & Player 2 joysticks & fire buttons */ |
756 | return space | |
756 | return space.machine().root_device().ioport("INPUTS")->read(); | |
757 | 757 | case 0x778 >> 1: /* Credits */ |
758 | return space | |
758 | return space.machine().root_device().ioport("SYSTEM")->read(); | |
759 | 759 | case 0x382 >> 1: /* DIPS */ |
760 | return space | |
760 | return space.machine().root_device().ioport("DSW")->read(); | |
761 | 761 | } |
762 | 762 | |
763 | if (space->device().safe_pc()!=0xc0ea) | |
764 | logerror("CPU #0 PC %06x: warning - read unmapped control address %06x (ctrl %04x)\n", space->device().safe_pc(), offset<<1, space->machine().root_device().ioport("INPUTS")->read()); | |
763 | if (space.device().safe_pc()!=0xc0ea) | |
764 | logerror("CPU #0 PC %06x: warning - read unmapped control address %06x (ctrl %04x)\n", space.device().safe_pc(), offset<<1, space.machine().root_device().ioport("INPUTS")->read()); | |
765 | 765 | |
766 | 766 | return 0; |
767 | 767 | } |
r17963 | r17964 | |
794 | 794 | COMBINE_DATA(&decoprot_buffer_ram[offset]); |
795 | 795 | else |
796 | 796 | COMBINE_DATA(&deco16_prot_ram[offset]); |
797 | driver_device *state = space | |
797 | driver_device *state = space.machine().driver_data<driver_device>(); | |
798 | 798 | if (offset == (0xa8 / 2)) |
799 | 799 | { |
800 | state->soundlatch_byte_w(*space, 0, data & 0xff); | |
801 | space->machine().device("audiocpu")->execute().set_input_line(0, HOLD_LINE); | |
800 | state->soundlatch_byte_w(space, 0, data & 0xff); | |
801 | space.machine().device("audiocpu")->execute().set_input_line(0, HOLD_LINE); | |
802 | 802 | return; |
803 | 803 | } |
804 | 804 | |
r17963 | r17964 | |
810 | 810 | |
811 | 811 | offset=offset*2; |
812 | 812 | |
813 | //logerror("CONTROL PC %06x: warning - write protection memory address %04x %04x\n",space | |
813 | //logerror("CONTROL PC %06x: warning - write protection memory address %04x %04x\n",space.device().safe_pc(),offset,data); | |
814 | 814 | if (offset==0xee || offset==0x42 || offset==0xa8) |
815 | 815 | return; |
816 | 816 | |
817 | // logerror("CONTROL PC %06x: warning - write protection memory address %04x %04x\n",space | |
817 | // logerror("CONTROL PC %06x: warning - write protection memory address %04x %04x\n",space.device().safe_pc(),offset,data); | |
818 | 818 | |
819 | 819 | #if 1 |
820 | 820 | // 66 7c 7e 28 58 4a 9e |
r17963 | r17964 | |
831 | 831 | return; |
832 | 832 | |
833 | 833 | // if (offset==0x3c) |
834 | // logerror("CONTROL PC %06x: warning - write protection memory address %04x %04x\n",space | |
834 | // logerror("CONTROL PC %06x: warning - write protection memory address %04x %04x\n",space.device().safe_pc(),offset,data); | |
835 | 835 | // Actually read: |
836 | 836 | // 22 24 26 2c 2e 30 32 3c 40 44 46 48 60 62 66 6a 6e 76 7e 80 82 84 86 88 8a 8c 90 94 96 98 9a 9c a0 c0 c4 c6 c8 cc ce d6 dc de |
837 | 837 | |
r17963 | r17964 | |
859 | 859 | return; |
860 | 860 | #endif |
861 | 861 | |
862 | logerror("CONTROL PC %06x: warning - write unmapped protection memory address %04x %04x\n",space | |
862 | logerror("CONTROL PC %06x: warning - write unmapped protection memory address %04x %04x\n",space.device().safe_pc(),offset,data); | |
863 | 863 | } |
864 | 864 | |
865 | 865 | READ16_HANDLER( deco16_104_rohga_prot_r ) |
r17963 | r17964 | |
867 | 867 | const UINT16* prot_ram=decoprot_buffer_ram_selected ? decoprot_buffer_ram : deco16_prot_ram; |
868 | 868 | |
869 | 869 | // if (offset!=0x88/2 && offset!=0x44c/2 && offset!=0x36c/2 && offset!=0x292/2) |
870 | // logerror("Protection PC %06x: warning - read prot address %04x\n",space | |
870 | // logerror("Protection PC %06x: warning - read prot address %04x\n",space.device().safe_pc(),offset<<1); | |
871 | 871 | |
872 | 872 | switch (offset) { |
873 | 873 | case 0x88/2: /* Player 1 & 2 input ports */ |
874 | return space | |
874 | return space.machine().root_device().ioport("IN0")->read(); | |
875 | 875 | case 0x36c/2: |
876 | return space | |
876 | return space.machine().root_device().ioport("IN1")->read(); | |
877 | 877 | case 0x44c/2: |
878 | return ((space | |
878 | return ((space.machine().root_device().ioport("IN1")->read() & 0x7)<<13)|((space.machine().root_device().ioport("IN1")->read() & 0x8)<<9); | |
879 | 879 | case 0x292/2: /* Dips */ |
880 | return space | |
880 | return space.machine().root_device().ioport("DSW1_2")->read(); | |
881 | 881 | |
882 | 882 | case 0x44/2: |
883 | 883 | return ((((DECO_PORT(0x2c)&0x000f)<<12)) ^ deco16_xor) & (~deco16_mask); |
r17963 | r17964 | |
1212 | 1212 | return DECO_PORT(0x58); |
1213 | 1213 | } |
1214 | 1214 | |
1215 | logerror("Protection PC %06x: warning - read unmapped protection address %04x\n",space | |
1215 | logerror("Protection PC %06x: warning - read unmapped protection address %04x\n",space.device().safe_pc(),offset<<1); | |
1216 | 1216 | |
1217 | 1217 | return 0; |
1218 | 1218 | } |
r17963 | r17964 | |
1221 | 1221 | |
1222 | 1222 | static WRITE16_HANDLER( deco16_146_core_prot_w ) |
1223 | 1223 | { |
1224 | driver_device *state = space | |
1224 | driver_device *state = space.machine().driver_data<driver_device>(); | |
1225 | 1225 | const int writeport=offset; |
1226 | 1226 | const int sndport=0x260; |
1227 | 1227 | const int xorport=0x340; |
1228 | 1228 | const int maskport=0x6c0; |
1229 | 1229 | if (writeport == sndport) |
1230 | 1230 | { |
1231 | state->soundlatch_byte_w(*space, 0, data & 0xff); | |
1232 | space->machine().device("audiocpu")->execute().set_input_line(0, HOLD_LINE); | |
1231 | state->soundlatch_byte_w(space, 0, data & 0xff); | |
1232 | space.machine().device("audiocpu")->execute().set_input_line(0, HOLD_LINE); | |
1233 | 1233 | return; |
1234 | 1234 | } |
1235 | 1235 | |
r17963 | r17964 | |
1244 | 1244 | COMBINE_DATA(&decoprot_buffer_ram[offset>>1]); |
1245 | 1245 | |
1246 | 1246 | // if (offset!=0x5e0 && offset!=0x340 && offset!=0 && offset!=0x3d0 && offset!=0x280) |
1247 | // logerror("%08x: Write protection port %04x, data %04x (%08x)\n", space | |
1247 | // logerror("%08x: Write protection port %04x, data %04x (%08x)\n", space.device().safe_pc(), offset, data, mem_mask); | |
1248 | 1248 | } |
1249 | 1249 | |
1250 | 1250 | static READ16_HANDLER( deco16_146_core_prot_r ) |
r17963 | r17964 | |
1256 | 1256 | switch (offset) |
1257 | 1257 | { |
1258 | 1258 | case 0x582: /* Player 1 & Player 2 */ |
1259 | return space | |
1259 | return space.machine().root_device().ioport("IN0")->read(); | |
1260 | 1260 | case 0x04c: /* Coins/VBL */ |
1261 | return space | |
1261 | return space.machine().root_device().ioport("IN1")->read(); | |
1262 | 1262 | case 0x672: /* Dip switches */ |
1263 | return space | |
1263 | return space.machine().root_device().ioport("DSW1_2")->read(); | |
1264 | 1264 | |
1265 | 1265 | case 0x13a: |
1266 | 1266 | return ((DECO_PORT(0x190)&0x00f0)<<8) | ((DECO_PORT(0x190)&0x0003)<<10) | ((DECO_PORT(0x190)&0x000c)<<6); |
r17963 | r17964 | |
1318 | 1318 | |
1319 | 1319 | /*********************************************************************************/ |
1320 | 1320 | |
1321 | // case 0x582: return space->machine().root_device().ioport("IN0")->read(); /* IN0 */ | |
1322 | // case 0x672: return space->machine().root_device().ioport("IN1")->read(); /* IN1 */ | |
1323 | // case 0x04c: return space->machine().device<eeprom_device>("eeprom")->read_bit(); | |
1321 | // case 0x582: return space.machine().root_device().ioport("IN0")->read(); /* IN0 */ | |
1322 | // case 0x672: return space.machine().root_device().ioport("IN1")->read(); /* IN1 */ | |
1323 | // case 0x04c: return space.machine().device<eeprom_device>("eeprom")->read_bit(); | |
1324 | 1324 | |
1325 | 1325 | case 0x468: |
1326 | 1326 | val=DECO_PORT(0x570); |
r17963 | r17964 | |
1642 | 1642 | return val & (~deco16_mask); |
1643 | 1643 | } |
1644 | 1644 | |
1645 | //logerror("Protection PC %06x: warning - read fully unmapped protection address %04x\n", space | |
1645 | //logerror("Protection PC %06x: warning - read fully unmapped protection address %04x\n", space.device().safe_pc(), offset); | |
1646 | 1646 | |
1647 | 1647 | return 0; |
1648 | 1648 | } |
r17963 | r17964 | |
1667 | 1667 | /* Special case inputs, because this is the only game with an eprom */ |
1668 | 1668 | switch (addr) |
1669 | 1669 | { |
1670 | case 0x582: return (space->machine().root_device().ioport("IN0")->read()<<16) | 0xffff; /* IN0 */ | |
1671 | case 0x672: return (space->machine().root_device().ioport("IN1")->read()<<16) | 0xffff; /* IN1 */ | |
1672 | case 0x04c: return (space->machine().device<eeprom_device>("eeprom")->read_bit()<<16) | 0xffff; | |
1670 | case 0x582: return (space.machine().root_device().ioport("IN0")->read()<<16) | 0xffff; /* IN0 */ | |
1671 | case 0x672: return (space.machine().root_device().ioport("IN1")->read()<<16) | 0xffff; /* IN1 */ | |
1672 | case 0x04c: return (space.machine().device<eeprom_device>("eeprom")->read_bit()<<16) | 0xffff; | |
1673 | 1673 | } |
1674 | 1674 | |
1675 | 1675 | /* Handle 'one shots' - writing data to an address, then immediately reading it back */ |
r17963 | r17964 | |
1694 | 1694 | && addr!=0x1ae && addr!=0x1d6 && addr!=0x4f8 && addr!=0x614 // cnofirmed |
1695 | 1695 | && addr!=0x5ae && addr!=0x50a && addr!=0x476 && addr!=0x328 && addr!=0x3e && addr!=0x558 // dbl check these later |
1696 | 1696 | && addr!=0x444 && addr!=0x46a // confirmed |
1697 | && space | |
1697 | && space.device().safe_pc()!=0x16448 // hmm | |
1698 | 1698 | && addr!=0x67a |
1699 | 1699 | && addr!=0x6c2 && addr!=0xac && addr!=0x416 && addr!=0x2c2 // confirmed |
1700 | 1700 | && addr!=0x3d8 |
r17963 | r17964 | |
1717 | 1717 | && addr!=0x440 && addr!=0x460 |
1718 | 1718 | ) |
1719 | 1719 | { |
1720 | logerror("Protection PC %06x: warning - read unmapped protection address %04x (ret %04x)\n", space | |
1720 | logerror("Protection PC %06x: warning - read unmapped protection address %04x (ret %04x)\n", space.device().safe_pc(), addr, val); | |
1721 | 1721 | popmessage("Read protection port %04x", addr); |
1722 | 1722 | } |
1723 | // logerror("Protection PC %06x: warning - read unmapped protection address %04x (ret %04x)\n", space | |
1723 | // logerror("Protection PC %06x: warning - read unmapped protection address %04x (ret %04x)\n", space.device().safe_pc(), addr, val); | |
1724 | 1724 | |
1725 | 1725 | return (val<<16)|0xffff; |
1726 | 1726 | } |
r17963 | r17964 | |
1743 | 1743 | { |
1744 | 1744 | switch (offset * 2) |
1745 | 1745 | { |
1746 | case 0x298: return space->machine().root_device().ioport("IN0")->read(); | |
1747 | case 0x342: return space->machine().root_device().ioport("IN1")->read(); | |
1748 | case 0x506: return space->machine().root_device().ioport("DSW")->read(); | |
1746 | case 0x298: return space.machine().root_device().ioport("IN0")->read(); | |
1747 | case 0x342: return space.machine().root_device().ioport("IN1")->read(); | |
1748 | case 0x506: return space.machine().root_device().ioport("DSW")->read(); | |
1749 | 1749 | } |
1750 | 1750 | |
1751 | logerror("Protection PC %06x: warning - read unmapped memory address %04x\n", space | |
1751 | logerror("Protection PC %06x: warning - read unmapped memory address %04x\n", space.device().safe_pc(), offset<<1); | |
1752 | 1752 | |
1753 | 1753 | return 0; |
1754 | 1754 | } |
1755 | 1755 | |
1756 | 1756 | WRITE16_HANDLER( dietgo_104_prot_w ) |
1757 | 1757 | { |
1758 | driver_device *state = space | |
1758 | driver_device *state = space.machine().driver_data<driver_device>(); | |
1759 | 1759 | if (offset == (0x380 / 2)) |
1760 | 1760 | { |
1761 | state->soundlatch_byte_w(*space, 0, data & 0xff); | |
1762 | space->machine().device("audiocpu")->execute().set_input_line(0, HOLD_LINE); | |
1761 | state->soundlatch_byte_w(space, 0, data & 0xff); | |
1762 | space.machine().device("audiocpu")->execute().set_input_line(0, HOLD_LINE); | |
1763 | 1763 | return; |
1764 | 1764 | } |
1765 | logerror("Protection PC %06x: warning - write unmapped memory address %04x %04x\n", space | |
1765 | logerror("Protection PC %06x: warning - write unmapped memory address %04x %04x\n", space.device().safe_pc(), offset << 1, data); | |
1766 | 1766 | } |
1767 | 1767 | |
1768 | 1768 | /**********************************************************************************/ |
r17963 | r17964 | |
1772 | 1772 | const UINT16* prot_ram=deco16_prot_ram; |
1773 | 1773 | switch (offset * 2) |
1774 | 1774 | { |
1775 | case 0x5b2: return space->machine().root_device().ioport("SYSTEM")->read(); | |
1776 | case 0x44c: return space->machine().root_device().ioport("DSW")->read(); | |
1777 | case 0x042: return space->machine().root_device().ioport("INPUTS")->read(); | |
1775 | case 0x5b2: return space.machine().root_device().ioport("SYSTEM")->read(); | |
1776 | case 0x44c: return space.machine().root_device().ioport("DSW")->read(); | |
1777 | case 0x042: return space.machine().root_device().ioport("INPUTS")->read(); | |
1778 | 1778 | |
1779 | 1779 | case 0x510: return DECO_PORT(0); |
1780 | 1780 | case 0x51a: return DECO_PORT(2); |
1781 | 1781 | } |
1782 | 1782 | |
1783 | logerror("Protection PC %06x: warning - read unmapped memory address %04x\n", space | |
1783 | logerror("Protection PC %06x: warning - read unmapped memory address %04x\n", space.device().safe_pc(), offset<<1); | |
1784 | 1784 | |
1785 | 1785 | return 0; |
1786 | 1786 | } |
r17963 | r17964 | |
1788 | 1788 | WRITE16_HANDLER( deco16_104_pktgaldx_prot_w ) |
1789 | 1789 | { |
1790 | 1790 | COMBINE_DATA(&deco16_prot_ram[offset]); |
1791 | // logerror("Protection PC %06x: warning - write unmapped memory address %04x %04x\n",space | |
1791 | // logerror("Protection PC %06x: warning - write unmapped memory address %04x %04x\n",space.device().safe_pc(),offset<<1,data); | |
1792 | 1792 | } |
1793 | 1793 | |
1794 | 1794 | /**********************************************************************************/ |
r17963 | r17964 | |
---|---|---|
6 | 6 | |
7 | 7 | static void cclimber_decode(running_machine &machine, const UINT8 convtable[8][16]) |
8 | 8 | { |
9 | address_space | |
9 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
10 | 10 | UINT8 *rom = machine.root_device().memregion("maincpu")->base(); |
11 | 11 | UINT8 *decrypt = auto_alloc_array(machine, UINT8, 0x10000); |
12 | 12 | int A; |
13 | 13 | |
14 | space | |
14 | space.set_decrypted_region(0x0000, 0xffff, decrypt); | |
15 | 15 | |
16 | 16 | for (A = 0x0000;A < 0x10000;A++) |
17 | 17 | { |
r17963 | r17964 | |
---|---|---|
485 | 485 | return retdata; |
486 | 486 | } |
487 | 487 | |
488 | static void vdp_data_w(address_space | |
488 | static void vdp_data_w(address_space &space, UINT8 data, struct sms_vdp* chip) | |
489 | 489 | { |
490 | 490 | /* data writes clear the pending flag */ |
491 | 491 | chip->cmd_pend = 0; |
r17963 | r17964 | |
522 | 522 | g = (palword & 0x00f0)>>4; |
523 | 523 | b = (palword & 0x0f00)>>8; |
524 | 524 | rgb_t rgb = MAKE_RGB(pal4bit(r), pal4bit(g), pal4bit(b)); |
525 | //palette_set_color(space | |
525 | //palette_set_color(space.machine(),(chip->addr_reg&0x3e)/2, rgb); | |
526 | 526 | chip->cram_mamecolours[(chip->addr_reg&0x3e)/2]=rgb; |
527 | 527 | } |
528 | 528 | } |
r17963 | r17964 | |
538 | 538 | g = (data & 0x0c)>>2; |
539 | 539 | b = (data & 0x30)>>4; |
540 | 540 | rgb_t rgb = MAKE_RGB(pal2bit(r), pal2bit(g), pal2bit(b)); |
541 | //palette_set_color(space | |
541 | //palette_set_color(space.machine(),chip->addr_reg&0x1f, rgb); | |
542 | 542 | chip->cram_mamecolours[chip->addr_reg&0x1f]=rgb; |
543 | 543 | } |
544 | 544 | |
r17963 | r17964 | |
551 | 551 | |
552 | 552 | } |
553 | 553 | |
554 | static UINT8 vdp_ctrl_r(address_space | |
554 | static UINT8 vdp_ctrl_r(address_space &space, struct sms_vdp *chip) | |
555 | 555 | { |
556 | 556 | UINT8 retvalue; |
557 | 557 | |
r17963 | r17964 | |
565 | 565 | chip->sprite_collision = 0; |
566 | 566 | chip->sprite_overflow = 0; |
567 | 567 | |
568 | (chip->set_irq)(space | |
568 | (chip->set_irq)(space.machine(), 0); // clear IRQ; | |
569 | 569 | |
570 | 570 | |
571 | 571 | return retvalue; |
r17963 | r17964 | |
615 | 615 | // printf("VDP: setting register %01x to %02x\n",reg, chip->cmd_part1); |
616 | 616 | } |
617 | 617 | |
618 | static void vdp_ctrl_w(address_space | |
618 | static void vdp_ctrl_w(address_space &space, UINT8 data, struct sms_vdp *chip) | |
619 | 619 | { |
620 | 620 | if (chip->cmd_pend) |
621 | 621 | { /* Part 2 of a command word write */ |
r17963 | r17964 | |
636 | 636 | break; |
637 | 637 | |
638 | 638 | case 0x2: /* REG setting */ |
639 | vdp_set_register(space | |
639 | vdp_set_register(space.machine(), chip); | |
640 | 640 | chip->writemode = 0; |
641 | 641 | break; |
642 | 642 | |
r17963 | r17964 | |
1479 | 1479 | |
1480 | 1480 | READ8_HANDLER( sms_ioport_gg00_r ) |
1481 | 1481 | { |
1482 | return ioport_gg00_r(space | |
1482 | return ioport_gg00_r(space.machine()); | |
1483 | 1483 | } |
1484 | 1484 | |
1485 | 1485 | |
r17963 | r17964 | |
1564 | 1564 | /* the SMS inputs should be more complex, like the megadrive ones */ |
1565 | 1565 | READ8_HANDLER (megatech_sms_ioport_dc_r) |
1566 | 1566 | { |
1567 | running_machine &machine = space | |
1567 | running_machine &machine = space.machine(); | |
1568 | 1568 | /* 2009-05 FP: would it be worth to give separate inputs to SMS? SMS has only 2 keys A,B (which are B,C on megadrive) */ |
1569 | 1569 | /* bit 4: TL-A; bit 5: TR-A */ |
1570 | 1570 | return (machine.root_device().ioport("PAD1")->read() & 0x3f) | ((machine.root_device().ioport("PAD2")->read() & 0x03) << 6); |
r17963 | r17964 | |
1572 | 1572 | |
1573 | 1573 | READ8_HANDLER (megatech_sms_ioport_dd_r) |
1574 | 1574 | { |
1575 | running_machine &machine = space | |
1575 | running_machine &machine = space.machine(); | |
1576 | 1576 | /* 2009-05 FP: would it be worth to give separate inputs to SMS? SMS has only 2 keys A,B (which are B,C on megadrive) */ |
1577 | 1577 | /* bit 2: TL-B; bit 3: TR-B; bit 4: RESET; bit 5: unused; bit 6: TH-A; bit 7: TH-B*/ |
1578 | 1578 | return ((machine.root_device().ioport("PAD2")->read() & 0x3c) >> 2) | 0x10; |
r17963 | r17964 | |
1602 | 1602 | logerror("bank w %02x %02x\n", offset, data); |
1603 | 1603 | if ((data & 0x08) && smsgg_backupram) |
1604 | 1604 | { |
1605 | space | |
1605 | space.install_legacy_readwrite_handler(0x8000, 0x9fff, FUNC(smsgg_backupram_r), FUNC(smsgg_backupram_w)); | |
1606 | 1606 | } |
1607 | 1607 | else |
1608 | 1608 | { |
1609 | space->install_rom(0x0000, 0xbfff, sms_rom); | |
1610 | space->unmap_write(0x0000, 0xbfff); | |
1609 | space.install_rom(0x0000, 0xbfff, sms_rom); | |
1610 | space.unmap_write(0x0000, 0xbfff); | |
1611 | 1611 | } |
1612 | 1612 | |
1613 | 1613 | //printf("bank ram??\n"); |
1614 | 1614 | break; |
1615 | 1615 | case 1: |
1616 | memcpy(sms_rom+0x0000, space | |
1616 | memcpy(sms_rom+0x0000, space.machine().root_device().memregion("maincpu")->base()+bank*0x4000, 0x4000); | |
1617 | 1617 | break; |
1618 | 1618 | case 2: |
1619 | memcpy(sms_rom+0x4000, space | |
1619 | memcpy(sms_rom+0x4000, space.machine().root_device().memregion("maincpu")->base()+bank*0x4000, 0x4000); | |
1620 | 1620 | break; |
1621 | 1621 | case 3: |
1622 | memcpy(sms_rom+0x8000, space | |
1622 | memcpy(sms_rom+0x8000, space.machine().root_device().memregion("maincpu")->base()+bank*0x4000, 0x4000); | |
1623 | 1623 | break; |
1624 | 1624 | |
1625 | 1625 | } |
r17963 | r17964 | |
1628 | 1628 | static WRITE8_HANDLER( codemasters_rom_bank_0000_w ) |
1629 | 1629 | { |
1630 | 1630 | int bank = data&0x1f; |
1631 | memcpy(sms_rom+0x0000, space | |
1631 | memcpy(sms_rom+0x0000, space.machine().root_device().memregion("maincpu")->base()+bank*0x4000, 0x4000); | |
1632 | 1632 | } |
1633 | 1633 | |
1634 | 1634 | static WRITE8_HANDLER( codemasters_rom_bank_4000_w ) |
1635 | 1635 | { |
1636 | 1636 | int bank = data&0x1f; |
1637 | memcpy(sms_rom+0x4000, space | |
1637 | memcpy(sms_rom+0x4000, space.machine().root_device().memregion("maincpu")->base()+bank*0x4000, 0x4000); | |
1638 | 1638 | } |
1639 | 1639 | |
1640 | 1640 | static WRITE8_HANDLER( codemasters_rom_bank_8000_w ) |
1641 | 1641 | { |
1642 | 1642 | int bank = data&0x1f; |
1643 | memcpy(sms_rom+0x8000, space | |
1643 | memcpy(sms_rom+0x8000, space.machine().root_device().memregion("maincpu")->base()+bank*0x4000, 0x4000); | |
1644 | 1644 | } |
1645 | 1645 | |
1646 | 1646 |
r17963 | r17964 | |
---|---|---|
21 | 21 | |
22 | 22 | READ8_HANDLER( maniach_68705_port_a_r ) |
23 | 23 | { |
24 | matmania_state *state = space | |
24 | matmania_state *state = space.machine().driver_data<matmania_state>(); | |
25 | 25 | |
26 | //logerror("%04x: 68705 port A read %02x\n", space | |
26 | //logerror("%04x: 68705 port A read %02x\n", space.device().safe_pc(), state->m_port_a_in); | |
27 | 27 | return (state->m_port_a_out & state->m_ddr_a) | (state->m_port_a_in & ~state->m_ddr_a); |
28 | 28 | } |
29 | 29 | |
30 | 30 | WRITE8_HANDLER( maniach_68705_port_a_w ) |
31 | 31 | { |
32 | matmania_state *state = space | |
32 | matmania_state *state = space.machine().driver_data<matmania_state>(); | |
33 | 33 | |
34 | //logerror("%04x: 68705 port A write %02x\n", space | |
34 | //logerror("%04x: 68705 port A write %02x\n", space.device().safe_pc(), data); | |
35 | 35 | state->m_port_a_out = data; |
36 | 36 | } |
37 | 37 | |
38 | 38 | WRITE8_HANDLER( maniach_68705_ddr_a_w ) |
39 | 39 | { |
40 | matmania_state *state = space | |
40 | matmania_state *state = space.machine().driver_data<matmania_state>(); | |
41 | 41 | state->m_ddr_a = data; |
42 | 42 | } |
43 | 43 | |
r17963 | r17964 | |
54 | 54 | |
55 | 55 | READ8_HANDLER( maniach_68705_port_b_r ) |
56 | 56 | { |
57 | matmania_state *state = space | |
57 | matmania_state *state = space.machine().driver_data<matmania_state>(); | |
58 | 58 | return (state->m_port_b_out & state->m_ddr_b) | (state->m_port_b_in & ~state->m_ddr_b); |
59 | 59 | } |
60 | 60 | |
61 | 61 | WRITE8_HANDLER( maniach_68705_port_b_w ) |
62 | 62 | { |
63 | matmania_state *state = space | |
63 | matmania_state *state = space.machine().driver_data<matmania_state>(); | |
64 | 64 | |
65 | //logerror("%04x: 68705 port B write %02x\n", space | |
65 | //logerror("%04x: 68705 port B write %02x\n", space.device().safe_pc(), data); | |
66 | 66 | |
67 | 67 | if (BIT(state->m_ddr_b, 1) && BIT(~data, 1) && BIT(state->m_port_b_out, 1)) |
68 | 68 | { |
r17963 | r17964 | |
82 | 82 | |
83 | 83 | WRITE8_HANDLER( maniach_68705_ddr_b_w ) |
84 | 84 | { |
85 | matmania_state *state = space | |
85 | matmania_state *state = space.machine().driver_data<matmania_state>(); | |
86 | 86 | state->m_ddr_b = data; |
87 | 87 | } |
88 | 88 | |
89 | 89 | |
90 | 90 | READ8_HANDLER( maniach_68705_port_c_r ) |
91 | 91 | { |
92 | matmania_state *state = space | |
92 | matmania_state *state = space.machine().driver_data<matmania_state>(); | |
93 | 93 | |
94 | 94 | state->m_port_c_in = 0; |
95 | 95 | |
r17963 | r17964 | |
106 | 106 | |
107 | 107 | WRITE8_HANDLER( maniach_68705_port_c_w ) |
108 | 108 | { |
109 | matmania_state *state = space | |
109 | matmania_state *state = space.machine().driver_data<matmania_state>(); | |
110 | 110 | |
111 | //logerror("%04x: 68705 port C write %02x\n", space | |
111 | //logerror("%04x: 68705 port C write %02x\n", space.device().safe_pc(), data); | |
112 | 112 | state->m_port_c_out = data; |
113 | 113 | } |
114 | 114 | |
115 | 115 | WRITE8_HANDLER( maniach_68705_ddr_c_w ) |
116 | 116 | { |
117 | matmania_state *state = space | |
117 | matmania_state *state = space.machine().driver_data<matmania_state>(); | |
118 | 118 | state->m_ddr_c = data; |
119 | 119 | } |
120 | 120 | |
121 | 121 | |
122 | 122 | WRITE8_HANDLER( maniach_mcu_w ) |
123 | 123 | { |
124 | matmania_state *state = space | |
124 | matmania_state *state = space.machine().driver_data<matmania_state>(); | |
125 | 125 | |
126 | //logerror("%04x: 3040_w %02x\n", space | |
126 | //logerror("%04x: 3040_w %02x\n", space.device().safe_pc(), data); | |
127 | 127 | state->m_from_main = data; |
128 | 128 | state->m_main_sent = 1; |
129 | 129 | } |
130 | 130 | |
131 | 131 | READ8_HANDLER( maniach_mcu_r ) |
132 | 132 | { |
133 | matmania_state *state = space | |
133 | matmania_state *state = space.machine().driver_data<matmania_state>(); | |
134 | 134 | |
135 | //logerror("%04x: 3040_r %02x\n", space | |
135 | //logerror("%04x: 3040_r %02x\n", space.device().safe_pc(), state->m_from_mcu); | |
136 | 136 | state->m_mcu_sent = 0; |
137 | 137 | return state->m_from_mcu; |
138 | 138 | } |
139 | 139 | |
140 | 140 | READ8_HANDLER( maniach_mcu_status_r ) |
141 | 141 | { |
142 | matmania_state *state = space | |
142 | matmania_state *state = space.machine().driver_data<matmania_state>(); | |
143 | 143 | int res = 0; |
144 | 144 | |
145 | 145 | /* bit 0 = when 0, mcu has sent data to the main cpu */ |
146 | 146 | /* bit 1 = when 1, mcu is ready to receive data from main cpu */ |
147 | //logerror("%04x: 3041_r\n", space | |
147 | //logerror("%04x: 3041_r\n", space.device().safe_pc()); | |
148 | 148 | if (!state->m_mcu_sent) |
149 | 149 | res |= 0x01; |
150 | 150 | if (!state->m_main_sent) |
r17963 | r17964 | |
---|---|---|
123 | 123 | |
124 | 124 | WRITE16_HANDLER( hd68k_irq_ack_w ) |
125 | 125 | { |
126 | harddriv_state *state = space | |
126 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
127 | 127 | state->m_irq_state = 0; |
128 | atarigen_update_interrupts(space | |
128 | atarigen_update_interrupts(space.machine()); | |
129 | 129 | } |
130 | 130 | |
131 | 131 | |
r17963 | r17964 | |
154 | 154 | |
155 | 155 | READ16_HANDLER( hd68k_gsp_io_r ) |
156 | 156 | { |
157 | harddriv_state *state = space | |
157 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
158 | 158 | UINT16 result; |
159 | 159 | offset = (offset / 2) ^ 1; |
160 | 160 | state->m_hd34010_host_access = TRUE; |
r17963 | r17964 | |
166 | 166 | |
167 | 167 | WRITE16_HANDLER( hd68k_gsp_io_w ) |
168 | 168 | { |
169 | harddriv_state *state = space | |
169 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
170 | 170 | offset = (offset / 2) ^ 1; |
171 | 171 | state->m_hd34010_host_access = TRUE; |
172 | 172 | tms34010_host_w(state->m_gsp, offset, data); |
r17963 | r17964 | |
183 | 183 | |
184 | 184 | READ16_HANDLER( hd68k_msp_io_r ) |
185 | 185 | { |
186 | harddriv_state *state = space | |
186 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
187 | 187 | UINT16 result; |
188 | 188 | offset = (offset / 2) ^ 1; |
189 | 189 | state->m_hd34010_host_access = TRUE; |
r17963 | r17964 | |
195 | 195 | |
196 | 196 | WRITE16_HANDLER( hd68k_msp_io_w ) |
197 | 197 | { |
198 | harddriv_state *state = space | |
198 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
199 | 199 | offset = (offset / 2) ^ 1; |
200 | 200 | if (state->m_msp != NULL) |
201 | 201 | { |
r17963 | r17964 | |
230 | 230 | ..... |
231 | 231 | 0x8000 = SW1 #1 |
232 | 232 | */ |
233 | int temp = (space->machine().root_device().ioport("SW1")->read() << 8) | space->machine().root_device().ioport("IN0")->read(); | |
234 | if (atarigen_get_hblank(*space->machine().primary_screen)) temp ^= 0x0002; | |
233 | int temp = (space.machine().root_device().ioport("SW1")->read() << 8) | space.machine().root_device().ioport("IN0")->read(); | |
234 | if (atarigen_get_hblank(*space.machine().primary_screen)) temp ^= 0x0002; | |
235 | 235 | temp ^= 0x0018; /* both EOCs always high for now */ |
236 | 236 | return temp; |
237 | 237 | } |
r17963 | r17964 | |
239 | 239 | |
240 | 240 | READ16_HANDLER( hdc68k_port1_r ) |
241 | 241 | { |
242 | harddriv_state *state = space | |
242 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
243 | 243 | UINT16 result = state->ioport("a80000")->read(); |
244 | 244 | UINT16 diff = result ^ state->m_hdc68k_last_port1; |
245 | 245 | |
r17963 | r17964 | |
268 | 268 | |
269 | 269 | READ16_HANDLER( hda68k_port1_r ) |
270 | 270 | { |
271 | harddriv_state *state = space | |
271 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
272 | 272 | UINT16 result = state->ioport("a80000")->read(); |
273 | 273 | |
274 | 274 | /* merge in the wheel edge latch bit */ |
r17963 | r17964 | |
281 | 281 | |
282 | 282 | READ16_HANDLER( hdc68k_wheel_r ) |
283 | 283 | { |
284 | harddriv_state *state = space | |
284 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
285 | 285 | |
286 | 286 | /* grab the new wheel value and upconvert to 12 bits */ |
287 | 287 | UINT16 new_wheel = state->ioport("12BADC0")->read() << 4; |
288 | 288 | |
289 | 289 | /* hack to display the wheel position */ |
290 | if (space | |
290 | if (space.machine().input().code_pressed(KEYCODE_LSHIFT)) | |
291 | 291 | popmessage("%04X", new_wheel); |
292 | 292 | |
293 | 293 | /* if we crossed the center line, latch the edge bit */ |
r17963 | r17964 | |
302 | 302 | |
303 | 303 | READ16_HANDLER( hd68k_adc8_r ) |
304 | 304 | { |
305 | harddriv_state *state = space | |
305 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
306 | 306 | return state->m_adc8_data; |
307 | 307 | } |
308 | 308 | |
309 | 309 | |
310 | 310 | READ16_HANDLER( hd68k_adc12_r ) |
311 | 311 | { |
312 | harddriv_state *state = space | |
312 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
313 | 313 | return state->m_adc12_byte ? ((state->m_adc12_data >> 8) & 0x0f) : (state->m_adc12_data & 0xff); |
314 | 314 | } |
315 | 315 | |
316 | 316 | |
317 | 317 | READ16_HANDLER( hd68k_sound_reset_r ) |
318 | 318 | { |
319 | harddriv_state *state = space | |
319 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
320 | 320 | if (state->m_jsacpu != NULL) |
321 | 321 | atarijsa_reset(); |
322 | 322 | return ~0; |
r17963 | r17964 | |
334 | 334 | { |
335 | 335 | static const char *const adc8names[] = { "8BADC0", "8BADC1", "8BADC2", "8BADC3", "8BADC4", "8BADC5", "8BADC6", "8BADC7" }; |
336 | 336 | static const char *const adc12names[] = { "12BADC0", "12BADC1", "12BADC2", "12BADC3" }; |
337 | harddriv_state *state = space | |
337 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
338 | 338 | |
339 | 339 | COMBINE_DATA(&state->m_adc_control); |
340 | 340 | |
r17963 | r17964 | |
349 | 349 | if (state->m_adc_control & 0x40) |
350 | 350 | { |
351 | 351 | state->m_adc12_select = (state->m_adc_control >> 4) & 0x03; |
352 | state->m_adc12_data = space | |
352 | state->m_adc12_data = space.machine().root_device().ioport(adc12names[state->m_adc12_select])->read() << 4; | |
353 | 353 | } |
354 | 354 | |
355 | 355 | /* bit 7 selects which byte of the 12 bit data to read */ |
r17963 | r17964 | |
376 | 376 | |
377 | 377 | case 6: /* CC1 */ |
378 | 378 | case 7: /* CC2 */ |
379 | coin_counter_w(space | |
379 | coin_counter_w(space.machine(), offset - 6, data); | |
380 | 380 | break; |
381 | 381 | } |
382 | 382 | } |
r17963 | r17964 | |
400 | 400 | |
401 | 401 | WRITE16_HANDLER( hd68k_nwr_w ) |
402 | 402 | { |
403 | harddriv_state *state = space | |
403 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
404 | 404 | |
405 | 405 | /* bit 3 selects the value; data is ignored */ |
406 | 406 | data = (offset >> 3) & 1; |
r17963 | r17964 | |
411 | 411 | { |
412 | 412 | case 0: /* CR2 */ |
413 | 413 | case 1: /* CR1 */ |
414 | set_led_status(space | |
414 | set_led_status(space.machine(), offset, data); | |
415 | 415 | break; |
416 | 416 | case 2: /* LC1 */ |
417 | 417 | break; |
r17963 | r17964 | |
440 | 440 | WRITE16_HANDLER( hdc68k_wheel_edge_reset_w ) |
441 | 441 | { |
442 | 442 | /* reset the edge latch */ |
443 | harddriv_state *state = space | |
443 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
444 | 444 | state->m_hdc68k_wheel_edge = 0; |
445 | 445 | } |
446 | 446 | |
r17963 | r17964 | |
454 | 454 | |
455 | 455 | READ16_HANDLER( hd68k_zram_r ) |
456 | 456 | { |
457 | harddriv_state *state = space | |
457 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
458 | 458 | return state->m_eeprom[offset]; |
459 | 459 | } |
460 | 460 | |
461 | 461 | |
462 | 462 | WRITE16_HANDLER( hd68k_zram_w ) |
463 | 463 | { |
464 | harddriv_state *state = space | |
464 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
465 | 465 | if (state->m_m68k_zp1 == 0 && state->m_m68k_zp2 == 1) |
466 | 466 | COMBINE_DATA(&state->m_eeprom[offset]); |
467 | 467 | } |
r17963 | r17964 | |
490 | 490 | |
491 | 491 | WRITE16_HANDLER( hdgsp_io_w ) |
492 | 492 | { |
493 | harddriv_state *state = space | |
493 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
494 | 494 | |
495 | 495 | /* detect an enabling of the shift register and force yielding */ |
496 | 496 | if (offset == REG_DPYCTL) |
r17963 | r17964 | |
500 | 500 | { |
501 | 501 | state->m_last_gsp_shiftreg = new_shiftreg; |
502 | 502 | if (new_shiftreg) |
503 | space | |
503 | space.device().execute().yield(); | |
504 | 504 | } |
505 | 505 | } |
506 | 506 | |
507 | 507 | /* detect changes to HEBLNK and HSBLNK and force an update before they change */ |
508 | 508 | if ((offset == REG_HEBLNK || offset == REG_HSBLNK) && data != tms34010_io_register_r(space, offset, 0xffff)) |
509 | space | |
509 | space.machine().primary_screen->update_partial(space.machine().primary_screen->vpos() - 1); | |
510 | 510 | |
511 | 511 | tms34010_io_register_w(space, offset, data, mem_mask); |
512 | 512 | } |
r17963 | r17964 | |
521 | 521 | |
522 | 522 | WRITE16_HANDLER( hdgsp_protection_w ) |
523 | 523 | { |
524 | harddriv_state *state = space | |
524 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
525 | 525 | |
526 | 526 | /* this memory address is incremented whenever a protection check fails */ |
527 | 527 | /* after it reaches a certain value, the GSP will randomly trash a */ |
r17963 | r17964 | |
543 | 543 | |
544 | 544 | READ16_HANDLER( hd68k_adsp_program_r ) |
545 | 545 | { |
546 | harddriv_state *state = space | |
546 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
547 | 547 | UINT32 word = state->m_adsp_pgm_memory[offset/2]; |
548 | 548 | return (!(offset & 1)) ? (word >> 16) : (word & 0xffff); |
549 | 549 | } |
r17963 | r17964 | |
551 | 551 | |
552 | 552 | WRITE16_HANDLER( hd68k_adsp_program_w ) |
553 | 553 | { |
554 | harddriv_state *state = space | |
554 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
555 | 555 | UINT32 *base = &state->m_adsp_pgm_memory[offset/2]; |
556 | 556 | UINT32 oldword = *base; |
557 | 557 | UINT16 temp; |
r17963 | r17964 | |
581 | 581 | |
582 | 582 | READ16_HANDLER( hd68k_adsp_data_r ) |
583 | 583 | { |
584 | harddriv_state *state = space | |
584 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
585 | 585 | return state->m_adsp_data_memory[offset]; |
586 | 586 | } |
587 | 587 | |
588 | 588 | |
589 | 589 | WRITE16_HANDLER( hd68k_adsp_data_w ) |
590 | 590 | { |
591 | harddriv_state *state = space | |
591 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
592 | 592 | |
593 | 593 | COMBINE_DATA(&state->m_adsp_data_memory[offset]); |
594 | 594 | |
595 | 595 | /* any write to $1FFF is taken to be a trigger; synchronize the CPUs */ |
596 | 596 | if (offset == 0x1fff) |
597 | 597 | { |
598 | logerror("%06X:ADSP sync address written (%04X)\n", space->device().safe_pcbase(), data); | |
599 | space->machine().scheduler().synchronize(); | |
598 | logerror("%06X:ADSP sync address written (%04X)\n", space.device().safe_pcbase(), data); | |
599 | space.machine().scheduler().synchronize(); | |
600 | 600 | state->m_adsp->signal_interrupt_trigger(); |
601 | 601 | } |
602 | 602 | else |
603 | logerror("%06X:ADSP W@%04X (%04X)\n", space | |
603 | logerror("%06X:ADSP W@%04X (%04X)\n", space.device().safe_pcbase(), offset, data); | |
604 | 604 | } |
605 | 605 | |
606 | 606 | |
r17963 | r17964 | |
613 | 613 | |
614 | 614 | READ16_HANDLER( hd68k_adsp_buffer_r ) |
615 | 615 | { |
616 | harddriv_state *state = space | |
616 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
617 | 617 | /* logerror("hd68k_adsp_buffer_r(%04X)\n", offset);*/ |
618 | 618 | return state->m_som_memory[state->m_m68k_adsp_buffer_bank * 0x2000 + offset]; |
619 | 619 | } |
r17963 | r17964 | |
621 | 621 | |
622 | 622 | WRITE16_HANDLER( hd68k_adsp_buffer_w ) |
623 | 623 | { |
624 | harddriv_state *state = space | |
624 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
625 | 625 | COMBINE_DATA(&state->m_som_memory[state->m_m68k_adsp_buffer_bank * 0x2000 + offset]); |
626 | 626 | } |
627 | 627 | |
r17963 | r17964 | |
687 | 687 | |
688 | 688 | WRITE16_HANDLER( hd68k_adsp_control_w ) |
689 | 689 | { |
690 | harddriv_state *state = space | |
690 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
691 | 691 | |
692 | 692 | /* bit 3 selects the value; data is ignored */ |
693 | 693 | int val = (offset >> 3) & 1; |
r17963 | r17964 | |
703 | 703 | |
704 | 704 | case 3: |
705 | 705 | logerror("ADSP bank = %d (deferred)\n", val); |
706 | space | |
706 | space.machine().scheduler().synchronize(FUNC(deferred_adsp_bank_switch), val); | |
707 | 707 | break; |
708 | 708 | |
709 | 709 | case 5: |
r17963 | r17964 | |
719 | 719 | /* a yield in this case is not enough */ |
720 | 720 | /* we would need to increase the interleaving otherwise */ |
721 | 721 | /* note that this only affects the test mode */ |
722 | space | |
722 | space.device().execute().spin(); | |
723 | 723 | } |
724 | 724 | break; |
725 | 725 | |
r17963 | r17964 | |
736 | 736 | /* a yield in this case is not enough */ |
737 | 737 | /* we would need to increase the interleaving otherwise */ |
738 | 738 | /* note that this only affects the test mode */ |
739 | space | |
739 | space.device().execute().spin(); | |
740 | 740 | } |
741 | 741 | break; |
742 | 742 | |
743 | 743 | case 7: |
744 | 744 | logerror("ADSP reset = %d\n", val); |
745 | 745 | state->m_adsp->set_input_line(INPUT_LINE_RESET, val ? CLEAR_LINE : ASSERT_LINE); |
746 | space | |
746 | space.device().execute().yield(); | |
747 | 747 | break; |
748 | 748 | |
749 | 749 | default: |
r17963 | r17964 | |
755 | 755 | |
756 | 756 | WRITE16_HANDLER( hd68k_adsp_irq_clear_w ) |
757 | 757 | { |
758 | harddriv_state *state = space->machine().driver_data<harddriv_state>(); | |
759 | logerror("%06X:68k clears ADSP interrupt\n", space->device().safe_pcbase()); | |
758 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
759 | logerror("%06X:68k clears ADSP interrupt\n", space.device().safe_pcbase()); | |
760 | 760 | state->m_adsp_irq_state = 0; |
761 | atarigen_update_interrupts(space | |
761 | atarigen_update_interrupts(space.machine()); | |
762 | 762 | } |
763 | 763 | |
764 | 764 | |
765 | 765 | READ16_HANDLER( hd68k_adsp_irq_state_r ) |
766 | 766 | { |
767 | harddriv_state *state = space | |
767 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
768 | 768 | int result = 0xfffd; |
769 | 769 | if (state->m_adsp_xflag) result ^= 2; |
770 | 770 | if (state->m_adsp_irq_state) result ^= 1; |
771 | logerror("%06X:68k reads ADSP interrupt state = %04x\n", space | |
771 | logerror("%06X:68k reads ADSP interrupt state = %04x\n", space.device().safe_pcbase(), result); | |
772 | 772 | return result; |
773 | 773 | } |
774 | 774 | |
r17963 | r17964 | |
782 | 782 | |
783 | 783 | READ16_HANDLER( hdadsp_special_r ) |
784 | 784 | { |
785 | harddriv_state *state = space | |
785 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
786 | 786 | switch (offset & 7) |
787 | 787 | { |
788 | 788 | case 0: /* /SIMBUF */ |
r17963 | r17964 | |
801 | 801 | break; |
802 | 802 | |
803 | 803 | default: |
804 | logerror("%04X:hdadsp_special_r(%04X)\n", space | |
804 | logerror("%04X:hdadsp_special_r(%04X)\n", space.device().safe_pcbase(), offset); | |
805 | 805 | break; |
806 | 806 | } |
807 | 807 | return 0; |
r17963 | r17964 | |
810 | 810 | |
811 | 811 | WRITE16_HANDLER( hdadsp_special_w ) |
812 | 812 | { |
813 | harddriv_state *state = space | |
813 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
814 | 814 | switch (offset & 7) |
815 | 815 | { |
816 | 816 | case 1: /* /SIMCLK */ |
r17963 | r17964 | |
830 | 830 | break; |
831 | 831 | |
832 | 832 | case 6: /* /GINT */ |
833 | logerror("%04X:ADSP signals interrupt\n", space | |
833 | logerror("%04X:ADSP signals interrupt\n", space.device().safe_pcbase()); | |
834 | 834 | state->m_adsp_irq_state = 1; |
835 | atarigen_update_interrupts(space | |
835 | atarigen_update_interrupts(space.machine()); | |
836 | 836 | break; |
837 | 837 | |
838 | 838 | case 7: /* /MP */ |
r17963 | r17964 | |
840 | 840 | break; |
841 | 841 | |
842 | 842 | default: |
843 | logerror("%04X:hdadsp_special_w(%04X)=%04X\n", space | |
843 | logerror("%04X:hdadsp_special_w(%04X)=%04X\n", space.device().safe_pcbase(), offset, data); | |
844 | 844 | break; |
845 | 845 | } |
846 | 846 | } |
r17963 | r17964 | |
870 | 870 | |
871 | 871 | WRITE16_HANDLER( hd68k_ds3_control_w ) |
872 | 872 | { |
873 | harddriv_state *state = space | |
873 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
874 | 874 | int val = (offset >> 3) & 1; |
875 | 875 | |
876 | 876 | switch (offset & 7) |
r17963 | r17964 | |
895 | 895 | /* a yield in this case is not enough */ |
896 | 896 | /* we would need to increase the interleaving otherwise */ |
897 | 897 | /* note that this only affects the test mode */ |
898 | space | |
898 | space.device().execute().spin(); | |
899 | 899 | } |
900 | 900 | break; |
901 | 901 | |
r17963 | r17964 | |
911 | 911 | update_ds3_irq(state); |
912 | 912 | } |
913 | 913 | state->m_ds3_reset = val; |
914 | space | |
914 | space.device().execute().yield(); | |
915 | 915 | logerror("DS III reset = %d\n", val); |
916 | 916 | break; |
917 | 917 | |
r17963 | r17964 | |
935 | 935 | |
936 | 936 | READ16_HANDLER( hd68k_ds3_girq_state_r ) |
937 | 937 | { |
938 | harddriv_state *state = space | |
938 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
939 | 939 | int result = 0x0fff; |
940 | 940 | if (state->m_ds3_g68flag) result ^= 0x8000; |
941 | 941 | if (state->m_ds3_gflag) result ^= 0x4000; |
r17963 | r17964 | |
947 | 947 | |
948 | 948 | READ16_HANDLER( hd68k_ds3_gdata_r ) |
949 | 949 | { |
950 | harddriv_state *state = space->machine().driver_data<harddriv_state>(); | |
951 | offs_t pc = space->device().safe_pc(); | |
950 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
951 | offs_t pc = space.device().safe_pc(); | |
952 | 952 | |
953 | 953 | state->m_ds3_gflag = 0; |
954 | 954 | update_ds3_irq(state); |
955 | 955 | |
956 | logerror("%06X:hd68k_ds3_gdata_r(%04X)\n", space | |
956 | logerror("%06X:hd68k_ds3_gdata_r(%04X)\n", space.device().safe_pcbase(), state->m_ds3_gdata); | |
957 | 957 | |
958 | 958 | /* attempt to optimize the transfer if conditions are right */ |
959 | if (&space | |
959 | if (&space.device() == state->m_maincpu && pc == state->m_ds3_transfer_pc && | |
960 | 960 | !(!state->m_ds3_g68flag && state->m_ds3_g68irqs) && !(state->m_ds3_gflag && state->m_ds3_gfirqs)) |
961 | 961 | { |
962 | 962 | UINT32 destaddr = state->m_maincpu->state_int(M68K_A1); |
r17963 | r17964 | |
970 | 970 | |
971 | 971 | while (count68k > 0 && state->m_adsp_data_memory[0x16e6] > 0) |
972 | 972 | { |
973 | space | |
973 | space.write_word(destaddr, state->m_ds3_gdata); | |
974 | 974 | { |
975 | 975 | state->m_adsp_data_memory[0x16e6]--; |
976 | 976 | state->m_ds3_gdata = state->m_adsp_pgm_memory[i6] >> 8; |
r17963 | r17964 | |
986 | 986 | /* if we just cleared the IRQ, we are going to do some VERY timing critical reads */ |
987 | 987 | /* it is important that all the CPUs be in sync before we continue, so spin a little */ |
988 | 988 | /* while to let everyone else catch up */ |
989 | space->device().execute().spin_until_trigger(DS3_TRIGGER); | |
990 | space->machine().scheduler().trigger(DS3_TRIGGER, attotime::from_usec(5)); | |
989 | space.device().execute().spin_until_trigger(DS3_TRIGGER); | |
990 | space.machine().scheduler().trigger(DS3_TRIGGER, attotime::from_usec(5)); | |
991 | 991 | |
992 | 992 | return state->m_ds3_gdata; |
993 | 993 | } |
r17963 | r17964 | |
995 | 995 | |
996 | 996 | WRITE16_HANDLER( hd68k_ds3_gdata_w ) |
997 | 997 | { |
998 | harddriv_state *state = space | |
998 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
999 | 999 | |
1000 | logerror("%06X:hd68k_ds3_gdata_w(%04X)\n", space | |
1000 | logerror("%06X:hd68k_ds3_gdata_w(%04X)\n", space.device().safe_pcbase(), state->m_ds3_gdata); | |
1001 | 1001 | |
1002 | 1002 | COMBINE_DATA(&state->m_ds3_g68data); |
1003 | 1003 | state->m_ds3_g68flag = 1; |
r17963 | r17964 | |
1039 | 1039 | |
1040 | 1040 | READ16_HANDLER( hdds3_special_r ) |
1041 | 1041 | { |
1042 | harddriv_state *state = space | |
1042 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
1043 | 1043 | int result; |
1044 | 1044 | |
1045 | 1045 | switch (offset & 7) |
r17963 | r17964 | |
1069 | 1069 | |
1070 | 1070 | WRITE16_HANDLER( hdds3_special_w ) |
1071 | 1071 | { |
1072 | harddriv_state *state = space | |
1072 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
1073 | 1073 | |
1074 | 1074 | /* IMPORTANT! these data values also write through to the underlying RAM */ |
1075 | 1075 | state->m_adsp_data_memory[offset] = data; |
r17963 | r17964 | |
1077 | 1077 | switch (offset & 7) |
1078 | 1078 | { |
1079 | 1079 | case 0: |
1080 | logerror("%04X:ADSP sets gdata to %04X\n", space | |
1080 | logerror("%04X:ADSP sets gdata to %04X\n", space.device().safe_pcbase(), data); | |
1081 | 1081 | state->m_ds3_gdata = data; |
1082 | 1082 | state->m_ds3_gflag = 1; |
1083 | 1083 | update_ds3_irq(state); |
1084 | 1084 | |
1085 | 1085 | /* once we've written data, trigger the main CPU to wake up again */ |
1086 | space | |
1086 | space.machine().scheduler().trigger(DS3_TRIGGER); | |
1087 | 1087 | break; |
1088 | 1088 | |
1089 | 1089 | case 1: |
1090 | logerror("%04X:ADSP sets interrupt = %d\n", space | |
1090 | logerror("%04X:ADSP sets interrupt = %d\n", space.device().safe_pcbase(), (data >> 1) & 1); | |
1091 | 1091 | state->m_adsp_irq_state = (data >> 1) & 1; |
1092 | hd68k_update_interrupts(space | |
1092 | hd68k_update_interrupts(space.machine()); | |
1093 | 1093 | break; |
1094 | 1094 | |
1095 | 1095 | case 2: |
r17963 | r17964 | |
1136 | 1136 | |
1137 | 1137 | READ16_HANDLER( hd68k_ds3_program_r ) |
1138 | 1138 | { |
1139 | harddriv_state *state = space | |
1139 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
1140 | 1140 | UINT32 *base = &state->m_adsp_pgm_memory[offset & 0x1fff]; |
1141 | 1141 | UINT32 word = *base; |
1142 | 1142 | return (!(offset & 0x2000)) ? (word >> 8) : (word & 0xff); |
r17963 | r17964 | |
1145 | 1145 | |
1146 | 1146 | WRITE16_HANDLER( hd68k_ds3_program_w ) |
1147 | 1147 | { |
1148 | harddriv_state *state = space | |
1148 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
1149 | 1149 | UINT32 *base = &state->m_adsp_pgm_memory[offset & 0x1fff]; |
1150 | 1150 | UINT32 oldword = *base; |
1151 | 1151 | UINT16 temp; |
r17963 | r17964 | |
1195 | 1195 | |
1196 | 1196 | WRITE16_HANDLER( hd68k_dsk_control_w ) |
1197 | 1197 | { |
1198 | harddriv_state *state = space | |
1198 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
1199 | 1199 | int val = (offset >> 3) & 1; |
1200 | 1200 | switch (offset & 7) |
1201 | 1201 | { |
r17963 | r17964 | |
1214 | 1214 | break; |
1215 | 1215 | |
1216 | 1216 | case 4: /* ASIC65 reset */ |
1217 | asic65_reset(space | |
1217 | asic65_reset(space.machine(), !val); | |
1218 | 1218 | break; |
1219 | 1219 | |
1220 | 1220 | case 7: /* LED */ |
r17963 | r17964 | |
1236 | 1236 | |
1237 | 1237 | READ16_HANDLER( hd68k_dsk_ram_r ) |
1238 | 1238 | { |
1239 | harddriv_state *state = space | |
1239 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
1240 | 1240 | return state->m_dsk_ram[offset]; |
1241 | 1241 | } |
1242 | 1242 | |
1243 | 1243 | |
1244 | 1244 | WRITE16_HANDLER( hd68k_dsk_ram_w ) |
1245 | 1245 | { |
1246 | harddriv_state *state = space | |
1246 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
1247 | 1247 | COMBINE_DATA(&state->m_dsk_ram[offset]); |
1248 | 1248 | } |
1249 | 1249 | |
1250 | 1250 | |
1251 | 1251 | READ16_HANDLER( hd68k_dsk_zram_r ) |
1252 | 1252 | { |
1253 | harddriv_state *state = space | |
1253 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
1254 | 1254 | return state->m_dsk_zram[offset]; |
1255 | 1255 | } |
1256 | 1256 | |
1257 | 1257 | |
1258 | 1258 | WRITE16_HANDLER( hd68k_dsk_zram_w ) |
1259 | 1259 | { |
1260 | harddriv_state *state = space | |
1260 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
1261 | 1261 | COMBINE_DATA(&state->m_dsk_zram[offset]); |
1262 | 1262 | } |
1263 | 1263 | |
1264 | 1264 | |
1265 | 1265 | READ16_HANDLER( hd68k_dsk_small_rom_r ) |
1266 | 1266 | { |
1267 | harddriv_state *state = space | |
1267 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
1268 | 1268 | return state->m_dsk_rom[offset & 0x1ffff]; |
1269 | 1269 | } |
1270 | 1270 | |
1271 | 1271 | |
1272 | 1272 | READ16_HANDLER( hd68k_dsk_rom_r ) |
1273 | 1273 | { |
1274 | harddriv_state *state = space | |
1274 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
1275 | 1275 | return state->m_dsk_rom[offset]; |
1276 | 1276 | } |
1277 | 1277 | |
r17963 | r17964 | |
1285 | 1285 | |
1286 | 1286 | WRITE16_HANDLER( hd68k_dsk_dsp32_w ) |
1287 | 1287 | { |
1288 | harddriv_state *state = space | |
1288 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
1289 | 1289 | state->m_dsk_pio_access = TRUE; |
1290 | 1290 | state->m_dsp32->pio_w(offset, data); |
1291 | 1291 | state->m_dsk_pio_access = FALSE; |
r17963 | r17964 | |
1294 | 1294 | |
1295 | 1295 | READ16_HANDLER( hd68k_dsk_dsp32_r ) |
1296 | 1296 | { |
1297 | harddriv_state *state = space | |
1297 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
1298 | 1298 | UINT16 result; |
1299 | 1299 | state->m_dsk_pio_access = TRUE; |
1300 | 1300 | result = state->m_dsp32->pio_r(offset); |
r17963 | r17964 | |
1318 | 1318 | |
1319 | 1319 | WRITE32_HANDLER( rddsp32_sync0_w ) |
1320 | 1320 | { |
1321 | harddriv_state *state = space | |
1321 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
1322 | 1322 | if (state->m_dsk_pio_access) |
1323 | 1323 | { |
1324 | 1324 | UINT32 *dptr = &state->m_rddsp32_sync[0][offset]; |
r17963 | r17964 | |
1326 | 1326 | COMBINE_DATA(&newdata); |
1327 | 1327 | state->m_dataptr[state->m_next_msp_sync % MAX_MSP_SYNC] = dptr; |
1328 | 1328 | state->m_dataval[state->m_next_msp_sync % MAX_MSP_SYNC] = newdata; |
1329 | space | |
1329 | space.machine().scheduler().synchronize(FUNC(rddsp32_sync_cb), state->m_next_msp_sync++ % MAX_MSP_SYNC); | |
1330 | 1330 | } |
1331 | 1331 | else |
1332 | 1332 | COMBINE_DATA(&state->m_rddsp32_sync[0][offset]); |
r17963 | r17964 | |
1335 | 1335 | |
1336 | 1336 | WRITE32_HANDLER( rddsp32_sync1_w ) |
1337 | 1337 | { |
1338 | harddriv_state *state = space | |
1338 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
1339 | 1339 | if (state->m_dsk_pio_access) |
1340 | 1340 | { |
1341 | 1341 | UINT32 *dptr = &state->m_rddsp32_sync[1][offset]; |
r17963 | r17964 | |
1343 | 1343 | COMBINE_DATA(&newdata); |
1344 | 1344 | state->m_dataptr[state->m_next_msp_sync % MAX_MSP_SYNC] = dptr; |
1345 | 1345 | state->m_dataval[state->m_next_msp_sync % MAX_MSP_SYNC] = newdata; |
1346 | space | |
1346 | space.machine().scheduler().synchronize(FUNC(rddsp32_sync_cb), state->m_next_msp_sync++ % MAX_MSP_SYNC); | |
1347 | 1347 | } |
1348 | 1348 | else |
1349 | 1349 | COMBINE_DATA(&state->m_rddsp32_sync[1][offset]); |
r17963 | r17964 | |
1368 | 1368 | switch (offset & 7) |
1369 | 1369 | { |
1370 | 1370 | case 2: /* ASIC65 reset */ |
1371 | asic65_reset(space | |
1371 | asic65_reset(space.machine(), !val); | |
1372 | 1372 | break; |
1373 | 1373 | |
1374 | 1374 | default: |
r17963 | r17964 | |
1398 | 1398 | |
1399 | 1399 | READ16_HANDLER( rd68k_slapstic_r ) |
1400 | 1400 | { |
1401 | harddriv_state *state = space | |
1401 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
1402 | 1402 | int bank = slapstic_tweak(space, offset & 0x3fff) * 0x4000; |
1403 | 1403 | return state->m_m68k_slapstic_base[bank + (offset & 0x3fff)]; |
1404 | 1404 | } |
r17963 | r17964 | |
1440 | 1440 | |
1441 | 1441 | WRITE16_HANDLER( st68k_sloop_w ) |
1442 | 1442 | { |
1443 | harddriv_state *state = space | |
1443 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
1444 | 1444 | st68k_sloop_tweak(state, offset & 0x3fff); |
1445 | 1445 | } |
1446 | 1446 | |
1447 | 1447 | |
1448 | 1448 | READ16_HANDLER( st68k_sloop_r ) |
1449 | 1449 | { |
1450 | harddriv_state *state = space | |
1450 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
1451 | 1451 | int bank = st68k_sloop_tweak(state, offset) * 0x4000; |
1452 | 1452 | return state->m_m68k_slapstic_base[bank + (offset & 0x3fff)]; |
1453 | 1453 | } |
r17963 | r17964 | |
1455 | 1455 | |
1456 | 1456 | READ16_HANDLER( st68k_sloop_alt_r ) |
1457 | 1457 | { |
1458 | harddriv_state *state = space | |
1458 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
1459 | 1459 | if (state->m_st68k_last_alt_sloop_offset == 0x00fe) |
1460 | 1460 | { |
1461 | 1461 | switch (offset*2) |
r17963 | r17964 | |
1508 | 1508 | |
1509 | 1509 | WRITE16_HANDLER( st68k_protosloop_w ) |
1510 | 1510 | { |
1511 | harddriv_state *state = space | |
1511 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
1512 | 1512 | st68k_protosloop_tweak(state, offset & 0x3fff); |
1513 | 1513 | } |
1514 | 1514 | |
1515 | 1515 | |
1516 | 1516 | READ16_HANDLER( st68k_protosloop_r ) |
1517 | 1517 | { |
1518 | harddriv_state *state = space | |
1518 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
1519 | 1519 | int bank = st68k_protosloop_tweak(state, offset) * 0x4000; |
1520 | 1520 | return state->m_m68k_slapstic_base[bank + (offset & 0x3fff)]; |
1521 | 1521 | } |
r17963 | r17964 | |
1538 | 1538 | |
1539 | 1539 | READ16_HANDLER( hdgsp_speedup_r ) |
1540 | 1540 | { |
1541 | harddriv_state *state = space | |
1541 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
1542 | 1542 | int result = state->m_gsp_speedup_addr[0][offset]; |
1543 | 1543 | |
1544 | 1544 | /* if both this address and the other important address are not $ffff */ |
1545 | 1545 | /* then we can spin until something gets written */ |
1546 | 1546 | if (result != 0xffff && state->m_gsp_speedup_addr[1][0] != 0xffff && |
1547 | &space | |
1547 | &space.device() == state->m_gsp && space.device().safe_pc() == state->m_gsp_speedup_pc) | |
1548 | 1548 | { |
1549 | 1549 | state->m_gsp_speedup_count[0]++; |
1550 | space | |
1550 | space.device().execute().spin_until_interrupt(); | |
1551 | 1551 | } |
1552 | 1552 | |
1553 | 1553 | return result; |
r17963 | r17964 | |
1556 | 1556 | |
1557 | 1557 | WRITE16_HANDLER( hdgsp_speedup1_w ) |
1558 | 1558 | { |
1559 | harddriv_state *state = space | |
1559 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
1560 | 1560 | |
1561 | 1561 | COMBINE_DATA(&state->m_gsp_speedup_addr[0][offset]); |
1562 | 1562 | |
r17963 | r17964 | |
1568 | 1568 | |
1569 | 1569 | WRITE16_HANDLER( hdgsp_speedup2_w ) |
1570 | 1570 | { |
1571 | harddriv_state *state = space | |
1571 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
1572 | 1572 | |
1573 | 1573 | COMBINE_DATA(&state->m_gsp_speedup_addr[1][offset]); |
1574 | 1574 | |
r17963 | r17964 | |
1589 | 1589 | |
1590 | 1590 | READ16_HANDLER( rdgsp_speedup1_r ) |
1591 | 1591 | { |
1592 | harddriv_state *state = space | |
1592 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
1593 | 1593 | int result = state->m_gsp_speedup_addr[0][offset]; |
1594 | 1594 | |
1595 | 1595 | /* if this address is equal to $f000, spin until something gets written */ |
1596 | if (&space->device() == state->m_gsp && space->device().safe_pc() == state->m_gsp_speedup_pc && | |
1597 | (result & 0xff) < space->device().state().state_int(TMS34010_A1)) | |
1596 | if (&space.device() == state->m_gsp && space.device().safe_pc() == state->m_gsp_speedup_pc && | |
1597 | (result & 0xff) < space.device().state().state_int(TMS34010_A1)) | |
1598 | 1598 | { |
1599 | 1599 | state->m_gsp_speedup_count[0]++; |
1600 | space | |
1600 | space.device().execute().spin_until_interrupt(); | |
1601 | 1601 | } |
1602 | 1602 | |
1603 | 1603 | return result; |
r17963 | r17964 | |
1606 | 1606 | |
1607 | 1607 | WRITE16_HANDLER( rdgsp_speedup1_w ) |
1608 | 1608 | { |
1609 | harddriv_state *state = space | |
1609 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
1610 | 1610 | COMBINE_DATA(&state->m_gsp_speedup_addr[0][offset]); |
1611 | if (&space | |
1611 | if (&space.device() != state->m_gsp) | |
1612 | 1612 | state->m_gsp->signal_interrupt_trigger(); |
1613 | 1613 | } |
1614 | 1614 | |
r17963 | r17964 | |
1627 | 1627 | |
1628 | 1628 | READ16_HANDLER( hdmsp_speedup_r ) |
1629 | 1629 | { |
1630 | harddriv_state *state = space | |
1630 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
1631 | 1631 | int data = state->m_msp_speedup_addr[offset]; |
1632 | 1632 | |
1633 | if (data == 0 && &space | |
1633 | if (data == 0 && &space.device() == state->m_msp && space.device().safe_pc() == state->m_msp_speedup_pc) | |
1634 | 1634 | { |
1635 | 1635 | state->m_msp_speedup_count[0]++; |
1636 | space | |
1636 | space.device().execute().spin_until_interrupt(); | |
1637 | 1637 | } |
1638 | 1638 | |
1639 | 1639 | return data; |
r17963 | r17964 | |
1642 | 1642 | |
1643 | 1643 | WRITE16_HANDLER( hdmsp_speedup_w ) |
1644 | 1644 | { |
1645 | harddriv_state *state = space | |
1645 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
1646 | 1646 | COMBINE_DATA(&state->m_msp_speedup_addr[offset]); |
1647 | 1647 | if (offset == 0 && state->m_msp_speedup_addr[offset] != 0) |
1648 | 1648 | state->m_msp->signal_interrupt_trigger(); |
r17963 | r17964 | |
1662 | 1662 | |
1663 | 1663 | READ16_HANDLER( hdadsp_speedup_r ) |
1664 | 1664 | { |
1665 | harddriv_state *state = space | |
1665 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
1666 | 1666 | int data = state->m_adsp_data_memory[0x1fff]; |
1667 | 1667 | |
1668 | if (data == 0xffff && &space | |
1668 | if (data == 0xffff && &space.device() == state->m_adsp && space.device().safe_pc() <= 0x3b) | |
1669 | 1669 | { |
1670 | 1670 | state->m_adsp_speedup_count[0]++; |
1671 | space | |
1671 | space.device().execute().spin_until_interrupt(); | |
1672 | 1672 | } |
1673 | 1673 | |
1674 | 1674 | return data; |
r17963 | r17964 | |
1677 | 1677 | |
1678 | 1678 | READ16_HANDLER( hdds3_speedup_r ) |
1679 | 1679 | { |
1680 | harddriv_state *state = space | |
1680 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
1681 | 1681 | int data = *state->m_ds3_speedup_addr; |
1682 | 1682 | |
1683 | if (data != 0 && &space | |
1683 | if (data != 0 && &space.device() == state->m_adsp && space.device().safe_pc() == state->m_ds3_speedup_pc) | |
1684 | 1684 | { |
1685 | 1685 | state->m_adsp_speedup_count[2]++; |
1686 | space | |
1686 | space.device().execute().spin_until_interrupt(); | |
1687 | 1687 | } |
1688 | 1688 | |
1689 | 1689 | return data; |
r17963 | r17964 | |
---|---|---|
217 | 217 | { |
218 | 218 | int A; |
219 | 219 | |
220 | address_space | |
220 | address_space &space = *machine.device(cputag)->memory().space(AS_PROGRAM); | |
221 | 221 | int length = machine.root_device().memregion(cputag)->bytes(); |
222 | 222 | int cryptlen = MIN(length, 0x8000); |
223 | 223 | UINT8 *rom = machine.root_device().memregion(cputag)->base(); |
224 | 224 | UINT8 *decrypted = auto_alloc_array(machine, UINT8, 0xc000); |
225 | 225 | |
226 | space | |
226 | space.set_decrypted_region(0x0000, cryptlen - 1, decrypted); | |
227 | 227 | |
228 | 228 | for (A = 0x0000;A < cryptlen;A++) |
229 | 229 | { |
r17963 | r17964 | |
439 | 439 | |
440 | 440 | int A; |
441 | 441 | |
442 | address_space | |
442 | address_space &space = *machine.device(cputag)->memory().space(AS_PROGRAM); | |
443 | 443 | UINT8 *rom = machine.root_device().memregion(regiontag)->base(); |
444 | 444 | int bankstart; |
445 | 445 | decrypted = auto_alloc_array(machine, UINT8, 0x6000*3); |
r17963 | r17964 | |
473 | 473 | |
474 | 474 | machine.root_device().membank("bank1")->configure_entries(0,3, machine.root_device().memregion(regiontag)->base(),0x6000); |
475 | 475 | machine.root_device().membank("bank1")->configure_decrypted_entries(0,3,decrypted,0x6000); |
476 | space->set_decrypted_region(0x0000, 0x5fff, decrypted); | |
477 | space->machine().root_device().membank("bank1")->set_entry(0); | |
476 | space.set_decrypted_region(0x0000, 0x5fff, decrypted); | |
477 | space.machine().root_device().membank("bank1")->set_entry(0); | |
478 | 478 | } |
479 | 479 | |
480 | 480 | |
r17963 | r17964 | |
797 | 797 | |
798 | 798 | int A; |
799 | 799 | |
800 | address_space | |
800 | address_space &space = *machine.device(cputag)->memory().space(AS_PROGRAM); | |
801 | 801 | UINT8 *rom = machine.root_device().memregion(cputag)->base(); |
802 | 802 | decrypted = auto_alloc_array(machine, UINT8, 0x9000); |
803 | 803 | |
r17963 | r17964 | |
832 | 832 | |
833 | 833 | machine.root_device().membank("bank1")->configure_entries(0,8, machine.root_device().memregion(cputag)->base()+0x7000,0x0400); |
834 | 834 | machine.root_device().membank("bank1")->configure_decrypted_entries(0,8,decrypted+0x7000,0x0400); |
835 | space | |
835 | space.set_decrypted_region(0x0000, 0x6bff, decrypted); | |
836 | 836 | machine.root_device().membank("bank1")->set_entry(0); |
837 | 837 | } |
838 | 838 |
r17963 | r17964 | |
---|---|---|
35 | 35 | |
36 | 36 | WRITE32_HANDLER( psx_com_delay_w ) |
37 | 37 | { |
38 | psx_state *p_psx = space | |
38 | psx_state *p_psx = space.machine().driver_data<psx_state>(); | |
39 | 39 | |
40 | 40 | COMBINE_DATA( &p_psx->n_com_delay ); |
41 | 41 | verboselog( p_psx, 1, "psx_com_delay_w( %08x %08x )\n", data, mem_mask ); |
r17963 | r17964 | |
43 | 43 | |
44 | 44 | READ32_HANDLER( psx_com_delay_r ) |
45 | 45 | { |
46 | psx_state *p_psx = space | |
46 | psx_state *p_psx = space.machine().driver_data<psx_state>(); | |
47 | 47 | |
48 | 48 | verboselog( p_psx, 1, "psx_com_delay_r( %08x )\n", mem_mask ); |
49 | 49 | return p_psx->n_com_delay; |
r17963 | r17964 | |
72 | 72 | |
73 | 73 | READ32_HANDLER( psx_gpu_r ) |
74 | 74 | { |
75 | psxgpu_device *gpu = downcast<psxgpu_device *>( space->machine().device("gpu") ); | |
76 | return gpu->read( *space, offset, mem_mask ); | |
75 | psxgpu_device *gpu = downcast<psxgpu_device *>( space.machine().device("gpu") ); | |
76 | return gpu->read( space, offset, mem_mask ); | |
77 | 77 | } |
78 | 78 | |
79 | 79 | WRITE32_HANDLER( psx_gpu_w ) |
80 | 80 | { |
81 | psxgpu_device *gpu = downcast<psxgpu_device *>( space->machine().device("gpu") ); | |
82 | gpu->write( *space, offset, data, mem_mask ); | |
81 | psxgpu_device *gpu = downcast<psxgpu_device *>( space.machine().device("gpu") ); | |
82 | gpu->write( space, offset, data, mem_mask ); | |
83 | 83 | } |
84 | 84 | |
85 | 85 | void psx_lightgun_set( running_machine &machine, int n_x, int n_y ) |
r17963 | r17964 | |
---|---|---|
886 | 886 | |
887 | 887 | void CDC_Do_DMA(running_machine& machine, int rate) |
888 | 888 | { |
889 | address_space | |
889 | address_space& space = *machine.device(":segacd:segacd_68k")->memory().space(AS_PROGRAM); | |
890 | 890 | |
891 | 891 | UINT32 dstoffset, length; |
892 | 892 | UINT8 *dest; |
r17963 | r17964 | |
949 | 949 | |
950 | 950 | if (PCM_DMA) |
951 | 951 | { |
952 | space->write_byte(0xff2000+(((dstoffset*2)+1)&0x1fff),data >> 8); | |
953 | space->write_byte(0xff2000+(((dstoffset*2)+3)&0x1fff),data & 0xff); | |
952 | space.write_byte(0xff2000+(((dstoffset*2)+1)&0x1fff),data >> 8); | |
953 | space.write_byte(0xff2000+(((dstoffset*2)+3)&0x1fff),data & 0xff); | |
954 | 954 | // printf("PCM_DMA writing %04x %04x\n",0xff2000+(dstoffset*2), data); |
955 | 955 | } |
956 | 956 | else |
r17963 | r17964 | |
967 | 967 | dest[dstoffset+1] = data >>8; |
968 | 968 | dest[dstoffset+0] = data&0xff; |
969 | 969 | |
970 | segacd_mark_tiles_dirty(space | |
970 | segacd_mark_tiles_dirty(space.machine(), dstoffset/2); | |
971 | 971 | } |
972 | 972 | else |
973 | 973 | { |
r17963 | r17964 | |
975 | 975 | |
976 | 976 | if (!(scd_rammode & 1)) |
977 | 977 | { |
978 | segacd_1meg_mode_word_write(space | |
978 | segacd_1meg_mode_word_write(space.machine(),(dstoffset+0x20000)/2, data, 0xffff, 0); | |
979 | 979 | } |
980 | 980 | else |
981 | 981 | { |
982 | segacd_1meg_mode_word_write(space | |
982 | segacd_1meg_mode_word_write(space.machine(),(dstoffset+0x00000)/2, data, 0xffff, 0); | |
983 | 983 | } |
984 | 984 | } |
985 | 985 | |
r17963 | r17964 | |
1233 | 1233 | |
1234 | 1234 | static WRITE16_HANDLER( scd_a12000_halt_reset_w ) |
1235 | 1235 | { |
1236 | if (SEGACD_FORCE_SYNCS) space | |
1236 | if (SEGACD_FORCE_SYNCS) space.machine().scheduler().synchronize(); | |
1237 | 1237 | |
1238 | 1238 | UINT16 old_halt = a12000_halt_reset_reg; |
1239 | 1239 | |
r17963 | r17964 | |
1244 | 1244 | // reset line |
1245 | 1245 | if (a12000_halt_reset_reg&0x0001) |
1246 | 1246 | { |
1247 | space | |
1247 | space.machine().device(":segacd:segacd_68k")->execute().set_input_line(INPUT_LINE_RESET, CLEAR_LINE); | |
1248 | 1248 | if (!(old_halt&0x0001)) printf("clear reset slave\n"); |
1249 | 1249 | } |
1250 | 1250 | else |
1251 | 1251 | { |
1252 | space | |
1252 | space.machine().device(":segacd:segacd_68k")->execute().set_input_line(INPUT_LINE_RESET, ASSERT_LINE); | |
1253 | 1253 | if ((old_halt&0x0001)) printf("assert reset slave\n"); |
1254 | 1254 | } |
1255 | 1255 | |
1256 | 1256 | // request BUS |
1257 | 1257 | if (a12000_halt_reset_reg&0x0002) |
1258 | 1258 | { |
1259 | space | |
1259 | space.machine().device(":segacd:segacd_68k")->execute().set_input_line(INPUT_LINE_HALT, ASSERT_LINE); | |
1260 | 1260 | if (!(old_halt&0x0002)) printf("halt slave\n"); |
1261 | 1261 | } |
1262 | 1262 | else |
1263 | 1263 | { |
1264 | space | |
1264 | space.machine().device(":segacd:segacd_68k")->execute().set_input_line(INPUT_LINE_HALT, CLEAR_LINE); | |
1265 | 1265 | if ((old_halt&0x0002)) printf("resume slave\n"); |
1266 | 1266 | } |
1267 | 1267 | } |
r17963 | r17964 | |
1270 | 1270 | { |
1271 | 1271 | if (a12000_halt_reset_reg&0x0100) |
1272 | 1272 | { |
1273 | running_machine& machine = space | |
1273 | running_machine& machine = space.machine(); | |
1274 | 1274 | CHECK_SCD_LV2_INTERRUPT |
1275 | 1275 | } |
1276 | 1276 | |
r17963 | r17964 | |
1286 | 1286 | |
1287 | 1287 | static READ16_HANDLER( scd_a12000_halt_reset_r ) |
1288 | 1288 | { |
1289 | if (SEGACD_FORCE_SYNCS) space | |
1289 | if (SEGACD_FORCE_SYNCS) space.machine().scheduler().synchronize(); | |
1290 | 1290 | |
1291 | 1291 | return a12000_halt_reset_reg; |
1292 | 1292 | } |
r17963 | r17964 | |
1305 | 1305 | |
1306 | 1306 | static READ16_HANDLER( scd_a12002_memory_mode_r ) |
1307 | 1307 | { |
1308 | if (SEGACD_FORCE_SYNCS) space | |
1308 | if (SEGACD_FORCE_SYNCS) space.machine().scheduler().synchronize(); | |
1309 | 1309 | |
1310 | 1310 | int temp = scd_rammode; |
1311 | 1311 | int temp2 = 0; |
r17963 | r17964 | |
1343 | 1343 | |
1344 | 1344 | static WRITE8_HANDLER( scd_a12002_memory_mode_w_0_7 ) |
1345 | 1345 | { |
1346 | if (SEGACD_FORCE_SYNCS) space | |
1346 | if (SEGACD_FORCE_SYNCS) space.machine().scheduler().synchronize(); | |
1347 | 1347 | |
1348 | 1348 | |
1349 | 1349 | //printf("scd_a12002_memory_mode_w_0_7 %04x\n",data); |
r17963 | r17964 | |
1369 | 1369 | |
1370 | 1370 | static WRITE16_HANDLER( scd_a12002_memory_mode_w ) |
1371 | 1371 | { |
1372 | if (SEGACD_FORCE_SYNCS) space | |
1372 | if (SEGACD_FORCE_SYNCS) space.machine().scheduler().synchronize(); | |
1373 | 1373 | |
1374 | 1374 | if (ACCESSING_BITS_8_15) |
1375 | 1375 | scd_a12002_memory_mode_w_8_15(space, 0, data>>8); |
r17963 | r17964 | |
1383 | 1383 | |
1384 | 1384 | static READ16_HANDLER( segacd_sub_memory_mode_r ) |
1385 | 1385 | { |
1386 | if (SEGACD_FORCE_SYNCS) space | |
1386 | if (SEGACD_FORCE_SYNCS) space.machine().scheduler().synchronize(); | |
1387 | 1387 | |
1388 | 1388 | int temp = scd_rammode; |
1389 | 1389 | int temp2 = 0; |
r17963 | r17964 | |
1405 | 1405 | |
1406 | 1406 | WRITE8_HANDLER( segacd_sub_memory_mode_w_0_7 ) |
1407 | 1407 | { |
1408 | if (SEGACD_FORCE_SYNCS) space | |
1408 | if (SEGACD_FORCE_SYNCS) space.machine().scheduler().synchronize(); | |
1409 | 1409 | |
1410 | 1410 | |
1411 | 1411 | segacd_memory_priority_mode = (data&0x0018)>>3; |
r17963 | r17964 | |
1465 | 1465 | static WRITE16_HANDLER( segacd_sub_memory_mode_w ) |
1466 | 1466 | { |
1467 | 1467 | //printf("segacd_sub_memory_mode_w %04x %04x\n", data, mem_mask); |
1468 | if (SEGACD_FORCE_SYNCS) space | |
1468 | if (SEGACD_FORCE_SYNCS) space.machine().scheduler().synchronize(); | |
1469 | 1469 | |
1470 | 1470 | if (ACCESSING_BITS_8_15) |
1471 | 1471 | segacd_sub_memory_mode_w_8_15(space, 0, data>>8); |
r17963 | r17964 | |
1488 | 1488 | |
1489 | 1489 | static READ16_HANDLER( segacd_comms_flags_r ) |
1490 | 1490 | { |
1491 | if (SEGACD_FORCE_SYNCS) space | |
1491 | if (SEGACD_FORCE_SYNCS) space.machine().scheduler().synchronize(); | |
1492 | 1492 | return segacd_comms_flags; |
1493 | 1493 | } |
1494 | 1494 | |
1495 | 1495 | static WRITE16_HANDLER( segacd_comms_flags_subcpu_w ) |
1496 | 1496 | { |
1497 | if (SEGACD_FORCE_SYNCS) space | |
1497 | if (SEGACD_FORCE_SYNCS) space.machine().scheduler().synchronize(); | |
1498 | 1498 | |
1499 | 1499 | if (ACCESSING_BITS_8_15) // Dragon's Lair |
1500 | 1500 | { |
r17963 | r17964 | |
1510 | 1510 | |
1511 | 1511 | static WRITE16_HANDLER( segacd_comms_flags_maincpu_w ) |
1512 | 1512 | { |
1513 | if (SEGACD_FORCE_SYNCS) space | |
1513 | if (SEGACD_FORCE_SYNCS) space.machine().scheduler().synchronize(); | |
1514 | 1514 | |
1515 | 1515 | if (ACCESSING_BITS_8_15) |
1516 | 1516 | { |
r17963 | r17964 | |
1561 | 1561 | |
1562 | 1562 | static READ16_HANDLER( segacd_comms_main_part1_r ) |
1563 | 1563 | { |
1564 | if (SEGACD_FORCE_SYNCS) space | |
1564 | if (SEGACD_FORCE_SYNCS) space.machine().scheduler().synchronize(); | |
1565 | 1565 | return segacd_comms_part1[offset]; |
1566 | 1566 | } |
1567 | 1567 | |
1568 | 1568 | static WRITE16_HANDLER( segacd_comms_main_part1_w ) |
1569 | 1569 | { |
1570 | if (SEGACD_FORCE_SYNCS) space | |
1570 | if (SEGACD_FORCE_SYNCS) space.machine().scheduler().synchronize(); | |
1571 | 1571 | COMBINE_DATA(&segacd_comms_part1[offset]); |
1572 | 1572 | } |
1573 | 1573 | |
1574 | 1574 | static READ16_HANDLER( segacd_comms_main_part2_r ) |
1575 | 1575 | { |
1576 | if (SEGACD_FORCE_SYNCS) space | |
1576 | if (SEGACD_FORCE_SYNCS) space.machine().scheduler().synchronize(); | |
1577 | 1577 | return segacd_comms_part2[offset]; |
1578 | 1578 | } |
1579 | 1579 | |
r17963 | r17964 | |
1585 | 1585 | |
1586 | 1586 | static READ16_HANDLER( segacd_comms_sub_part1_r ) |
1587 | 1587 | { |
1588 | if (SEGACD_FORCE_SYNCS) space | |
1588 | if (SEGACD_FORCE_SYNCS) space.machine().scheduler().synchronize(); | |
1589 | 1589 | return segacd_comms_part1[offset]; |
1590 | 1590 | } |
1591 | 1591 | |
r17963 | r17964 | |
1596 | 1596 | |
1597 | 1597 | static READ16_HANDLER( segacd_comms_sub_part2_r ) |
1598 | 1598 | { |
1599 | if (SEGACD_FORCE_SYNCS) space | |
1599 | if (SEGACD_FORCE_SYNCS) space.machine().scheduler().synchronize(); | |
1600 | 1600 | return segacd_comms_part2[offset]; |
1601 | 1601 | } |
1602 | 1602 | |
1603 | 1603 | static WRITE16_HANDLER( segacd_comms_sub_part2_w ) |
1604 | 1604 | { |
1605 | if (SEGACD_FORCE_SYNCS) space | |
1605 | if (SEGACD_FORCE_SYNCS) space.machine().scheduler().synchronize(); | |
1606 | 1606 | COMBINE_DATA(&segacd_comms_part2[offset]); |
1607 | 1607 | } |
1608 | 1608 | |
r17963 | r17964 | |
1720 | 1720 | if (!(scd_rammode&1)) |
1721 | 1721 | { |
1722 | 1722 | COMBINE_DATA(&segacd_dataram[offset]); |
1723 | segacd_mark_tiles_dirty(space | |
1723 | segacd_mark_tiles_dirty(space.machine(), offset); | |
1724 | 1724 | } |
1725 | 1725 | else |
1726 | 1726 | { |
r17963 | r17964 | |
1738 | 1738 | // ret bit set by sub cpu determines which half of WorkRAM we have access to? |
1739 | 1739 | if (scd_rammode&1) |
1740 | 1740 | { |
1741 | segacd_1meg_mode_word_write(space | |
1741 | segacd_1meg_mode_word_write(space.machine(), offset+0x20000/2, data, mem_mask, 0); | |
1742 | 1742 | } |
1743 | 1743 | else |
1744 | 1744 | { |
1745 | segacd_1meg_mode_word_write(space | |
1745 | segacd_1meg_mode_word_write(space.machine(), offset+0x00000/2, data, mem_mask, 0); | |
1746 | 1746 | } |
1747 | 1747 | } |
1748 | 1748 | else |
r17963 | r17964 | |
1771 | 1771 | |
1772 | 1772 | static READ16_HANDLER( scd_a12006_hint_register_r ) |
1773 | 1773 | { |
1774 | if (SEGACD_FORCE_SYNCS) space | |
1774 | if (SEGACD_FORCE_SYNCS) space.machine().scheduler().synchronize(); | |
1775 | 1775 | return segacd_hint_register; |
1776 | 1776 | } |
1777 | 1777 | |
1778 | 1778 | static WRITE16_HANDLER( scd_a12006_hint_register_w ) |
1779 | 1779 | { |
1780 | if (SEGACD_FORCE_SYNCS) space | |
1780 | if (SEGACD_FORCE_SYNCS) space.machine().scheduler().synchronize(); | |
1781 | 1781 | COMBINE_DATA(&segacd_hint_register); |
1782 | 1782 | } |
1783 | 1783 | |
r17963 | r17964 | |
2275 | 2275 | |
2276 | 2276 | READ16_HANDLER( cdc_data_sub_r ) |
2277 | 2277 | { |
2278 | return CDC_Host_r(space | |
2278 | return CDC_Host_r(space.machine(), READ_SUB); | |
2279 | 2279 | } |
2280 | 2280 | |
2281 | 2281 | READ16_HANDLER( cdc_data_main_r ) |
2282 | 2282 | { |
2283 | return CDC_Host_r(space | |
2283 | return CDC_Host_r(space.machine(), READ_MAIN); | |
2284 | 2284 | } |
2285 | 2285 | |
2286 | 2286 | |
r17963 | r17964 | |
2304 | 2304 | /* main CPU map set up in INIT */ |
2305 | 2305 | void segacd_init_main_cpu( running_machine& machine ) |
2306 | 2306 | { |
2307 | address_space | |
2307 | address_space& space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
2308 | 2308 | |
2309 | 2309 | segacd_font_bits = reinterpret_cast<UINT16 *>(machine.root_device().memshare(":segacd:segacd_font")->ptr()); |
2310 | 2310 | segacd_backupram = reinterpret_cast<UINT16 *>(machine.root_device().memshare(":segacd:backupram")->ptr()); |
r17963 | r17964 | |
2315 | 2315 | segacd_4meg_prgbank = 0; |
2316 | 2316 | |
2317 | 2317 | |
2318 | space | |
2318 | space.unmap_readwrite (0x020000,0x3fffff); | |
2319 | 2319 | |
2320 | // space->install_read_bank(0x0020000, 0x003ffff, "scd_4m_prgbank"); | |
2321 | // space->machine().root_device().membank("scd_4m_prgbank")->set_base(segacd_4meg_prgram + segacd_4meg_prgbank * 0x20000 ); | |
2322 | space->install_legacy_read_handler (0x0020000, 0x003ffff, FUNC(scd_4m_prgbank_ram_r) ); | |
2323 | space->install_legacy_write_handler (0x0020000, 0x003ffff, FUNC(scd_4m_prgbank_ram_w) ); | |
2320 | // space.install_read_bank(0x0020000, 0x003ffff, "scd_4m_prgbank"); | |
2321 | // space.machine().root_device().membank("scd_4m_prgbank")->set_base(segacd_4meg_prgram + segacd_4meg_prgbank * 0x20000 ); | |
2322 | space.install_legacy_read_handler (0x0020000, 0x003ffff, FUNC(scd_4m_prgbank_ram_r) ); | |
2323 | space.install_legacy_write_handler (0x0020000, 0x003ffff, FUNC(scd_4m_prgbank_ram_w) ); | |
2324 | 2324 | segacd_wordram_mapped = 1; |
2325 | 2325 | |
2326 | 2326 | |
2327 | space | |
2327 | space.machine().device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_readwrite_handler(0x200000, 0x23ffff, FUNC(segacd_main_dataram_part1_r), FUNC(segacd_main_dataram_part1_w)); // RAM shared with sub | |
2328 | 2328 | |
2329 | space->machine().device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_readwrite_handler(0xa12000, 0xa12001, FUNC(scd_a12000_halt_reset_r), FUNC(scd_a12000_halt_reset_w)); // sub-cpu control | |
2330 | space->machine().device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_readwrite_handler(0xa12002, 0xa12003, FUNC(scd_a12002_memory_mode_r), FUNC(scd_a12002_memory_mode_w)); // memory mode / write protect | |
2331 | //space->machine().device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_readwrite_handler(0xa12004, 0xa12005, FUNC(segacd_cdc_mode_address_r), FUNC(segacd_cdc_mode_address_w)); | |
2332 | space->machine().device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_readwrite_handler(0xa12006, 0xa12007, FUNC(scd_a12006_hint_register_r), FUNC(scd_a12006_hint_register_w)); // where HINT points on main CPU | |
2333 | //space->machine().device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_read_handler (0xa12008, 0xa12009, FUNC(cdc_data_main_r)); | |
2329 | space.machine().device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_readwrite_handler(0xa12000, 0xa12001, FUNC(scd_a12000_halt_reset_r), FUNC(scd_a12000_halt_reset_w)); // sub-cpu control | |
2330 | space.machine().device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_readwrite_handler(0xa12002, 0xa12003, FUNC(scd_a12002_memory_mode_r), FUNC(scd_a12002_memory_mode_w)); // memory mode / write protect | |
2331 | //space.machine().device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_readwrite_handler(0xa12004, 0xa12005, FUNC(segacd_cdc_mode_address_r), FUNC(segacd_cdc_mode_address_w)); | |
2332 | space.machine().device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_readwrite_handler(0xa12006, 0xa12007, FUNC(scd_a12006_hint_register_r), FUNC(scd_a12006_hint_register_w)); // where HINT points on main CPU | |
2333 | //space.machine().device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_read_handler (0xa12008, 0xa12009, FUNC(cdc_data_main_r)); | |
2334 | 2334 | |
2335 | 2335 | |
2336 | space | |
2336 | space.machine().device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_readwrite_handler(0xa1200c, 0xa1200d, FUNC(segacd_stopwatch_timer_r), FUNC(segacd_stopwatch_timer_w)); // starblad | |
2337 | 2337 | |
2338 | space | |
2338 | space.machine().device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_readwrite_handler(0xa1200e, 0xa1200f, FUNC(segacd_comms_flags_r), FUNC(segacd_comms_flags_maincpu_w)); // communication flags block | |
2339 | 2339 | |
2340 | space->machine().device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_readwrite_handler(0xa12010, 0xa1201f, FUNC(segacd_comms_main_part1_r), FUNC(segacd_comms_main_part1_w)); | |
2341 | space->machine().device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_readwrite_handler(0xa12020, 0xa1202f, FUNC(segacd_comms_main_part2_r), FUNC(segacd_comms_main_part2_w)); | |
2340 | space.machine().device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_readwrite_handler(0xa12010, 0xa1201f, FUNC(segacd_comms_main_part1_r), FUNC(segacd_comms_main_part1_w)); | |
2341 | space.machine().device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_readwrite_handler(0xa12020, 0xa1202f, FUNC(segacd_comms_main_part2_r), FUNC(segacd_comms_main_part2_w)); | |
2342 | 2342 | |
2343 | 2343 | |
2344 | 2344 | |
2345 | 2345 | machine.device(":segacd:segacd_68k")->execute().set_irq_acknowledge_callback(segacd_sub_int_callback); |
2346 | 2346 | |
2347 | space | |
2347 | space.install_legacy_read_handler (0x0000070, 0x0000073, FUNC(scd_hint_vector_r) ); | |
2348 | 2348 | |
2349 | 2349 | segacd_gfx_conversion_timer = machine.scheduler().timer_alloc(FUNC(segacd_gfx_conversion_timer_callback)); |
2350 | 2350 | segacd_gfx_conversion_timer->adjust(attotime::never); |
r17963 | r17964 | |
2551 | 2551 | if (scd_rammode&1) |
2552 | 2552 | { |
2553 | 2553 | COMBINE_DATA(&segacd_dataram[offset]); |
2554 | segacd_mark_tiles_dirty(space | |
2554 | segacd_mark_tiles_dirty(space.machine(), offset); | |
2555 | 2555 | } |
2556 | 2556 | else |
2557 | 2557 | { |
r17963 | r17964 | |
2578 | 2578 | |
2579 | 2579 | if (scd_rammode&1) |
2580 | 2580 | { |
2581 | segacd_1meg_mode_word_write(space | |
2581 | segacd_1meg_mode_word_write(space.machine(), offset/2+0x00000/2, data , mem_mask, 1); | |
2582 | 2582 | } |
2583 | 2583 | else |
2584 | 2584 | { |
2585 | segacd_1meg_mode_word_write(space | |
2585 | segacd_1meg_mode_word_write(space.machine(), offset/2+0x20000/2, data, mem_mask, 1); | |
2586 | 2586 | } |
2587 | 2587 | |
2588 | 2588 | // printf("Unspported: segacd_sub_dataram_part1_w in mode 1 (Word RAM Expander - 1 Byte Per Pixel) %04x\n", data); |
r17963 | r17964 | |
2626 | 2626 | // ret bit set by sub cpu determines which half of WorkRAM we have access to? |
2627 | 2627 | if (scd_rammode&1) |
2628 | 2628 | { |
2629 | segacd_1meg_mode_word_write(space | |
2629 | segacd_1meg_mode_word_write(space.machine(),offset+0x00000/2, data, mem_mask, 0); | |
2630 | 2630 | } |
2631 | 2631 | else |
2632 | 2632 | { |
2633 | segacd_1meg_mode_word_write(space | |
2633 | segacd_1meg_mode_word_write(space.machine(),offset+0x20000/2, data, mem_mask, 0); | |
2634 | 2634 | } |
2635 | 2635 | |
2636 | 2636 | } |
r17963 | r17964 | |
2640 | 2640 | |
2641 | 2641 | static READ16_HANDLER( segacd_irq_mask_r ) |
2642 | 2642 | { |
2643 | if (SEGACD_FORCE_SYNCS) space | |
2643 | if (SEGACD_FORCE_SYNCS) space.machine().scheduler().synchronize(); | |
2644 | 2644 | return segacd_irq_mask; |
2645 | 2645 | } |
2646 | 2646 | |
r17963 | r17964 | |
2649 | 2649 | if (ACCESSING_BITS_0_7) |
2650 | 2650 | { |
2651 | 2651 | UINT16 control = CDD_CONTROL; |
2652 | if (SEGACD_FORCE_SYNCS) space | |
2652 | if (SEGACD_FORCE_SYNCS) space.machine().scheduler().synchronize(); | |
2653 | 2653 | // printf("segacd_irq_mask_w %04x %04x (CDD control is %04x)\n",data, mem_mask, control); |
2654 | 2654 | |
2655 | 2655 | if (data & 0x10) |
r17963 | r17964 | |
2659 | 2659 | if (!(segacd_irq_mask & 0x10)) |
2660 | 2660 | { |
2661 | 2661 | segacd_irq_mask = data & 0x7e; |
2662 | CDD_Process(space | |
2662 | CDD_Process(space.machine(), 0); | |
2663 | 2663 | return; |
2664 | 2664 | } |
2665 | 2665 | } |
r17963 | r17964 | |
2677 | 2677 | |
2678 | 2678 | static READ16_HANDLER( segacd_cdd_ctrl_r ) |
2679 | 2679 | { |
2680 | if (SEGACD_FORCE_SYNCS) space | |
2680 | if (SEGACD_FORCE_SYNCS) space.machine().scheduler().synchronize(); | |
2681 | 2681 | return CDD_CONTROL; |
2682 | 2682 | } |
2683 | 2683 | |
r17963 | r17964 | |
2687 | 2687 | if (ACCESSING_BITS_0_7) |
2688 | 2688 | { |
2689 | 2689 | UINT16 control = CDD_CONTROL; |
2690 | if (SEGACD_FORCE_SYNCS) space | |
2690 | if (SEGACD_FORCE_SYNCS) space.machine().scheduler().synchronize(); | |
2691 | 2691 | |
2692 | 2692 | //printf("segacd_cdd_ctrl_w %04x %04x (control %04x irq %04x\n", data, mem_mask, control, segacd_irq_mask); |
2693 | 2693 | |
r17963 | r17964 | |
2699 | 2699 | { |
2700 | 2700 | if (segacd_irq_mask&0x10) |
2701 | 2701 | { |
2702 | CDD_Process(space | |
2702 | CDD_Process(space.machine(), 1); | |
2703 | 2703 | } |
2704 | 2704 | } |
2705 | 2705 | } |
r17963 | r17964 | |
2725 | 2725 | |
2726 | 2726 | if(offset == 9) |
2727 | 2727 | { |
2728 | CDD_Import(space | |
2728 | CDD_Import(space.machine()); | |
2729 | 2729 | } |
2730 | 2730 | } |
2731 | 2731 | |
r17963 | r17964 | |
2858 | 2858 | //int i; |
2859 | 2859 | UINT8 pix = 0x0; |
2860 | 2860 | |
2861 | pix = read_pixel_from_stampmap(space | |
2861 | pix = read_pixel_from_stampmap(space.machine(), srcbitmap, xbase>>(3+8), ybase>>(3+8)); | |
2862 | 2862 | |
2863 | 2863 | xbase += deltax; |
2864 | 2864 | ybase += deltay; |
r17963 | r17964 | |
2878 | 2878 | |
2879 | 2879 | offset+=countx & 0x7; |
2880 | 2880 | |
2881 | write_pixel( space | |
2881 | write_pixel( space.machine(), pix, offset ); | |
2882 | 2882 | |
2883 | segacd_mark_tiles_dirty(space->machine(), (offset>>3)); | |
2884 | segacd_mark_tiles_dirty(space->machine(), (offset>>3)+1); | |
2883 | segacd_mark_tiles_dirty(space.machine(), (offset>>3)); | |
2884 | segacd_mark_tiles_dirty(space.machine(), (offset>>3)+1); | |
2885 | 2885 | |
2886 | 2886 | } |
2887 | 2887 | |
r17963 | r17964 | |
3032 | 3032 | |
3033 | 3033 | //printf("%f\n",cdfader_vol); |
3034 | 3034 | |
3035 | cdda_set_volume(space | |
3035 | cdda_set_volume(space.machine().device(":segacd:cdda"), cdfader_vol); | |
3036 | 3036 | } |
3037 | 3037 | |
3038 | 3038 | READ16_HANDLER( segacd_backupram_r ) |
3039 | 3039 | { |
3040 | if(ACCESSING_BITS_8_15 && !(space | |
3040 | if(ACCESSING_BITS_8_15 && !(space.debugger_access())) | |
3041 | 3041 | printf("Warning: read to backupram even bytes! [%04x]\n",offset); |
3042 | 3042 | |
3043 | 3043 | return segacd_backupram[offset] & 0xff; |
r17963 | r17964 | |
3048 | 3048 | if(ACCESSING_BITS_0_7) |
3049 | 3049 | segacd_backupram[offset] = data; |
3050 | 3050 | |
3051 | if(ACCESSING_BITS_8_15 && !(space | |
3051 | if(ACCESSING_BITS_8_15 && !(space.debugger_access())) | |
3052 | 3052 | printf("Warning: write to backupram even bytes! [%04x] %02x\n",offset,data); |
3053 | 3053 | } |
3054 | 3054 |
r17963 | r17964 | |
---|---|---|
54 | 54 | |
55 | 55 | READ16_HANDLER( pgm_asic3_r ) |
56 | 56 | { |
57 | pgm_asic3_state *state = space | |
57 | pgm_asic3_state *state = space.machine().driver_data<pgm_asic3_state>(); | |
58 | 58 | UINT8 res = 0; |
59 | 59 | /* region is supplied by the protection device */ |
60 | 60 | |
r17963 | r17964 | |
98 | 98 | |
99 | 99 | WRITE16_HANDLER( pgm_asic3_w ) |
100 | 100 | { |
101 | pgm_asic3_state *state = space | |
101 | pgm_asic3_state *state = space.machine().driver_data<pgm_asic3_state>(); | |
102 | 102 | |
103 | 103 | if(ACCESSING_BITS_0_7) |
104 | 104 | { |
r17963 | r17964 | |
127 | 127 | { |
128 | 128 | state->m_asic3_y = state->m_asic3_reg & 7; |
129 | 129 | state->m_asic3_z = data; |
130 | asic3_compute_hold(space | |
130 | asic3_compute_hold(space.machine()); | |
131 | 131 | } |
132 | 132 | } |
133 | 133 | } |
134 | 134 | |
135 | 135 | WRITE16_HANDLER( pgm_asic3_reg_w ) |
136 | 136 | { |
137 | pgm_asic3_state *state = space | |
137 | pgm_asic3_state *state = space.machine().driver_data<pgm_asic3_state>(); | |
138 | 138 | |
139 | 139 | if(ACCESSING_BITS_0_7) |
140 | 140 | state->m_asic3_reg = data & 0xff; |
r17963 | r17964 | |
---|---|---|
44 | 44 | offset = (cx4.ram[0x626] & 3) * 2; |
45 | 45 | srcptr = 0x220; |
46 | 46 | |
47 | address_space | |
47 | address_space &space = *machine.device<cpu_device>("maincpu")->space(AS_PROGRAM); | |
48 | 48 | for(i = cx4.ram[0x620]; i > 0 && sprcount > 0; i--, srcptr += 16) |
49 | 49 | { |
50 | 50 | UINT32 spraddr = CX4_readl(srcptr + 7); |
r17963 | r17964 | |
54 | 54 | sprname = cx4.ram[srcptr + 5]; |
55 | 55 | sprattr = cx4.ram[srcptr + 4] | cx4.ram[srcptr + 6]; |
56 | 56 | |
57 | if(space | |
57 | if(space.read_byte(spraddr)) | |
58 | 58 | { |
59 | 59 | INT16 x, y; |
60 | 60 | INT32 sprcnt; |
61 | for(sprcnt = space | |
61 | for(sprcnt = space.read_byte(spraddr++); sprcnt > 0 && sprcount > 0; sprcnt--, spraddr += 4) | |
62 | 62 | { |
63 | x = (INT8)space | |
63 | x = (INT8)space.read_byte(spraddr + 1); | |
64 | 64 | if(sprattr & 0x40) |
65 | 65 | { |
66 | x = -x - ((space | |
66 | x = -x - ((space.read_byte(spraddr) & 0x20) ? 16 : 8); | |
67 | 67 | } |
68 | 68 | x += sprx; |
69 | 69 | if(x >= -16 && x <= 272) |
70 | 70 | { |
71 | y = (INT8)space | |
71 | y = (INT8)space.read_byte(spraddr + 2); | |
72 | 72 | if(sprattr & 0x80) |
73 | 73 | { |
74 | y = -y - ((space | |
74 | y = -y - ((space.read_byte(spraddr) & 0x20) ? 16 : 8); | |
75 | 75 | } |
76 | 76 | y += spry; |
77 | 77 | if(y >= -16 && y <= 224) |
78 | 78 | { |
79 | 79 | cx4.ram[oamptr ] = (UINT8)x; |
80 | 80 | cx4.ram[oamptr + 1] = (UINT8)y; |
81 | cx4.ram[oamptr + 2] = sprname + space->read_byte(spraddr + 3); | |
82 | cx4.ram[oamptr + 3] = sprattr ^ (space->read_byte(spraddr) & 0xc0); | |
81 | cx4.ram[oamptr + 2] = sprname + space.read_byte(spraddr + 3); | |
82 | cx4.ram[oamptr + 3] = sprattr ^ (space.read_byte(spraddr) & 0xc0); | |
83 | 83 | cx4.ram[oamptr2] &= ~(3 << offset); |
84 | 84 | if(x & 0x100) |
85 | 85 | { |
86 | 86 | cx4.ram[oamptr2] |= 1 << offset; |
87 | 87 | } |
88 | if(space | |
88 | if(space.read_byte(spraddr) & 0x20) | |
89 | 89 | { |
90 | 90 | cx4.ram[oamptr2] |= 2 << offset; |
91 | 91 | } |
r17963 | r17964 | |
---|---|---|
289 | 289 | WRITE_LINE_DEVICE_HANDLER( zwackery_ca2_w ) |
290 | 290 | { |
291 | 291 | mcr68_state *drvstate = device->machine().driver_data<mcr68_state>(); |
292 | address_space *space = device->machine().device("maincpu")->memory().space(AS_PROGRAM); | |
293 | drvstate->m_chip_squeak_deluxe->write(*space, 0, (state << 4) | drvstate->m_zwackery_sound_data); | |
292 | address_space &space = *device->machine().device("maincpu")->memory().space(AS_PROGRAM); | |
293 | drvstate->m_chip_squeak_deluxe->write(space, 0, (state << 4) | drvstate->m_zwackery_sound_data); | |
294 | 294 | } |
295 | 295 | |
296 | 296 |
r17963 | r17964 | |
---|---|---|
632 | 632 | |
633 | 633 | static void cps2_decrypt(running_machine &machine, const UINT32 *master_key, UINT32 upper_limit) |
634 | 634 | { |
635 | address_space | |
635 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
636 | 636 | UINT16 *rom = (UINT16 *)machine.root_device().memregion("maincpu")->base(); |
637 | 637 | int length = machine.root_device().memregion("maincpu")->bytes(); |
638 | 638 | UINT16 *dec = auto_alloc_array(machine, UINT16, length/2); |
r17963 | r17964 | |
720 | 720 | } |
721 | 721 | } |
722 | 722 | |
723 | space | |
723 | space.set_decrypted_region(0x000000, length - 1, dec); | |
724 | 724 | m68k_set_encrypted_opcode_range(machine.device("maincpu"), 0, length); |
725 | 725 | } |
726 | 726 |
r17963 | r17964 | |
---|---|---|
43 | 43 | static WRITE32_HANDLER( svg_arm7_ram_sel_w ) |
44 | 44 | { |
45 | 45 | // printf("svg_arm7_ram_sel_w %08x\n", data); |
46 | space | |
46 | space.machine().scheduler().synchronize(); // force resync | |
47 | 47 | |
48 | pgm_arm_type3_state *state = space | |
48 | pgm_arm_type3_state *state = space.machine().driver_data<pgm_arm_type3_state>(); | |
49 | 49 | state->m_svg_ram_sel = data & 1; |
50 | 50 | } |
51 | 51 | |
52 | 52 | static READ32_HANDLER( svg_arm7_shareram_r ) |
53 | 53 | { |
54 | pgm_arm_type3_state *state = space | |
54 | pgm_arm_type3_state *state = space.machine().driver_data<pgm_arm_type3_state>(); | |
55 | 55 | return state->m_svg_shareram[state->m_svg_ram_sel & 1][offset]; |
56 | 56 | } |
57 | 57 | |
58 | 58 | static WRITE32_HANDLER( svg_arm7_shareram_w ) |
59 | 59 | { |
60 | pgm_arm_type3_state *state = space | |
60 | pgm_arm_type3_state *state = space.machine().driver_data<pgm_arm_type3_state>(); | |
61 | 61 | COMBINE_DATA(&state->m_svg_shareram[state->m_svg_ram_sel & 1][offset]); |
62 | 62 | } |
63 | 63 | |
64 | 64 | static READ16_HANDLER( svg_m68k_ram_r ) |
65 | 65 | { |
66 | pgm_arm_type3_state *state = space | |
66 | pgm_arm_type3_state *state = space.machine().driver_data<pgm_arm_type3_state>(); | |
67 | 67 | int ram_sel = (state->m_svg_ram_sel & 1) ^ 1; |
68 | 68 | UINT16 *share16 = (UINT16 *)(state->m_svg_shareram[ram_sel & 1]); |
69 | 69 | |
r17963 | r17964 | |
72 | 72 | |
73 | 73 | static WRITE16_HANDLER( svg_m68k_ram_w ) |
74 | 74 | { |
75 | pgm_arm_type3_state *state = space | |
75 | pgm_arm_type3_state *state = space.machine().driver_data<pgm_arm_type3_state>(); | |
76 | 76 | int ram_sel = (state->m_svg_ram_sel & 1) ^ 1; |
77 | 77 | UINT16 *share16 = (UINT16 *)(state->m_svg_shareram[ram_sel & 1]); |
78 | 78 | |
r17963 | r17964 | |
86 | 86 | |
87 | 87 | static WRITE16_HANDLER( svg_68k_nmi_w ) |
88 | 88 | { |
89 | pgm_arm_type3_state *state = space | |
89 | pgm_arm_type3_state *state = space.machine().driver_data<pgm_arm_type3_state>(); | |
90 | 90 | generic_pulse_irq_line(state->m_prot, ARM7_FIRQ_LINE, 1); |
91 | 91 | } |
92 | 92 | |
93 | 93 | static WRITE16_HANDLER( svg_latch_68k_w ) |
94 | 94 | { |
95 | pgm_arm_type3_state *state = space | |
95 | pgm_arm_type3_state *state = space.machine().driver_data<pgm_arm_type3_state>(); | |
96 | 96 | if (PGMARM7LOGERROR) |
97 | logerror("M68K: Latch write: %04x (%04x) (%06x)\n", data & 0x0000ffff, mem_mask, space | |
97 | logerror("M68K: Latch write: %04x (%04x) (%06x)\n", data & 0x0000ffff, mem_mask, space.device().safe_pc()); | |
98 | 98 | COMBINE_DATA(&state->m_svg_latchdata_68k_w); |
99 | 99 | } |
100 | 100 | |
101 | 101 | |
102 | 102 | static READ16_HANDLER( svg_latch_68k_r ) |
103 | 103 | { |
104 | pgm_arm_type3_state *state = space | |
104 | pgm_arm_type3_state *state = space.machine().driver_data<pgm_arm_type3_state>(); | |
105 | 105 | |
106 | 106 | if (PGMARM7LOGERROR) |
107 | logerror("M68K: Latch read: %04x (%04x) (%06x)\n", state->m_svg_latchdata_arm_w & 0x0000ffff, mem_mask, space | |
107 | logerror("M68K: Latch read: %04x (%04x) (%06x)\n", state->m_svg_latchdata_arm_w & 0x0000ffff, mem_mask, space.device().safe_pc()); | |
108 | 108 | return state->m_svg_latchdata_arm_w; |
109 | 109 | } |
110 | 110 | |
r17963 | r17964 | |
112 | 112 | |
113 | 113 | static READ32_HANDLER( svg_latch_arm_r ) |
114 | 114 | { |
115 | pgm_arm_type3_state *state = space | |
115 | pgm_arm_type3_state *state = space.machine().driver_data<pgm_arm_type3_state>(); | |
116 | 116 | |
117 | 117 | if (PGMARM7LOGERROR) |
118 | logerror("ARM7: Latch read: %08x (%08x) (%06x)\n", state->m_svg_latchdata_68k_w, mem_mask, space | |
118 | logerror("ARM7: Latch read: %08x (%08x) (%06x)\n", state->m_svg_latchdata_68k_w, mem_mask, space.device().safe_pc()); | |
119 | 119 | return state->m_svg_latchdata_68k_w; |
120 | 120 | } |
121 | 121 | |
122 | 122 | static WRITE32_HANDLER( svg_latch_arm_w ) |
123 | 123 | { |
124 | pgm_arm_type3_state *state = space | |
124 | pgm_arm_type3_state *state = space.machine().driver_data<pgm_arm_type3_state>(); | |
125 | 125 | |
126 | 126 | if (PGMARM7LOGERROR) |
127 | logerror("ARM7: Latch write: %08x (%08x) (%06x)\n", data, mem_mask, space | |
127 | logerror("ARM7: Latch write: %08x (%08x) (%06x)\n", data, mem_mask, space.device().safe_pc()); | |
128 | 128 | |
129 | 129 | COMBINE_DATA(&state->m_svg_latchdata_arm_w); |
130 | 130 | } |
r17963 | r17964 | |
267 | 267 | |
268 | 268 | static READ32_HANDLER( dmnfrnt_speedup_r ) |
269 | 269 | { |
270 | pgm_arm_type3_state *state = space->machine().driver_data<pgm_arm_type3_state>(); | |
271 | int pc = space->device().safe_pc(); | |
272 | if (pc == 0x8000fea) space->device().execute().eat_cycles(500); | |
270 | pgm_arm_type3_state *state = space.machine().driver_data<pgm_arm_type3_state>(); | |
271 | int pc = space.device().safe_pc(); | |
272 | if (pc == 0x8000fea) space.device().execute().eat_cycles(500); | |
273 | 273 | // else printf("dmn_speedup_r %08x\n", pc); |
274 | 274 | return state->m_arm_ram[0x000444/4]; |
275 | 275 | } |
276 | 276 | |
277 | 277 | static READ16_HANDLER( dmnfrnt_main_speedup_r ) |
278 | 278 | { |
279 | pgm_state *state = space | |
279 | pgm_state *state = space.machine().driver_data<pgm_state>(); | |
280 | 280 | UINT16 data = state->m_mainram[0xa03c/2]; |
281 | int pc = space->device().safe_pc(); | |
282 | if (pc == 0x10193a) space->device().execute().spin_until_interrupt(); | |
283 | else if (pc == 0x1019a4) space->device().execute().spin_until_interrupt(); | |
281 | int pc = space.device().safe_pc(); | |
282 | if (pc == 0x10193a) space.device().execute().spin_until_interrupt(); | |
283 | else if (pc == 0x1019a4) space.device().execute().spin_until_interrupt(); | |
284 | 284 | return data; |
285 | 285 | } |
286 | 286 |
r17963 | r17964 | |
---|---|---|
11 | 11 | #define TGP_FUNCTION(name) void name(running_machine &machine) |
12 | 12 | |
13 | 13 | |
14 | static UINT32 fifoout_pop(address_space | |
14 | static UINT32 fifoout_pop(address_space &space) | |
15 | 15 | { |
16 | model1_state *state = space | |
16 | model1_state *state = space.machine().driver_data<model1_state>(); | |
17 | 17 | UINT32 v; |
18 | 18 | if(state->m_fifoout_wpos == state->m_fifoout_rpos) { |
19 | fatalerror("TGP FIFOOUT underflow (%x)\n", space | |
19 | fatalerror("TGP FIFOOUT underflow (%x)\n", space.device().safe_pc()); | |
20 | 20 | } |
21 | 21 | v = state->m_fifoout_data[state->m_fifoout_rpos++]; |
22 | 22 | if(state->m_fifoout_rpos == FIFO_SIZE) |
r17963 | r17964 | |
57 | 57 | return v; |
58 | 58 | } |
59 | 59 | |
60 | static void fifoin_push(address_space | |
60 | static void fifoin_push(address_space &space, UINT32 data) | |
61 | 61 | { |
62 | model1_state *state = space->machine().driver_data<model1_state>(); | |
63 | // logerror("TGP FIFOIN write %08x (%x)\n", data, space->device().safe_pc()); | |
62 | model1_state *state = space.machine().driver_data<model1_state>(); | |
63 | // logerror("TGP FIFOIN write %08x (%x)\n", data, space.device().safe_pc()); | |
64 | 64 | state->m_fifoin_data[state->m_fifoin_wpos++] = data; |
65 | 65 | if(state->m_fifoin_wpos == FIFO_SIZE) |
66 | 66 | state->m_fifoin_wpos = 0; |
r17963 | r17964 | |
68 | 68 | logerror("TGP FIFOIN overflow\n"); |
69 | 69 | state->m_fifoin_cbcount--; |
70 | 70 | if(!state->m_fifoin_cbcount) |
71 | state->m_fifoin_cb(space | |
71 | state->m_fifoin_cb(space.machine()); | |
72 | 72 | } |
73 | 73 | |
74 | 74 | static float fifoin_pop_f(model1_state *state) |
r17963 | r17964 | |
1938 | 1938 | READ16_MEMBER(model1_state::model1_tgp_copro_r) |
1939 | 1939 | { |
1940 | 1940 | if(!offset) { |
1941 | m_copro_r = fifoout_pop( | |
1941 | m_copro_r = fifoout_pop(space); | |
1942 | 1942 | return m_copro_r; |
1943 | 1943 | } else |
1944 | 1944 | return m_copro_r >> 16; |
r17963 | r17964 | |
1949 | 1949 | if(offset) { |
1950 | 1950 | m_copro_w = (m_copro_w & 0x0000ffff) | (data << 16); |
1951 | 1951 | m_pushpc = space.device().safe_pc(); |
1952 | fifoin_push( | |
1952 | fifoin_push(space, m_copro_w); | |
1953 | 1953 | } else |
1954 | 1954 | m_copro_w = (m_copro_w & 0xffff0000) | data; |
1955 | 1955 | } |
r17963 | r17964 | |
2071 | 2071 | return 1; |
2072 | 2072 | } |
2073 | 2073 | |
2074 | static void copro_fifoin_push(address_space | |
2074 | static void copro_fifoin_push(address_space &space, UINT32 data) | |
2075 | 2075 | { |
2076 | model1_state *state = space | |
2076 | model1_state *state = space.machine().driver_data<model1_state>(); | |
2077 | 2077 | if (state->m_copro_fifoin_num == FIFO_SIZE) |
2078 | 2078 | { |
2079 | fatalerror("Copro FIFOIN overflow (at %08X)\n", space | |
2079 | fatalerror("Copro FIFOIN overflow (at %08X)\n", space.device().safe_pc()); | |
2080 | 2080 | return; |
2081 | 2081 | } |
2082 | 2082 | |
r17963 | r17964 | |
2090 | 2090 | state->m_copro_fifoin_num++; |
2091 | 2091 | } |
2092 | 2092 | |
2093 | static UINT32 copro_fifoout_pop(address_space | |
2093 | static UINT32 copro_fifoout_pop(address_space &space) | |
2094 | 2094 | { |
2095 | model1_state *state = space | |
2095 | model1_state *state = space.machine().driver_data<model1_state>(); | |
2096 | 2096 | UINT32 r; |
2097 | 2097 | |
2098 | 2098 | if (state->m_copro_fifoout_num == 0) |
2099 | 2099 | { |
2100 | 2100 | // Reading from empty FIFO causes the v60 to enter wait state |
2101 | v60_stall(space | |
2101 | v60_stall(space.machine().device("maincpu")); | |
2102 | 2102 | |
2103 | space | |
2103 | space.machine().scheduler().synchronize(); | |
2104 | 2104 | |
2105 | 2105 | return 0; |
2106 | 2106 | } |
r17963 | r17964 | |
2204 | 2204 | { |
2205 | 2205 | if (!offset) |
2206 | 2206 | { |
2207 | m_vr_r = copro_fifoout_pop( | |
2207 | m_vr_r = copro_fifoout_pop(space); | |
2208 | 2208 | return m_vr_r; |
2209 | 2209 | } |
2210 | 2210 | else |
r17963 | r17964 | |
2216 | 2216 | if (offset) |
2217 | 2217 | { |
2218 | 2218 | m_vr_w = (m_vr_w & 0x0000ffff) | (data << 16); |
2219 | copro_fifoin_push( | |
2219 | copro_fifoin_push(space, m_vr_w); | |
2220 | 2220 | } |
2221 | 2221 | else |
2222 | 2222 | m_vr_w = (m_vr_w & 0xffff0000) | data; |
r17963 | r17964 | |
---|---|---|
471 | 471 | ((m_vdp_command_part2 & 0x0003) << 14); |
472 | 472 | } |
473 | 473 | |
474 | UINT16 (*vdp_get_word_from_68k_mem)(running_machine &machine, UINT32 source, address_space | |
474 | UINT16 (*vdp_get_word_from_68k_mem)(running_machine &machine, UINT32 source, address_space& space68k); | |
475 | 475 | |
476 | UINT16 vdp_get_word_from_68k_mem_default(running_machine &machine, UINT32 source, address_space* space68k) | |
476 | UINT16 vdp_get_word_from_68k_mem_default(running_machine &machine, UINT32 source, address_space * space68k) | |
477 | 477 | { |
478 | 478 | // should we limit the valid areas here? |
479 | 479 | // how does this behave with the segacd etc? |
r17963 | r17964 | |
574 | 574 | |
575 | 575 | for (count = 0;count<(length>>1);count++) |
576 | 576 | { |
577 | vdp_vram_write(vdp_get_word_from_68k_mem(machine, source, m_space68k)); | |
577 | vdp_vram_write(vdp_get_word_from_68k_mem(machine, source, *m_space68k)); | |
578 | 578 | source+=2; |
579 | 579 | if (source>0xffffff) source = 0xe00000; |
580 | 580 | } |
r17963 | r17964 | |
600 | 600 | { |
601 | 601 | //if (m_vdp_address>=0x80) return; // abandon |
602 | 602 | |
603 | write_cram_value(machine, (m_vdp_address&0x7e)>>1, vdp_get_word_from_68k_mem(machine, source, m_space68k)); | |
603 | write_cram_value(machine, (m_vdp_address&0x7e)>>1, vdp_get_word_from_68k_mem(machine, source, *m_space68k)); | |
604 | 604 | source+=2; |
605 | 605 | |
606 | 606 | if (source>0xffffff) source = 0xfe0000; |
r17963 | r17964 | |
628 | 628 | { |
629 | 629 | if (m_vdp_address>=0x80) return; // abandon |
630 | 630 | |
631 | m_vsram[(m_vdp_address&0x7e)>>1] = vdp_get_word_from_68k_mem(machine, source, m_space68k); | |
631 | m_vsram[(m_vdp_address&0x7e)>>1] = vdp_get_word_from_68k_mem(machine, source, *m_space68k); | |
632 | 632 | source+=2; |
633 | 633 | |
634 | 634 | if (source>0xffffff) source = 0xfe0000; |
r17963 | r17964 | |
855 | 855 | case 0x14: |
856 | 856 | case 0x16: |
857 | 857 | if (ACCESSING_BITS_0_7) sn76496_w(space.machine().device(":snsnd"), space, 0, data & 0xff); |
858 | //if (ACCESSING_BITS_8_15) sn76496_w(space | |
858 | //if (ACCESSING_BITS_8_15) sn76496_w(space.machine().device("snsnd"), 0, (data >>8) & 0xff); | |
859 | 859 | break; |
860 | 860 | |
861 | 861 | default: |
r17963 | r17964 | |
1265 | 1265 | case 0x06: |
1266 | 1266 | // if ((!ACCESSING_BITS_8_15) || (!ACCESSING_BITS_0_7)) mame_printf_debug("8-bit VDP read control port access, offset %04x mem_mask %04x\n",offset,mem_mask); |
1267 | 1267 | retvalue = megadriv_vdp_ctrl_port_r(space.machine()); |
1268 | // retvalue = space->machine().rand(); | |
1269 | // mame_printf_debug("%06x: Read Control Port at scanline %d hpos %d (return %04x)\n",space->device().safe_pc(),genesis_get_scanline_counter(machine), get_hposition(space.machine()),retvalue); | |
1268 | // retvalue = space.machine().rand(); | |
1269 | // mame_printf_debug("%06x: Read Control Port at scanline %d hpos %d (return %04x)\n",space.device().safe_pc(),genesis_get_scanline_counter(machine), get_hposition(space.machine()),retvalue); | |
1270 | 1270 | break; |
1271 | 1271 | |
1272 | 1272 | case 0x08: |
r17963 | r17964 | |
1275 | 1275 | case 0x0e: |
1276 | 1276 | // if ((!ACCESSING_BITS_8_15) || (!ACCESSING_BITS_0_7)) mame_printf_debug("8-bit VDP read HV counter port access, offset %04x mem_mask %04x\n",offset,mem_mask); |
1277 | 1277 | retvalue = megadriv_read_hv_counters(space.machine()); |
1278 | // retvalue = space->machine().rand(); | |
1279 | // mame_printf_debug("%06x: Read HV counters at scanline %d hpos %d (return %04x)\n",space->device().safe_pc(),genesis_get_scanline_counter(machine), get_hposition(space.machine()),retvalue); | |
1278 | // retvalue = space.machine().rand(); | |
1279 | // mame_printf_debug("%06x: Read HV counters at scanline %d hpos %d (return %04x)\n",space.device().safe_pc(),genesis_get_scanline_counter(machine), get_hposition(space.machine()),retvalue); | |
1280 | 1280 | break; |
1281 | 1281 | |
1282 | 1282 | case 0x10: |
r17963 | r17964 | |
---|---|---|
399 | 399 | if ( state->m_cdrom_status[0] & state->m_cdrom_status[1] ) |
400 | 400 | { |
401 | 401 | if (LOG_AKIKO_CD) logerror( "Akiko CD IRQ\n" ); |
402 | amiga_custom_w(state->m_space, REG_INTREQ, 0x8000 | INTENA_PORTS, 0xffff); | |
402 | amiga_custom_w(*state->m_space, REG_INTREQ, 0x8000 | INTENA_PORTS, 0xffff); | |
403 | 403 | } |
404 | 404 | } |
405 | 405 |
r17963 | r17964 | |
---|---|---|
605 | 605 | |
606 | 606 | DRIVER_INIT_MEMBER(micro3d_state,micro3d) |
607 | 607 | { |
608 | address_space | |
608 | address_space &space = *machine().device("drmath")->memory().space(AS_DATA); | |
609 | 609 | |
610 | 610 | i8051_set_serial_tx_callback(machine().device("audiocpu"), data_from_i8031); |
611 | 611 | i8051_set_serial_rx_callback(machine().device("audiocpu"), data_to_i8031); |
r17963 | r17964 | |
614 | 614 | |
615 | 615 | /* The Am29000 program seems to rely on RAM from 0x00470000 onwards being |
616 | 616 | non-zero on a reset, otherwise the 3D object data doesn't get uploaded! */ |
617 | space | |
617 | space.write_dword(0x00470000, 0xa5a5a5a5); | |
618 | 618 | |
619 | 619 | /* TODO? BOTSS crashes when starting the final stage because the 68000 |
620 | 620 | overwrites memory in use by the Am29000. Slowing down the 68000 slightly |
r17963 | r17964 | |
624 | 624 | |
625 | 625 | DRIVER_INIT_MEMBER(micro3d_state,botss) |
626 | 626 | { |
627 | address_space | |
627 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
628 | 628 | |
629 | 629 | /* Required to pass the hardware version check */ |
630 | space->install_read_handler(0x140000, 0x140001, read16_delegate(FUNC(micro3d_state::botss_140000_r),this)); | |
631 | space->install_read_handler(0x180000, 0x180001, read16_delegate(FUNC(micro3d_state::botss_180000_r),this)); | |
630 | space.install_read_handler(0x140000, 0x140001, read16_delegate(FUNC(micro3d_state::botss_140000_r),this)); | |
631 | space.install_read_handler(0x180000, 0x180001, read16_delegate(FUNC(micro3d_state::botss_180000_r),this)); | |
632 | 632 | |
633 | 633 | DRIVER_INIT_CALL(micro3d); |
634 | 634 | } |
r17963 | r17964 | |
---|---|---|
189 | 189 | *************************************/ |
190 | 190 | static WRITE16_HANDLER( genesis_ssf2_bank_w ) |
191 | 191 | { |
192 | md_cons_state *state = space | |
192 | md_cons_state *state = space.machine().driver_data<md_cons_state>(); | |
193 | 193 | UINT8 *ROM = state->memregion("maincpu")->base(); |
194 | 194 | |
195 | 195 | if ((state->m_md_cart.ssf2_lastoff != offset) || (state->m_md_cart.ssf2_lastdata != data)) |
r17963 | r17964 | |
236 | 236 | #ifdef UNUSED_FUNCTION |
237 | 237 | static WRITE16_HANDLER( l3alt_pdat_w ) |
238 | 238 | { |
239 | md_cons_state *state = space | |
239 | md_cons_state *state = space.machine().driver_data<md_cons_state>(); | |
240 | 240 | state->m_md_cart.l3alt_pdat = data; |
241 | 241 | } |
242 | 242 | |
243 | 243 | static WRITE16_HANDLER( l3alt_pcmd_w ) |
244 | 244 | { |
245 | md_cons_state *state = space | |
245 | md_cons_state *state = space.machine().driver_data<md_cons_state>(); | |
246 | 246 | state->m_md_cart.l3alt_pcmd = data; |
247 | 247 | } |
248 | 248 | #endif |
249 | 249 | |
250 | 250 | static READ16_HANDLER( l3alt_prot_r ) |
251 | 251 | { |
252 | md_cons_state *state = space | |
252 | md_cons_state *state = space.machine().driver_data<md_cons_state>(); | |
253 | 253 | int retdata = 0; |
254 | 254 | |
255 | 255 | offset &= 0x07; |
r17963 | r17964 | |
296 | 296 | |
297 | 297 | static WRITE16_HANDLER( l3alt_prot_w ) |
298 | 298 | { |
299 | md_cons_state *state = space | |
299 | md_cons_state *state = space.machine().driver_data<md_cons_state>(); | |
300 | 300 | offset &= 0x7; |
301 | 301 | |
302 | 302 | switch (offset) |
r17963 | r17964 | |
321 | 321 | { |
322 | 322 | case 0: |
323 | 323 | { |
324 | UINT8 *ROM = space | |
324 | UINT8 *ROM = space.machine().root_device().memregion("maincpu")->base(); | |
325 | 325 | /* printf("%06x data %04x\n",activecpu_get_pc(), data); */ |
326 | 326 | memcpy(&ROM[0x000000], &ROM[VIRGIN_COPY_GEN + (data & 0xffff) * 0x8000], 0x8000); |
327 | 327 | } |
r17963 | r17964 | |
341 | 341 | *************************************/ |
342 | 342 | static WRITE16_HANDLER( realtec_402000_w ) |
343 | 343 | { |
344 | md_cons_state *state = space | |
344 | md_cons_state *state = space.machine().driver_data<md_cons_state>(); | |
345 | 345 | state->m_md_cart.realtec_bank_addr = 0; |
346 | 346 | state->m_md_cart.realtec_bank_size = (data >> 8) & 0x1f; |
347 | 347 | } |
348 | 348 | |
349 | 349 | static WRITE16_HANDLER( realtec_400000_w ) |
350 | 350 | { |
351 | md_cons_state *state = space | |
351 | md_cons_state *state = space.machine().driver_data<md_cons_state>(); | |
352 | 352 | int bankdata = (data >> 9) & 0x7; |
353 | 353 | |
354 | 354 | UINT8 *ROM = state->memregion("maincpu")->base(); |
r17963 | r17964 | |
362 | 362 | |
363 | 363 | static WRITE16_HANDLER( realtec_404000_w ) |
364 | 364 | { |
365 | md_cons_state *state = space | |
365 | md_cons_state *state = space.machine().driver_data<md_cons_state>(); | |
366 | 366 | int bankdata = (data >> 8) & 0x3; |
367 | 367 | UINT8 *ROM = state->memregion("maincpu")->base(); |
368 | 368 | |
r17963 | r17964 | |
381 | 381 | *************************************/ |
382 | 382 | static WRITE16_HANDLER( chifi3_bank_w ) |
383 | 383 | { |
384 | UINT8 *ROM = space | |
384 | UINT8 *ROM = space.machine().root_device().memregion("maincpu")->base(); | |
385 | 385 | |
386 | 386 | if (data == 0xf100) // *hit player |
387 | 387 | { |
r17963 | r17964 | |
417 | 417 | } |
418 | 418 | else |
419 | 419 | { |
420 | logerror("%06x chifi3, bankw? %04x %04x\n", space | |
420 | logerror("%06x chifi3, bankw? %04x %04x\n", space.device().safe_pc(), offset, data); | |
421 | 421 | } |
422 | 422 | |
423 | 423 | } |
r17963 | r17964 | |
434 | 434 | 04cefa chifi3, prot_r? 65262 |
435 | 435 | */ |
436 | 436 | |
437 | if (space | |
437 | if (space.device().safe_pc() == 0x01782) // makes 'VS' screen appear | |
438 | 438 | { |
439 | retdat = space | |
439 | retdat = space.device().state().state_int(M68K_D3) & 0xff; | |
440 | 440 | retdat <<= 8; |
441 | 441 | return retdat; |
442 | 442 | } |
443 | else if (space | |
443 | else if (space.device().safe_pc() == 0x1c24) // background gfx etc. | |
444 | 444 | { |
445 | retdat = space | |
445 | retdat = space.device().state().state_int(M68K_D3) & 0xff; | |
446 | 446 | retdat <<= 8; |
447 | 447 | return retdat; |
448 | 448 | } |
449 | else if (space | |
449 | else if (space.device().safe_pc() == 0x10c4a) // unknown | |
450 | 450 | { |
451 | return space | |
451 | return space.machine().rand(); | |
452 | 452 | } |
453 | else if (space | |
453 | else if (space.device().safe_pc() == 0x10c50) // unknown | |
454 | 454 | { |
455 | return space | |
455 | return space.machine().rand(); | |
456 | 456 | } |
457 | else if (space | |
457 | else if (space.device().safe_pc() == 0x10c52) // relates to the game speed.. | |
458 | 458 | { |
459 | retdat = space | |
459 | retdat = space.device().state().state_int(M68K_D4) & 0xff; | |
460 | 460 | retdat <<= 8; |
461 | 461 | return retdat; |
462 | 462 | } |
463 | else if (space | |
463 | else if (space.device().safe_pc() == 0x061ae) | |
464 | 464 | { |
465 | retdat = space | |
465 | retdat = space.device().state().state_int(M68K_D3) & 0xff; | |
466 | 466 | retdat <<= 8; |
467 | 467 | return retdat; |
468 | 468 | } |
469 | else if (space | |
469 | else if (space.device().safe_pc() == 0x061b0) | |
470 | 470 | { |
471 | retdat = space | |
471 | retdat = space.device().state().state_int(M68K_D3) & 0xff; | |
472 | 472 | retdat <<= 8; |
473 | 473 | return retdat; |
474 | 474 | } |
475 | 475 | else |
476 | 476 | { |
477 | logerror("%06x chifi3, prot_r? %04x\n", space | |
477 | logerror("%06x chifi3, prot_r? %04x\n", space.device().safe_pc(), offset); | |
478 | 478 | } |
479 | 479 | |
480 | 480 | return 0; |
r17963 | r17964 | |
485 | 485 | *************************************/ |
486 | 486 | static WRITE16_HANDLER( s19in1_bank ) |
487 | 487 | { |
488 | UINT8 *ROM = space | |
488 | UINT8 *ROM = space.machine().root_device().memregion("maincpu")->base(); | |
489 | 489 | memcpy(ROM + 0x000000, ROM + 0x400000 + ((offset << 1) * 0x10000), 0x80000); |
490 | 490 | } |
491 | 491 | |
r17963 | r17964 | |
494 | 494 | *************************************/ |
495 | 495 | static WRITE16_HANDLER( kaiju_bank_w ) |
496 | 496 | { |
497 | UINT8 *ROM = space | |
497 | UINT8 *ROM = space.machine().root_device().memregion("maincpu")->base(); | |
498 | 498 | memcpy(ROM + 0x000000, ROM + 0x400000 + (data & 0x7f) * 0x8000, 0x8000); |
499 | 499 | } |
500 | 500 | |
r17963 | r17964 | |
503 | 503 | *************************************/ |
504 | 504 | static READ16_HANDLER( soulb_400006_r ) |
505 | 505 | { |
506 | // printf("%06x soulb_400006_r\n",space | |
506 | // printf("%06x soulb_400006_r\n",space.device().safe_pc()); | |
507 | 507 | return 0xf000; |
508 | 508 | } |
509 | 509 | |
510 | 510 | static READ16_HANDLER( soulb_400002_r ) |
511 | 511 | { |
512 | // printf("%06x soulb_400002_r\n",space | |
512 | // printf("%06x soulb_400002_r\n",space.device().safe_pc()); | |
513 | 513 | return 0x9800; |
514 | 514 | } |
515 | 515 | |
516 | 516 | static READ16_HANDLER( soulb_400004_r ) |
517 | 517 | { |
518 | 518 | // return 0x9800; |
519 | // printf("%06x soulb_400004_r\n",space | |
519 | // printf("%06x soulb_400004_r\n",space.device().safe_pc()); | |
520 | 520 | // |
521 | 521 | return 0xc900; |
522 | 522 | //aa |
r17963 | r17964 | |
601 | 601 | static READ16_HANDLER( radica_bank_select ) |
602 | 602 | { |
603 | 603 | int bank = offset & 0x3f; |
604 | UINT8 *ROM = space | |
604 | UINT8 *ROM = space.machine().root_device().memregion("maincpu")->base(); | |
605 | 605 | memcpy(ROM, ROM + 0x400000 + (bank * 0x10000), 0x400000); |
606 | 606 | return 0; |
607 | 607 | } |
r17963 | r17964 | |
624 | 624 | *************************************/ |
625 | 625 | static READ16_HANDLER( squirrel_king_extra_r ) |
626 | 626 | { |
627 | md_cons_state *state = space | |
627 | md_cons_state *state = space.machine().driver_data<md_cons_state>(); | |
628 | 628 | return state->m_md_cart.squirrel_king_extra; |
629 | 629 | } |
630 | 630 | |
631 | 631 | static WRITE16_HANDLER( squirrel_king_extra_w ) |
632 | 632 | { |
633 | md_cons_state *state = space | |
633 | md_cons_state *state = space.machine().driver_data<md_cons_state>(); | |
634 | 634 | state->m_md_cart.squirrel_king_extra = data; |
635 | 635 | } |
636 | 636 | |
r17963 | r17964 | |
639 | 639 | *************************************/ |
640 | 640 | static READ16_HANDLER( lion2_prot1_r ) |
641 | 641 | { |
642 | md_cons_state *state = space | |
642 | md_cons_state *state = space.machine().driver_data<md_cons_state>(); | |
643 | 643 | return state->m_md_cart.lion2_prot1_data; |
644 | 644 | } |
645 | 645 | |
646 | 646 | static READ16_HANDLER( lion2_prot2_r ) |
647 | 647 | { |
648 | md_cons_state *state = space | |
648 | md_cons_state *state = space.machine().driver_data<md_cons_state>(); | |
649 | 649 | return state->m_md_cart.lion2_prot2_data; |
650 | 650 | } |
651 | 651 | |
652 | 652 | static WRITE16_HANDLER ( lion2_prot1_w ) |
653 | 653 | { |
654 | md_cons_state *state = space | |
654 | md_cons_state *state = space.machine().driver_data<md_cons_state>(); | |
655 | 655 | state->m_md_cart.lion2_prot1_data = data; |
656 | 656 | } |
657 | 657 | |
658 | 658 | static WRITE16_HANDLER ( lion2_prot2_w ) |
659 | 659 | { |
660 | md_cons_state *state = space | |
660 | md_cons_state *state = space.machine().driver_data<md_cons_state>(); | |
661 | 661 | state->m_md_cart.lion2_prot2_data = data; |
662 | 662 | } |
663 | 663 | |
r17963 | r17964 | |
741 | 741 | cpu #0 (PC=001771A2): unmapped program memory word read from 006BD294 & 00FF |
742 | 742 | */ |
743 | 743 | |
744 | if (space | |
744 | if (space.device().safe_pc()==0x1771a2) return 0x50; | |
745 | 745 | else |
746 | 746 | { |
747 | 747 | x++; |
748 | logerror("%06x topfig_6BD294_r %04x\n",space | |
748 | logerror("%06x topfig_6BD294_r %04x\n",space.device().safe_pc(), x); | |
749 | 749 | return x; |
750 | 750 | } |
751 | 751 | } |
r17963 | r17964 | |
754 | 754 | { |
755 | 755 | static int x = -1; |
756 | 756 | |
757 | if (space | |
757 | if (space.device().safe_pc()==0x4C94E) | |
758 | 758 | { |
759 | return space | |
759 | return space.machine().device("maincpu")->state().state_int((M68K_D0)) & 0xff; | |
760 | 760 | } |
761 | 761 | else |
762 | 762 | { |
763 | 763 | x++; |
764 | logerror("%06x topfig_6F5344_r %04x\n",space | |
764 | logerror("%06x topfig_6F5344_r %04x\n",space.device().safe_pc(), x); | |
765 | 765 | return x; |
766 | 766 | } |
767 | 767 | } |
768 | 768 | |
769 | 769 | static WRITE16_HANDLER( topfig_bank_w ) |
770 | 770 | { |
771 | UINT8 *ROM = space | |
771 | UINT8 *ROM = space.machine().root_device().memregion("maincpu")->base(); | |
772 | 772 | if (data == 0x002a) |
773 | 773 | { |
774 | 774 | memcpy(ROM + 0x060000, ROM + 0x570000, 0x8000); // == 0x2e*0x8000?! |
775 | // printf("%06x offset %06x, data %04x\n",space | |
775 | // printf("%06x offset %06x, data %04x\n",space.device().safe_pc(), offset, data); | |
776 | 776 | |
777 | 777 | } |
778 | 778 | else if (data==0x0035) // characters ingame |
r17963 | r17964 | |
788 | 788 | memcpy(ROM + 0x060000, ROM + 0x460000, 0x8000); |
789 | 789 | memcpy(ROM + 0x020000, ROM + 0x420000, 0x8000); |
790 | 790 | memcpy(ROM + 0x058000, ROM + 0x458000, 0x8000); |
791 | // printf("%06x offset %06x, data %04x\n",space | |
791 | // printf("%06x offset %06x, data %04x\n",space.device().safe_pc(), offset, data); | |
792 | 792 | } |
793 | 793 | else |
794 | 794 | { |
795 | logerror("%06x offset %06x, data %04x\n", space | |
795 | logerror("%06x offset %06x, data %04x\n", space.device().safe_pc(), offset, data); | |
796 | 796 | } |
797 | 797 | |
798 | 798 | } |
r17963 | r17964 | |
815 | 815 | *************************************/ |
816 | 816 | static WRITE16_HANDLER( mc_12in1_bank_w ) |
817 | 817 | { |
818 | UINT8 *ROM = space | |
818 | UINT8 *ROM = space.machine().root_device().memregion("maincpu")->base(); | |
819 | 819 | logerror("offset %06x", offset << 17); |
820 | 820 | memcpy(ROM + 0x000000, ROM + VIRGIN_COPY_GEN + ((offset & 0x3f) << 17), 0x100000); |
821 | 821 | } |
r17963 | r17964 | |
836 | 836 | |
837 | 837 | static WRITE16_HANDLER( psolar_bank_w ) |
838 | 838 | { |
839 | UINT8 *ROM = space | |
839 | UINT8 *ROM = space.machine().root_device().memregion("maincpu")->base(); | |
840 | 840 | logerror("switch bank %02x, page %02x\n",offset, data); |
841 | 841 | memcpy(&ROM[0x280000 + (0x80000 * offset)], &ROM[VIRGIN_COPY_GEN + (0x80000 * (data&0x0f))], 0x80000); |
842 | 842 | } |
r17963 | r17964 | |
879 | 879 | *************************************/ |
880 | 880 | static READ16_HANDLER( genesis_sram_read ) |
881 | 881 | { |
882 | md_cons_state *state = space | |
882 | md_cons_state *state = space.machine().driver_data<md_cons_state>(); | |
883 | 883 | UINT8 *ROM; |
884 | 884 | int rom_offset; |
885 | 885 | |
r17963 | r17964 | |
896 | 896 | |
897 | 897 | static WRITE16_HANDLER( genesis_sram_write ) |
898 | 898 | { |
899 | md_cons_state *state = space | |
899 | md_cons_state *state = space.machine().driver_data<md_cons_state>(); | |
900 | 900 | if (state->m_md_cart.sram_active) |
901 | 901 | { |
902 | 902 | if (!state->m_md_cart.sram_readonly) |
r17963 | r17964 | |
923 | 923 | |
924 | 924 | static WRITE16_HANDLER( genesis_sram_toggle ) |
925 | 925 | { |
926 | md_cons_state *state = space | |
926 | md_cons_state *state = space.machine().driver_data<md_cons_state>(); | |
927 | 927 | |
928 | 928 | /* unsure if this is actually supposed to toggle or just switch on? |
929 | 929 | Yet to encounter game that utilizes */ |
r17963 | r17964 | |
931 | 931 | state->m_md_cart.sram_readonly = (data & 2) ? 1 : 0; |
932 | 932 | |
933 | 933 | if (state->m_md_cart.sram_active && !state->m_md_cart.sram_handlers_installed) |
934 | install_sram_rw_handlers(space | |
934 | install_sram_rw_handlers(space.machine(), TRUE); | |
935 | 935 | } |
936 | 936 | |
937 | 937 | static READ16_HANDLER( sega_6658a_reg_r ) |
938 | 938 | { |
939 | md_cons_state *state = space | |
939 | md_cons_state *state = space.machine().driver_data<md_cons_state>(); | |
940 | 940 | return state->m_md_cart.sram_active; |
941 | 941 | } |
942 | 942 | |
943 | 943 | static WRITE16_HANDLER( sega_6658a_reg_w ) |
944 | 944 | { |
945 | md_cons_state *state = space | |
945 | md_cons_state *state = space.machine().driver_data<md_cons_state>(); | |
946 | 946 | if (data == 1) |
947 | 947 | state->m_md_cart.sram_active = 1; |
948 | 948 | if (data == 0) |
r17963 | r17964 | |
957 | 957 | |
958 | 958 | static READ16_HANDLER( nba_jam_eeprom_r ) |
959 | 959 | { |
960 | md_cons_state *state = space->machine().driver_data<md_cons_state>(); | |
961 | // state->m_md_cart.i2c_mem = (i2cmem_sda_read(space->machine().device("i2cmem")) & 1); | |
960 | md_cons_state *state = space.machine().driver_data<md_cons_state>(); | |
961 | // state->m_md_cart.i2c_mem = (i2cmem_sda_read(space.machine().device("i2cmem")) & 1); | |
962 | 962 | return state->m_md_cart.i2c_mem & 1; |
963 | 963 | } |
964 | 964 | |
965 | 965 | static WRITE16_HANDLER( nba_jam_eeprom_w ) |
966 | 966 | { |
967 | md_cons_state *state = space | |
967 | md_cons_state *state = space.machine().driver_data<md_cons_state>(); | |
968 | 968 | state->m_md_cart.i2c_clk = (data & 0x0002) >> 1; |
969 | 969 | state->m_md_cart.i2c_mem = (data & 0x0001); |
970 | 970 | |
971 | // i2cmem_sda_write(space->machine().device("i2cmem"), state->m_md_cart.i2c_clk); | |
972 | // i2cmem_scl_write(space->machine().device("i2cmem"), state->m_md_cart.i2c_mem); | |
971 | // i2cmem_sda_write(space.machine().device("i2cmem"), state->m_md_cart.i2c_clk); | |
972 | // i2cmem_scl_write(space.machine().device("i2cmem"), state->m_md_cart.i2c_mem); | |
973 | 973 | } |
974 | 974 | |
975 | 975 | static READ16_HANDLER( nba_jam_te_eeprom_r ) |
976 | 976 | { |
977 | md_cons_state *state = space->machine().driver_data<md_cons_state>(); | |
978 | // state->m_md_cart.i2c_mem = (i2cmem_sda_read(space->machine().device("i2cmem")) & 1); | |
977 | md_cons_state *state = space.machine().driver_data<md_cons_state>(); | |
978 | // state->m_md_cart.i2c_mem = (i2cmem_sda_read(space.machine().device("i2cmem")) & 1); | |
979 | 979 | return (state->m_md_cart.i2c_mem & 1); |
980 | 980 | } |
981 | 981 | |
982 | 982 | static WRITE16_HANDLER( nba_jam_te_eeprom_w ) |
983 | 983 | { |
984 | md_cons_state *state = space | |
984 | md_cons_state *state = space.machine().driver_data<md_cons_state>(); | |
985 | 985 | state->m_md_cart.i2c_clk = ((data & 0x0100) >> 8); |
986 | 986 | state->m_md_cart.i2c_mem = data & 0x0001; |
987 | 987 | |
988 | // i2cmem_sda_write(space->machine().device("i2cmem"), state->m_md_cart.i2c_clk); | |
989 | // i2cmem_scl_write(space->machine().device("i2cmem"), state->m_md_cart.i2c_mem); | |
988 | // i2cmem_sda_write(space.machine().device("i2cmem"), state->m_md_cart.i2c_clk); | |
989 | // i2cmem_scl_write(space.machine().device("i2cmem"), state->m_md_cart.i2c_mem); | |
990 | 990 | } |
991 | 991 | |
992 | 992 | static READ16_HANDLER( ea_nhlpa_eeprom_r ) |
993 | 993 | { |
994 | md_cons_state *state = space->machine().driver_data<md_cons_state>(); | |
995 | // state->m_md_cart.i2c_mem = (i2cmem_sda_read(space->machine().device("i2cmem")) & 1); | |
994 | md_cons_state *state = space.machine().driver_data<md_cons_state>(); | |
995 | // state->m_md_cart.i2c_mem = (i2cmem_sda_read(space.machine().device("i2cmem")) & 1); | |
996 | 996 | return (state->m_md_cart.i2c_mem & 1) << 7; |
997 | 997 | } |
998 | 998 | |
999 | 999 | static WRITE16_HANDLER( ea_nhlpa_eeprom_w ) |
1000 | 1000 | { |
1001 | md_cons_state *state = space | |
1001 | md_cons_state *state = space.machine().driver_data<md_cons_state>(); | |
1002 | 1002 | state->m_md_cart.i2c_clk = ((data & 0x0040) >> 6); |
1003 | 1003 | state->m_md_cart.i2c_mem = ((data & 0x0080) >> 7); |
1004 | 1004 | |
1005 | // i2cmem_sda_write(space->machine().device("i2cmem"), state->m_md_cart.i2c_clk); | |
1006 | // i2cmem_scl_write(space->machine().device("i2cmem"), state->m_md_cart.i2c_mem); | |
1005 | // i2cmem_sda_write(space.machine().device("i2cmem"), state->m_md_cart.i2c_clk); | |
1006 | // i2cmem_scl_write(space.machine().device("i2cmem"), state->m_md_cart.i2c_mem); | |
1007 | 1007 | } |
1008 | 1008 | |
1009 | 1009 | /* TODO: identical as NBA Jam, used as kludge */ |
1010 | 1010 | static READ16_HANDLER( wboy_v_eeprom_r ) |
1011 | 1011 | { |
1012 | md_cons_state *state = space->machine().driver_data<md_cons_state>(); | |
1013 | // state->m_md_cart.i2c_mem = (i2cmem_sda_read(space->machine().device("i2cmem")) & 1); | |
1012 | md_cons_state *state = space.machine().driver_data<md_cons_state>(); | |
1013 | // state->m_md_cart.i2c_mem = (i2cmem_sda_read(space.machine().device("i2cmem")) & 1); | |
1014 | 1014 | return ~state->m_md_cart.i2c_mem & 1; |
1015 | 1015 | } |
1016 | 1016 | |
1017 | 1017 | static WRITE16_HANDLER( wboy_v_eeprom_w ) |
1018 | 1018 | { |
1019 | md_cons_state *state = space | |
1019 | md_cons_state *state = space.machine().driver_data<md_cons_state>(); | |
1020 | 1020 | state->m_md_cart.i2c_clk = (data & 0x0002) >> 1; |
1021 | 1021 | state->m_md_cart.i2c_mem = (data & 0x0001); |
1022 | 1022 | |
1023 | // i2cmem_sda_write(space->machine().device("i2cmem"), state->m_md_cart.i2c_clk); | |
1024 | // i2cmem_scl_write(space->machine().device("i2cmem"), state->m_md_cart.i2c_mem); | |
1023 | // i2cmem_sda_write(space.machine().device("i2cmem"), state->m_md_cart.i2c_clk); | |
1024 | // i2cmem_scl_write(space.machine().device("i2cmem"), state->m_md_cart.i2c_mem); | |
1025 | 1025 | } |
1026 | 1026 | |
1027 | 1027 | static READ16_HANDLER( codemasters_eeprom_r ) |
1028 | 1028 | { |
1029 | md_cons_state *state = space->machine().driver_data<md_cons_state>(); | |
1030 | // state->m_md_cart.i2c_mem = (i2cmem_sda_read(space->machine().device("i2cmem")) & 1); | |
1029 | md_cons_state *state = space.machine().driver_data<md_cons_state>(); | |
1030 | // state->m_md_cart.i2c_mem = (i2cmem_sda_read(space.machine().device("i2cmem")) & 1); | |
1031 | 1031 | return (state->m_md_cart.i2c_mem & 1) << 7; |
1032 | 1032 | } |
1033 | 1033 | |
1034 | 1034 | static WRITE16_HANDLER( codemasters_eeprom_w ) |
1035 | 1035 | { |
1036 | md_cons_state *state = space | |
1036 | md_cons_state *state = space.machine().driver_data<md_cons_state>(); | |
1037 | 1037 | state->m_md_cart.i2c_clk = (data & 0x0200) >> 9; |
1038 | 1038 | state->m_md_cart.i2c_mem = (data & 0x0100) >> 8; |
1039 | 1039 | |
1040 | // i2cmem_sda_write(space->machine().device("i2cmem"), state->m_md_cart.i2c_clk); | |
1041 | // i2cmem_scl_write(space->machine().device("i2cmem"), state->m_md_cart.i2c_mem); | |
1040 | // i2cmem_sda_write(space.machine().device("i2cmem"), state->m_md_cart.i2c_clk); | |
1041 | // i2cmem_scl_write(space.machine().device("i2cmem"), state->m_md_cart.i2c_mem); | |
1042 | 1042 | } |
1043 | 1043 | |
1044 | 1044 | /* ST M95320 32Kbit serial EEPROM implementation */ |
r17963 | r17964 | |
---|---|---|
1243 | 1243 | int kaneko_calc3_device::calc3_decompress_table(running_machine& machine, int tabnum, UINT8* dstram, int dstoffset) |
1244 | 1244 | { |
1245 | 1245 | calc3_t &calc3 = m_calc3; |
1246 | address_space | |
1246 | address_space &space = *machine.device(":maincpu")->memory().space(AS_PROGRAM); | |
1247 | 1247 | UINT8* datarom = memregion(":calc3_rom")->base(); |
1248 | 1248 | |
1249 | 1249 | UINT8 numregions; |
r17963 | r17964 | |
1344 | 1344 | //printf("save to eeprom\n"); |
1345 | 1345 | |
1346 | 1346 | { |
1347 | address_space *eeprom_space = space | |
1347 | address_space *eeprom_space = space.machine().device<eeprom_device>(":eeprom")->space(); | |
1348 | 1348 | |
1349 | 1349 | for (i=0;i<0x80;i++) |
1350 | 1350 | { |
1351 | eeprom_space->write_byte(i, space | |
1351 | eeprom_space->write_byte(i, space.read_byte(calc3.eeprom_addr+0x200000+i)); | |
1352 | 1352 | } |
1353 | 1353 | |
1354 | 1354 | } |
r17963 | r17964 | |
1446 | 1446 | |
1447 | 1447 | if(local_counter>1) |
1448 | 1448 | { |
1449 | if (space) | |
1450 | { | |
1451 | space->write_byte(dstoffset+i, dat); | |
1452 | } | |
1449 | space.write_byte(dstoffset+i, dat); | |
1453 | 1450 | |
1454 | 1451 | // debug, used to output tables at the start |
1455 | 1452 | if (dstram) |
r17963 | r17964 | |
1520 | 1517 | |
1521 | 1518 | if(local_counter>1) |
1522 | 1519 | { |
1523 | if (space) | |
1524 | { | |
1525 | space->write_byte(dstoffset+i, dat); | |
1526 | } | |
1520 | space.write_byte(dstoffset+i, dat); | |
1527 | 1521 | |
1528 | 1522 | // debug, used to output tables at the start |
1529 | 1523 | if (dstram) |
r17963 | r17964 | |
1639 | 1633 | calc3_t &calc3 = m_calc3; |
1640 | 1634 | UINT16 mcu_command; |
1641 | 1635 | int i; |
1642 | address_space | |
1636 | address_space &space = *machine.device(":maincpu")->memory().space(AS_PROGRAM); | |
1643 | 1637 | |
1644 | 1638 | if ( calc3.mcu_status != (1|2|4|8) ) return; |
1645 | 1639 | |
1646 | if (calc3.dsw_addr) space | |
1640 | if (calc3.dsw_addr) space.write_byte(calc3.dsw_addr+0x200000, ( ~ioport(":DSW1")->read())&0xff); // // DSW // dsw actually updates in realtime - mcu reads+writes it every frame | |
1647 | 1641 | |
1648 | 1642 | |
1649 | 1643 | //calc3.mcu_status = 0; |
r17963 | r17964 | |
1684 | 1678 | printf("Calc 3 Init Command - %04x ROM Checksum Address\n", calc3.checksumaddress); |
1685 | 1679 | printf("Calc 3 Init Command - %08x Data Write Address\n", calc3.writeaddress); |
1686 | 1680 | #endif |
1687 | // space | |
1681 | // space.write_byte(calc3.dsw_addr+0x200000, ( ~ioport("DSW1")->read())&0xff); // // DSW // dsw actually updates in realtime - mcu reads+writes it every frame | |
1688 | 1682 | |
1689 | 1683 | m_calc3_mcuram[calc3.checksumaddress / 2] = calc3.mcu_crc; // MCU Rom Checksum! |
1690 | 1684 | |
r17963 | r17964 | |
1695 | 1689 | } |
1696 | 1690 | #endif |
1697 | 1691 | { |
1698 | address_space *eeprom_space = space | |
1692 | address_space *eeprom_space = space.machine().device<eeprom_device>(":eeprom")->space(); | |
1699 | 1693 | |
1700 | 1694 | for (i=0;i<0x80;i++) |
1701 | 1695 | { |
1702 | space | |
1696 | space.write_byte(calc3.eeprom_addr+0x200000+i, eeprom_space->read_byte(i)); | |
1703 | 1697 | } |
1704 | 1698 | |
1705 | 1699 | } |
r17963 | r17964 | |
1738 | 1732 | printf("writing back address %08x to %08x %08x\n", calc3.writeaddress_current, commandaddr,write); |
1739 | 1733 | #endif |
1740 | 1734 | |
1741 | space->write_byte(write+0x200000, calc3.data_header[0]); | |
1742 | space->write_byte(write+0x200001, calc3.data_header[1]); | |
1735 | space.write_byte(write+0x200000, calc3.data_header[0]); | |
1736 | space.write_byte(write+0x200001, calc3.data_header[1]); | |
1743 | 1737 | |
1744 | 1738 | write=commandaddr+(char)commandunk; |
1745 | space->write_word(write+0x200000, (calc3.writeaddress_current>>16)&0xffff); | |
1746 | space->write_word(write+0x200002, (calc3.writeaddress_current&0xffff)); | |
1739 | space.write_word(write+0x200000, (calc3.writeaddress_current>>16)&0xffff); | |
1740 | space.write_word(write+0x200002, (calc3.writeaddress_current&0xffff)); | |
1747 | 1741 | |
1748 | 1742 | calc3.writeaddress_current += ((length+3)&(~1)); |
1749 | 1743 | } |
r17963 | r17964 | |
---|---|---|
581 | 581 | snes_sdd1.buffer.ready = 0; |
582 | 582 | } |
583 | 583 | |
584 | static UINT8 sdd1_mmio_read(address_space | |
584 | static UINT8 sdd1_mmio_read(address_space &space, UINT32 addr) | |
585 | 585 | { |
586 | 586 | addr &= 0xffff; |
587 | 587 | |
r17963 | r17964 | |
605 | 605 | return snes_open_bus_r(space, 0); |
606 | 606 | } |
607 | 607 | |
608 | static void sdd1_mmio_write(address_space | |
608 | static void sdd1_mmio_write(address_space &space, UINT32 addr, UINT8 data) | |
609 | 609 | { |
610 | 610 | addr &= 0xffff; |
611 | 611 |
r17963 | r17964 | |
---|---|---|
275 | 275 | } |
276 | 276 | |
277 | 277 | |
278 | static UINT8 console_read(address_space | |
278 | static UINT8 console_read(address_space &space) | |
279 | 279 | { |
280 | return space | |
280 | return space.machine().root_device().ioport("console")->read(); | |
281 | 281 | } |
282 | 282 | |
283 | 283 | |
284 | static void console_write(address_space | |
284 | static void console_write(address_space &space, UINT8 data) | |
285 | 285 | { |
286 | dac_device *dac = space | |
286 | dac_device *dac = space.machine().device<dac_device>("dac"); | |
287 | 287 | if (data & 0x08) |
288 | 288 | dac->write_unsigned8((UINT8)-120); |
289 | 289 | else |
r17963 | r17964 | |
---|---|---|
627 | 627 | * |
628 | 628 | *******************************************/ |
629 | 629 | |
630 | static void smpc_comreg_exec(address_space | |
630 | static void smpc_comreg_exec(address_space &space, UINT8 data, UINT8 is_stv) | |
631 | 631 | { |
632 | saturn_state *state = space | |
632 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
633 | 633 | |
634 | 634 | switch (data) |
635 | 635 | { |
636 | 636 | case 0x00: |
637 | 637 | if(LOG_SMPC) printf ("SMPC: Master ON\n"); |
638 | smpc_master_on(space | |
638 | smpc_master_on(space.machine()); | |
639 | 639 | break; |
640 | 640 | //case 0x01: Master OFF? |
641 | 641 | case 0x02: |
642 | 642 | case 0x03: |
643 | 643 | if(LOG_SMPC) printf ("SMPC: Slave %s\n",(data & 1) ? "off" : "on"); |
644 | space | |
644 | space.machine().scheduler().timer_set(attotime::from_usec(100), FUNC(smpc_slave_enable),data & 1); | |
645 | 645 | break; |
646 | 646 | case 0x06: |
647 | 647 | case 0x07: |
648 | 648 | if(LOG_SMPC) printf ("SMPC: Sound %s\n",(data & 1) ? "off" : "on"); |
649 | 649 | |
650 | 650 | if(!is_stv) |
651 | space | |
651 | space.machine().scheduler().timer_set(attotime::from_usec(100), FUNC(smpc_sound_enable),data & 1); | |
652 | 652 | break; |
653 | 653 | /*CD (SH-1) ON/OFF */ |
654 | 654 | //case 0x08: |
655 | 655 | //case 0x09: |
656 | 656 | case 0x0d: |
657 | 657 | if(LOG_SMPC) printf ("SMPC: System Reset\n"); |
658 | smpc_system_reset(space | |
658 | smpc_system_reset(space.machine()); | |
659 | 659 | break; |
660 | 660 | case 0x0e: |
661 | 661 | case 0x0f: |
662 | if(LOG_SMPC) printf ("SMPC: Change Clock to %s (%d %d)\n",data & 1 ? "320" : "352",space | |
662 | if(LOG_SMPC) printf ("SMPC: Change Clock to %s (%d %d)\n",data & 1 ? "320" : "352",space.machine().primary_screen->hpos(),space.machine().primary_screen->vpos()); | |
663 | 663 | |
664 | 664 | /* on ST-V timing of this is pretty fussy, you get 2 credits at start-up otherwise |
665 | 665 | sokyugurentai threshold is 74 lines |
666 | 666 | shanhigw threshold is 90 lines |
667 | 667 | I assume that it needs ~100 lines, so 6666,(6) usecs. Obviously needs HW tests ... */ |
668 | 668 | |
669 | space | |
669 | space.machine().scheduler().timer_set(attotime::from_usec(6666), FUNC(smpc_change_clock),data & 1); | |
670 | 670 | break; |
671 | 671 | /*"Interrupt Back"*/ |
672 | 672 | case 0x10: |
673 | 673 | if(0) |
674 | 674 | { |
675 | saturn_state *state = space->machine().driver_data<saturn_state>(); | |
676 | printf ("SMPC: Status Acquire %02x %02x %02x %d\n",state->m_smpc.IREG[0],state->m_smpc.IREG[1],state->m_smpc.IREG[2],space->machine().primary_screen->vpos()); | |
675 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
676 | printf ("SMPC: Status Acquire %02x %02x %02x %d\n",state->m_smpc.IREG[0],state->m_smpc.IREG[1],state->m_smpc.IREG[2],space.machine().primary_screen->vpos()); | |
677 | 677 | } |
678 | 678 | |
679 | 679 | if(is_stv) |
680 | space | |
680 | space.machine().scheduler().timer_set(attotime::from_usec(700), FUNC(stv_smpc_intback),0); //TODO: variable time | |
681 | 681 | else |
682 | 682 | { |
683 | 683 | int timing; |
r17963 | r17964 | |
692 | 692 | |
693 | 693 | /* TODO: check if IREG[2] is setted to 0xf0 */ |
694 | 694 | |
695 | if(LOG_PAD_CMD) printf("INTBACK %02x %02x %d %d\n",state->m_smpc.IREG[0],state->m_smpc.IREG[1],space->machine().primary_screen->vpos(),(int)space->machine().primary_screen->frame_number()); | |
696 | space->machine().scheduler().timer_set(attotime::from_usec(timing), FUNC(saturn_smpc_intback),0); //TODO: is variable time correct? | |
695 | if(LOG_PAD_CMD) printf("INTBACK %02x %02x %d %d\n",state->m_smpc.IREG[0],state->m_smpc.IREG[1],space.machine().primary_screen->vpos(),(int)space.machine().primary_screen->frame_number()); | |
696 | space.machine().scheduler().timer_set(attotime::from_usec(timing), FUNC(saturn_smpc_intback),0); //TODO: is variable time correct? | |
697 | 697 | } |
698 | 698 | break; |
699 | 699 | /* RTC write*/ |
700 | 700 | case 0x16: |
701 | 701 | if(LOG_SMPC) printf("SMPC: RTC write\n"); |
702 | smpc_rtc_write(space | |
702 | smpc_rtc_write(space.machine()); | |
703 | 703 | break; |
704 | 704 | /* SMPC memory setting*/ |
705 | 705 | case 0x17: |
706 | 706 | if(LOG_SMPC) printf ("SMPC: memory setting\n"); |
707 | smpc_memory_setting(space | |
707 | smpc_memory_setting(space.machine()); | |
708 | 708 | break; |
709 | 709 | case 0x18: |
710 | 710 | if(LOG_SMPC) printf ("SMPC: NMI request\n"); |
711 | smpc_nmi_req(space | |
711 | smpc_nmi_req(space.machine()); | |
712 | 712 | break; |
713 | 713 | case 0x19: |
714 | 714 | case 0x1a: |
715 | 715 | if(LOG_SMPC) printf ("SMPC: NMI %sable\n",data & 1 ? "Dis" : "En"); |
716 | smpc_nmi_set(space | |
716 | smpc_nmi_set(space.machine(),data & 1); | |
717 | 717 | break; |
718 | 718 | default: |
719 | printf ("cpu '%s' (PC=%08X) SMPC: undocumented Command %02x\n", space | |
719 | printf ("cpu '%s' (PC=%08X) SMPC: undocumented Command %02x\n", space.device().tag(), space.device().safe_pc(), data); | |
720 | 720 | } |
721 | 721 | } |
722 | 722 | |
r17963 | r17964 | |
728 | 728 | |
729 | 729 | READ8_HANDLER( stv_SMPC_r ) |
730 | 730 | { |
731 | saturn_state *state = space | |
731 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
732 | 732 | int return_data = 0; |
733 | 733 | |
734 | 734 | if(!(offset & 1)) |
r17963 | r17964 | |
747 | 747 | return_data = state->ioport("DSW1")->read(); |
748 | 748 | |
749 | 749 | if (offset == 0x77)//PDR2 read |
750 | return_data = (0xfe | space | |
750 | return_data = (0xfe | space.machine().device<eeprom_device>("eeprom")->read_bit()); | |
751 | 751 | |
752 | 752 | return return_data; |
753 | 753 | } |
754 | 754 | |
755 | 755 | WRITE8_HANDLER( stv_SMPC_w ) |
756 | 756 | { |
757 | saturn_state *state = space | |
757 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
758 | 758 | |
759 | 759 | if (!(offset & 1)) // avoid writing to even bytes |
760 | 760 | return; |
r17963 | r17964 | |
789 | 789 | ---- -x-- EEPROM CS line |
790 | 790 | ---- --xx A-Bus bank bits |
791 | 791 | */ |
792 | eeprom_device *eeprom = space | |
792 | eeprom_device *eeprom = space.machine().device<eeprom_device>("eeprom"); | |
793 | 793 | eeprom->set_clock_line((data & 0x08) ? ASSERT_LINE : CLEAR_LINE); |
794 | 794 | eeprom->write_bit(data & 0x10); |
795 | 795 | eeprom->set_cs_line((data & 0x04) ? CLEAR_LINE : ASSERT_LINE); |
796 | 796 | state->m_stv_multi_bank = data & 3; |
797 | 797 | |
798 | stv_select_game(space | |
798 | stv_select_game(space.machine(), state->m_stv_multi_bank); | |
799 | 799 | |
800 | 800 | state->m_smpc.PDR1 = (data & 0x60); |
801 | 801 | } |
r17963 | r17964 | |
809 | 809 | //popmessage("PDR2 = %02x",state->m_smpc_ram[0x77]); |
810 | 810 | |
811 | 811 | if(LOG_SMPC) printf("SMPC: M68k %s\n",(data & 0x10) ? "off" : "on"); |
812 | //space | |
812 | //space.machine().scheduler().timer_set(attotime::from_usec(100), FUNC(smpc_sound_enable),(state->m_smpc_ram[0x77] & 0x10) >> 4); | |
813 | 813 | state->m_audiocpu->set_input_line(INPUT_LINE_RESET, (data & 0x10) ? ASSERT_LINE : CLEAR_LINE); |
814 | 814 | state->m_en_68k = ((data & 0x10) >> 4) ^ 1; |
815 | 815 | |
r17963 | r17964 | |
843 | 843 | |
844 | 844 | READ8_HANDLER( saturn_SMPC_r ) |
845 | 845 | { |
846 | saturn_state *state = space | |
846 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
847 | 847 | UINT8 return_data = 0; |
848 | 848 | |
849 | 849 | if (!(offset & 1)) // avoid reading to even bytes (TODO: is it 0s or 1s?) |
r17963 | r17964 | |
866 | 866 | const int shift_bit[4] = { 4, 12, 8, 0 }; |
867 | 867 | const char *const padnames[] = { "JOY1", "JOY2" }; |
868 | 868 | |
869 | if(space | |
869 | if(space.machine().root_device().ioport("INPUT_TYPE")->read() && !(space.debugger_access())) | |
870 | 870 | { |
871 | 871 | popmessage("Warning: read with SH-2 direct mode with a non-pad device"); |
872 | 872 | return 0; |
r17963 | r17964 | |
879 | 879 | |
880 | 880 | if (LOG_SMPC) logerror("SMPC: SH-2 direct mode, returning data for phase %d\n", hshake); |
881 | 881 | |
882 | return_data = 0x80 | 0x10 | ((space | |
882 | return_data = 0x80 | 0x10 | ((space.machine().root_device().ioport(padnames[offset == 0x77])->read()>>shift_bit[hshake]) & 0xf); | |
883 | 883 | } |
884 | 884 | } |
885 | 885 | |
886 | if (LOG_SMPC) logerror ("cpu %s (PC=%08X) SMPC: Read from Byte Offset %02x (%d) Returns %02x\n", space | |
886 | if (LOG_SMPC) logerror ("cpu %s (PC=%08X) SMPC: Read from Byte Offset %02x (%d) Returns %02x\n", space.device().tag(), space.device().safe_pc(), offset, offset>>1, return_data); | |
887 | 887 | |
888 | 888 | |
889 | 889 | return return_data; |
r17963 | r17964 | |
891 | 891 | |
892 | 892 | WRITE8_HANDLER( saturn_SMPC_w ) |
893 | 893 | { |
894 | saturn_state *state = space | |
894 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
895 | 895 | |
896 | 896 | if (LOG_SMPC) logerror ("8-bit SMPC Write to Offset %02x (reg %d) with Data %02x\n", offset, offset>>1, data); |
897 | 897 | |
r17963 | r17964 | |
914 | 914 | else if(data & 0x80) |
915 | 915 | { |
916 | 916 | if(LOG_PAD_CMD) printf("SMPC: CONTINUE request\n"); |
917 | space | |
917 | space.machine().scheduler().timer_set(attotime::from_usec(700), FUNC(intback_peripheral),0); /* TODO: is timing correct? */ | |
918 | 918 | state->m_smpc.OREG[31] = 0x10; |
919 | 919 | state->m_smpc.SF = 0x01; //TODO: set hand-shake flag? |
920 | 920 | } |
r17963 | r17964 | |
---|---|---|
207 | 207 | |
208 | 208 | void darkedge_fd1149_vblank(device_t *device) |
209 | 209 | { |
210 | address_space | |
210 | address_space &space = *device->memory().space(AS_PROGRAM); | |
211 | 211 | |
212 | space->write_word(0x20f072, 0); | |
213 | space->write_word(0x20f082, 0); | |
212 | space.write_word(0x20f072, 0); | |
213 | space.write_word(0x20f082, 0); | |
214 | 214 | |
215 | if( space | |
215 | if( space.read_byte(0x20a12c) != 0 ) | |
216 | 216 | { |
217 | space | |
217 | space.write_byte(0x20a12c, space.read_byte(0x20a12c)-1 ); | |
218 | 218 | |
219 | if( space->read_byte(0x20a12c) == 0 ) | |
220 | space->write_byte(0x20a12e, 1); | |
219 | if( space.read_byte(0x20a12c) == 0 ) | |
220 | space.write_byte(0x20a12e, 1); | |
221 | 221 | } |
222 | 222 | } |
223 | 223 | |
r17963 | r17964 | |
243 | 243 | |
244 | 244 | void f1lap_fd1149_vblank(device_t *device) |
245 | 245 | { |
246 | address_space | |
246 | address_space &space = *device->memory().space(AS_PROGRAM); | |
247 | 247 | |
248 | space | |
248 | space.write_byte(0x20F7C6, 0); | |
249 | 249 | |
250 | 250 | // needed to start a game |
251 | UINT8 val = space->read_byte(0x20EE81); | |
252 | if (val == 0xff) space->write_byte(0x20EE81,0); | |
251 | UINT8 val = space.read_byte(0x20EE81); | |
252 | if (val == 0xff) space.write_byte(0x20EE81,0); | |
253 | 253 | |
254 | 254 | } |
255 | 255 |
r17963 | r17964 | |
---|---|---|
152 | 152 | |
153 | 153 | READ8_HANDLER( acitya_decrypt_rom ) |
154 | 154 | { |
155 | pacman_state *state = space | |
155 | pacman_state *state = space.machine().driver_data<pacman_state>(); | |
156 | 156 | if (offset & 0x01) |
157 | 157 | { |
158 | 158 | state->m_counter = (state->m_counter - 1) & 0x0F; |
r17963 | r17964 | |
---|---|---|
111 | 111 | |
112 | 112 | for (x = 0; x < size; x++) |
113 | 113 | { |
114 | //UINT16 *RAMDUMP = (UINT16*)space | |
114 | //UINT16 *RAMDUMP = (UINT16*)space.machine().root_device().memregion("user2")->base(); | |
115 | 115 | //UINT16 dat = RAMDUMP[dst + x]; |
116 | 116 | |
117 | 117 | UINT16 dat2 = PROTROM[src + x]; |
r17963 | r17964 | |
279 | 279 | { |
280 | 280 | // mame_printf_debug("killbrd prot r\n"); |
281 | 281 | // return 0; |
282 | pgm_022_025_state *state = space | |
282 | pgm_022_025_state *state = space.machine().driver_data<pgm_022_025_state>(); | |
283 | 283 | offset &= 0xf; |
284 | 284 | |
285 | 285 | if (offset == 0) |
286 | 286 | state->m_kb_cmd = data; |
287 | 287 | else //offset==2 |
288 | 288 | { |
289 | logerror("%06X: ASIC25 W CMD %X VAL %X\n", space | |
289 | logerror("%06X: ASIC25 W CMD %X VAL %X\n", space.device().safe_pc(), state->m_kb_cmd, data); | |
290 | 290 | if (state->m_kb_cmd == 0) |
291 | 291 | state->m_kb_reg = data; |
292 | 292 | else if (state->m_kb_cmd == 2) |
293 | 293 | { |
294 | 294 | if (data == 1) //Execute cmd |
295 | 295 | { |
296 | IGS022_handle_command(space | |
296 | IGS022_handle_command(space.machine()); | |
297 | 297 | state->m_kb_reg++; |
298 | 298 | } |
299 | 299 | } |
r17963 | r17964 | |
307 | 307 | static READ16_HANDLER( killbld_igs025_prot_r ) |
308 | 308 | { |
309 | 309 | // mame_printf_debug("killbld prot w\n"); |
310 | pgm_022_025_state *state = space | |
310 | pgm_022_025_state *state = space.machine().driver_data<pgm_022_025_state>(); | |
311 | 311 | UINT16 res ; |
312 | 312 | |
313 | 313 | offset &= 0xf; |
r17963 | r17964 | |
334 | 334 | } |
335 | 335 | else |
336 | 336 | { |
337 | UINT32 protvalue = 0x89911400 | space | |
337 | UINT32 protvalue = 0x89911400 | space.machine().root_device().ioport("Region")->read(); | |
338 | 338 | ret = (protvalue >> (8 * (state->m_kb_ptr - 1))) & 0xff; |
339 | 339 | } |
340 | 340 | |
r17963 | r17964 | |
342 | 342 | |
343 | 343 | } |
344 | 344 | } |
345 | logerror("%06X: ASIC25 R CMD %X VAL %X\n", space | |
345 | logerror("%06X: ASIC25 R CMD %X VAL %X\n", space.device().safe_pc(), state->m_kb_cmd, res); | |
346 | 346 | return res; |
347 | 347 | } |
348 | 348 | |
r17963 | r17964 | |
451 | 451 | static UINT8 dw3_swap; |
452 | 452 | static WRITE16_HANDLER( drgw3_igs025_prot_w ) |
453 | 453 | { |
454 | pgm_022_025_state *state = space | |
454 | pgm_022_025_state *state = space.machine().driver_data<pgm_022_025_state>(); | |
455 | 455 | |
456 | 456 | offset&=0xf; |
457 | 457 | |
r17963 | r17964 | |
459 | 459 | state->m_kb_cmd=data; |
460 | 460 | else //offset==2 |
461 | 461 | { |
462 | printf("%06X: ASIC25 W CMD %X VAL %X\n",space | |
462 | printf("%06X: ASIC25 W CMD %X VAL %X\n",space.device().safe_pc(),state->m_kb_cmd,data); | |
463 | 463 | if(state->m_kb_cmd==0) |
464 | 464 | reg=data; |
465 | 465 | else if(state->m_kb_cmd==3) //?????????? |
r17963 | r17964 | |
478 | 478 | static READ16_HANDLER( drgw3_igs025_prot_r ) |
479 | 479 | { |
480 | 480 | // mame_printf_debug("killbld prot w\n"); |
481 | pgm_022_025_state *state = space | |
481 | pgm_022_025_state *state = space.machine().driver_data<pgm_022_025_state>(); | |
482 | 482 | |
483 | 483 | UINT16 res ; |
484 | 484 | |
r17963 | r17964 | |
510 | 510 | else if(state->m_kb_cmd==5) |
511 | 511 | { |
512 | 512 | UINT32 protvalue; |
513 | protvalue = 0x60000|space | |
513 | protvalue = 0x60000|space.machine().root_device().ioport("Region")->read(); | |
514 | 514 | res=(protvalue>>(8*(ptr-1)))&0xff; |
515 | 515 | |
516 | 516 | |
517 | 517 | } |
518 | 518 | } |
519 | logerror("%06X: ASIC25 R CMD %X VAL %X\n",space | |
519 | logerror("%06X: ASIC25 R CMD %X VAL %X\n",space.device().safe_pc(),state->m_kb_cmd,res); | |
520 | 520 | return res; |
521 | 521 | } |
522 | 522 |
r17963 | r17964 | |
---|---|---|
101 | 101 | UINT8 Color; |
102 | 102 | INT32 i; |
103 | 103 | |
104 | address_space | |
104 | address_space &space = *machine.device<cpu_device>("maincpu")->space(AS_PROGRAM); | |
105 | 105 | for(i = cx4.ram[0x0295]; i > 0; i--, line += 5) |
106 | 106 | { |
107 | if(space->read_byte(line) == 0xff && | |
108 | space->read_byte(line + 1) == 0xff) | |
107 | if(space.read_byte(line) == 0xff && | |
108 | space.read_byte(line + 1) == 0xff) | |
109 | 109 | { |
110 | 110 | INT32 tmp = line - 5; |
111 | while(space->read_byte(tmp + 2) == 0xff && | |
112 | space->read_byte(tmp + 3) == 0xff && | |
111 | while(space.read_byte(tmp + 2) == 0xff && | |
112 | space.read_byte(tmp + 3) == 0xff && | |
113 | 113 | (tmp + 2) >= 0) |
114 | 114 | { |
115 | 115 | tmp -= 5; |
116 | 116 | } |
117 | 117 | point1 = (CX4_read(0x1f82) << 16) | |
118 | (space->read_byte(tmp + 2) << 8) | | |
119 | space->read_byte(tmp + 3); | |
118 | (space.read_byte(tmp + 2) << 8) | | |
119 | space.read_byte(tmp + 3); | |
120 | 120 | } |
121 | 121 | else |
122 | 122 | { |
123 | 123 | point1 = (CX4_read(0x1f82) << 16) | |
124 | (space->read_byte(line) << 8) | | |
125 | space->read_byte(line + 1); | |
124 | (space.read_byte(line) << 8) | | |
125 | space.read_byte(line + 1); | |
126 | 126 | } |
127 | 127 | point2 = (CX4_read(0x1f82) << 16) | |
128 | (space->read_byte(line + 2) << 8) | | |
129 | space->read_byte(line + 3); | |
128 | (space.read_byte(line + 2) << 8) | | |
129 | space.read_byte(line + 3); | |
130 | 130 | |
131 | X1=(space->read_byte(point1 + 0) << 8) | | |
132 | space->read_byte(point1 + 1); | |
133 | Y1=(space->read_byte(point1 + 2) << 8) | | |
134 | space->read_byte(point1 + 3); | |
135 | Z1=(space->read_byte(point1 + 4) << 8) | | |
136 | space->read_byte(point1 + 5); | |
137 | X2=(space->read_byte(point2 + 0) << 8) | | |
138 | space->read_byte(point2 + 1); | |
139 | Y2=(space->read_byte(point2 + 2) << 8) | | |
140 | space->read_byte(point2 + 3); | |
141 | Z2=(space->read_byte(point2 + 4) << 8) | | |
142 | space->read_byte(point2 + 5); | |
143 | Color = space->read_byte(line + 4); | |
131 | X1=(space.read_byte(point1 + 0) << 8) | | |
132 | space.read_byte(point1 + 1); | |
133 | Y1=(space.read_byte(point1 + 2) << 8) | | |
134 | space.read_byte(point1 + 3); | |
135 | Z1=(space.read_byte(point1 + 4) << 8) | | |
136 | space.read_byte(point1 + 5); | |
137 | X2=(space.read_byte(point2 + 0) << 8) | | |
138 | space.read_byte(point2 + 1); | |
139 | Y2=(space.read_byte(point2 + 2) << 8) | | |
140 | space.read_byte(point2 + 3); | |
141 | Z2=(space.read_byte(point2 + 4) << 8) | | |
142 | space.read_byte(point2 + 5); | |
143 | Color = space.read_byte(line + 4); | |
144 | 144 | CX4_C4DrawLine(X1, Y1, Z1, X2, Y2, Z2, Color); |
145 | 145 | } |
146 | 146 | } |
r17963 | r17964 | |
---|---|---|
59 | 59 | |
60 | 60 | WRITE8_HANDLER( decocass_sound_command_w ) |
61 | 61 | { |
62 | decocass_state *state = space->machine().driver_data<decocass_state>(); | |
63 | LOG(2,("CPU %s sound command -> $%02x\n", space->device().tag(), data)); | |
64 | state->soundlatch_byte_w(*space, 0, data); | |
62 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
63 | LOG(2,("CPU %s sound command -> $%02x\n", space.device().tag(), data)); | |
64 | state->soundlatch_byte_w(space, 0, data); | |
65 | 65 | state->m_sound_ack |= 0x80; |
66 | 66 | /* remove snd cpu data ack bit. i don't see it in the schems, but... */ |
67 | 67 | state->m_sound_ack &= ~0x40; |
r17963 | r17964 | |
70 | 70 | |
71 | 71 | READ8_HANDLER( decocass_sound_data_r ) |
72 | 72 | { |
73 | decocass_state *state = space->machine().driver_data<decocass_state>(); | |
74 | UINT8 data = state->soundlatch2_byte_r(*space, 0); | |
75 | LOG(2,("CPU %s sound data <- $%02x\n", space->device().tag(), data)); | |
73 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
74 | UINT8 data = state->soundlatch2_byte_r(space, 0); | |
75 | LOG(2,("CPU %s sound data <- $%02x\n", space.device().tag(), data)); | |
76 | 76 | return data; |
77 | 77 | } |
78 | 78 | |
79 | 79 | READ8_HANDLER( decocass_sound_ack_r ) |
80 | 80 | { |
81 | decocass_state *state = space | |
81 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
82 | 82 | UINT8 data = state->m_sound_ack; /* D6+D7 */ |
83 | LOG(4,("CPU %s sound ack <- $%02x\n", space | |
83 | LOG(4,("CPU %s sound ack <- $%02x\n", space.device().tag(), data)); | |
84 | 84 | return data; |
85 | 85 | } |
86 | 86 | |
87 | 87 | WRITE8_HANDLER( decocass_sound_data_w ) |
88 | 88 | { |
89 | decocass_state *state = space->machine().driver_data<decocass_state>(); | |
90 | LOG(2,("CPU %s sound data -> $%02x\n", space->device().tag(), data)); | |
91 | state->soundlatch2_byte_w(*space, 0, data); | |
89 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
90 | LOG(2,("CPU %s sound data -> $%02x\n", space.device().tag(), data)); | |
91 | state->soundlatch2_byte_w(space, 0, data); | |
92 | 92 | state->m_sound_ack |= 0x40; |
93 | 93 | } |
94 | 94 | |
95 | 95 | READ8_HANDLER( decocass_sound_command_r ) |
96 | 96 | { |
97 | decocass_state *state = space->machine().driver_data<decocass_state>(); | |
98 | UINT8 data = state->soundlatch_byte_r(*space, 0); | |
99 | LOG(4,("CPU %s sound command <- $%02x\n", space->device().tag(), data)); | |
97 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
98 | UINT8 data = state->soundlatch_byte_r(space, 0); | |
99 | LOG(4,("CPU %s sound command <- $%02x\n", space.device().tag(), data)); | |
100 | 100 | state->m_audiocpu->set_input_line(M6502_IRQ_LINE, CLEAR_LINE); |
101 | 101 | state->m_sound_ack &= ~0x80; |
102 | 102 | return data; |
r17963 | r17964 | |
112 | 112 | |
113 | 113 | WRITE8_HANDLER( decocass_sound_nmi_enable_w ) |
114 | 114 | { |
115 | decocass_state *state = space | |
115 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
116 | 116 | state->m_audio_nmi_enabled = 1; |
117 | 117 | state->m_audiocpu->set_input_line(INPUT_LINE_NMI, (state->m_audio_nmi_enabled && state->m_audio_nmi_state) ? ASSERT_LINE : CLEAR_LINE); |
118 | 118 | } |
119 | 119 | |
120 | 120 | READ8_HANDLER( decocass_sound_nmi_enable_r ) |
121 | 121 | { |
122 | decocass_state *state = space | |
122 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
123 | 123 | state->m_audio_nmi_enabled = 1; |
124 | 124 | state->m_audiocpu->set_input_line(INPUT_LINE_NMI, (state->m_audio_nmi_enabled && state->m_audio_nmi_state) ? ASSERT_LINE : CLEAR_LINE); |
125 | 125 | return 0xff; |
r17963 | r17964 | |
127 | 127 | |
128 | 128 | READ8_HANDLER( decocass_sound_data_ack_reset_r ) |
129 | 129 | { |
130 | decocass_state *state = space | |
130 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
131 | 131 | UINT8 data = 0xff; |
132 | LOG(2,("CPU %s sound ack rst <- $%02x\n", space | |
132 | LOG(2,("CPU %s sound ack rst <- $%02x\n", space.device().tag(), data)); | |
133 | 133 | state->m_sound_ack &= ~0x40; |
134 | 134 | return data; |
135 | 135 | } |
136 | 136 | |
137 | 137 | WRITE8_HANDLER( decocass_sound_data_ack_reset_w ) |
138 | 138 | { |
139 | decocass_state *state = space->machine().driver_data<decocass_state>(); | |
140 | LOG(2,("CPU %s sound ack rst -> $%02x\n", space->device().tag(), data)); | |
139 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
140 | LOG(2,("CPU %s sound ack rst -> $%02x\n", space.device().tag(), data)); | |
141 | 141 | state->m_sound_ack &= ~0x40; |
142 | 142 | } |
143 | 143 | |
144 | 144 | WRITE8_HANDLER( decocass_nmi_reset_w ) |
145 | 145 | { |
146 | decocass_state *state = space | |
146 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
147 | 147 | state->m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE ); |
148 | 148 | } |
149 | 149 | |
150 | 150 | WRITE8_HANDLER( decocass_quadrature_decoder_reset_w ) |
151 | 151 | { |
152 | decocass_state *state = space | |
152 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
153 | 153 | |
154 | 154 | /* just latch the analog controls here */ |
155 | 155 | state->m_quadrature_decoder[0] = state->ioport("AN0")->read(); |
r17963 | r17964 | |
174 | 174 | */ |
175 | 175 | READ8_HANDLER( decocass_input_r ) |
176 | 176 | { |
177 | decocass_state *state = space | |
177 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
178 | 178 | UINT8 data = 0xff; |
179 | 179 | static const char *const portnames[] = { "IN0", "IN1", "IN2" }; |
180 | 180 | |
181 | 181 | switch (offset & 7) |
182 | 182 | { |
183 | 183 | case 0: case 1: case 2: |
184 | data = space | |
184 | data = space.machine().root_device().ioport(portnames[offset & 7])->read(); | |
185 | 185 | break; |
186 | 186 | case 3: case 4: case 5: case 6: |
187 | 187 | data = state->m_quadrature_decoder[(offset & 7) - 3]; |
r17963 | r17964 | |
209 | 209 | |
210 | 210 | WRITE8_HANDLER( decocass_reset_w ) |
211 | 211 | { |
212 | decocass_state *state = space->machine().driver_data<decocass_state>(); | |
213 | LOG(1,("%10s 6502-PC: %04x decocass_reset_w(%02x): $%02x\n", space->machine().time().as_string(6), space->device().safe_pcbase(), offset, data)); | |
212 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
213 | LOG(1,("%10s 6502-PC: %04x decocass_reset_w(%02x): $%02x\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data)); | |
214 | 214 | state->m_decocass_reset = data; |
215 | 215 | |
216 | 216 | /* CPU #1 active high reset */ |
r17963 | r17964 | |
277 | 277 | |
278 | 278 | static READ8_HANDLER( decocass_type1_latch_26_pass_3_inv_2_r ) |
279 | 279 | { |
280 | decocass_state *state = space | |
280 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
281 | 281 | UINT8 data; |
282 | 282 | |
283 | 283 | if (1 == (offset & 1)) |
r17963 | r17964 | |
289 | 289 | |
290 | 290 | data = (BIT(data, 0) << 0) | (BIT(data, 1) << 1) | 0x7c; |
291 | 291 | LOG(4,("%10s 6502-PC: %04x decocass_type1_latch_26_pass_3_inv_2_r(%02x): $%02x <- (%s %s)\n", |
292 | space | |
292 | space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data, | |
293 | 293 | (data & 1) ? "OBF" : "-", |
294 | 294 | (data & 2) ? "IBF" : "-")); |
295 | 295 | } |
r17963 | r17964 | |
297 | 297 | { |
298 | 298 | offs_t promaddr; |
299 | 299 | UINT8 save; |
300 | UINT8 *prom = space | |
300 | UINT8 *prom = space.machine().root_device().memregion("dongle")->base(); | |
301 | 301 | |
302 | 302 | if (state->m_firsttime) |
303 | 303 | { |
r17963 | r17964 | |
337 | 337 | (((prom[promaddr] >> 4) & 1) << MAP7(state->m_type1_outmap)); |
338 | 338 | |
339 | 339 | LOG(3,("%10s 6502-PC: %04x decocass_type1_latch_26_pass_3_inv_2_r(%02x): $%02x\n", |
340 | space | |
340 | space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data)); | |
341 | 341 | |
342 | 342 | state->m_latch1 = save; /* latch the data for the next A0 == 0 read */ |
343 | 343 | } |
r17963 | r17964 | |
357 | 357 | |
358 | 358 | static READ8_HANDLER( decocass_type1_pass_136_r ) |
359 | 359 | { |
360 | decocass_state *state = space | |
360 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
361 | 361 | UINT8 data; |
362 | 362 | |
363 | 363 | if (1 == (offset & 1)) |
r17963 | r17964 | |
369 | 369 | |
370 | 370 | data = (BIT(data, 0) << 0) | (BIT(data, 1) << 1) | 0x7c; |
371 | 371 | LOG(4,("%10s 6502-PC: %04x decocass_type1_pass_136_r(%02x): $%02x <- (%s %s)\n", |
372 | space | |
372 | space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data, | |
373 | 373 | (data & 1) ? "OBF" : "-", |
374 | 374 | (data & 2) ? "IBF" : "-")); |
375 | 375 | } |
r17963 | r17964 | |
377 | 377 | { |
378 | 378 | offs_t promaddr; |
379 | 379 | UINT8 save; |
380 | UINT8 *prom = space | |
380 | UINT8 *prom = space.machine().root_device().memregion("dongle")->base(); | |
381 | 381 | |
382 | 382 | if (state->m_firsttime) |
383 | 383 | { |
r17963 | r17964 | |
417 | 417 | (((prom[promaddr] >> 4) & 1) << MAP7(state->m_type1_outmap)); |
418 | 418 | |
419 | 419 | LOG(3,("%10s 6502-PC: %04x decocass_type1_pass_136_r(%02x): $%02x\n", |
420 | space | |
420 | space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data)); | |
421 | 421 | |
422 | 422 | state->m_latch1 = save; /* latch the data for the next A0 == 0 read */ |
423 | 423 | } |
r17963 | r17964 | |
437 | 437 | |
438 | 438 | static READ8_HANDLER( decocass_type1_latch_27_pass_3_inv_2_r ) |
439 | 439 | { |
440 | decocass_state *state = space | |
440 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
441 | 441 | UINT8 data; |
442 | 442 | |
443 | 443 | if (1 == (offset & 1)) |
r17963 | r17964 | |
449 | 449 | |
450 | 450 | data = (BIT(data, 0) << 0) | (BIT(data, 1) << 1) | 0x7c; |
451 | 451 | LOG(4,("%10s 6502-PC: %04x decocass_type1_latch_27_pass_3_inv_2_r(%02x): $%02x <- (%s %s)\n", |
452 | space | |
452 | space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data, | |
453 | 453 | (data & 1) ? "OBF" : "-", |
454 | 454 | (data & 2) ? "IBF" : "-")); |
455 | 455 | } |
r17963 | r17964 | |
457 | 457 | { |
458 | 458 | offs_t promaddr; |
459 | 459 | UINT8 save; |
460 | UINT8 *prom = space | |
460 | UINT8 *prom = space.machine().root_device().memregion("dongle")->base(); | |
461 | 461 | |
462 | 462 | if (state->m_firsttime) |
463 | 463 | { |
r17963 | r17964 | |
497 | 497 | (((state->m_latch1 >> MAP7(state->m_type1_inmap)) & 1) << MAP7(state->m_type1_outmap)); |
498 | 498 | |
499 | 499 | LOG(3,("%10s 6502-PC: %04x decocass_type1_latch_27_pass_3_inv_2_r(%02x): $%02x\n", |
500 | space | |
500 | space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data)); | |
501 | 501 | |
502 | 502 | state->m_latch1 = save; /* latch the data for the next A0 == 0 read */ |
503 | 503 | } |
r17963 | r17964 | |
517 | 517 | |
518 | 518 | static READ8_HANDLER( decocass_type1_latch_26_pass_5_inv_2_r ) |
519 | 519 | { |
520 | decocass_state *state = space | |
520 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
521 | 521 | UINT8 data; |
522 | 522 | |
523 | 523 | if (1 == (offset & 1)) |
r17963 | r17964 | |
529 | 529 | |
530 | 530 | data = (BIT(data, 0) << 0) | (BIT(data, 1) << 1) | 0x7c; |
531 | 531 | LOG(4,("%10s 6502-PC: %04x decocass_type1_latch_26_pass_5_inv_2_r(%02x): $%02x <- (%s %s)\n", |
532 | space | |
532 | space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data, | |
533 | 533 | (data & 1) ? "OBF" : "-", |
534 | 534 | (data & 2) ? "IBF" : "-")); |
535 | 535 | } |
r17963 | r17964 | |
537 | 537 | { |
538 | 538 | offs_t promaddr; |
539 | 539 | UINT8 save; |
540 | UINT8 *prom = space | |
540 | UINT8 *prom = space.machine().root_device().memregion("dongle")->base(); | |
541 | 541 | |
542 | 542 | if (state->m_firsttime) |
543 | 543 | { |
r17963 | r17964 | |
577 | 577 | (((prom[promaddr] >> 4) & 1) << MAP7(state->m_type1_outmap)); |
578 | 578 | |
579 | 579 | LOG(3,("%10s 6502-PC: %04x decocass_type1_latch_26_pass_5_inv_2_r(%02x): $%02x\n", |
580 | space | |
580 | space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data)); | |
581 | 581 | |
582 | 582 | state->m_latch1 = save; /* latch the data for the next A0 == 0 read */ |
583 | 583 | } |
r17963 | r17964 | |
599 | 599 | |
600 | 600 | static READ8_HANDLER( decocass_type1_latch_16_pass_3_inv_1_r ) |
601 | 601 | { |
602 | decocass_state *state = space | |
602 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
603 | 603 | UINT8 data; |
604 | 604 | |
605 | 605 | if (1 == (offset & 1)) |
r17963 | r17964 | |
611 | 611 | |
612 | 612 | data = (BIT(data, 0) << 0) | (BIT(data, 1) << 1) | 0x7c; |
613 | 613 | LOG(4,("%10s 6502-PC: %04x decocass_type1_latch_16_pass_3_inv_1_r(%02x): $%02x <- (%s %s)\n", |
614 | space | |
614 | space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data, | |
615 | 615 | (data & 1) ? "OBF" : "-", |
616 | 616 | (data & 2) ? "IBF" : "-")); |
617 | 617 | } |
r17963 | r17964 | |
619 | 619 | { |
620 | 620 | offs_t promaddr; |
621 | 621 | UINT8 save; |
622 | UINT8 *prom = space | |
622 | UINT8 *prom = space.machine().root_device().memregion("dongle")->base(); | |
623 | 623 | |
624 | 624 | if (state->m_firsttime) |
625 | 625 | { |
r17963 | r17964 | |
659 | 659 | (((prom[promaddr] >> 4) & 1) << MAP7(state->m_type1_outmap)); |
660 | 660 | |
661 | 661 | LOG(3,("%10s 6502-PC: %04x decocass_type1_latch_16_pass_3_inv_1_r(%02x): $%02x\n", |
662 | space | |
662 | space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data)); | |
663 | 663 | |
664 | 664 | state->m_latch1 = save; /* latch the data for the next A0 == 0 read */ |
665 | 665 | } |
r17963 | r17964 | |
680 | 680 | ***************************************************************************/ |
681 | 681 | static READ8_HANDLER( decocass_type2_r ) |
682 | 682 | { |
683 | decocass_state *state = space | |
683 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
684 | 684 | UINT8 data; |
685 | 685 | |
686 | 686 | if (1 == state->m_type2_xx_latch) |
r17963 | r17964 | |
689 | 689 | { |
690 | 690 | UINT8 *prom = state->memregion("dongle")->base(); |
691 | 691 | data = prom[256 * state->m_type2_d2_latch + state->m_type2_promaddr]; |
692 | LOG(3,("%10s 6502-PC: %04x decocass_type2_r(%02x): $%02x <- prom[%03x]\n", space | |
692 | LOG(3,("%10s 6502-PC: %04x decocass_type2_r(%02x): $%02x <- prom[%03x]\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data, 256 * state->m_type2_d2_latch + state->m_type2_promaddr)); | |
693 | 693 | } |
694 | 694 | else |
695 | 695 | { |
r17963 | r17964 | |
703 | 703 | else |
704 | 704 | data = offset & 0xff; |
705 | 705 | |
706 | LOG(3,("%10s 6502-PC: %04x decocass_type2_r(%02x): $%02x <- 8041-%s\n", space | |
706 | LOG(3,("%10s 6502-PC: %04x decocass_type2_r(%02x): $%02x <- 8041-%s\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data, offset & 1 ? "STATUS" : "DATA")); | |
707 | 707 | } |
708 | 708 | return data; |
709 | 709 | } |
710 | 710 | |
711 | 711 | static WRITE8_HANDLER( decocass_type2_w ) |
712 | 712 | { |
713 | decocass_state *state = space | |
713 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
714 | 714 | if (1 == state->m_type2_xx_latch) |
715 | 715 | { |
716 | 716 | if (1 == (offset & 1)) |
717 | 717 | { |
718 | LOG(4,("%10s 6502-PC: %04x decocass_e5xx_w(%02x): $%02x -> set PROM+D2 latch", space | |
718 | LOG(4,("%10s 6502-PC: %04x decocass_e5xx_w(%02x): $%02x -> set PROM+D2 latch", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data)); | |
719 | 719 | } |
720 | 720 | else |
721 | 721 | { |
722 | 722 | state->m_type2_promaddr = data; |
723 | LOG(3,("%10s 6502-PC: %04x decocass_e5xx_w(%02x): $%02x -> set PROM addr $%02x\n", space | |
723 | LOG(3,("%10s 6502-PC: %04x decocass_e5xx_w(%02x): $%02x -> set PROM addr $%02x\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data, state->m_type2_promaddr)); | |
724 | 724 | return; |
725 | 725 | } |
726 | 726 | } |
727 | 727 | else |
728 | 728 | { |
729 | LOG(3,("%10s 6502-PC: %04x decocass_e5xx_w(%02x): $%02x -> %s ", space | |
729 | LOG(3,("%10s 6502-PC: %04x decocass_e5xx_w(%02x): $%02x -> %s ", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data, offset & 1 ? "8041-CMND" : "8041 DATA")); | |
730 | 730 | } |
731 | 731 | if (1 == (offset & 1)) |
732 | 732 | { |
r17963 | r17964 | |
740 | 740 | upi41_master_w(state->m_mcu, offset & 1, data); |
741 | 741 | |
742 | 742 | #ifdef MAME_DEBUG |
743 | decocass_fno(space | |
743 | decocass_fno(space.machine(), offset, data); | |
744 | 744 | #endif |
745 | 745 | } |
746 | 746 | |
r17963 | r17964 | |
764 | 764 | ***************************************************************************/ |
765 | 765 | static READ8_HANDLER( decocass_type3_r ) |
766 | 766 | { |
767 | decocass_state *state = space | |
767 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
768 | 768 | UINT8 data, save; |
769 | 769 | |
770 | 770 | if (1 == (offset & 1)) |
r17963 | r17964 | |
773 | 773 | { |
774 | 774 | UINT8 *prom = state->memregion("dongle")->base(); |
775 | 775 | data = prom[state->m_type3_ctrs]; |
776 | LOG(3,("%10s 6502-PC: %04x decocass_type3_r(%02x): $%02x <- prom[$%03x]\n", space | |
776 | LOG(3,("%10s 6502-PC: %04x decocass_type3_r(%02x): $%02x <- prom[$%03x]\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data, state->m_type3_ctrs)); | |
777 | 777 | if (++state->m_type3_ctrs == 4096) |
778 | 778 | state->m_type3_ctrs = 0; |
779 | 779 | } |
r17963 | r17964 | |
782 | 782 | if (0 == (offset & E5XX_MASK)) |
783 | 783 | { |
784 | 784 | data = upi41_master_r(state->m_mcu, 1); |
785 | LOG(4,("%10s 6502-PC: %04x decocass_type3_r(%02x): $%02x <- 8041 STATUS\n", space | |
785 | LOG(4,("%10s 6502-PC: %04x decocass_type3_r(%02x): $%02x <- 8041 STATUS\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data)); | |
786 | 786 | } |
787 | 787 | else |
788 | 788 | { |
789 | 789 | data = 0xff; /* open data bus? */ |
790 | LOG(4,("%10s 6502-PC: %04x decocass_type3_r(%02x): $%02x <- open bus\n", space | |
790 | LOG(4,("%10s 6502-PC: %04x decocass_type3_r(%02x): $%02x <- open bus\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data)); | |
791 | 791 | } |
792 | 792 | } |
793 | 793 | } |
r17963 | r17964 | |
796 | 796 | if (1 == state->m_type3_pal_19) |
797 | 797 | { |
798 | 798 | save = data = 0xff; /* open data bus? */ |
799 | LOG(3,("%10s 6502-PC: %04x decocass_type3_r(%02x): $%02x <- open bus", space | |
799 | LOG(3,("%10s 6502-PC: %04x decocass_type3_r(%02x): $%02x <- open bus", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data)); | |
800 | 800 | } |
801 | 801 | else |
802 | 802 | { |
r17963 | r17964 | |
938 | 938 | (BIT(save, 7) << 7); |
939 | 939 | } |
940 | 940 | state->m_type3_d0_latch = save & 1; |
941 | LOG(3,("%10s 6502-PC: %04x decocass_type3_r(%02x): $%02x '%c' <- 8041-DATA\n", space | |
941 | LOG(3,("%10s 6502-PC: %04x decocass_type3_r(%02x): $%02x '%c' <- 8041-DATA\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data, (data >= 32) ? data : '.')); | |
942 | 942 | } |
943 | 943 | else |
944 | 944 | { |
r17963 | r17964 | |
952 | 952 | (BIT(save, 5) << 5) | |
953 | 953 | (BIT(save, 6) << 7) | |
954 | 954 | (BIT(save, 7) << 6); |
955 | LOG(3,("%10s 6502-PC: %04x decocass_type3_r(%02x): $%02x '%c' <- open bus (D0 replaced with latch)\n", space | |
955 | LOG(3,("%10s 6502-PC: %04x decocass_type3_r(%02x): $%02x '%c' <- open bus (D0 replaced with latch)\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data, (data >= 32) ? data : '.')); | |
956 | 956 | state->m_type3_d0_latch = save & 1; |
957 | 957 | } |
958 | 958 | } |
r17963 | r17964 | |
963 | 963 | |
964 | 964 | static WRITE8_HANDLER( decocass_type3_w ) |
965 | 965 | { |
966 | decocass_state *state = space | |
966 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
967 | 967 | if (1 == (offset & 1)) |
968 | 968 | { |
969 | 969 | if (1 == state->m_type3_pal_19) |
970 | 970 | { |
971 | 971 | state->m_type3_ctrs = data << 4; |
972 | LOG(3,("%10s 6502-PC: %04x decocass_e5xx_w(%02x): $%02x -> %s\n", space | |
972 | LOG(3,("%10s 6502-PC: %04x decocass_e5xx_w(%02x): $%02x -> %s\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data, "LDCTRS")); | |
973 | 973 | return; |
974 | 974 | } |
975 | 975 | else |
r17963 | r17964 | |
981 | 981 | if (1 == state->m_type3_pal_19) |
982 | 982 | { |
983 | 983 | /* write nowhere?? */ |
984 | LOG(3,("%10s 6502-PC: %04x decocass_e5xx_w(%02x): $%02x -> %s\n", space | |
984 | LOG(3,("%10s 6502-PC: %04x decocass_e5xx_w(%02x): $%02x -> %s\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data, "nowhere?")); | |
985 | 985 | return; |
986 | 986 | } |
987 | 987 | } |
988 | LOG(3,("%10s 6502-PC: %04x decocass_e5xx_w(%02x): $%02x -> %s\n", space | |
988 | LOG(3,("%10s 6502-PC: %04x decocass_e5xx_w(%02x): $%02x -> %s\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data, offset & 1 ? "8041-CMND" : "8041-DATA")); | |
989 | 989 | upi41_master_w(state->m_mcu, offset, data); |
990 | 990 | } |
991 | 991 | |
r17963 | r17964 | |
1004 | 1004 | |
1005 | 1005 | static READ8_HANDLER( decocass_type4_r ) |
1006 | 1006 | { |
1007 | decocass_state *state = space | |
1007 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
1008 | 1008 | UINT8 data; |
1009 | 1009 | |
1010 | 1010 | if (1 == (offset & 1)) |
r17963 | r17964 | |
1012 | 1012 | if (0 == (offset & E5XX_MASK)) |
1013 | 1013 | { |
1014 | 1014 | data = upi41_master_r(state->m_mcu, 1); |
1015 | LOG(4,("%10s 6502-PC: %04x decocass_type4_r(%02x): $%02x <- 8041 STATUS\n", space | |
1015 | LOG(4,("%10s 6502-PC: %04x decocass_type4_r(%02x): $%02x <- 8041 STATUS\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data)); | |
1016 | 1016 | } |
1017 | 1017 | else |
1018 | 1018 | { |
1019 | 1019 | data = 0xff; /* open data bus? */ |
1020 | LOG(4,("%10s 6502-PC: %04x decocass_type4_r(%02x): $%02x <- open bus\n", space | |
1020 | LOG(4,("%10s 6502-PC: %04x decocass_type4_r(%02x): $%02x <- open bus\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data)); | |
1021 | 1021 | } |
1022 | 1022 | } |
1023 | 1023 | else |
1024 | 1024 | { |
1025 | 1025 | if (state->m_type4_latch) |
1026 | 1026 | { |
1027 | UINT8 *prom = space | |
1027 | UINT8 *prom = space.machine().root_device().memregion("dongle")->base(); | |
1028 | 1028 | |
1029 | 1029 | data = prom[state->m_type4_ctrs]; |
1030 | LOG(3,("%10s 6502-PC: %04x decocass_type4_r(%02x): $%02x '%c' <- PROM[%04x]\n", space | |
1030 | LOG(3,("%10s 6502-PC: %04x decocass_type4_r(%02x): $%02x '%c' <- PROM[%04x]\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data, (data >= 32) ? data : '.', state->m_type4_ctrs)); | |
1031 | 1031 | state->m_type4_ctrs = (state->m_type4_ctrs + 1) & 0x7fff; |
1032 | 1032 | } |
1033 | 1033 | else |
r17963 | r17964 | |
1035 | 1035 | if (0 == (offset & E5XX_MASK)) |
1036 | 1036 | { |
1037 | 1037 | data = upi41_master_r(state->m_mcu, 0); |
1038 | LOG(3,("%10s 6502-PC: %04x decocass_type4_r(%02x): $%02x '%c' <- open bus (D0 replaced with latch)\n", space | |
1038 | LOG(3,("%10s 6502-PC: %04x decocass_type4_r(%02x): $%02x '%c' <- open bus (D0 replaced with latch)\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data, (data >= 32) ? data : '.')); | |
1039 | 1039 | } |
1040 | 1040 | else |
1041 | 1041 | { |
1042 | 1042 | data = 0xff; /* open data bus? */ |
1043 | LOG(4,("%10s 6502-PC: %04x decocass_type4_r(%02x): $%02x <- open bus\n", space | |
1043 | LOG(4,("%10s 6502-PC: %04x decocass_type4_r(%02x): $%02x <- open bus\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data)); | |
1044 | 1044 | } |
1045 | 1045 | } |
1046 | 1046 | } |
r17963 | r17964 | |
1050 | 1050 | |
1051 | 1051 | static WRITE8_HANDLER( decocass_type4_w ) |
1052 | 1052 | { |
1053 | decocass_state *state = space | |
1053 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
1054 | 1054 | if (1 == (offset & 1)) |
1055 | 1055 | { |
1056 | 1056 | if (1 == state->m_type4_latch) |
1057 | 1057 | { |
1058 | 1058 | state->m_type4_ctrs = (state->m_type4_ctrs & 0x00ff) | ((data & 0x7f) << 8); |
1059 | LOG(3,("%10s 6502-PC: %04x decocass_e5xx_w(%02x): $%02x -> CTRS MSB (%04x)\n", space | |
1059 | LOG(3,("%10s 6502-PC: %04x decocass_e5xx_w(%02x): $%02x -> CTRS MSB (%04x)\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data, state->m_type4_ctrs)); | |
1060 | 1060 | return; |
1061 | 1061 | } |
1062 | 1062 | else |
r17963 | r17964 | |
1070 | 1070 | if (state->m_type4_latch) |
1071 | 1071 | { |
1072 | 1072 | state->m_type4_ctrs = (state->m_type4_ctrs & 0xff00) | data; |
1073 | LOG(3,("%10s 6502-PC: %04x decocass_e5xx_w(%02x): $%02x -> CTRS LSB (%04x)\n", space | |
1073 | LOG(3,("%10s 6502-PC: %04x decocass_e5xx_w(%02x): $%02x -> CTRS LSB (%04x)\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data, state->m_type4_ctrs)); | |
1074 | 1074 | return; |
1075 | 1075 | } |
1076 | 1076 | } |
1077 | LOG(3,("%10s 6502-PC: %04x decocass_e5xx_w(%02x): $%02x -> %s\n", space | |
1077 | LOG(3,("%10s 6502-PC: %04x decocass_e5xx_w(%02x): $%02x -> %s\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data, offset & 1 ? "8041-CMND" : "8041-DATA")); | |
1078 | 1078 | upi41_master_w(state->m_mcu, offset, data); |
1079 | 1079 | } |
1080 | 1080 | |
r17963 | r17964 | |
1089 | 1089 | |
1090 | 1090 | static READ8_HANDLER( decocass_type5_r ) |
1091 | 1091 | { |
1092 | decocass_state *state = space | |
1092 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
1093 | 1093 | UINT8 data; |
1094 | 1094 | |
1095 | 1095 | if (1 == (offset & 1)) |
r17963 | r17964 | |
1097 | 1097 | if (0 == (offset & E5XX_MASK)) |
1098 | 1098 | { |
1099 | 1099 | data = upi41_master_r(state->m_mcu, 1); |
1100 | LOG(4,("%10s 6502-PC: %04x decocass_type5_r(%02x): $%02x <- 8041 STATUS\n", space | |
1100 | LOG(4,("%10s 6502-PC: %04x decocass_type5_r(%02x): $%02x <- 8041 STATUS\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data)); | |
1101 | 1101 | } |
1102 | 1102 | else |
1103 | 1103 | { |
1104 | 1104 | data = 0xff; /* open data bus? */ |
1105 | LOG(4,("%10s 6502-PC: %04x decocass_type5_r(%02x): $%02x <- open bus\n", space | |
1105 | LOG(4,("%10s 6502-PC: %04x decocass_type5_r(%02x): $%02x <- open bus\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data)); | |
1106 | 1106 | } |
1107 | 1107 | } |
1108 | 1108 | else |
r17963 | r17964 | |
1110 | 1110 | if (state->m_type5_latch) |
1111 | 1111 | { |
1112 | 1112 | data = 0x55; /* Only a fixed value? It looks like this is all we need to do */ |
1113 | LOG(3,("%10s 6502-PC: %04x decocass_type5_r(%02x): $%02x '%c' <- fixed value???\n", space | |
1113 | LOG(3,("%10s 6502-PC: %04x decocass_type5_r(%02x): $%02x '%c' <- fixed value???\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data, (data >= 32) ? data : '.')); | |
1114 | 1114 | } |
1115 | 1115 | else |
1116 | 1116 | { |
1117 | 1117 | if (0 == (offset & E5XX_MASK)) |
1118 | 1118 | { |
1119 | 1119 | data = upi41_master_r(state->m_mcu, 0); |
1120 | LOG(3,("%10s 6502-PC: %04x decocass_type5_r(%02x): $%02x '%c' <- open bus (D0 replaced with latch)\n", space | |
1120 | LOG(3,("%10s 6502-PC: %04x decocass_type5_r(%02x): $%02x '%c' <- open bus (D0 replaced with latch)\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data, (data >= 32) ? data : '.')); | |
1121 | 1121 | } |
1122 | 1122 | else |
1123 | 1123 | { |
1124 | 1124 | data = 0xff; /* open data bus? */ |
1125 | LOG(4,("%10s 6502-PC: %04x decocass_type5_r(%02x): $%02x <- open bus\n", space | |
1125 | LOG(4,("%10s 6502-PC: %04x decocass_type5_r(%02x): $%02x <- open bus\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data)); | |
1126 | 1126 | } |
1127 | 1127 | } |
1128 | 1128 | } |
r17963 | r17964 | |
1132 | 1132 | |
1133 | 1133 | static WRITE8_HANDLER( decocass_type5_w ) |
1134 | 1134 | { |
1135 | decocass_state *state = space | |
1135 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
1136 | 1136 | if (1 == (offset & 1)) |
1137 | 1137 | { |
1138 | 1138 | if (1 == state->m_type5_latch) |
1139 | 1139 | { |
1140 | LOG(3,("%10s 6502-PC: %04x decocass_e5xx_w(%02x): $%02x -> %s\n", space | |
1140 | LOG(3,("%10s 6502-PC: %04x decocass_e5xx_w(%02x): $%02x -> %s\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data, "latch #2??")); | |
1141 | 1141 | return; |
1142 | 1142 | } |
1143 | 1143 | else |
r17963 | r17964 | |
1149 | 1149 | if (state->m_type5_latch) |
1150 | 1150 | { |
1151 | 1151 | /* write nowhere?? */ |
1152 | LOG(3,("%10s 6502-PC: %04x decocass_e5xx_w(%02x): $%02x -> %s\n", space | |
1152 | LOG(3,("%10s 6502-PC: %04x decocass_e5xx_w(%02x): $%02x -> %s\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data, "nowhere?")); | |
1153 | 1153 | return; |
1154 | 1154 | } |
1155 | 1155 | } |
1156 | LOG(3,("%10s 6502-PC: %04x decocass_e5xx_w(%02x): $%02x -> %s\n", space | |
1156 | LOG(3,("%10s 6502-PC: %04x decocass_e5xx_w(%02x): $%02x -> %s\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data, offset & 1 ? "8041-CMND" : "8041-DATA")); | |
1157 | 1157 | upi41_master_w(state->m_mcu, offset, data); |
1158 | 1158 | } |
1159 | 1159 | |
r17963 | r17964 | |
1167 | 1167 | |
1168 | 1168 | static READ8_HANDLER( decocass_nodong_r ) |
1169 | 1169 | { |
1170 | decocass_state *state = space | |
1170 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
1171 | 1171 | UINT8 data; |
1172 | 1172 | |
1173 | 1173 | if (1 == (offset & 1)) |
r17963 | r17964 | |
1175 | 1175 | if (0 == (offset & E5XX_MASK)) |
1176 | 1176 | { |
1177 | 1177 | data = upi41_master_r(state->m_mcu, 1); |
1178 | LOG(4,("%10s 6502-PC: %04x decocass_nodong_r(%02x): $%02x <- 8041 STATUS\n", space | |
1178 | LOG(4,("%10s 6502-PC: %04x decocass_nodong_r(%02x): $%02x <- 8041 STATUS\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data)); | |
1179 | 1179 | } |
1180 | 1180 | else |
1181 | 1181 | { |
1182 | 1182 | data = 0xff; /* open data bus? */ |
1183 | LOG(4,("%10s 6502-PC: %04x decocass_nodong_r(%02x): $%02x <- open bus\n", space | |
1183 | LOG(4,("%10s 6502-PC: %04x decocass_nodong_r(%02x): $%02x <- open bus\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data)); | |
1184 | 1184 | } |
1185 | 1185 | } |
1186 | 1186 | else |
r17963 | r17964 | |
1188 | 1188 | if (0 == (offset & E5XX_MASK)) |
1189 | 1189 | { |
1190 | 1190 | data = upi41_master_r(state->m_mcu, 0); |
1191 | LOG(3,("%10s 6502-PC: %04x decocass_nodong_r(%02x): $%02x '%c' <- open bus (D0 replaced with latch)\n", space | |
1191 | LOG(3,("%10s 6502-PC: %04x decocass_nodong_r(%02x): $%02x '%c' <- open bus (D0 replaced with latch)\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data, (data >= 32) ? data : '.')); | |
1192 | 1192 | } |
1193 | 1193 | else |
1194 | 1194 | { |
1195 | 1195 | data = 0xff; /* open data bus? */ |
1196 | LOG(4,("%10s 6502-PC: %04x decocass_nodong_r(%02x): $%02x <- open bus\n", space | |
1196 | LOG(4,("%10s 6502-PC: %04x decocass_nodong_r(%02x): $%02x <- open bus\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data)); | |
1197 | 1197 | } |
1198 | 1198 | } |
1199 | 1199 | |
r17963 | r17964 | |
1208 | 1208 | |
1209 | 1209 | READ8_HANDLER( decocass_e5xx_r ) |
1210 | 1210 | { |
1211 | decocass_state *state = space | |
1211 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
1212 | 1212 | UINT8 data; |
1213 | 1213 | |
1214 | 1214 | /* E5x2-E5x3 and mirrors */ |
r17963 | r17964 | |
1227 | 1227 | (!tape_is_present(state->m_cassette) << 7); /* D7 = cassette present */ |
1228 | 1228 | |
1229 | 1229 | LOG(4,("%10s 6502-PC: %04x decocass_e5xx_r(%02x): $%02x <- STATUS (%s%s%s%s%s%s%s%s)\n", |
1230 | space->machine().time().as_string(6), | |
1231 | space->device().safe_pcbase(), | |
1230 | space.machine().time().as_string(6), | |
1231 | space.device().safe_pcbase(), | |
1232 | 1232 | offset, data, |
1233 | 1233 | data & 0x01 ? "" : "REQ/", |
1234 | 1234 | data & 0x02 ? "" : " FNO/", |
r17963 | r17964 | |
1251 | 1251 | |
1252 | 1252 | WRITE8_HANDLER( decocass_e5xx_w ) |
1253 | 1253 | { |
1254 | decocass_state *state = space | |
1254 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
1255 | 1255 | if (state->m_dongle_w) |
1256 | 1256 | { |
1257 | 1257 | (*state->m_dongle_w)(space, offset, data); |
r17963 | r17964 | |
1260 | 1260 | |
1261 | 1261 | if (0 == (offset & E5XX_MASK)) |
1262 | 1262 | { |
1263 | LOG(3,("%10s 6502-PC: %04x decocass_e5xx_w(%02x): $%02x -> %s\n", space | |
1263 | LOG(3,("%10s 6502-PC: %04x decocass_e5xx_w(%02x): $%02x -> %s\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data, offset & 1 ? "8041-CMND" : "8041-DATA")); | |
1264 | 1264 | upi41_master_w(state->m_mcu, offset & 1, data); |
1265 | 1265 | #ifdef MAME_DEBUG |
1266 | decocass_fno(space | |
1266 | decocass_fno(space.machine(), offset, data); | |
1267 | 1267 | #endif |
1268 | 1268 | } |
1269 | 1269 | else |
1270 | 1270 | { |
1271 | LOG(3,("%10s 6502-PC: %04x decocass_e5xx_w(%02x): $%02x -> dongle\n", space | |
1271 | LOG(3,("%10s 6502-PC: %04x decocass_e5xx_w(%02x): $%02x -> dongle\n", space.machine().time().as_string(6), space.device().safe_pcbase(), offset, data)); | |
1272 | 1272 | } |
1273 | 1273 | } |
1274 | 1274 | |
r17963 | r17964 | |
1286 | 1286 | |
1287 | 1287 | WRITE8_HANDLER( decocass_e900_w ) |
1288 | 1288 | { |
1289 | decocass_state *state = space | |
1289 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
1290 | 1290 | state->m_de0091_enable = data & 1; |
1291 | 1291 | state->membank("bank1")->set_entry(data & 1); |
1292 | 1292 | /* Perhaps the second row of ROMs is enabled by another bit. |
r17963 | r17964 | |
1298 | 1298 | |
1299 | 1299 | WRITE8_HANDLER( decocass_de0091_w ) |
1300 | 1300 | { |
1301 | decocass_state *state = space | |
1301 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
1302 | 1302 | /* don't allow writes to the ROMs */ |
1303 | 1303 | if (!state->m_de0091_enable) |
1304 | 1304 | decocass_charram_w(space, offset, data); |
r17963 | r17964 | |
1719 | 1719 | |
1720 | 1720 | WRITE8_HANDLER( i8041_p1_w ) |
1721 | 1721 | { |
1722 | decocass_state *state = space | |
1722 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
1723 | 1723 | if (data != state->m_i8041_p1_write_latch) |
1724 | 1724 | { |
1725 | 1725 | LOG(4,("%10s 8041-PC: %03x i8041_p1_w: $%02x (%s%s%s%s%s%s%s%s)\n", |
1726 | space->machine().time().as_string(6), | |
1727 | space->device().safe_pcbase(), | |
1726 | space.machine().time().as_string(6), | |
1727 | space.device().safe_pcbase(), | |
1728 | 1728 | data, |
1729 | 1729 | data & 0x01 ? "" : "DATA-WRT", |
1730 | 1730 | data & 0x02 ? "" : " DATA-CLK", |
r17963 | r17964 | |
1754 | 1754 | |
1755 | 1755 | READ8_HANDLER( i8041_p1_r ) |
1756 | 1756 | { |
1757 | decocass_state *state = space | |
1757 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
1758 | 1758 | UINT8 data = state->m_i8041_p1; |
1759 | 1759 | |
1760 | 1760 | if (data != state->m_i8041_p1_read_latch) |
1761 | 1761 | { |
1762 | 1762 | LOG(4,("%10s 8041-PC: %03x i8041_p1_r: $%02x (%s%s%s%s%s%s%s%s)\n", |
1763 | space->machine().time().as_string(6), | |
1764 | space->device().safe_pcbase(), | |
1763 | space.machine().time().as_string(6), | |
1764 | space.device().safe_pcbase(), | |
1765 | 1765 | data, |
1766 | 1766 | data & 0x01 ? "" : "DATA-WRT", |
1767 | 1767 | data & 0x02 ? "" : " DATA-CLK", |
r17963 | r17964 | |
1778 | 1778 | |
1779 | 1779 | WRITE8_HANDLER( i8041_p2_w ) |
1780 | 1780 | { |
1781 | decocass_state *state = space | |
1781 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
1782 | 1782 | if (data != state->m_i8041_p2_write_latch) |
1783 | 1783 | { |
1784 | 1784 | LOG(4,("%10s 8041-PC: %03x i8041_p2_w: $%02x (%s%s%s%s%s%s%s%s)\n", |
1785 | space->machine().time().as_string(6), | |
1786 | space->device().safe_pcbase(), | |
1785 | space.machine().time().as_string(6), | |
1786 | space.device().safe_pcbase(), | |
1787 | 1787 | data, |
1788 | 1788 | data & 0x01 ? "" : "FNO/", |
1789 | 1789 | data & 0x02 ? "" : " EOT/", |
r17963 | r17964 | |
1800 | 1800 | |
1801 | 1801 | READ8_HANDLER( i8041_p2_r ) |
1802 | 1802 | { |
1803 | decocass_state *state = space | |
1803 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
1804 | 1804 | UINT8 data; |
1805 | 1805 | |
1806 | 1806 | data = (state->m_i8041_p2 & ~0xe0) | tape_get_status_bits(state->m_cassette); |
r17963 | r17964 | |
1808 | 1808 | if (data != state->m_i8041_p2_read_latch) |
1809 | 1809 | { |
1810 | 1810 | LOG(4,("%10s 8041-PC: %03x i8041_p2_r: $%02x (%s%s%s%s%s%s%s%s)\n", |
1811 | space->machine().time().as_string(6), | |
1812 | space->device().safe_pcbase(), | |
1811 | space.machine().time().as_string(6), | |
1812 | space.device().safe_pcbase(), | |
1813 | 1813 | data, |
1814 | 1814 | data & 0x01 ? "" : "FNO/", |
1815 | 1815 | data & 0x02 ? "" : " EOT/", |
r17963 | r17964 | |
---|---|---|
129 | 129 | { |
130 | 130 | if (cgboard_id < MAX_CG_BOARDS) |
131 | 131 | { |
132 | // mame_printf_debug("dsp_cmd_r: (board %d) %08X, %08X at %08X\n", cgboard_id, offset, mem_mask, space | |
132 | // mame_printf_debug("dsp_cmd_r: (board %d) %08X, %08X at %08X\n", cgboard_id, offset, mem_mask, space.device().safe_pc()); | |
133 | 133 | return dsp_comm_sharc[cgboard_id][offset] | (dsp_state[cgboard_id] << 16); |
134 | 134 | } |
135 | 135 | else |
r17963 | r17964 | |
142 | 142 | { |
143 | 143 | const char *dsptag = (cgboard_id == 0) ? "dsp" : "dsp2"; |
144 | 144 | const char *pcitag = (cgboard_id == 0) ? "k033906_1" : "k033906_2"; |
145 | device_t *dsp = space->machine().device(dsptag); | |
146 | device_t *k033906 = space->machine().device(pcitag); | |
147 | // mame_printf_debug("dsp_cmd_w: (board %d) %08X, %08X, %08X at %08X\n", cgboard_id, data, offset, mem_mask, space->device().safe_pc()); | |
145 | device_t *dsp = space.machine().device(dsptag); | |
146 | device_t *k033906 = space.machine().device(pcitag); | |
147 | // mame_printf_debug("dsp_cmd_w: (board %d) %08X, %08X, %08X at %08X\n", cgboard_id, data, offset, mem_mask, space.device().safe_pc()); | |
148 | 148 | |
149 | 149 | if (cgboard_id < MAX_CG_BOARDS) |
150 | 150 | { |
r17963 | r17964 | |
198 | 198 | { |
199 | 199 | if (cgboard_id < MAX_CG_BOARDS) |
200 | 200 | { |
201 | space | |
201 | space.machine().scheduler().trigger(10000); // Remove the timeout (a part of the GTI Club FIFO test workaround) | |
202 | 202 | COMBINE_DATA(dsp_shared_ram[cgboard_id] + (offset + (dsp_shared_ram_bank[cgboard_id] * DSP_BANK_SIZE_WORD))); |
203 | 203 | } |
204 | 204 | } |
r17963 | r17964 | |
212 | 212 | return dsp_comm_ppc[board][offset]; |
213 | 213 | } |
214 | 214 | |
215 | static void dsp_comm_sharc_w(address_space | |
215 | static void dsp_comm_sharc_w(address_space &space, int board, int offset, UINT32 data) | |
216 | 216 | { |
217 | 217 | if (offset >= 2) |
218 | 218 | { |
r17963 | r17964 | |
225 | 225 | case CGBOARD_TYPE_GTICLUB: |
226 | 226 | { |
227 | 227 | //machine.device("dsp")->execute().set_input_line(SHARC_INPUT_FLAG0, ASSERT_LINE); |
228 | sharc_set_flag_input(space | |
228 | sharc_set_flag_input(space.machine().device("dsp"), 0, ASSERT_LINE); | |
229 | 229 | |
230 | 230 | if (offset == 1) |
231 | 231 | { |
232 | 232 | if (data & 0x03) |
233 | space | |
233 | space.machine().device("dsp")->execute().set_input_line(INPUT_LINE_IRQ2, ASSERT_LINE); | |
234 | 234 | } |
235 | 235 | break; |
236 | 236 | } |
r17963 | r17964 | |
239 | 239 | case CGBOARD_TYPE_HANGPLT: |
240 | 240 | { |
241 | 241 | const char *dsptag = (board == 0) ? "dsp" : "dsp2"; |
242 | device_t *device = space | |
242 | device_t *device = space.machine().device(dsptag); | |
243 | 243 | |
244 | 244 | if (offset == 1) |
245 | 245 | { |
r17963 | r17964 | |
254 | 254 | { |
255 | 255 | int offset = (data & 0x08) ? 1 : 0; |
256 | 256 | |
257 | space | |
257 | space.machine().root_device().membank(texture_bank[board])->set_entry(offset); | |
258 | 258 | } |
259 | 259 | } |
260 | 260 | break; |
r17963 | r17964 | |
268 | 268 | { |
269 | 269 | int offset = (data & 0x08) ? 1 : 0; |
270 | 270 | |
271 | space | |
271 | space.machine().root_device().membank(texture_bank[board])->set_entry(offset); | |
272 | 272 | } |
273 | 273 | } |
274 | 274 | break; |
275 | 275 | } |
276 | 276 | } |
277 | 277 | |
278 | // printf("%s:cgboard_dsp_comm_w_sharc: %08X, %08X, %08X\n", space | |
278 | // printf("%s:cgboard_dsp_comm_w_sharc: %08X, %08X, %08X\n", space.machine().describe_context(), data, offset, mem_mask); | |
279 | 279 | |
280 | 280 | dsp_comm_sharc[board][offset] = data; |
281 | 281 | } |
r17963 | r17964 | |
351 | 351 | |
352 | 352 | /*****************************************************************************/ |
353 | 353 | |
354 | static UINT32 nwk_fifo_r(address_space | |
354 | static UINT32 nwk_fifo_r(address_space &space, int board) | |
355 | 355 | { |
356 | 356 | const char *dsptag = (board == 0) ? "dsp" : "dsp2"; |
357 | device_t *device = space | |
357 | device_t *device = space.machine().device(dsptag); | |
358 | 358 | UINT32 data; |
359 | 359 | |
360 | 360 | if (nwk_fifo_read_ptr[board] < nwk_fifo_half_full_r) |
r17963 | r17964 | |
409 | 409 | |
410 | 410 | READ32_HANDLER( K033906_0_r ) |
411 | 411 | { |
412 | device_t *k033906_1 = space | |
412 | device_t *k033906_1 = space.machine().device("k033906_1"); | |
413 | 413 | if (nwk_device_sel[0] & 0x01) |
414 | 414 | return nwk_fifo_r(space, 0); |
415 | 415 | else |
416 | return k033906_r(k033906_1, | |
416 | return k033906_r(k033906_1, space, offset, mem_mask); | |
417 | 417 | } |
418 | 418 | |
419 | 419 | WRITE32_HANDLER( K033906_0_w ) |
420 | 420 | { |
421 | device_t *k033906_1 = space->machine().device("k033906_1"); | |
422 | k033906_w(k033906_1, *space, offset, data, mem_mask); | |
421 | device_t *k033906_1 = space.machine().device("k033906_1"); | |
422 | k033906_w(k033906_1, space, offset, data, mem_mask); | |
423 | 423 | } |
424 | 424 | |
425 | 425 | READ32_HANDLER( K033906_1_r ) |
426 | 426 | { |
427 | device_t *k033906_2 = space | |
427 | device_t *k033906_2 = space.machine().device("k033906_2"); | |
428 | 428 | if (nwk_device_sel[1] & 0x01) |
429 | 429 | return nwk_fifo_r(space, 1); |
430 | 430 | else |
431 | return k033906_r(k033906_2, | |
431 | return k033906_r(k033906_2, space, offset, mem_mask); | |
432 | 432 | } |
433 | 433 | |
434 | 434 | WRITE32_HANDLER(K033906_1_w) |
435 | 435 | { |
436 | device_t *k033906_2 = space->machine().device("k033906_2"); | |
437 | k033906_w(k033906_2, *space, offset, data, mem_mask); | |
436 | device_t *k033906_2 = space.machine().device("k033906_2"); | |
437 | k033906_w(k033906_2, space, offset, data, mem_mask); | |
438 | 438 | } |
439 | 439 | |
440 | 440 | /*****************************************************************************/ |
r17963 | r17964 | |
---|---|---|
161 | 161 | |
162 | 162 | static void mitchell_decode(running_machine &machine, int swap_key1,int swap_key2,int addr_key,int xor_key) |
163 | 163 | { |
164 | address_space | |
164 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
165 | 165 | UINT8 *rom = machine.root_device().memregion("maincpu")->base(); |
166 | 166 | UINT8 *decrypt = auto_alloc_array(machine, UINT8, machine.root_device().memregion("maincpu")->bytes()); |
167 | 167 | int numbanks = (machine.root_device().memregion("maincpu")->bytes() - 0x10000) / 0x4000; |
168 | 168 | int i; |
169 | 169 | |
170 | space | |
170 | space.set_decrypted_region(0x0000, 0x7fff, decrypt); | |
171 | 171 | kabuki_decode(rom,decrypt,rom,0x0000,0x8000, swap_key1,swap_key2,addr_key,xor_key); |
172 | 172 | |
173 | 173 | rom += 0x10000; |
r17963 | r17964 | |
202 | 202 | |
203 | 203 | static void cps1_decode(running_machine &machine,int swap_key1,int swap_key2,int addr_key,int xor_key) |
204 | 204 | { |
205 | address_space | |
205 | address_space &space = *machine.device("audiocpu")->memory().space(AS_PROGRAM); | |
206 | 206 | UINT8 *decrypt = auto_alloc_array(machine, UINT8, 0x8000); |
207 | 207 | UINT8 *rom = machine.root_device().memregion("audiocpu")->base(); |
208 | 208 | |
209 | space | |
209 | space.set_decrypted_region(0x0000, 0x7fff, decrypt); | |
210 | 210 | kabuki_decode(rom,decrypt,rom,0x0000,0x8000, swap_key1,swap_key2,addr_key,xor_key); |
211 | 211 | } |
212 | 212 |
r17963 | r17964 | |
---|---|---|
205 | 205 | } |
206 | 206 | |
207 | 207 | |
208 | UINT8 midway_serial_pic_r(address_space | |
208 | UINT8 midway_serial_pic_r(address_space &space) | |
209 | 209 | { |
210 | logerror("%s:security R = %04X\n", space | |
210 | logerror("%s:security R = %04X\n", space.machine().describe_context(), serial.buffer); | |
211 | 211 | serial.status = 1; |
212 | 212 | return serial.buffer; |
213 | 213 | } |
214 | 214 | |
215 | 215 | |
216 | void midway_serial_pic_w(address_space | |
216 | void midway_serial_pic_w(address_space &space, UINT8 data) | |
217 | 217 | { |
218 | logerror("%s:security W = %04X\n", space | |
218 | logerror("%s:security W = %04X\n", space.machine().describe_context(), data); | |
219 | 219 | |
220 | 220 | /* status seems to reflect the clock bit */ |
221 | 221 | serial.status = (data >> 4) & 1; |
r17963 | r17964 | |
292 | 292 | } |
293 | 293 | |
294 | 294 | |
295 | UINT8 midway_serial_pic2_status_r(address_space | |
295 | UINT8 midway_serial_pic2_status_r(address_space &space) | |
296 | 296 | { |
297 | 297 | UINT8 result = 0; |
298 | 298 | |
299 | 299 | /* if we're still holding the data ready bit high, do it */ |
300 | 300 | if (pic.latch & 0xf00) |
301 | 301 | { |
302 | if (space | |
302 | if (space.machine().time() > pic.latch_expire_time) | |
303 | 303 | pic.latch &= 0xff; |
304 | 304 | else |
305 | 305 | pic.latch -= 0x100; |
306 | 306 | result = 1; |
307 | 307 | } |
308 | 308 | |
309 | logerror("%s:PIC status %d\n", space | |
309 | logerror("%s:PIC status %d\n", space.machine().describe_context(), result); | |
310 | 310 | return result; |
311 | 311 | } |
312 | 312 | |
313 | 313 | |
314 | UINT8 midway_serial_pic2_r(address_space | |
314 | UINT8 midway_serial_pic2_r(address_space &space) | |
315 | 315 | { |
316 | 316 | UINT8 result = 0; |
317 | 317 | |
318 | 318 | /* PIC data register */ |
319 | logerror("%s:PIC data read (index=%d total=%d latch=%03X) =", space | |
319 | logerror("%s:PIC data read (index=%d total=%d latch=%03X) =", space.machine().describe_context(), pic.index, pic.total, pic.latch); | |
320 | 320 | |
321 | 321 | /* return the current result */ |
322 | 322 | if (pic.latch & 0xf00) |
r17963 | r17964 | |
331 | 331 | } |
332 | 332 | |
333 | 333 | |
334 | void midway_serial_pic2_w(address_space | |
334 | void midway_serial_pic2_w(address_space &space, UINT8 data) | |
335 | 335 | { |
336 | running_machine &machine = space | |
336 | running_machine &machine = space.machine(); | |
337 | 337 | static FILE *nvramlog; |
338 | 338 | if (LOG_NVRAM && !nvramlog) |
339 | 339 | nvramlog = fopen("nvram.log", "w"); |
r17963 | r17964 | |
862 | 862 | switch (offset) |
863 | 863 | { |
864 | 864 | case IOASIC_PORT0: |
865 | result = space | |
865 | result = space.machine().root_device().ioport("DIPS")->read(); | |
866 | 866 | /* bit 0 seems to be a ready flag before shuffling happens */ |
867 | 867 | if (!ioasic.shuffle_active) |
868 | 868 | { |
r17963 | r17964 | |
874 | 874 | break; |
875 | 875 | |
876 | 876 | case IOASIC_PORT1: |
877 | result = space | |
877 | result = space.machine().root_device().ioport("SYSTEM")->read(); | |
878 | 878 | break; |
879 | 879 | |
880 | 880 | case IOASIC_PORT2: |
881 | result = space | |
881 | result = space.machine().root_device().ioport("IN1")->read(); | |
882 | 882 | break; |
883 | 883 | |
884 | 884 | case IOASIC_PORT3: |
885 | result = space | |
885 | result = space.machine().root_device().ioport("IN2")->read(); | |
886 | 886 | break; |
887 | 887 | |
888 | 888 | case IOASIC_UARTIN: |
r17963 | r17964 | |
894 | 894 | result = 0; |
895 | 895 | if (ioasic.has_dcs) |
896 | 896 | { |
897 | result |= ((dcs_control_r(space->machine()) >> 4) ^ 0x40) & 0x00c0; | |
898 | result |= ioasic_fifo_status_r(&space->device()) & 0x0038; | |
899 | result |= dcs_data2_r(space->machine()) & 0xff00; | |
897 | result |= ((dcs_control_r(space.machine()) >> 4) ^ 0x40) & 0x00c0; | |
898 | result |= ioasic_fifo_status_r(&space.device()) & 0x0038; | |
899 | result |= dcs_data2_r(space.machine()) & 0xff00; | |
900 | 900 | } |
901 | 901 | else if (ioasic.has_cage) |
902 | 902 | { |
903 | result |= (cage_control_r(space | |
903 | result |= (cage_control_r(space.machine()) << 6) ^ 0x80; | |
904 | 904 | } |
905 | 905 | else |
906 | 906 | result |= 0x48; |
r17963 | r17964 | |
910 | 910 | result = 0; |
911 | 911 | if (ioasic.has_dcs) |
912 | 912 | { |
913 | result = dcs_data_r(space | |
913 | result = dcs_data_r(space.machine()); | |
914 | 914 | if (ioasic.auto_ack) |
915 | dcs_ack_w(space | |
915 | dcs_ack_w(space.machine()); | |
916 | 916 | } |
917 | 917 | else if (ioasic.has_cage) |
918 | 918 | result = cage_main_r(space); |
r17963 | r17964 | |
932 | 932 | } |
933 | 933 | |
934 | 934 | if (LOG_IOASIC && offset != IOASIC_SOUNDSTAT && offset != IOASIC_SOUNDIN) |
935 | logerror("%06X:ioasic_r(%d) = %08X\n", space | |
935 | logerror("%06X:ioasic_r(%d) = %08X\n", space.device().safe_pc(), offset, result); | |
936 | 936 | |
937 | 937 | return result; |
938 | 938 | } |
r17963 | r17964 | |
957 | 957 | newreg = ioasic.reg[offset]; |
958 | 958 | |
959 | 959 | if (LOG_IOASIC && offset != IOASIC_SOUNDOUT) |
960 | logerror("%06X:ioasic_w(%d) = %08X\n", space | |
960 | logerror("%06X:ioasic_w(%d) = %08X\n", space.device().safe_pc(), offset, data); | |
961 | 961 | |
962 | 962 | switch (offset) |
963 | 963 | { |
r17963 | r17964 | |
984 | 984 | { |
985 | 985 | /* we're in loopback mode -- copy to the input */ |
986 | 986 | ioasic.reg[IOASIC_UARTIN] = (newreg & 0x00ff) | 0x1000; |
987 | update_ioasic_irq(space | |
987 | update_ioasic_irq(space.machine()); | |
988 | 988 | } |
989 | 989 | else if (PRINTF_DEBUG) |
990 | 990 | mame_printf_debug("%c", data & 0xff); |
r17963 | r17964 | |
994 | 994 | /* sound reset? */ |
995 | 995 | if (ioasic.has_dcs) |
996 | 996 | { |
997 | dcs_reset_w(space | |
997 | dcs_reset_w(space.machine(), ~newreg & 1); | |
998 | 998 | } |
999 | 999 | else if (ioasic.has_cage) |
1000 | 1000 | { |
1001 | 1001 | if ((oldreg ^ newreg) & 1) |
1002 | 1002 | { |
1003 | cage_control_w(space | |
1003 | cage_control_w(space.machine(), 0); | |
1004 | 1004 | if (!(~newreg & 1)) |
1005 | cage_control_w(space | |
1005 | cage_control_w(space.machine(), 3); | |
1006 | 1006 | } |
1007 | 1007 | } |
1008 | 1008 | |
1009 | 1009 | /* FIFO reset? */ |
1010 | midway_ioasic_fifo_reset_w(space | |
1010 | midway_ioasic_fifo_reset_w(space.machine(), ~newreg & 4); | |
1011 | 1011 | break; |
1012 | 1012 | |
1013 | 1013 | case IOASIC_SOUNDOUT: |
1014 | 1014 | if (ioasic.has_dcs) |
1015 | dcs_data_w(space | |
1015 | dcs_data_w(space.machine(), newreg); | |
1016 | 1016 | else if (ioasic.has_cage) |
1017 | 1017 | cage_main_w(space, newreg); |
1018 | 1018 | break; |
1019 | 1019 | |
1020 | 1020 | case IOASIC_SOUNDIN: |
1021 | dcs_ack_w(space | |
1021 | dcs_ack_w(space.machine()); | |
1022 | 1022 | /* acknowledge data read */ |
1023 | 1023 | break; |
1024 | 1024 | |
r17963 | r17964 | |
1040 | 1040 | /* bit 14 = LED? */ |
1041 | 1041 | if ((oldreg ^ newreg) & 0x3ff6) |
1042 | 1042 | logerror("IOASIC int control = %04X\n", data); |
1043 | update_ioasic_irq(space | |
1043 | update_ioasic_irq(space.machine()); | |
1044 | 1044 | break; |
1045 | 1045 | |
1046 | 1046 | default: |
r17963 | r17964 | |
---|---|---|
376 | 376 | |
377 | 377 | WRITE16_HANDLER( bonzeadv_cchip_bank_w ) |
378 | 378 | { |
379 | asuka_state *state = space | |
379 | asuka_state *state = space.machine().driver_data<asuka_state>(); | |
380 | 380 | state->m_current_bank = data & 7; |
381 | 381 | } |
382 | 382 | |
383 | 383 | WRITE16_HANDLER( bonzeadv_cchip_ram_w ) |
384 | 384 | { |
385 | asuka_state *state = space | |
385 | asuka_state *state = space.machine().driver_data<asuka_state>(); | |
386 | 386 | |
387 | // if (space->device().safe_pc()!=0xa028) | |
388 | // logerror("%08x: write %04x %04x cchip\n", space->device().safe_pc(), offset, data); | |
387 | // if (space.device().safe_pc()!=0xa028) | |
388 | // logerror("%08x: write %04x %04x cchip\n", space.device().safe_pc(), offset, data); | |
389 | 389 | |
390 | 390 | if (state->m_current_bank == 0) |
391 | 391 | { |
r17963 | r17964 | |
393 | 393 | { |
394 | 394 | state->m_cc_port = data; |
395 | 395 | |
396 | coin_lockout_w(space->machine(), 1, data & 0x80); | |
397 | coin_lockout_w(space->machine(), 0, data & 0x40); | |
398 | coin_counter_w(space->machine(), 1, data & 0x20); | |
399 | coin_counter_w(space->machine(), 0, data & 0x10); | |
396 | coin_lockout_w(space.machine(), 1, data & 0x80); | |
397 | coin_lockout_w(space.machine(), 0, data & 0x40); | |
398 | coin_counter_w(space.machine(), 1, data & 0x20); | |
399 | coin_counter_w(space.machine(), 0, data & 0x10); | |
400 | 400 | } |
401 | 401 | |
402 | 402 | if (offset == 0x0e && data != 0x00) |
403 | 403 | { |
404 | WriteRestartPos(space | |
404 | WriteRestartPos(space.machine(), state->m_current_round); | |
405 | 405 | } |
406 | 406 | |
407 | 407 | if (offset == 0x0f && data != 0x00) |
408 | 408 | { |
409 | WriteLevelData(space | |
409 | WriteLevelData(space.machine()); | |
410 | 410 | } |
411 | 411 | |
412 | 412 | if (offset == 0x10) |
r17963 | r17964 | |
438 | 438 | |
439 | 439 | READ16_HANDLER( bonzeadv_cchip_ram_r ) |
440 | 440 | { |
441 | asuka_state *state = space | |
441 | asuka_state *state = space.machine().driver_data<asuka_state>(); | |
442 | 442 | |
443 | // logerror("%08x: read %04x cchip\n", space | |
443 | // logerror("%08x: read %04x cchip\n", space.device().safe_pc(), offset); | |
444 | 444 | |
445 | 445 | if (state->m_current_bank == 0) |
446 | 446 | { |
r17963 | r17964 | |
---|---|---|
9 | 9 | void midway_serial_pic_init(running_machine &machine, int upper); |
10 | 10 | void midway_serial_pic_reset_w(int state); |
11 | 11 | UINT8 midway_serial_pic_status_r(void); |
12 | UINT8 midway_serial_pic_r(address_space *space); | |
13 | void midway_serial_pic_w(address_space *space, UINT8 data); | |
12 | UINT8 midway_serial_pic_r(address_space &space); | |
13 | void midway_serial_pic_w(address_space &space, UINT8 data); | |
14 | 14 | |
15 | 15 | |
16 | 16 | /* 2nd generation Midway serial/NVRAM/RTC PIC */ |
17 | 17 | void midway_serial_pic2_init(running_machine &machine, int upper, int yearoffs); |
18 | 18 | void midway_serial_pic2_set_default_nvram(const UINT8 *nvram); |
19 | UINT8 midway_serial_pic2_status_r(address_space *space); | |
20 | UINT8 midway_serial_pic2_r(address_space *space); | |
21 | void midway_serial_pic2_w(address_space *space, UINT8 data); | |
19 | UINT8 midway_serial_pic2_status_r(address_space &space); | |
20 | UINT8 midway_serial_pic2_r(address_space &space); | |
21 | void midway_serial_pic2_w(address_space &space, UINT8 data); | |
22 | 22 | NVRAM_HANDLER( midway_serial_pic2 ); |
23 | 23 | |
24 | 24 |
r17963 | r17964 | |
---|---|---|
128 | 128 | dc_update_interrupt_status(machine); |
129 | 129 | } |
130 | 130 | |
131 | static void wave_dma_execute(address_space | |
131 | static void wave_dma_execute(address_space &space) | |
132 | 132 | { |
133 | dc_state *state = space | |
133 | dc_state *state = space.machine().driver_data<dc_state>(); | |
134 | 134 | |
135 | 135 | UINT32 src,dst,size; |
136 | 136 | dst = state->m_wave_dma.aica_addr; |
r17963 | r17964 | |
144 | 144 | { |
145 | 145 | for(;size<state->m_wave_dma.size;size+=4) |
146 | 146 | { |
147 | space | |
147 | space.write_dword(dst,space.read_dword(src)); | |
148 | 148 | src+=4; |
149 | 149 | dst+=4; |
150 | 150 | } |
r17963 | r17964 | |
153 | 153 | { |
154 | 154 | for(;size<state->m_wave_dma.size;size+=4) |
155 | 155 | { |
156 | space | |
156 | space.write_dword(src,space.read_dword(dst)); | |
157 | 157 | src+=4; |
158 | 158 | dst+=4; |
159 | 159 | } |
r17963 | r17964 | |
166 | 166 | state->m_wave_dma.flag = (state->m_wave_dma.indirect & 1) ? 1 : 0; |
167 | 167 | /* Note: if you trigger an instant DMA IRQ trigger, sfz3upper doesn't play any bgm. */ |
168 | 168 | /* TODO: timing of this */ |
169 | space | |
169 | space.machine().scheduler().timer_set(attotime::from_usec(300), FUNC(aica_dma_irq)); | |
170 | 170 | } |
171 | 171 | |
172 | static void pvr_dma_execute(address_space | |
172 | static void pvr_dma_execute(address_space &space) | |
173 | 173 | { |
174 | dc_state *state = space | |
174 | dc_state *state = space.machine().driver_data<dc_state>(); | |
175 | 175 | |
176 | 176 | UINT32 src,dst,size; |
177 | 177 | dst = state->m_pvr_dma.pvr_addr; |
r17963 | r17964 | |
190 | 190 | { |
191 | 191 | for(;size<state->m_pvr_dma.size;size+=4) |
192 | 192 | { |
193 | space | |
193 | space.write_dword(dst,space.read_dword(src)); | |
194 | 194 | src+=4; |
195 | 195 | dst+=4; |
196 | 196 | } |
r17963 | r17964 | |
199 | 199 | { |
200 | 200 | for(;size<state->m_pvr_dma.size;size+=4) |
201 | 201 | { |
202 | space | |
202 | space.write_dword(src,space.read_dword(dst)); | |
203 | 203 | src+=4; |
204 | 204 | dst+=4; |
205 | 205 | } |
206 | 206 | } |
207 | 207 | /* Note: do not update the params, since this DMA type doesn't support it. */ |
208 | 208 | /* TODO: timing of this */ |
209 | space | |
209 | space.machine().scheduler().timer_set(attotime::from_usec(250), FUNC(pvr_dma_irq)); | |
210 | 210 | } |
211 | 211 | |
212 | 212 | // register decode helpers |
r17963 | r17964 | |
321 | 321 | { |
322 | 322 | if((state->dc_sysctrl_regs[SB_G2DTNRM] & state->dc_sysctrl_regs[SB_ISTNRM]) || (state->dc_sysctrl_regs[SB_G2DTEXT] & state->dc_sysctrl_regs[SB_ISTEXT])) |
323 | 323 | { |
324 | address_space | |
324 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
325 | 325 | |
326 | 326 | printf("Wave DMA HW trigger\n"); |
327 | 327 | wave_dma_execute(space); |
r17963 | r17964 | |
333 | 333 | { |
334 | 334 | if((state->dc_sysctrl_regs[SB_PDTNRM] & state->dc_sysctrl_regs[SB_ISTNRM]) || (state->dc_sysctrl_regs[SB_PDTEXT] & state->dc_sysctrl_regs[SB_ISTEXT])) |
335 | 335 | { |
336 | address_space | |
336 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
337 | 337 | |
338 | 338 | printf("PVR-DMA HW trigger\n"); |
339 | 339 | pvr_dma_execute(space); |
r17963 | r17964 | |
343 | 343 | |
344 | 344 | READ64_HANDLER( dc_sysctrl_r ) |
345 | 345 | { |
346 | dc_state *state = space | |
346 | dc_state *state = space.machine().driver_data<dc_state>(); | |
347 | 347 | |
348 | 348 | int reg; |
349 | 349 | UINT64 shift; |
350 | 350 | |
351 | reg = decode_reg32_64(space | |
351 | reg = decode_reg32_64(space.machine(), offset, mem_mask, &shift); | |
352 | 352 | |
353 | 353 | #if DEBUG_SYSCTRL |
354 | 354 | if ((reg != 0x40) && (reg != 0x41) && (reg != 0x42) && (reg != 0x23) && (reg > 2)) // filter out IRQ status reads |
355 | 355 | { |
356 | mame_printf_verbose("SYSCTRL: [%08x] read %x @ %x (reg %x: %s), mask %" I64FMT "x (PC=%x)\n", 0x5f6800+reg*4, state->dc_sysctrl_regs[reg], offset, reg, sysctrl_names[reg], mem_mask, space | |
356 | mame_printf_verbose("SYSCTRL: [%08x] read %x @ %x (reg %x: %s), mask %" I64FMT "x (PC=%x)\n", 0x5f6800+reg*4, state->dc_sysctrl_regs[reg], offset, reg, sysctrl_names[reg], mem_mask, space.device().safe_pc()); | |
357 | 357 | } |
358 | 358 | #endif |
359 | 359 | |
r17963 | r17964 | |
362 | 362 | |
363 | 363 | WRITE64_HANDLER( dc_sysctrl_w ) |
364 | 364 | { |
365 | dc_state *state = space | |
365 | dc_state *state = space.machine().driver_data<dc_state>(); | |
366 | 366 | |
367 | 367 | int reg; |
368 | 368 | UINT64 shift; |
r17963 | r17964 | |
370 | 370 | UINT32 address; |
371 | 371 | struct sh4_ddt_dma ddtdata; |
372 | 372 | |
373 | reg = decode_reg32_64(space | |
373 | reg = decode_reg32_64(space.machine(), offset, mem_mask, &shift); | |
374 | 374 | dat = (UINT32)(data >> shift); |
375 | 375 | old = state->dc_sysctrl_regs[reg]; |
376 | 376 | state->dc_sysctrl_regs[reg] = dat; // 5f6800+off*4=dat |
r17963 | r17964 | |
393 | 393 | ddtdata.direction=0; |
394 | 394 | ddtdata.channel=2; |
395 | 395 | ddtdata.mode=25; //011001 |
396 | sh4_dma_ddt(space | |
396 | sh4_dma_ddt(space.machine().device("maincpu"),&ddtdata); | |
397 | 397 | #if DEBUG_SYSCTRL |
398 | 398 | if ((address >= 0x11000000) && (address <= 0x11FFFFFF)) |
399 | 399 | if (state->dc_sysctrl_regs[SB_LMMODE0]) |
r17963 | r17964 | |
419 | 419 | state->dc_sysctrl_regs[SB_C2DSTAT]=address+ddtdata.length; |
420 | 420 | |
421 | 421 | /* 200 usecs breaks sfz3upper */ |
422 | space | |
422 | space.machine().scheduler().timer_set(attotime::from_usec(50), FUNC(ch2_dma_irq)); | |
423 | 423 | /* simulate YUV FIFO processing here */ |
424 | 424 | if((address & 0x1800000) == 0x0800000) |
425 | space | |
425 | space.machine().scheduler().timer_set(attotime::from_usec(500), FUNC(yuv_fifo_irq)); | |
426 | 426 | } |
427 | 427 | break; |
428 | 428 | |
429 | 429 | case SB_ISTNRM: |
430 | 430 | state->dc_sysctrl_regs[SB_ISTNRM] = old & ~(dat | 0xC0000000); // bits 31,30 ro |
431 | dc_update_interrupt_status(space | |
431 | dc_update_interrupt_status(space.machine()); | |
432 | 432 | break; |
433 | 433 | |
434 | 434 | case SB_ISTEXT: |
435 | 435 | state->dc_sysctrl_regs[SB_ISTEXT] = old; |
436 | dc_update_interrupt_status(space | |
436 | dc_update_interrupt_status(space.machine()); | |
437 | 437 | break; |
438 | 438 | |
439 | 439 | case SB_ISTERR: |
440 | 440 | state->dc_sysctrl_regs[SB_ISTERR] = old & ~dat; |
441 | dc_update_interrupt_status(space | |
441 | dc_update_interrupt_status(space.machine()); | |
442 | 442 | break; |
443 | 443 | case SB_SDST: |
444 | 444 | if(dat & 1) |
r17963 | r17964 | |
448 | 448 | |
449 | 449 | state->dc_sysctrl_regs[SB_SDST] = 0; |
450 | 450 | state->dc_sysctrl_regs[SB_ISTNRM] |= IST_DMA_SORT; |
451 | dc_update_interrupt_status(space | |
451 | dc_update_interrupt_status(space.machine()); | |
452 | 452 | } |
453 | 453 | break; |
454 | 454 | } |
r17963 | r17964 | |
463 | 463 | |
464 | 464 | READ64_HANDLER( dc_gdrom_r ) |
465 | 465 | { |
466 | // dc_state *state = space | |
466 | // dc_state *state = space.machine().driver_data<dc_state>(); | |
467 | 467 | |
468 | 468 | UINT32 off; |
469 | 469 | |
r17963 | r17964 | |
486 | 486 | |
487 | 487 | WRITE64_HANDLER( dc_gdrom_w ) |
488 | 488 | { |
489 | // dc_state *state = space | |
489 | // dc_state *state = space.machine().driver_data<dc_state>(); | |
490 | 490 | UINT32 dat,off; |
491 | 491 | |
492 | 492 | if ((int)~mem_mask & 1) |
r17963 | r17964 | |
505 | 505 | |
506 | 506 | READ64_HANDLER( dc_g2_ctrl_r ) |
507 | 507 | { |
508 | dc_state *state = space | |
508 | dc_state *state = space.machine().driver_data<dc_state>(); | |
509 | 509 | int reg; |
510 | 510 | UINT64 shift; |
511 | 511 | |
512 | reg = decode_reg32_64(space | |
512 | reg = decode_reg32_64(space.machine(), offset, mem_mask, &shift); | |
513 | 513 | mame_printf_verbose("G2CTRL: Unmapped read %08x\n", 0x5f7800+reg*4); |
514 | 514 | return (UINT64)state->g2bus_regs[reg] << shift; |
515 | 515 | } |
516 | 516 | |
517 | 517 | WRITE64_HANDLER( dc_g2_ctrl_w ) |
518 | 518 | { |
519 | dc_state *state = space | |
519 | dc_state *state = space.machine().driver_data<dc_state>(); | |
520 | 520 | int reg; |
521 | 521 | UINT64 shift; |
522 | 522 | UINT32 dat; |
523 | 523 | UINT8 old; |
524 | 524 | |
525 | reg = decode_reg32_64(space | |
525 | reg = decode_reg32_64(space.machine(), offset, mem_mask, &shift); | |
526 | 526 | dat = (UINT32)(data >> shift); |
527 | 527 | |
528 | 528 | state->g2bus_regs[reg] = dat; // 5f7800+reg*4=dat |
r17963 | r17964 | |
608 | 608 | |
609 | 609 | READ64_HANDLER( pvr_ctrl_r ) |
610 | 610 | { |
611 | dc_state *state = space | |
611 | dc_state *state = space.machine().driver_data<dc_state>(); | |
612 | 612 | int reg; |
613 | 613 | UINT64 shift; |
614 | 614 | |
615 | 615 | reg = decode_reg_64(offset, mem_mask, &shift); |
616 | 616 | |
617 | 617 | #if DEBUG_PVRCTRL |
618 | mame_printf_verbose("PVRCTRL: [%08x] read %x @ %x (reg %x), mask %" I64FMT "x (PC=%x)\n", 0x5f7c00+reg*4, state->pvrctrl_regs[reg], offset, reg, mem_mask, space | |
618 | mame_printf_verbose("PVRCTRL: [%08x] read %x @ %x (reg %x), mask %" I64FMT "x (PC=%x)\n", 0x5f7c00+reg*4, state->pvrctrl_regs[reg], offset, reg, mem_mask, space.device().safe_pc()); | |
619 | 619 | #endif |
620 | 620 | |
621 | 621 | return (UINT64)state->pvrctrl_regs[reg] << shift; |
r17963 | r17964 | |
623 | 623 | |
624 | 624 | WRITE64_HANDLER( pvr_ctrl_w ) |
625 | 625 | { |
626 | dc_state *state = space | |
626 | dc_state *state = space.machine().driver_data<dc_state>(); | |
627 | 627 | int reg; |
628 | 628 | UINT64 shift; |
629 | 629 | UINT32 dat; |
r17963 | r17964 | |
664 | 664 | |
665 | 665 | READ64_HANDLER( dc_modem_r ) |
666 | 666 | { |
667 | // dc_state *state = space | |
667 | // dc_state *state = space.machine().driver_data<dc_state>(); | |
668 | 668 | int reg; |
669 | 669 | UINT64 shift; |
670 | 670 | |
671 | reg = decode_reg32_64(space | |
671 | reg = decode_reg32_64(space.machine(), offset, mem_mask, &shift); | |
672 | 672 | |
673 | 673 | // from ElSemi: this makes Atomiswave do it's "verbose boot" with a Sammy logo and diagnostics instead of just running the cart. |
674 | 674 | // our PVR emulation is apparently not good enough for that to work yet though. |
r17963 | r17964 | |
683 | 683 | |
684 | 684 | WRITE64_HANDLER( dc_modem_w ) |
685 | 685 | { |
686 | // dc_state *state = space | |
686 | // dc_state *state = space.machine().driver_data<dc_state>(); | |
687 | 687 | int reg; |
688 | 688 | UINT64 shift; |
689 | 689 | UINT32 dat; |
690 | 690 | |
691 | reg = decode_reg32_64(space | |
691 | reg = decode_reg32_64(space.machine(), offset, mem_mask, &shift); | |
692 | 692 | dat = (UINT32)(data >> shift); |
693 | 693 | mame_printf_verbose("MODEM: [%08x=%x] write %" I64FMT "x to %x, mask %" I64FMT "x\n", 0x600000+reg*4, dat, data, offset, mem_mask); |
694 | 694 | } |
695 | 695 | |
696 | 696 | READ64_HANDLER( dc_rtc_r ) |
697 | 697 | { |
698 | dc_state *state = space | |
698 | dc_state *state = space.machine().driver_data<dc_state>(); | |
699 | 699 | int reg; |
700 | 700 | UINT64 shift; |
701 | 701 | |
702 | reg = decode_reg3216_64(space | |
702 | reg = decode_reg3216_64(space.machine(), offset, mem_mask, &shift); | |
703 | 703 | mame_printf_verbose("RTC: Unmapped read %08x\n", 0x710000+reg*4); |
704 | 704 | |
705 | 705 | return (UINT64)state->dc_rtcregister[reg] << shift; |
r17963 | r17964 | |
707 | 707 | |
708 | 708 | WRITE64_HANDLER( dc_rtc_w ) |
709 | 709 | { |
710 | dc_state *state = space | |
710 | dc_state *state = space.machine().driver_data<dc_state>(); | |
711 | 711 | int reg; |
712 | 712 | UINT64 shift; |
713 | 713 | UINT32 old,dat; |
714 | 714 | |
715 | reg = decode_reg3216_64(space | |
715 | reg = decode_reg3216_64(space.machine(), offset, mem_mask, &shift); | |
716 | 716 | dat = (UINT32)(data >> shift); |
717 | 717 | old = state->dc_rtcregister[reg]; |
718 | 718 | state->dc_rtcregister[reg] = dat & 0xFFFF; // 5f6c00+off*4=dat |
r17963 | r17964 | |
---|---|---|
87 | 87 | |
88 | 88 | READ8_HANDLER( triplep_pip_r ) |
89 | 89 | { |
90 | logerror("PC %04x: triplep read port 2\n",space->device().safe_pc()); | |
91 | if (space->device().safe_pc() == 0x015a) return 0xff; | |
92 | else if (space->device().safe_pc() == 0x0886) return 0x05; | |
90 | logerror("PC %04x: triplep read port 2\n",space.device().safe_pc()); | |
91 | if (space.device().safe_pc() == 0x015a) return 0xff; | |
92 | else if (space.device().safe_pc() == 0x0886) return 0x05; | |
93 | 93 | else return 0; |
94 | 94 | } |
95 | 95 | |
96 | 96 | READ8_HANDLER( triplep_pap_r ) |
97 | 97 | { |
98 | logerror("PC %04x: triplep read port 3\n",space->device().safe_pc()); | |
99 | if (space->device().safe_pc() == 0x015d) return 0x04; | |
98 | logerror("PC %04x: triplep read port 3\n",space.device().safe_pc()); | |
99 | if (space.device().safe_pc() == 0x015d) return 0x04; | |
100 | 100 | else return 0; |
101 | 101 | } |
102 | 102 | |
r17963 | r17964 | |
115 | 115 | |
116 | 116 | static READ8_HANDLER( cavelon_banksw_r ) |
117 | 117 | { |
118 | scramble_state *state = space->machine().driver_data<scramble_state>(); | |
119 | cavelon_banksw(space->machine()); | |
118 | scramble_state *state = space.machine().driver_data<scramble_state>(); | |
119 | cavelon_banksw(space.machine()); | |
120 | 120 | |
121 | 121 | if ((offset >= 0x0100) && (offset <= 0x0103)) |
122 | return state->m_ppi8255_0->read( | |
122 | return state->m_ppi8255_0->read(space, offset - 0x0100); | |
123 | 123 | else if ((offset >= 0x0200) && (offset <= 0x0203)) |
124 | return state->m_ppi8255_1->read( | |
124 | return state->m_ppi8255_1->read(space, offset - 0x0200); | |
125 | 125 | |
126 | 126 | return 0xff; |
127 | 127 | } |
128 | 128 | |
129 | 129 | static WRITE8_HANDLER( cavelon_banksw_w ) |
130 | 130 | { |
131 | scramble_state *state = space->machine().driver_data<scramble_state>(); | |
132 | cavelon_banksw(space->machine()); | |
131 | scramble_state *state = space.machine().driver_data<scramble_state>(); | |
132 | cavelon_banksw(space.machine()); | |
133 | 133 | |
134 | 134 | if ((offset >= 0x0100) && (offset <= 0x0103)) |
135 | state->m_ppi8255_0->write( | |
135 | state->m_ppi8255_0->write(space, offset - 0x0100, data); | |
136 | 136 | else if ((offset >= 0x0200) && (offset <= 0x0203)) |
137 | state->m_ppi8255_1->write( | |
137 | state->m_ppi8255_1->write(space, offset - 0x0200, data); | |
138 | 138 | } |
139 | 139 | |
140 | 140 | |
141 | 141 | READ8_HANDLER( hunchbks_mirror_r ) |
142 | 142 | { |
143 | return space | |
143 | return space.read_byte(0x1000+offset); | |
144 | 144 | } |
145 | 145 | |
146 | 146 | WRITE8_HANDLER( hunchbks_mirror_w ) |
147 | 147 | { |
148 | space | |
148 | space.write_byte(0x1000+offset,data); | |
149 | 149 | } |
150 | 150 | |
151 | 151 |
r17963 | r17964 | |
---|---|---|
312 | 312 | static void execute_fdclist(running_machine &machine, int ref, int params, const char **param); |
313 | 313 | static void execute_fdcsearch(running_machine &machine, int ref, int params, const char **param); |
314 | 314 | |
315 | static fd1094_possibility *try_all_possibilities(address_space | |
315 | static fd1094_possibility *try_all_possibilities(address_space &space, int basepc, int offset, int length, UINT8 *instrbuffer, UINT8 *keybuffer, fd1094_possibility *possdata); | |
316 | 316 | static void tag_possibility(running_machine &machine, fd1094_possibility *possdata, UINT8 status); |
317 | 317 | |
318 | 318 | static void perform_constrained_search(running_machine &machine); |
r17963 | r17964 | |
322 | 322 | static UINT32 reconstruct_base_seed(int keybaseaddr, UINT32 startseed); |
323 | 323 | |
324 | 324 | static void build_optable(running_machine &machine); |
325 | static int validate_ea(address_space *space, UINT32 pc, UINT8 modereg, const UINT8 *parambase, UINT32 flags); | |
326 | static int validate_opcode(address_space *space, UINT32 pc, const UINT8 *opdata, int maxwords); | |
325 | static int validate_ea(address_space &space, UINT32 pc, UINT8 modereg, const UINT8 *parambase, UINT32 flags); | |
326 | static int validate_opcode(address_space &space, UINT32 pc, const UINT8 *opdata, int maxwords); | |
327 | 327 | |
328 | 328 | |
329 | 329 | |
r17963 | r17964 | |
464 | 464 | 0=no, 1=yes, 2=unlikely |
465 | 465 | -----------------------------------------------*/ |
466 | 466 | |
467 | INLINE int pc_is_valid(address_space | |
467 | INLINE int pc_is_valid(address_space &space, UINT32 pc, UINT32 flags) | |
468 | 468 | { |
469 | 469 | /* if we're odd or out of range, fail */ |
470 | 470 | if ((pc & 1) == 1) |
471 | 471 | return 0; |
472 | 472 | if (pc & 0xff000000) |
473 | 473 | return 0; |
474 | if (space | |
474 | if (space.direct().read_decrypted_ptr(pc) == NULL) | |
475 | 475 | return 0; |
476 | 476 | return 1; |
477 | 477 | } |
r17963 | r17964 | |
482 | 482 | valid? 0=no, 1=yes, 2=unlikely |
483 | 483 | -----------------------------------------------*/ |
484 | 484 | |
485 | INLINE int addr_is_valid(address_space | |
485 | INLINE int addr_is_valid(address_space &space, UINT32 addr, UINT32 flags) | |
486 | 486 | { |
487 | 487 | /* if this a JMP, the address is a PC */ |
488 | 488 | if (flags & OF_JMP) |
r17963 | r17964 | |
495 | 495 | return 0; |
496 | 496 | |
497 | 497 | /* if we're invalid, fail */ |
498 | if (strcmp(const_cast<address_space | |
498 | if (strcmp(const_cast<address_space &>(space)->get_handler_string(ROW_READ, addr), "segaic16_memory_mapper_lsb_r") == 0) | |
499 | 499 | return 2; |
500 | 500 | |
501 | 501 | return 1; |
r17963 | r17964 | |
747 | 747 | } |
748 | 748 | |
749 | 749 | /* try all possible decodings at the current pc */ |
750 | posscount = try_all_possibilities(device.memory().space(AS_PROGRAM), curpc, 0, 0, instrbuffer, keybuffer, posslist) - posslist; | |
750 | posscount = try_all_possibilities(*device.memory().space(AS_PROGRAM), curpc, 0, 0, instrbuffer, keybuffer, posslist) - posslist; | |
751 | 751 | if (keydirty) |
752 | 752 | fd1094_regenerate_key(device.machine()); |
753 | 753 | |
r17963 | r17964 | |
1075 | 1075 | |
1076 | 1076 | static void execute_fdsearch(running_machine &machine, int ref, int params, const char **param) |
1077 | 1077 | { |
1078 | address_space *space = debug_cpu_get_visible_cpu(machine)->memory().space(AS_PROGRAM); | |
1079 | int pc = space->device().safe_pc(); | |
1078 | address_space &space = *debug_cpu_get_visible_cpu(machine)->memory().space(AS_PROGRAM); | |
1079 | int pc = space.device().safe_pc(); | |
1080 | 1080 | int length, first = TRUE; |
1081 | 1081 | UINT8 instrdata[2]; |
1082 | 1082 | UINT16 decoded; |
r17963 | r17964 | |
1114 | 1114 | } |
1115 | 1115 | |
1116 | 1116 | /* set this as our current PC and run the instruction hook */ |
1117 | space->device().state().set_pc(pc); | |
1118 | if (instruction_hook(space->device(), pc)) | |
1117 | space.device().state().set_pc(pc); | |
1118 | if (instruction_hook(space.device(), pc)) | |
1119 | 1119 | break; |
1120 | 1120 | } |
1121 | 1121 | keystatus[pc/2] |= SEARCH_MASK; |
r17963 | r17964 | |
1201 | 1201 | |
1202 | 1202 | static void execute_fddasm(running_machine &machine, int ref, int params, const char **param) |
1203 | 1203 | { |
1204 | address_space | |
1204 | address_space &space = *debug_cpu_get_visible_cpu(machine)->memory().space(AS_PROGRAM); | |
1205 | 1205 | int origstate = fd1094_set_state(keyregion, -1); |
1206 | 1206 | const char *filename; |
1207 | 1207 | int skipped = FALSE; |
r17963 | r17964 | |
1406 | 1406 | length |
1407 | 1407 | -----------------------------------------------*/ |
1408 | 1408 | |
1409 | static fd1094_possibility *try_all_possibilities(address_space | |
1409 | static fd1094_possibility *try_all_possibilities(address_space &space, int basepc, int offset, int length, UINT8 *instrbuffer, UINT8 *keybuffer, fd1094_possibility *possdata) | |
1410 | 1410 | { |
1411 | 1411 | UINT8 keymask, keystat; |
1412 | 1412 | UINT16 possvalue[4]; |
r17963 | r17964 | |
2249 | 2249 | valid or not, and return the length |
2250 | 2250 | -----------------------------------------------*/ |
2251 | 2251 | |
2252 | static int validate_ea(address_space | |
2252 | static int validate_ea(address_space &space, UINT32 pc, UINT8 modereg, const UINT8 *parambase, UINT32 flags) | |
2253 | 2253 | { |
2254 | 2254 | UINT32 addr; |
2255 | 2255 | int valid; |
r17963 | r17964 | |
2319 | 2319 | the length specified |
2320 | 2320 | -----------------------------------------------*/ |
2321 | 2321 | |
2322 | static int validate_opcode(address_space | |
2322 | static int validate_opcode(address_space &space, UINT32 pc, const UINT8 *opdata, int maxwords) | |
2323 | 2323 | { |
2324 | 2324 | UINT32 immvalue = 0; |
2325 | 2325 | int iffy = FALSE; |
r17963 | r17964 | |
---|---|---|
334 | 334 | |
335 | 335 | READ16_MEMBER(midxunit_state::midxunit_security_r) |
336 | 336 | { |
337 | return midway_serial_pic_r( | |
337 | return midway_serial_pic_r(space); | |
338 | 338 | } |
339 | 339 | |
340 | 340 | WRITE16_MEMBER(midxunit_state::midxunit_security_w) |
r17963 | r17964 | |
347 | 347 | WRITE16_MEMBER(midxunit_state::midxunit_security_clock_w) |
348 | 348 | { |
349 | 349 | if (offset == 0 && ACCESSING_BITS_0_7) |
350 | midway_serial_pic_w( | |
350 | midway_serial_pic_w(space, ((~data & 2) << 3) | m_security_bits); | |
351 | 351 | } |
352 | 352 | |
353 | 353 |
r17963 | r17964 | |
---|---|---|
82 | 82 | |
83 | 83 | static READ8_HANDLER( namco_53xx_K_r ) |
84 | 84 | { |
85 | namco_53xx_state *state = get_safe_token(space | |
85 | namco_53xx_state *state = get_safe_token(space.device().owner()); | |
86 | 86 | return state->m_k(0); |
87 | 87 | } |
88 | 88 | |
89 | 89 | static READ8_HANDLER( namco_53xx_Rx_r ) |
90 | 90 | { |
91 | namco_53xx_state *state = get_safe_token(space | |
91 | namco_53xx_state *state = get_safe_token(space.device().owner()); | |
92 | 92 | return state->m_in[offset](0); |
93 | 93 | } |
94 | 94 | |
95 | 95 | static WRITE8_HANDLER( namco_53xx_O_w ) |
96 | 96 | { |
97 | namco_53xx_state *state = get_safe_token(space | |
97 | namco_53xx_state *state = get_safe_token(space.device().owner()); | |
98 | 98 | UINT8 out = (data & 0x0f); |
99 | 99 | if (data & 0x10) |
100 | 100 | state->m_portO = (state->m_portO & 0x0f) | (out << 4); |
r17963 | r17964 | |
104 | 104 | |
105 | 105 | static WRITE8_HANDLER( namco_53xx_P_w ) |
106 | 106 | { |
107 | namco_53xx_state *state = get_safe_token(space | |
107 | namco_53xx_state *state = get_safe_token(space.device().owner()); | |
108 | 108 | state->m_p(0, data); |
109 | 109 | } |
110 | 110 |
r17963 | r17964 | |
---|---|---|
38 | 38 | |
39 | 39 | DRIVER_INIT_MEMBER(stfight_state,empcity) |
40 | 40 | { |
41 | address_space | |
41 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
42 | 42 | UINT8 *rom = memregion("maincpu")->base(); |
43 | 43 | int A; |
44 | 44 | |
45 | 45 | m_decrypt = auto_alloc_array(machine(), UINT8, 0x8000); |
46 | space | |
46 | space.set_decrypted_region(0x0000, 0x7fff, m_decrypt); | |
47 | 47 | |
48 | 48 | for (A = 0;A < 0x8000;A++) |
49 | 49 | { |
r17963 | r17964 | |
82 | 82 | |
83 | 83 | void stfight_state::machine_reset() |
84 | 84 | { |
85 | address_space | |
85 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
86 | 86 | m_adpcm_data_offs = m_adpcm_data_end = 0; |
87 | 87 | m_toggle = 0; |
88 | 88 | m_fm_data = 0; |
r17963 | r17964 | |
93 | 93 | m_coin_mech_query = 0; |
94 | 94 | |
95 | 95 | // initialise rom bank |
96 | stfight_bank_w( | |
96 | stfight_bank_w(space, 0, 0 ); | |
97 | 97 | } |
98 | 98 | |
99 | 99 | // It's entirely possible that this bank is never switched out |
r17963 | r17964 | |
---|---|---|
32 | 32 | // if(dw2reg<0x20) //NOT SURE!! |
33 | 33 | { |
34 | 34 | //The value at 0x80EECE is computed in the routine at 0x107c18 |
35 | pgm_state *state = space | |
35 | pgm_state *state = space.machine().driver_data<pgm_state>(); | |
36 | 36 | UINT16 d = state->m_mainram[0xEECE/2]; |
37 | 37 | UINT16 d2 = 0; |
38 | 38 | d = (d >> 8) | (d << 8); |
r17963 | r17964 | |
---|---|---|
109 | 109 | return (sum + 1) % 7; // 1900-01-01 was a Monday |
110 | 110 | } |
111 | 111 | |
112 | static UINT8 srtc_read( address_space | |
112 | static UINT8 srtc_read( address_space &space, UINT16 addr ) | |
113 | 113 | { |
114 | 114 | addr &= 0xffff; |
115 | 115 | |
r17963 | r17964 | |
122 | 122 | |
123 | 123 | if (rtc_state.index < 0) |
124 | 124 | { |
125 | srtc_update_time(space | |
125 | srtc_update_time(space.machine()); | |
126 | 126 | rtc_state.index++; |
127 | 127 | return 0x0f; |
128 | 128 | } |
r17963 | r17964 | |
---|---|---|
122 | 122 | } |
123 | 123 | |
124 | 124 | /* 8741 update */ |
125 | static void taito8741_update(address_space | |
125 | static void taito8741_update(address_space &space, int num) | |
126 | 126 | { |
127 | 127 | I8741 *st,*sst; |
128 | 128 | int next = num; |
r17963 | r17964 | |
177 | 177 | else |
178 | 178 | { /* port select */ |
179 | 179 | st->parallelselect = data & 0x07; |
180 | taito8741_hostdata_w(st,st->portHandler ? st->portHandler(space,st->parallelselect) : st->portName ? space | |
180 | taito8741_hostdata_w(st,st->portHandler ? st->portHandler(space,st->parallelselect) : st->portName ? space.machine().root_device().ioport(st->portName)->read() : 0); | |
181 | 181 | } |
182 | 182 | } |
183 | 183 | } |
r17963 | r17964 | |
188 | 188 | case -1: /* no command data */ |
189 | 189 | break; |
190 | 190 | case 0x00: /* read from parallel port */ |
191 | taito8741_hostdata_w(st,st->portHandler ? st->portHandler(space,0) : st->portName ? space | |
191 | taito8741_hostdata_w(st,st->portHandler ? st->portHandler(space,0) : st->portName ? space.machine().root_device().ioport(st->portName)->read() : 0 ); | |
192 | 192 | break; |
193 | 193 | case 0x01: /* read receive buffer 0 */ |
194 | 194 | case 0x02: /* read receive buffer 1 */ |
r17963 | r17964 | |
201 | 201 | taito8741_hostdata_w(st,st->rxd[data-1]); |
202 | 202 | break; |
203 | 203 | case 0x08: /* latch received serial data */ |
204 | st->txd[0] = st->portHandler ? st->portHandler(space,0) : st->portName ? space | |
204 | st->txd[0] = st->portHandler ? st->portHandler(space,0) : st->portName ? space.machine().root_device().ioport(st->portName)->read() : 0; | |
205 | 205 | if( sst ) |
206 | 206 | { |
207 | space | |
207 | space.machine().scheduler().synchronize(FUNC(taito8741_serial_tx), num); | |
208 | 208 | st->serial_out = 0; |
209 | 209 | st->status |= 0x04; |
210 | 210 | st->phase = CMD_08; |
r17963 | r17964 | |
273 | 273 | } |
274 | 274 | |
275 | 275 | /* read status port */ |
276 | static int I8741_status_r(address_space | |
276 | static int I8741_status_r(address_space &space, int num) | |
277 | 277 | { |
278 | 278 | I8741 *st = &taito8741[num]; |
279 | 279 | taito8741_update(space, num); |
280 | LOG(("%s:8741-%d ST Read %02x\n",space | |
280 | LOG(("%s:8741-%d ST Read %02x\n",space.machine().describe_context(),num,st->status)); | |
281 | 281 | return st->status; |
282 | 282 | } |
283 | 283 | |
284 | 284 | /* read data port */ |
285 | static int I8741_data_r(address_space | |
285 | static int I8741_data_r(address_space &space, int num) | |
286 | 286 | { |
287 | 287 | I8741 *st = &taito8741[num]; |
288 | 288 | int ret = st->toData; |
289 | 289 | st->status &= 0xfe; |
290 | LOG(("%s:8741-%d DATA Read %02x\n",space | |
290 | LOG(("%s:8741-%d DATA Read %02x\n",space.machine().describe_context(),num,ret)); | |
291 | 291 | |
292 | 292 | /* update chip */ |
293 | 293 | taito8741_update(space, num); |
r17963 | r17964 | |
295 | 295 | switch( st->mode ) |
296 | 296 | { |
297 | 297 | case TAITO8741_PORT: /* parallel data */ |
298 | taito8741_hostdata_w(st,st->portHandler ? st->portHandler(space, st->parallelselect) : st->portName ? space | |
298 | taito8741_hostdata_w(st,st->portHandler ? st->portHandler(space, st->parallelselect) : st->portName ? space.machine().root_device().ioport(st->portName)->read() : 0); | |
299 | 299 | break; |
300 | 300 | } |
301 | 301 | return ret; |
302 | 302 | } |
303 | 303 | |
304 | 304 | /* Write data port */ |
305 | static void I8741_data_w(address_space | |
305 | static void I8741_data_w(address_space &space, int num, int data) | |
306 | 306 | { |
307 | 307 | I8741 *st = &taito8741[num]; |
308 | LOG(("%s:8741-%d DATA Write %02x\n",space | |
308 | LOG(("%s:8741-%d DATA Write %02x\n",space.machine().describe_context(),num,data)); | |
309 | 309 | st->fromData = data; |
310 | 310 | st->status |= 0x02; |
311 | 311 | /* update chip */ |
r17963 | r17964 | |
313 | 313 | } |
314 | 314 | |
315 | 315 | /* Write command port */ |
316 | static void I8741_command_w(address_space | |
316 | static void I8741_command_w(address_space &space, int num, int data) | |
317 | 317 | { |
318 | 318 | I8741 *st = &taito8741[num]; |
319 | LOG(("%s:8741-%d CMD Write %02x\n",space | |
319 | LOG(("%s:8741-%d CMD Write %02x\n",space.machine().describe_context(),num,data)); | |
320 | 320 | st->fromCmd = data; |
321 | 321 | st->status |= 0x04; |
322 | 322 | /* update chip */ |
r17963 | r17964 | |
444 | 444 | } |
445 | 445 | } |
446 | 446 | |
447 | static void josvolly_8741_w(address_space | |
447 | static void josvolly_8741_w(address_space &space, int num, int offset, int data) | |
448 | 448 | { |
449 | 449 | JV8741 *mcu = &i8741[num]; |
450 | 450 | |
451 | 451 | if(offset==1) |
452 | 452 | { |
453 | LOG(("%s:8741[%d] CW %02X\n", space | |
453 | LOG(("%s:8741[%d] CW %02X\n", space.machine().describe_context(), num, data)); | |
454 | 454 | |
455 | 455 | /* read pointer */ |
456 | 456 | mcu->cmd = data; |
r17963 | r17964 | |
472 | 472 | break; |
473 | 473 | case 2: |
474 | 474 | #if 1 |
475 | mcu->rxd = space | |
475 | mcu->rxd = space.machine().root_device().ioport("DSW2")->read(); | |
476 | 476 | mcu->sts |= 0x01; /* RD ready */ |
477 | 477 | #endif |
478 | 478 | break; |
r17963 | r17964 | |
488 | 488 | else |
489 | 489 | { |
490 | 490 | /* data */ |
491 | LOG(("%s:8741[%d] DW %02X\n", space | |
491 | LOG(("%s:8741[%d] DW %02X\n", space.machine().describe_context(), num, data)); | |
492 | 492 | |
493 | 493 | mcu->txd = data ^ 0x40; /* parity reverce ? */ |
494 | 494 | mcu->sts |= 0x02; /* TXD busy */ |
r17963 | r17964 | |
498 | 498 | { |
499 | 499 | if(josvolly_nmi_enable) |
500 | 500 | { |
501 | space | |
501 | space.machine().device("audiocpu")->execute().set_input_line(INPUT_LINE_NMI, PULSE_LINE); | |
502 | 502 | josvolly_nmi_enable = 0; |
503 | 503 | } |
504 | 504 | } |
505 | 505 | #endif |
506 | 506 | } |
507 | josvolly_8741_do(space | |
507 | josvolly_8741_do(space.machine(), num); | |
508 | 508 | } |
509 | 509 | |
510 | static INT8 josvolly_8741_r(address_space | |
510 | static INT8 josvolly_8741_r(address_space &space,int num,int offset) | |
511 | 511 | { |
512 | 512 | JV8741 *mcu = &i8741[num]; |
513 | 513 | int ret; |
r17963 | r17964 | |
515 | 515 | if(offset==1) |
516 | 516 | { |
517 | 517 | if(mcu->rst) |
518 | mcu->rxd = space | |
518 | mcu->rxd = space.machine().root_device().ioport(mcu->initReadPort)->read(); /* port in */ | |
519 | 519 | ret = mcu->sts; |
520 | LOG(("%s:8741[%d] SR %02X\n",space | |
520 | LOG(("%s:8741[%d] SR %02X\n",space.machine().describe_context(),num,ret)); | |
521 | 521 | } |
522 | 522 | else |
523 | 523 | { |
524 | 524 | /* clear status port */ |
525 | 525 | mcu->sts &= ~0x01; /* RD ready */ |
526 | 526 | ret = mcu->rxd; |
527 | LOG(("%s:8741[%d] DR %02X\n",space | |
527 | LOG(("%s:8741[%d] DR %02X\n",space.machine().describe_context(),num,ret)); | |
528 | 528 | mcu->rst = 0; |
529 | 529 | } |
530 | 530 | return ret; |
r17963 | r17964 | |
---|---|---|
108 | 108 | count = (cx4.reg[0x43]) | (cx4.reg[0x44] << 8); |
109 | 109 | dest = (cx4.reg[0x45]) | (cx4.reg[0x46] << 8); |
110 | 110 | |
111 | address_space | |
111 | address_space &space = *machine.device<cpu_device>("maincpu")->space(AS_PROGRAM); | |
112 | 112 | for(i=0;i<count;i++) |
113 | 113 | { |
114 | CX4_write(machine, dest++, space | |
114 | CX4_write(machine, dest++, space.read_byte(src++)); | |
115 | 115 | } |
116 | 116 | } |
117 | 117 |
r17963 | r17964 | |
---|---|---|
50 | 50 | void deco102_decrypt_cpu(running_machine &machine, const char *cputag, int address_xor, int data_select_xor, int opcode_select_xor) |
51 | 51 | { |
52 | 52 | int i; |
53 | address_space | |
53 | address_space &space = *machine.device(cputag)->memory().space(AS_PROGRAM); | |
54 | 54 | UINT16 *rom = (UINT16 *)machine.root_device().memregion(cputag)->base(); |
55 | 55 | int size = machine.root_device().memregion(cputag)->bytes(); |
56 | 56 | UINT16 *opcodes = auto_alloc_array(machine, UINT16, size / 2); |
r17963 | r17964 | |
58 | 58 | |
59 | 59 | memcpy(buf, rom, size); |
60 | 60 | |
61 | space | |
61 | space.set_decrypted_region(0, size - 1, opcodes); | |
62 | 62 | m68k_set_encrypted_opcode_range(machine.device(cputag), 0, size); |
63 | 63 | |
64 | 64 | for (i = 0; i < size / 2; i++) |
r17963 | r17964 | |
---|---|---|
27 | 27 | /* todo: how many input ports does the PCE have? */ |
28 | 28 | WRITE8_HANDLER ( pce_joystick_w ) |
29 | 29 | { |
30 | h6280io_set_buffer(&space | |
30 | h6280io_set_buffer(&space.device(), data); | |
31 | 31 | /* bump counter on a low-to-high transition of bit 1 */ |
32 | 32 | if((!joystick_data_select) && (data & JOY_CLOCK)) |
33 | 33 | { |
r17963 | r17964 | |
51 | 51 | |
52 | 52 | if ( pce_joystick_readinputport_callback != NULL ) |
53 | 53 | { |
54 | data = pce_joystick_readinputport_callback(space | |
54 | data = pce_joystick_readinputport_callback(space.machine()); | |
55 | 55 | } |
56 | 56 | else |
57 | 57 | { |
58 | data = space | |
58 | data = space.machine().root_device().ioport("JOY")->read(); | |
59 | 59 | } |
60 | 60 | if(joystick_data_select) data >>= 4; |
61 | 61 | ret = (data & 0x0F) | pce.io_port_options; |
r17963 | r17964 | |
---|---|---|
206 | 206 | |
207 | 207 | READ8_HANDLER( theglobp_decrypt_rom ) |
208 | 208 | { |
209 | pacman_state *state = space | |
209 | pacman_state *state = space.machine().driver_data<pacman_state>(); | |
210 | 210 | if (offset & 0x01) |
211 | 211 | { |
212 | 212 | state->m_counter = (state->m_counter - 1) & 0x0F; |
r17963 | r17964 | |
---|---|---|
31 | 31 | /* -- Globals -- */ |
32 | 32 | UINT8 *snes_ram = NULL; /* 65816 ram */ |
33 | 33 | |
34 | static void snes_dma(address_space *space, UINT8 channels); | |
35 | static void snes_hdma_init(address_space *space); | |
36 | static void snes_hdma(address_space *space); | |
34 | static void snes_dma(address_space &space, UINT8 channels); | |
35 | static void snes_hdma_init(address_space &space); | |
36 | static void snes_hdma(address_space &space); | |
37 | 37 | |
38 | 38 | static READ8_HANDLER(snes_io_dma_r); |
39 | 39 | static WRITE8_HANDLER(snes_io_dma_w); |
r17963 | r17964 | |
135 | 135 | { |
136 | 136 | snes_state *state = machine.driver_data<snes_state>(); |
137 | 137 | // make sure we're in the 65816's context since we're messing with the OAM and stuff |
138 | address_space | |
138 | address_space &space = *state->m_maincpu->space(AS_PROGRAM); | |
139 | 139 | |
140 | 140 | if (!(snes_ppu.screen_disabled)) //Reset OAM address, byuu says it happens at H=10 |
141 | 141 | { |
142 | space->write_byte(OAMADDL, snes_ppu.oam.saved_address_low); /* Reset oam address */ | |
143 | space->write_byte(OAMADDH, snes_ppu.oam.saved_address_high); | |
142 | space.write_byte(OAMADDL, snes_ppu.oam.saved_address_low); /* Reset oam address */ | |
143 | space.write_byte(OAMADDH, snes_ppu.oam.saved_address_high); | |
144 | 144 | snes_ppu.oam.first_sprite = snes_ppu.oam.priority_rotation ? (snes_ppu.oam.address >> 1) & 127 : 0; |
145 | 145 | } |
146 | 146 | } |
r17963 | r17964 | |
148 | 148 | static TIMER_CALLBACK( snes_reset_hdma ) |
149 | 149 | { |
150 | 150 | snes_state *state = machine.driver_data<snes_state>(); |
151 | address_space | |
151 | address_space &cpu0space = *state->m_maincpu->space(AS_PROGRAM); | |
152 | 152 | snes_hdma_init(cpu0space); |
153 | 153 | } |
154 | 154 | |
r17963 | r17964 | |
233 | 233 | // hdma reset happens at scanline 0, H=~6 |
234 | 234 | if (snes_ppu.beam.current_vert == 0) |
235 | 235 | { |
236 | address_space | |
236 | address_space &cpu0space = *state->m_maincpu->space(AS_PROGRAM); | |
237 | 237 | snes_hdma_init(cpu0space); |
238 | 238 | } |
239 | 239 | |
r17963 | r17964 | |
257 | 257 | static TIMER_CALLBACK( snes_hblank_tick ) |
258 | 258 | { |
259 | 259 | snes_state *state = machine.driver_data<snes_state>(); |
260 | address_space | |
260 | address_space &cpu0space = *state->m_maincpu->space(AS_PROGRAM); | |
261 | 261 | int nextscan; |
262 | 262 | |
263 | 263 | snes_ppu.beam.current_vert = machine.primary_screen->vpos(); |
r17963 | r17964 | |
308 | 308 | return 0xff; |
309 | 309 | |
310 | 310 | recurse = 1; |
311 | result = space | |
311 | result = space.read_byte(space.device().safe_pc() - 1); //LAST opcode that's fetched on the bus | |
312 | 312 | recurse = 0; |
313 | 313 | return result; |
314 | 314 | } |
r17963 | r17964 | |
316 | 316 | /* read & write to DMA addresses are defined separately, to be called by snessdd1 handlers */ |
317 | 317 | static READ8_HANDLER( snes_io_dma_r ) |
318 | 318 | { |
319 | snes_state *state = space | |
319 | snes_state *state = space.machine().driver_data<snes_state>(); | |
320 | 320 | |
321 | 321 | switch (offset) |
322 | 322 | { |
r17963 | r17964 | |
364 | 364 | |
365 | 365 | static WRITE8_HANDLER( snes_io_dma_w ) |
366 | 366 | { |
367 | snes_state *state = space | |
367 | snes_state *state = space.machine().driver_data<snes_state>(); | |
368 | 368 | |
369 | 369 | switch (offset) |
370 | 370 | { |
r17963 | r17964 | |
430 | 430 | */ |
431 | 431 | READ8_HANDLER( snes_r_io ) |
432 | 432 | { |
433 | snes_state *state = space | |
433 | snes_state *state = space.machine().driver_data<snes_state>(); | |
434 | 434 | UINT8 value = 0; |
435 | 435 | |
436 | 436 | // PPU accesses are from 2100 to 213f |
r17963 | r17964 | |
442 | 442 | // APU is mirrored from 2140 to 217f |
443 | 443 | if (offset >= APU00 && offset < WMDATA) |
444 | 444 | { |
445 | return spc_port_out(state->m_spc700, | |
445 | return spc_port_out(state->m_spc700, space, offset & 0x3); | |
446 | 446 | } |
447 | 447 | |
448 | 448 | if (state->m_has_addon_chip == HAS_SUPERFX && state->m_superfx != NULL) |
r17963 | r17964 | |
488 | 488 | switch (offset) |
489 | 489 | { |
490 | 490 | case WMDATA: /* Data to read from WRAM */ |
491 | value = space | |
491 | value = space.read_byte(0x7e0000 + state->m_wram_address++); | |
492 | 492 | state->m_wram_address &= 0x1ffff; |
493 | 493 | return value; |
494 | 494 | case OLDJOY1: /* Data for old NES controllers (JOYSER1) */ |
495 | 495 | if (snes_ram[offset] & 0x1) |
496 | 496 | return 0 | (snes_open_bus_r(space, 0) & 0xfc); //correct? |
497 | 497 | |
498 | value = state->m_oldjoy1_read(space | |
498 | value = state->m_oldjoy1_read(space.machine()); | |
499 | 499 | |
500 | 500 | return (value & 0x03) | (snes_open_bus_r(space, 0) & 0xfc); //correct? |
501 | 501 | case OLDJOY2: /* Data for old NES controllers (JOYSER2) */ |
502 | 502 | if (snes_ram[OLDJOY1] & 0x1) |
503 | 503 | return 0 | 0x1c | (snes_open_bus_r(space, 0) & 0xe0); //correct? |
504 | 504 | |
505 | value = state->m_oldjoy2_read(space | |
505 | value = state->m_oldjoy2_read(space.machine()); | |
506 | 506 | |
507 | 507 | return value | 0x1c | (snes_open_bus_r(space, 0) & 0xe0); //correct? |
508 | 508 | case RDNMI: /* NMI flag by v-blank and version number */ |
r17963 | r17964 | |
516 | 516 | return value; |
517 | 517 | case HVBJOY: /* H/V blank and joypad controller enable */ |
518 | 518 | // electronics test says hcounter 272 is start of hblank, which is beampos 363 |
519 | // if (space | |
519 | // if (space.machine().primary_screen->hpos() >= 363) snes_ram[offset] |= 0x40; | |
520 | 520 | // else snes_ram[offset] &= ~0x40; |
521 | 521 | return (snes_ram[offset] & 0xc1) | (snes_open_bus_r(space, 0) & 0x3e); |
522 | 522 | case RDIO: /* Programmable I/O port - echos back what's written to WRIO */ |
r17963 | r17964 | |
565 | 565 | case 0x4100: /* NSS Dip-Switches */ |
566 | 566 | { |
567 | 567 | if (state->m_is_nss) |
568 | return space | |
568 | return space.machine().root_device().ioport("DSW")->read(); | |
569 | 569 | |
570 | 570 | return snes_open_bus_r(space, 0); |
571 | 571 | } |
572 | 572 | // case 0x4101: //PC: a104 - a10e - a12a //only nss_actr (DSW actually reads in word units ...) |
573 | 573 | |
574 | 574 | default: |
575 | // mame_printf_debug("snes_r: offset = %x pc = %x\n",offset,space | |
575 | // mame_printf_debug("snes_r: offset = %x pc = %x\n",offset,space.device().safe_pc()); | |
576 | 576 | // Added break; after commenting above line. If uncommenting, drop the break; |
577 | 577 | break; |
578 | 578 | } |
r17963 | r17964 | |
592 | 592 | */ |
593 | 593 | WRITE8_HANDLER( snes_w_io ) |
594 | 594 | { |
595 | snes_state *state = space | |
595 | snes_state *state = space.machine().driver_data<snes_state>(); | |
596 | 596 | |
597 | 597 | // PPU accesses are from 2100 to 213f |
598 | 598 | if (offset >= INIDISP && offset < APU00) |
r17963 | r17964 | |
605 | 605 | if (offset >= APU00 && offset < WMDATA) |
606 | 606 | { |
607 | 607 | // printf("816: %02x to APU @ %d (PC=%06x)\n", data, offset & 3,space->device().safe_pc()); |
608 | spc_port_in(state->m_spc700, *space, offset & 0x3, data); | |
609 | space->machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(20)); | |
608 | spc_port_in(state->m_spc700, space, offset & 0x3, data); | |
609 | space.machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(20)); | |
610 | 610 | return; |
611 | 611 | } |
612 | 612 | |
r17963 | r17964 | |
622 | 622 | { |
623 | 623 | if (offset == 0x2800 || offset == 0x2801) |
624 | 624 | { |
625 | srtc_write(space | |
625 | srtc_write(space.machine(), offset, data); | |
626 | 626 | return; |
627 | 627 | } |
628 | 628 | } |
r17963 | r17964 | |
644 | 644 | UINT16 limit = (state->m_has_addon_chip == HAS_SPC7110_RTC) ? 0x4842 : 0x483f; |
645 | 645 | if (offset >= 0x4800 && offset <= limit) |
646 | 646 | { |
647 | spc7110_mmio_write(space | |
647 | spc7110_mmio_write(space.machine(), (UINT32)offset, data); | |
648 | 648 | return; |
649 | 649 | } |
650 | 650 | } |
r17963 | r17964 | |
659 | 659 | switch (offset) |
660 | 660 | { |
661 | 661 | case WMDATA: /* Data to write to WRAM */ |
662 | space | |
662 | space.write_byte(0x7e0000 + state->m_wram_address++, data ); | |
663 | 663 | state->m_wram_address &= 0x1ffff; |
664 | 664 | return; |
665 | 665 | case WMADDL: /* Address to read/write to wram (low) */ |
r17963 | r17964 | |
698 | 698 | if (!(snes_ram[WRIO] & 0x80) && (data & 0x80)) |
699 | 699 | { |
700 | 700 | // external latch |
701 | snes_latch_counters(space | |
701 | snes_latch_counters(space.machine()); | |
702 | 702 | } |
703 | 703 | break; |
704 | 704 | case HTIMEL: /* H-Count timer settings (low) */ |
r17963 | r17964 | |
723 | 723 | break; |
724 | 724 | case HDMAEN: /* HDMA channel designation */ |
725 | 725 | if (data) //if a HDMA is enabled, data is inited at the next scanline |
726 | space | |
726 | space.machine().scheduler().timer_set(space.machine().primary_screen->time_until_pos(snes_ppu.beam.current_vert + 1), FUNC(snes_reset_hdma)); | |
727 | 727 | break; |
728 | 728 | case TIMEUP: // IRQ Flag is cleared on both read and write |
729 | 729 | state->m_maincpu->set_input_line(G65816_LINE_IRQ, CLEAR_LINE ); |
r17963 | r17964 | |
840 | 840 | /* 0x000000 - 0x2fffff */ |
841 | 841 | READ8_HANDLER( snes_r_bank1 ) |
842 | 842 | { |
843 | snes_state *state = space | |
843 | snes_state *state = space.machine().driver_data<snes_state>(); | |
844 | 844 | UINT8 value = 0xff; |
845 | 845 | UINT16 address = offset & 0xffff; |
846 | 846 | |
847 | 847 | if (address < 0x2000) /* Mirror of Low RAM */ |
848 | value = space | |
848 | value = space.read_byte(0x7e0000 + address); | |
849 | 849 | else if (address < 0x6000) /* I/O */ |
850 | 850 | { |
851 | 851 | if (state->m_cart[0].mode == SNES_MODE_BSX && address >= 0x5000) |
r17963 | r17964 | |
875 | 875 | } |
876 | 876 | else |
877 | 877 | { |
878 | logerror("(PC=%06x) snes_r_bank1: Unmapped external chip read: %04x\n",space | |
878 | logerror("(PC=%06x) snes_r_bank1: Unmapped external chip read: %04x\n",space.device().safe_pc(),address); | |
879 | 879 | value = snes_open_bus_r(space, 0); /* Reserved */ |
880 | 880 | } |
881 | 881 | } |
r17963 | r17964 | |
894 | 894 | /* 0x300000 - 0x3fffff */ |
895 | 895 | READ8_HANDLER( snes_r_bank2 ) |
896 | 896 | { |
897 | snes_state *state = space | |
897 | snes_state *state = space.machine().driver_data<snes_state>(); | |
898 | 898 | UINT8 value = 0xff; |
899 | 899 | UINT16 address = offset & 0xffff; |
900 | 900 | |
901 | 901 | if (address < 0x2000) /* Mirror of Low RAM */ |
902 | value = space | |
902 | value = space.read_byte(0x7e0000 + address); | |
903 | 903 | else if (address < 0x6000) /* I/O */ |
904 | 904 | { |
905 | 905 | if (state->m_cart[0].mode == SNES_MODE_BSX && address >= 0x5000) |
r17963 | r17964 | |
934 | 934 | } |
935 | 935 | else |
936 | 936 | { |
937 | logerror( "(PC=%06x) snes_r_bank2: Unmapped external chip read: %04x\n",space | |
937 | logerror( "(PC=%06x) snes_r_bank2: Unmapped external chip read: %04x\n",space.device().safe_pc(),address ); | |
938 | 938 | value = snes_open_bus_r(space, 0); |
939 | 939 | } |
940 | 940 | } |
r17963 | r17964 | |
956 | 956 | /* 0x400000 - 0x5fffff */ |
957 | 957 | READ8_HANDLER( snes_r_bank3 ) |
958 | 958 | { |
959 | snes_state *state = space | |
959 | snes_state *state = space.machine().driver_data<snes_state>(); | |
960 | 960 | UINT8 value = 0xff; |
961 | 961 | UINT16 address = offset & 0xffff; |
962 | 962 | |
r17963 | r17964 | |
994 | 994 | /* 0x600000 - 0x6fffff */ |
995 | 995 | READ8_HANDLER( snes_r_bank4 ) |
996 | 996 | { |
997 | snes_state *state = space | |
997 | snes_state *state = space.machine().driver_data<snes_state>(); | |
998 | 998 | UINT8 value = 0xff; |
999 | 999 | UINT16 address = offset & 0xffff; |
1000 | 1000 | |
r17963 | r17964 | |
1025 | 1025 | value = (address >= 0x4000) ? dsp_get_sr() : dsp_get_dr(); |
1026 | 1026 | else |
1027 | 1027 | { |
1028 | logerror("(PC=%06x) snes_r_bank4: Unmapped external chip read: %04x\n",space | |
1028 | logerror("(PC=%06x) snes_r_bank4: Unmapped external chip read: %04x\n",space.device().safe_pc(),address); | |
1029 | 1029 | value = snes_open_bus_r(space, 0); /* Reserved */ |
1030 | 1030 | } |
1031 | 1031 | } |
r17963 | r17964 | |
1038 | 1038 | /* 0x700000 - 0x7dffff */ |
1039 | 1039 | READ8_HANDLER( snes_r_bank5 ) |
1040 | 1040 | { |
1041 | snes_state *state = space | |
1041 | snes_state *state = space.machine().driver_data<snes_state>(); | |
1042 | 1042 | UINT8 value; |
1043 | 1043 | UINT16 address = offset & 0xffff; |
1044 | 1044 | |
r17963 | r17964 | |
1058 | 1058 | } |
1059 | 1059 | else |
1060 | 1060 | { |
1061 | logerror("(PC=%06x) snes_r_bank5: Unmapped external chip read: %04x\n",space | |
1061 | logerror("(PC=%06x) snes_r_bank5: Unmapped external chip read: %04x\n",space.device().safe_pc(),address); | |
1062 | 1062 | value = snes_open_bus_r(space, 0); /* Reserved */ |
1063 | 1063 | } |
1064 | 1064 | } |
r17963 | r17964 | |
1071 | 1071 | /* 0x800000 - 0xbfffff */ |
1072 | 1072 | READ8_HANDLER( snes_r_bank6 ) |
1073 | 1073 | { |
1074 | snes_state *state = space | |
1074 | snes_state *state = space.machine().driver_data<snes_state>(); | |
1075 | 1075 | UINT8 value = 0; |
1076 | 1076 | UINT16 address = offset & 0xffff; |
1077 | 1077 | |
1078 | 1078 | if (state->m_has_addon_chip == HAS_SUPERFX) |
1079 | value = space | |
1079 | value = space.read_byte(offset); | |
1080 | 1080 | else if (address < 0x8000) |
1081 | 1081 | { |
1082 | 1082 | if (state->m_cart[0].mode != SNES_MODE_25) |
1083 | value = space | |
1083 | value = space.read_byte(offset); | |
1084 | 1084 | else if ((state->m_has_addon_chip == HAS_CX4) && (address >= 0x6000)) |
1085 | 1085 | value = CX4_read(address - 0x6000); |
1086 | 1086 | else /* Mode 25 has SRAM not mirrored from lower banks */ |
1087 | 1087 | { |
1088 | 1088 | if (address < 0x6000) |
1089 | value = space | |
1089 | value = space.read_byte(offset); | |
1090 | 1090 | else if ((offset >= 0x300000) && (state->m_cart[0].sram > 0)) |
1091 | 1091 | { |
1092 | 1092 | int mask = (state->m_cart[0].sram - 1) | 0xff0000; /* Limit SRAM size to what's actually present */ |
r17963 | r17964 | |
1094 | 1094 | } |
1095 | 1095 | else /* Area 0x6000-0x8000 with offset < 0x300000 is reserved */ |
1096 | 1096 | { |
1097 | logerror("(PC=%06x) snes_r_bank6: Unmapped external chip read: %04x\n",space | |
1097 | logerror("(PC=%06x) snes_r_bank6: Unmapped external chip read: %04x\n",space.device().safe_pc(),address); | |
1098 | 1098 | value = snes_open_bus_r(space, 0); |
1099 | 1099 | } |
1100 | 1100 | } |
r17963 | r17964 | |
1116 | 1116 | /* 0xc00000 - 0xffffff */ |
1117 | 1117 | READ8_HANDLER( snes_r_bank7 ) |
1118 | 1118 | { |
1119 | snes_state *state = space | |
1119 | snes_state *state = space.machine().driver_data<snes_state>(); | |
1120 | 1120 | UINT8 value = 0; |
1121 | 1121 | UINT16 address = offset & 0xffff; |
1122 | 1122 | |
r17963 | r17964 | |
1147 | 1147 | else if ((state->m_has_addon_chip == HAS_SPC7110 || state->m_has_addon_chip == HAS_SPC7110_RTC) && offset >= 0x100000) |
1148 | 1148 | value = spc7110_bank7_read(space, offset); |
1149 | 1149 | else if (state->m_has_addon_chip == HAS_SDD1) |
1150 | value = sdd1_read(space | |
1150 | value = sdd1_read(space.machine(), offset); | |
1151 | 1151 | else if (state->m_has_addon_chip == HAS_ST010 || state->m_has_addon_chip == HAS_ST011) |
1152 | 1152 | { |
1153 | 1153 | if (offset >= 0x280000 && offset < 0x300000 && address < 0x1000) |
r17963 | r17964 | |
1162 | 1162 | else if ((state->m_cart[0].mode & 5) && !(state->m_has_addon_chip == HAS_SUPERFX)) /* Mode 20 & 22 */ |
1163 | 1163 | { |
1164 | 1164 | if (address < 0x8000) |
1165 | value = space | |
1165 | value = space.read_byte(0x400000 + offset); | |
1166 | 1166 | else |
1167 | 1167 | value = snes_ram[0xc00000 + offset]; |
1168 | 1168 | } |
r17963 | r17964 | |
1176 | 1176 | /* 0x000000 - 0x2fffff */ |
1177 | 1177 | WRITE8_HANDLER( snes_w_bank1 ) |
1178 | 1178 | { |
1179 | snes_state *state = space | |
1179 | snes_state *state = space.machine().driver_data<snes_state>(); | |
1180 | 1180 | UINT16 address = offset & 0xffff; |
1181 | 1181 | |
1182 | 1182 | if (address < 0x2000) /* Mirror of Low RAM */ |
1183 | space | |
1183 | space.write_byte(0x7e0000 + address, data); | |
1184 | 1184 | else if (address < 0x6000) /* I/O */ |
1185 | 1185 | { |
1186 | 1186 | if (state->m_cart[0].mode == SNES_MODE_BSX && address >= 0x5000) |
r17963 | r17964 | |
1197 | 1197 | else if ((state->m_cart[0].mode == SNES_MODE_21) && (state->m_has_addon_chip == HAS_DSP1) && (offset < 0x100000)) |
1198 | 1198 | dsp_set_dr(data); |
1199 | 1199 | else if (state->m_has_addon_chip == HAS_CX4) |
1200 | CX4_write(space | |
1200 | CX4_write(space.machine(), address - 0x6000, data); | |
1201 | 1201 | else if (state->m_has_addon_chip == HAS_SPC7110 || state->m_has_addon_chip == HAS_SPC7110_RTC) |
1202 | 1202 | { |
1203 | 1203 | if (offset < 0x10000) |
r17963 | r17964 | |
1221 | 1221 | else |
1222 | 1222 | dsp_set_sr(data); |
1223 | 1223 | else |
1224 | logerror( "(PC=%06x) Attempt to write to ROM address: %X\n",space | |
1224 | logerror( "(PC=%06x) Attempt to write to ROM address: %X\n",space.device().safe_pc(),offset ); | |
1225 | 1225 | } |
1226 | 1226 | |
1227 | 1227 | /* 0x300000 - 0x3fffff */ |
1228 | 1228 | WRITE8_HANDLER( snes_w_bank2 ) |
1229 | 1229 | { |
1230 | snes_state *state = space | |
1230 | snes_state *state = space.machine().driver_data<snes_state>(); | |
1231 | 1231 | UINT16 address = offset & 0xffff; |
1232 | 1232 | |
1233 | 1233 | if (address < 0x2000) /* Mirror of Low RAM */ |
1234 | space | |
1234 | space.write_byte(0x7e0000 + address, data); | |
1235 | 1235 | else if (address < 0x6000) /* I/O */ |
1236 | 1236 | { |
1237 | 1237 | if (state->m_cart[0].mode == SNES_MODE_BSX && address >= 0x5000) |
r17963 | r17964 | |
1246 | 1246 | else if (state->m_has_addon_chip == HAS_OBC1) |
1247 | 1247 | obc1_write(space, offset, data); |
1248 | 1248 | else if (state->m_has_addon_chip == HAS_CX4) |
1249 | CX4_write(space | |
1249 | CX4_write(space.machine(), address - 0x6000, data); | |
1250 | 1250 | else if (state->m_has_addon_chip == HAS_SPC7110 || state->m_has_addon_chip == HAS_SPC7110_RTC) |
1251 | 1251 | { |
1252 | 1252 | if (offset < 0x10000) |
r17963 | r17964 | |
1278 | 1278 | else |
1279 | 1279 | dsp_set_sr(data); |
1280 | 1280 | else |
1281 | logerror("(PC=%06x) Attempt to write to ROM address: %X\n",space | |
1281 | logerror("(PC=%06x) Attempt to write to ROM address: %X\n",space.device().safe_pc(),offset + 0x300000); | |
1282 | 1282 | } |
1283 | 1283 | |
1284 | 1284 | /* 0x600000 - 0x6fffff */ |
1285 | 1285 | WRITE8_HANDLER( snes_w_bank4 ) |
1286 | 1286 | { |
1287 | snes_state *state = space | |
1287 | snes_state *state = space.machine().driver_data<snes_state>(); | |
1288 | 1288 | UINT16 address = offset & 0xffff; |
1289 | 1289 | |
1290 | 1290 | if (state->m_has_addon_chip == HAS_SUPERFX) |
r17963 | r17964 | |
1307 | 1307 | else if (state->m_cart[0].mode & 5) /* Mode 20 & 22 */ |
1308 | 1308 | { |
1309 | 1309 | if (address >= 0x8000) |
1310 | logerror("(PC=%06x) Attempt to write to ROM address: %X\n",space | |
1310 | logerror("(PC=%06x) Attempt to write to ROM address: %X\n",space.device().safe_pc(),offset + 0x600000); | |
1311 | 1311 | else if (state->m_has_addon_chip == HAS_DSP1) |
1312 | 1312 | dsp_set_dr(data); |
1313 | 1313 | else |
1314 | 1314 | logerror("snes_w_bank4: Attempt to write to reserved address: %X = %02x\n", offset + 0x600000, data); |
1315 | 1315 | } |
1316 | 1316 | else if (state->m_cart[0].mode & 0x0a) |
1317 | logerror("(PC=%06x) Attempt to write to ROM address: %X\n",space | |
1317 | logerror("(PC=%06x) Attempt to write to ROM address: %X\n",space.device().safe_pc(),offset + 0x600000); | |
1318 | 1318 | } |
1319 | 1319 | |
1320 | 1320 | /* 0x700000 - 0x7dffff */ |
1321 | 1321 | WRITE8_HANDLER( snes_w_bank5 ) |
1322 | 1322 | { |
1323 | snes_state *state = space | |
1323 | snes_state *state = space.machine().driver_data<snes_state>(); | |
1324 | 1324 | UINT16 address = offset & 0xffff; |
1325 | 1325 | |
1326 | 1326 | if (state->m_has_addon_chip == HAS_SUPERFX) |
r17963 | r17964 | |
1336 | 1336 | logerror("snes_w_bank5: Attempt to write to reserved address: %X = %02x\n", offset + 0x700000, data); |
1337 | 1337 | } |
1338 | 1338 | else if (state->m_cart[0].mode & 0x0a) |
1339 | logerror("(PC=%06x) Attempt to write to ROM address: %X\n",space | |
1339 | logerror("(PC=%06x) Attempt to write to ROM address: %X\n",space.device().safe_pc(),offset + 0x700000); | |
1340 | 1340 | } |
1341 | 1341 | |
1342 | 1342 | |
1343 | 1343 | /* 0x800000 - 0xbfffff */ |
1344 | 1344 | WRITE8_HANDLER( snes_w_bank6 ) |
1345 | 1345 | { |
1346 | snes_state *state = space | |
1346 | snes_state *state = space.machine().driver_data<snes_state>(); | |
1347 | 1347 | UINT16 address = offset & 0xffff; |
1348 | 1348 | |
1349 | 1349 | if (state->m_has_addon_chip == HAS_SUPERFX) |
1350 | space | |
1350 | space.write_byte(offset, data); | |
1351 | 1351 | else if (address < 0x8000) |
1352 | 1352 | { |
1353 | 1353 | if ((state->m_has_addon_chip == HAS_CX4) && (address >= 0x6000)) |
1354 | CX4_write(space | |
1354 | CX4_write(space.machine(), address - 0x6000, data); | |
1355 | 1355 | else if (state->m_cart[0].mode != SNES_MODE_25) |
1356 | space | |
1356 | space.write_byte(offset, data); | |
1357 | 1357 | else /* Mode 25 has SRAM not mirrored from lower banks */ |
1358 | 1358 | { |
1359 | 1359 | if (address < 0x6000) |
1360 | space | |
1360 | space.write_byte(offset, data); | |
1361 | 1361 | else if ((offset >= 0x300000) && (state->m_cart[0].sram > 0)) |
1362 | 1362 | { |
1363 | 1363 | int mask = (state->m_cart[0].sram - 1) | 0xff0000; /* Limit SRAM size to what's actually present */ |
r17963 | r17964 | |
1387 | 1387 | else |
1388 | 1388 | dsp_set_sr(data); |
1389 | 1389 | else |
1390 | logerror("(PC=%06x) Attempt to write to ROM address: %X\n",space | |
1390 | logerror("(PC=%06x) Attempt to write to ROM address: %X\n",space.device().safe_pc(),offset + 0x800000); | |
1391 | 1391 | } |
1392 | 1392 | |
1393 | 1393 | |
1394 | 1394 | /* 0xc00000 - 0xffffff */ |
1395 | 1395 | WRITE8_HANDLER( snes_w_bank7 ) |
1396 | 1396 | { |
1397 | snes_state *state = space | |
1397 | snes_state *state = space.machine().driver_data<snes_state>(); | |
1398 | 1398 | UINT16 address = offset & 0xffff; |
1399 | 1399 | |
1400 | 1400 | if (state->m_has_addon_chip == HAS_SUPERFX) |
r17963 | r17964 | |
1405 | 1405 | snes_ram[0xe00000 + offset] = data; // SFX RAM |
1406 | 1406 | } |
1407 | 1407 | else |
1408 | logerror("(PC=%06x) Attempt to write to ROM address: %X\n",space | |
1408 | logerror("(PC=%06x) Attempt to write to ROM address: %X\n",space.device().safe_pc(),offset + 0xc00000); | |
1409 | 1409 | } |
1410 | 1410 | else if (state->m_has_addon_chip == HAS_ST010 || state->m_has_addon_chip == HAS_ST011) |
1411 | 1411 | { |
r17963 | r17964 | |
1434 | 1434 | snes_w_bank4(space, offset - 0x200000, data); |
1435 | 1435 | } |
1436 | 1436 | else |
1437 | logerror("(PC=%06x) snes_w_bank7: Attempt to write to ROM address: %X = %02x\n",space | |
1437 | logerror("(PC=%06x) snes_w_bank7: Attempt to write to ROM address: %X = %02x\n",space.device().safe_pc(),offset + 0xc00000, data); | |
1438 | 1438 | } |
1439 | 1439 | else if (state->m_cart[0].mode & 0x0a) |
1440 | logerror("(PC=%06x) Attempt to write to ROM address: %X\n",space | |
1440 | logerror("(PC=%06x) Attempt to write to ROM address: %X\n",space.device().safe_pc(),offset + 0xc00000); | |
1441 | 1441 | } |
1442 | 1442 | |
1443 | 1443 | |
r17963 | r17964 | |
1816 | 1816 | /* for mame we use an init, maybe we will need more for the different games */ |
1817 | 1817 | DRIVER_INIT_MEMBER(snes_state,snes) |
1818 | 1818 | { |
1819 | address_space | |
1819 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
1820 | 1820 | UINT16 total_blocks, read_blocks; |
1821 | 1821 | UINT8 *rom; |
1822 | 1822 | |
r17963 | r17964 | |
1881 | 1881 | |
1882 | 1882 | DRIVER_INIT_MEMBER(snes_state,snes_hirom) |
1883 | 1883 | { |
1884 | address_space | |
1884 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
1885 | 1885 | UINT16 total_blocks, read_blocks; |
1886 | 1886 | UINT8 *rom; |
1887 | 1887 | |
r17963 | r17964 | |
1955 | 1955 | return 1; |
1956 | 1956 | } |
1957 | 1957 | |
1958 | INLINE UINT8 snes_abus_read( address_space | |
1958 | INLINE UINT8 snes_abus_read( address_space &space, UINT32 abus ) | |
1959 | 1959 | { |
1960 | 1960 | if (!dma_abus_valid(abus)) |
1961 | 1961 | return 0; |
1962 | 1962 | |
1963 | return space | |
1963 | return space.read_byte(abus); | |
1964 | 1964 | } |
1965 | 1965 | |
1966 | INLINE void snes_dma_transfer( address_space | |
1966 | INLINE void snes_dma_transfer( address_space &space, UINT8 dma, UINT32 abus, UINT16 bbus ) | |
1967 | 1967 | { |
1968 | snes_state *state = space | |
1968 | snes_state *state = space.machine().driver_data<snes_state>(); | |
1969 | 1969 | |
1970 | 1970 | if (state->m_dma_channel[dma].dmap & 0x80) /* PPU->CPU */ |
1971 | 1971 | { |
r17963 | r17964 | |
1973 | 1973 | { |
1974 | 1974 | //illegal WRAM->WRAM transfer (bus conflict) |
1975 | 1975 | //no read occurs; write does occur |
1976 | space | |
1976 | space.write_byte(abus, 0x00); | |
1977 | 1977 | return; |
1978 | 1978 | } |
1979 | 1979 | else |
r17963 | r17964 | |
1981 | 1981 | if (!dma_abus_valid(abus)) |
1982 | 1982 | return; |
1983 | 1983 | |
1984 | space | |
1984 | space.write_byte(abus, space.read_byte(bbus)); | |
1985 | 1985 | return; |
1986 | 1986 | } |
1987 | 1987 | } |
r17963 | r17964 | |
1996 | 1996 | } |
1997 | 1997 | else |
1998 | 1998 | { |
1999 | space | |
1999 | space.write_byte(bbus, snes_abus_read(space, abus)); | |
2000 | 2000 | return; |
2001 | 2001 | } |
2002 | 2002 | } |
r17963 | r17964 | |
2031 | 2031 | return 1; |
2032 | 2032 | } |
2033 | 2033 | |
2034 | static void snes_hdma_update( address_space | |
2034 | static void snes_hdma_update( address_space &space, int dma ) | |
2035 | 2035 | { |
2036 | snes_state *state = space->machine().driver_data<snes_state>(); | |
2037 | UINT32 abus = snes_get_hdma_addr(space->machine(), dma); | |
2036 | snes_state *state = space.machine().driver_data<snes_state>(); | |
2037 | UINT32 abus = snes_get_hdma_addr(space.machine(), dma); | |
2038 | 2038 | |
2039 | 2039 | state->m_dma_channel[dma].hdma_line_counter = snes_abus_read(space, abus); |
2040 | 2040 | |
r17963 | r17964 | |
2044 | 2044 | one byte for Address, and use the $00 for the low byte. So Address ends up incremented one less than |
2045 | 2045 | otherwise expected */ |
2046 | 2046 | |
2047 | abus = snes_get_hdma_addr(space | |
2047 | abus = snes_get_hdma_addr(space.machine(), dma); | |
2048 | 2048 | state->m_dma_channel[dma].trans_size = snes_abus_read(space, abus) << 8; |
2049 | 2049 | |
2050 | if (state->m_dma_channel[dma].hdma_line_counter || !is_last_active_channel(space | |
2050 | if (state->m_dma_channel[dma].hdma_line_counter || !is_last_active_channel(space.machine(), dma)) | |
2051 | 2051 | { |
2052 | 2052 | // we enter here if we have more transfers to be done or if there are other active channels after this one |
2053 | abus = snes_get_hdma_addr(space | |
2053 | abus = snes_get_hdma_addr(space.machine(), dma); | |
2054 | 2054 | state->m_dma_channel[dma].trans_size >>= 8; |
2055 | 2055 | state->m_dma_channel[dma].trans_size |= snes_abus_read(space, abus) << 8; |
2056 | 2056 | } |
r17963 | r17964 | |
2062 | 2062 | state->m_dma_channel[dma].do_transfer = 1; |
2063 | 2063 | } |
2064 | 2064 | |
2065 | static void snes_hdma_init( address_space | |
2065 | static void snes_hdma_init( address_space &space ) | |
2066 | 2066 | { |
2067 | snes_state *state = space | |
2067 | snes_state *state = space.machine().driver_data<snes_state>(); | |
2068 | 2068 | int i; |
2069 | 2069 | |
2070 | 2070 | state->m_hdmaen = snes_ram[HDMAEN]; |
r17963 | r17964 | |
2078 | 2078 | } |
2079 | 2079 | } |
2080 | 2080 | |
2081 | static void snes_hdma( address_space | |
2081 | static void snes_hdma( address_space &space ) | |
2082 | 2082 | { |
2083 | snes_state *state = space | |
2083 | snes_state *state = space.machine().driver_data<snes_state>(); | |
2084 | 2084 | UINT16 bbus; |
2085 | 2085 | UINT32 abus; |
2086 | 2086 | int i; |
r17963 | r17964 | |
2162 | 2162 | } |
2163 | 2163 | } |
2164 | 2164 | |
2165 | static void snes_dma( address_space | |
2165 | static void snes_dma( address_space &space, UINT8 channels ) | |
2166 | 2166 | { |
2167 | snes_state *state = space | |
2167 | snes_state *state = space.machine().driver_data<snes_state>(); | |
2168 | 2168 | int i; |
2169 | 2169 | INT8 increment; |
2170 | 2170 | UINT16 bbus; |
r17963 | r17964 | |
---|---|---|
166 | 166 | offs_t page_offset = (((offs_t) dma_offset[0][dma_channel]) << 16) |
167 | 167 | & 0xFF0000; |
168 | 168 | |
169 | return space | |
169 | return space.read_byte(page_offset + offset); | |
170 | 170 | } |
171 | 171 | |
172 | 172 | |
r17963 | r17964 | |
175 | 175 | offs_t page_offset = (((offs_t) dma_offset[0][dma_channel]) << 16) |
176 | 176 | & 0xFF0000; |
177 | 177 | |
178 | space | |
178 | space.write_byte(page_offset + offset, data); | |
179 | 179 | } |
180 | 180 | |
181 | 181 | static READ8_HANDLER(dma_page_select_r) |
r17963 | r17964 | |
---|---|---|
236 | 236 | |
237 | 237 | WRITE16_HANDLER( atarigen_scanline_int_ack_w ) |
238 | 238 | { |
239 | atarigen_state *state = space | |
239 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
240 | 240 | state->m_scanline_int_state = 0; |
241 | (*state->m_update_int_callback)(space | |
241 | (*state->m_update_int_callback)(space.machine()); | |
242 | 242 | } |
243 | 243 | |
244 | 244 | WRITE32_HANDLER( atarigen_scanline_int_ack32_w ) |
245 | 245 | { |
246 | atarigen_state *state = space | |
246 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
247 | 247 | state->m_scanline_int_state = 0; |
248 | (*state->m_update_int_callback)(space | |
248 | (*state->m_update_int_callback)(space.machine()); | |
249 | 249 | } |
250 | 250 | |
251 | 251 | |
r17963 | r17964 | |
269 | 269 | |
270 | 270 | WRITE16_HANDLER( atarigen_sound_int_ack_w ) |
271 | 271 | { |
272 | atarigen_state *state = space | |
272 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
273 | 273 | state->m_sound_int_state = 0; |
274 | (*state->m_update_int_callback)(space | |
274 | (*state->m_update_int_callback)(space.machine()); | |
275 | 275 | } |
276 | 276 | |
277 | 277 | WRITE32_HANDLER( atarigen_sound_int_ack32_w ) |
278 | 278 | { |
279 | atarigen_state *state = space | |
279 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
280 | 280 | state->m_sound_int_state = 0; |
281 | (*state->m_update_int_callback)(space | |
281 | (*state->m_update_int_callback)(space.machine()); | |
282 | 282 | } |
283 | 283 | |
284 | 284 | |
r17963 | r17964 | |
302 | 302 | |
303 | 303 | WRITE16_HANDLER( atarigen_video_int_ack_w ) |
304 | 304 | { |
305 | atarigen_state *state = space | |
305 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
306 | 306 | state->m_video_int_state = 0; |
307 | (*state->m_update_int_callback)(space | |
307 | (*state->m_update_int_callback)(space.machine()); | |
308 | 308 | } |
309 | 309 | |
310 | 310 | WRITE32_HANDLER( atarigen_video_int_ack32_w ) |
311 | 311 | { |
312 | atarigen_state *state = space | |
312 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
313 | 313 | state->m_video_int_state = 0; |
314 | (*state->m_update_int_callback)(space | |
314 | (*state->m_update_int_callback)(space.machine()); | |
315 | 315 | } |
316 | 316 | |
317 | 317 | |
r17963 | r17964 | |
358 | 358 | |
359 | 359 | WRITE16_HANDLER( atarigen_eeprom_enable_w ) |
360 | 360 | { |
361 | atarigen_state *state = space | |
361 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
362 | 362 | state->m_eeprom_unlocked = 1; |
363 | 363 | } |
364 | 364 | |
365 | 365 | WRITE32_HANDLER( atarigen_eeprom_enable32_w ) |
366 | 366 | { |
367 | atarigen_state *state = space | |
367 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
368 | 368 | state->m_eeprom_unlocked = 1; |
369 | 369 | } |
370 | 370 | |
r17963 | r17964 | |
378 | 378 | |
379 | 379 | WRITE16_HANDLER( atarigen_eeprom_w ) |
380 | 380 | { |
381 | atarigen_state *state = space | |
381 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
382 | 382 | |
383 | 383 | if (!state->m_eeprom_unlocked) |
384 | 384 | return; |
r17963 | r17964 | |
389 | 389 | |
390 | 390 | WRITE32_HANDLER( atarigen_eeprom32_w ) |
391 | 391 | { |
392 | atarigen_state *state = space | |
392 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
393 | 393 | |
394 | 394 | if (!state->m_eeprom_unlocked) |
395 | 395 | return; |
r17963 | r17964 | |
409 | 409 | |
410 | 410 | READ16_HANDLER( atarigen_eeprom_r ) |
411 | 411 | { |
412 | atarigen_state *state = space | |
412 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
413 | 413 | return state->m_eeprom[offset] | 0xff00; |
414 | 414 | } |
415 | 415 | |
416 | 416 | READ16_HANDLER( atarigen_eeprom_upper_r ) |
417 | 417 | { |
418 | atarigen_state *state = space | |
418 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
419 | 419 | return state->m_eeprom[offset] | 0x00ff; |
420 | 420 | } |
421 | 421 | |
422 | 422 | READ32_HANDLER( atarigen_eeprom_upper32_r ) |
423 | 423 | { |
424 | atarigen_state *state = space | |
424 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
425 | 425 | return (state->m_eeprom[offset * 2] << 16) | state->m_eeprom[offset * 2 + 1] | 0x00ff00ff; |
426 | 426 | } |
427 | 427 | |
r17963 | r17964 | |
468 | 468 | { |
469 | 469 | m_slapstic_last_pc = pc; |
470 | 470 | m_slapstic_last_address = address; |
471 | atarigen_slapstic_r( | |
471 | atarigen_slapstic_r(direct.space(), (address >> 1) & 0x3fff, 0xffff); | |
472 | 472 | } |
473 | 473 | return ~0; |
474 | 474 | } |
r17963 | r17964 | |
511 | 511 | state->m_slapstic_base = base; |
512 | 512 | state->m_slapstic_mirror = mirror; |
513 | 513 | |
514 | address_space *space = downcast<cpu_device *>(device)->space(AS_PROGRAM); | |
515 | space->set_direct_update_handler(direct_update_delegate(FUNC(atarigen_state::atarigen_slapstic_setdirect), state)); | |
514 | address_space &space = *downcast<cpu_device *>(device)->space(AS_PROGRAM); | |
515 | space.set_direct_update_handler(direct_update_delegate(FUNC(atarigen_state::atarigen_slapstic_setdirect), state)); | |
516 | 516 | } |
517 | 517 | } |
518 | 518 | |
r17963 | r17964 | |
540 | 540 | |
541 | 541 | WRITE16_HANDLER( atarigen_slapstic_w ) |
542 | 542 | { |
543 | atarigen_state *state = space | |
543 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
544 | 544 | update_bank(state, slapstic_tweak(space, offset)); |
545 | 545 | } |
546 | 546 | |
r17963 | r17964 | |
553 | 553 | READ16_HANDLER( atarigen_slapstic_r ) |
554 | 554 | { |
555 | 555 | /* fetch the result from the current bank first */ |
556 | atarigen_state *state = space | |
556 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
557 | 557 | int result = state->m_slapstic[offset & 0xfff]; |
558 | 558 | |
559 | 559 | /* then determine the new one */ |
r17963 | r17964 | |
607 | 607 | |
608 | 608 | READ8_HANDLER( atarigen_6502_irq_ack_r ) |
609 | 609 | { |
610 | atarigen_state *state = space | |
610 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
611 | 611 | state->m_timed_int = 0; |
612 | update_6502_irq(space | |
612 | update_6502_irq(space.machine()); | |
613 | 613 | return 0; |
614 | 614 | } |
615 | 615 | |
616 | 616 | WRITE8_HANDLER( atarigen_6502_irq_ack_w ) |
617 | 617 | { |
618 | atarigen_state *state = space | |
618 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
619 | 619 | state->m_timed_int = 0; |
620 | update_6502_irq(space | |
620 | update_6502_irq(space.machine()); | |
621 | 621 | } |
622 | 622 | |
623 | 623 | |
r17963 | r17964 | |
641 | 641 | |
642 | 642 | WRITE16_HANDLER( atarigen_sound_reset_w ) |
643 | 643 | { |
644 | space | |
644 | space.machine().scheduler().synchronize(FUNC(delayed_sound_reset)); | |
645 | 645 | } |
646 | 646 | |
647 | 647 | |
r17963 | r17964 | |
666 | 666 | WRITE16_HANDLER( atarigen_sound_w ) |
667 | 667 | { |
668 | 668 | if (ACCESSING_BITS_0_7) |
669 | space | |
669 | space.machine().scheduler().synchronize(FUNC(delayed_sound_w), data & 0xff); | |
670 | 670 | } |
671 | 671 | |
672 | 672 | WRITE16_HANDLER( atarigen_sound_upper_w ) |
673 | 673 | { |
674 | 674 | if (ACCESSING_BITS_8_15) |
675 | space | |
675 | space.machine().scheduler().synchronize(FUNC(delayed_sound_w), (data >> 8) & 0xff); | |
676 | 676 | } |
677 | 677 | |
678 | 678 | WRITE32_HANDLER( atarigen_sound_upper32_w ) |
679 | 679 | { |
680 | 680 | if (ACCESSING_BITS_24_31) |
681 | space | |
681 | space.machine().scheduler().synchronize(FUNC(delayed_sound_w), (data >> 24) & 0xff); | |
682 | 682 | } |
683 | 683 | |
684 | 684 | |
r17963 | r17964 | |
691 | 691 | |
692 | 692 | READ16_HANDLER( atarigen_sound_r ) |
693 | 693 | { |
694 | atarigen_state *state = space | |
694 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
695 | 695 | state->m_sound_to_cpu_ready = 0; |
696 | 696 | atarigen_sound_int_ack_w(space, 0, 0, 0xffff); |
697 | 697 | return state->m_sound_to_cpu | 0xff00; |
r17963 | r17964 | |
699 | 699 | |
700 | 700 | READ16_HANDLER( atarigen_sound_upper_r ) |
701 | 701 | { |
702 | atarigen_state *state = space | |
702 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
703 | 703 | state->m_sound_to_cpu_ready = 0; |
704 | 704 | atarigen_sound_int_ack_w(space, 0, 0, 0xffff); |
705 | 705 | return (state->m_sound_to_cpu << 8) | 0x00ff; |
r17963 | r17964 | |
707 | 707 | |
708 | 708 | READ32_HANDLER( atarigen_sound_upper32_r ) |
709 | 709 | { |
710 | atarigen_state *state = space | |
710 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
711 | 711 | state->m_sound_to_cpu_ready = 0; |
712 | 712 | atarigen_sound_int_ack32_w(space, 0, 0, 0xffff); |
713 | 713 | return (state->m_sound_to_cpu << 24) | 0x00ffffff; |
r17963 | r17964 | |
721 | 721 | |
722 | 722 | WRITE8_HANDLER( atarigen_6502_sound_w ) |
723 | 723 | { |
724 | space | |
724 | space.machine().scheduler().synchronize(FUNC(delayed_6502_sound_w), data); | |
725 | 725 | } |
726 | 726 | |
727 | 727 | |
r17963 | r17964 | |
732 | 732 | |
733 | 733 | READ8_HANDLER( atarigen_6502_sound_r ) |
734 | 734 | { |
735 | atarigen_state *state = space | |
735 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
736 | 736 | state->m_cpu_to_sound_ready = 0; |
737 | 737 | state->m_sound_cpu->execute().set_input_line(INPUT_LINE_NMI, CLEAR_LINE); |
738 | 738 | return state->m_cpu_to_sound; |
r17963 | r17964 | |
764 | 764 | static TIMER_CALLBACK( delayed_sound_reset ) |
765 | 765 | { |
766 | 766 | atarigen_state *state = machine.driver_data<atarigen_state>(); |
767 | address_space | |
767 | address_space &space = *state->m_sound_cpu->memory().space(AS_PROGRAM); | |
768 | 768 | |
769 | 769 | /* unhalt and reset the sound CPU */ |
770 | 770 | if (param == 0) |
r17963 | r17964 | |
1125 | 1125 | /* scanline IRQ ack here */ |
1126 | 1126 | case 0x1e: |
1127 | 1127 | /* hack: this should be a device */ |
1128 | atarigen_scanline_int_ack_w(screen.machine().device("maincpu")->memory().space(AS_PROGRAM), 0, 0, 0xffff); | |
1128 | atarigen_scanline_int_ack_w(*screen.machine().device("maincpu")->memory().space(AS_PROGRAM), 0, 0, 0xffff); | |
1129 | 1129 | break; |
1130 | 1130 | |
1131 | 1131 | /* log anything else */ |
r17963 | r17964 | |
1177 | 1177 | |
1178 | 1178 | WRITE16_HANDLER( atarigen_alpha_w ) |
1179 | 1179 | { |
1180 | atarigen_state *state = space | |
1180 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
1181 | 1181 | COMBINE_DATA(&state->m_alpha[offset]); |
1182 | 1182 | state->m_alpha_tilemap->mark_tile_dirty(offset); |
1183 | 1183 | } |
1184 | 1184 | |
1185 | 1185 | WRITE32_HANDLER( atarigen_alpha32_w ) |
1186 | 1186 | { |
1187 | atarigen_state *state = space | |
1187 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
1188 | 1188 | COMBINE_DATA(&state->m_alpha32[offset]); |
1189 | 1189 | if (ACCESSING_BITS_16_31) |
1190 | 1190 | state->m_alpha_tilemap->mark_tile_dirty(offset * 2); |
r17963 | r17964 | |
1194 | 1194 | |
1195 | 1195 | WRITE16_HANDLER( atarigen_alpha2_w ) |
1196 | 1196 | { |
1197 | atarigen_state *state = space | |
1197 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
1198 | 1198 | COMBINE_DATA(&state->m_alpha2[offset]); |
1199 | 1199 | state->m_alpha2_tilemap->mark_tile_dirty(offset); |
1200 | 1200 | } |
r17963 | r17964 | |
1224 | 1224 | |
1225 | 1225 | WRITE16_HANDLER( atarigen_playfield_w ) |
1226 | 1226 | { |
1227 | atarigen_state *state = space | |
1227 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
1228 | 1228 | COMBINE_DATA(&state->m_playfield[offset]); |
1229 | 1229 | state->m_playfield_tilemap->mark_tile_dirty(offset); |
1230 | 1230 | } |
1231 | 1231 | |
1232 | 1232 | WRITE32_HANDLER( atarigen_playfield32_w ) |
1233 | 1233 | { |
1234 | atarigen_state *state = space | |
1234 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
1235 | 1235 | COMBINE_DATA(&state->m_playfield32[offset]); |
1236 | 1236 | if (ACCESSING_BITS_16_31) |
1237 | 1237 | state->m_playfield_tilemap->mark_tile_dirty(offset * 2); |
r17963 | r17964 | |
1241 | 1241 | |
1242 | 1242 | WRITE16_HANDLER( atarigen_playfield2_w ) |
1243 | 1243 | { |
1244 | atarigen_state *state = space | |
1244 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
1245 | 1245 | COMBINE_DATA(&state->m_playfield2[offset]); |
1246 | 1246 | state->m_playfield2_tilemap->mark_tile_dirty(offset); |
1247 | 1247 | } |
r17963 | r17964 | |
1255 | 1255 | |
1256 | 1256 | WRITE16_HANDLER( atarigen_playfield_large_w ) |
1257 | 1257 | { |
1258 | atarigen_state *state = space | |
1258 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
1259 | 1259 | COMBINE_DATA(&state->m_playfield[offset]); |
1260 | 1260 | state->m_playfield_tilemap->mark_tile_dirty(offset / 2); |
1261 | 1261 | } |
r17963 | r17964 | |
1269 | 1269 | |
1270 | 1270 | WRITE16_HANDLER( atarigen_playfield_upper_w ) |
1271 | 1271 | { |
1272 | atarigen_state *state = space | |
1272 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
1273 | 1273 | COMBINE_DATA(&state->m_playfield_upper[offset]); |
1274 | 1274 | state->m_playfield_tilemap->mark_tile_dirty(offset); |
1275 | 1275 | } |
r17963 | r17964 | |
1283 | 1283 | |
1284 | 1284 | WRITE16_HANDLER( atarigen_playfield_dual_upper_w ) |
1285 | 1285 | { |
1286 | atarigen_state *state = space | |
1286 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
1287 | 1287 | COMBINE_DATA(&state->m_playfield_upper[offset]); |
1288 | 1288 | state->m_playfield_tilemap->mark_tile_dirty(offset); |
1289 | 1289 | state->m_playfield2_tilemap->mark_tile_dirty(offset); |
r17963 | r17964 | |
1299 | 1299 | |
1300 | 1300 | WRITE16_HANDLER( atarigen_playfield_latched_lsb_w ) |
1301 | 1301 | { |
1302 | atarigen_state *state = space | |
1302 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
1303 | 1303 | |
1304 | 1304 | COMBINE_DATA(&state->m_playfield[offset]); |
1305 | 1305 | state->m_playfield_tilemap->mark_tile_dirty(offset); |
r17963 | r17964 | |
1318 | 1318 | |
1319 | 1319 | WRITE16_HANDLER( atarigen_playfield_latched_msb_w ) |
1320 | 1320 | { |
1321 | atarigen_state *state = space | |
1321 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
1322 | 1322 | |
1323 | 1323 | COMBINE_DATA(&state->m_playfield[offset]); |
1324 | 1324 | state->m_playfield_tilemap->mark_tile_dirty(offset); |
r17963 | r17964 | |
1337 | 1337 | |
1338 | 1338 | WRITE16_HANDLER( atarigen_playfield2_latched_msb_w ) |
1339 | 1339 | { |
1340 | atarigen_state *state = space | |
1340 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
1341 | 1341 | |
1342 | 1342 | COMBINE_DATA(&state->m_playfield2[offset]); |
1343 | 1343 | state->m_playfield2_tilemap->mark_tile_dirty(offset); |
r17963 | r17964 | |
1395 | 1395 | |
1396 | 1396 | WRITE16_HANDLER( atarigen_666_paletteram_w ) |
1397 | 1397 | { |
1398 | atarigen_state *state = space | |
1398 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
1399 | 1399 | int newword, r, g, b; |
1400 | 1400 | |
1401 | 1401 | COMBINE_DATA(&state->m_generic_paletteram_16[offset]); |
r17963 | r17964 | |
1405 | 1405 | g = ((newword >> 4) & 0x3e) | ((newword >> 15) & 1); |
1406 | 1406 | b = ((newword << 1) & 0x3e) | ((newword >> 15) & 1); |
1407 | 1407 | |
1408 | palette_set_color_rgb(space | |
1408 | palette_set_color_rgb(space.machine(), offset, pal6bit(r), pal6bit(g), pal6bit(b)); | |
1409 | 1409 | } |
1410 | 1410 | |
1411 | 1411 | |
r17963 | r17964 | |
1416 | 1416 | |
1417 | 1417 | WRITE16_HANDLER( atarigen_expanded_666_paletteram_w ) |
1418 | 1418 | { |
1419 | atarigen_state *state = space | |
1419 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
1420 | 1420 | COMBINE_DATA(&state->m_generic_paletteram_16[offset]); |
1421 | 1421 | |
1422 | 1422 | if (ACCESSING_BITS_8_15) |
r17963 | r17964 | |
1430 | 1430 | g = ((newword >> 4) & 0x3e) | ((newword >> 15) & 1); |
1431 | 1431 | b = ((newword << 1) & 0x3e) | ((newword >> 15) & 1); |
1432 | 1432 | |
1433 | palette_set_color_rgb(space | |
1433 | palette_set_color_rgb(space.machine(), palentry & 0x1ff, pal6bit(r), pal6bit(g), pal6bit(b)); | |
1434 | 1434 | } |
1435 | 1435 | } |
1436 | 1436 | |
r17963 | r17964 | |
1441 | 1441 | |
1442 | 1442 | WRITE32_HANDLER( atarigen_666_paletteram32_w ) |
1443 | 1443 | { |
1444 | atarigen_state *state = space | |
1444 | atarigen_state *state = space.machine().driver_data<atarigen_state>(); | |
1445 | 1445 | int newword, r, g, b; |
1446 | 1446 | |
1447 | 1447 | COMBINE_DATA(&state->m_generic_paletteram_32[offset]); |
r17963 | r17964 | |
1454 | 1454 | g = ((newword >> 4) & 0x3e) | ((newword >> 15) & 1); |
1455 | 1455 | b = ((newword << 1) & 0x3e) | ((newword >> 15) & 1); |
1456 | 1456 | |
1457 | palette_set_color_rgb(space | |
1457 | palette_set_color_rgb(space.machine(), offset * 2, pal6bit(r), pal6bit(g), pal6bit(b)); | |
1458 | 1458 | } |
1459 | 1459 | |
1460 | 1460 | if (ACCESSING_BITS_0_15) |
r17963 | r17964 | |
1465 | 1465 | g = ((newword >> 4) & 0x3e) | ((newword >> 15) & 1); |
1466 | 1466 | b = ((newword << 1) & 0x3e) | ((newword >> 15) & 1); |
1467 | 1467 | |
1468 | palette_set_color_rgb(space | |
1468 | palette_set_color_rgb(space.machine(), offset * 2 + 1, pal6bit(r), pal6bit(g), pal6bit(b)); | |
1469 | 1469 | } |
1470 | 1470 | } |
1471 | 1471 |
r17963 | r17964 | |
---|---|---|
106 | 106 | |
107 | 107 | static READ16_HANDLER( olds_r ) |
108 | 108 | { |
109 | pgm_028_025_state *state = space | |
109 | pgm_028_025_state *state = space.machine().driver_data<pgm_028_025_state>(); | |
110 | 110 | UINT16 res = 0; |
111 | 111 | |
112 | 112 | if (offset == 1) |
r17963 | r17964 | |
124 | 124 | |
125 | 125 | } |
126 | 126 | } |
127 | logerror("%06X: ASIC25 R CMD %X VAL %X\n", space | |
127 | logerror("%06X: ASIC25 R CMD %X VAL %X\n", space.device().safe_pc(), state->m_kb_cmd, res); | |
128 | 128 | return res; |
129 | 129 | } |
130 | 130 | |
131 | 131 | static WRITE16_HANDLER( olds_w ) |
132 | 132 | { |
133 | pgm_028_025_state *state = space | |
133 | pgm_028_025_state *state = space.machine().driver_data<pgm_028_025_state>(); | |
134 | 134 | if (offset == 0) |
135 | 135 | state->m_kb_cmd = data; |
136 | 136 | else //offset==2 |
137 | 137 | { |
138 | logerror("%06X: ASIC25 W CMD %X VAL %X\n",space | |
138 | logerror("%06X: ASIC25 W CMD %X VAL %X\n",space.device().safe_pc(), state->m_kb_cmd, data); | |
139 | 139 | if (state->m_kb_cmd == 0) |
140 | 140 | state->m_kb_reg = data; |
141 | 141 | else if(state->m_kb_cmd == 2) //a bitswap= |
r17963 | r17964 | |
165 | 165 | UINT16 val0 = state->m_sharedprotram[0x3050 / 2]; //CMD_FORMAT |
166 | 166 | { |
167 | 167 | if ((cmd0 & 0xff) == 0x2) |
168 | olds_write_reg(space | |
168 | olds_write_reg(space.machine(), val0, olds_read_reg(space.machine(), val0) + 0x10000); | |
169 | 169 | } |
170 | 170 | break; |
171 | 171 | } |
r17963 | r17964 | |
184 | 184 | |
185 | 185 | static READ16_HANDLER( olds_prot_swap_r ) |
186 | 186 | { |
187 | pgm_state *state = space->machine().driver_data<pgm_state>(); | |
188 | if (space->device().safe_pc() < 0x100000) //bios | |
187 | pgm_state *state = space.machine().driver_data<pgm_state>(); | |
188 | if (space.device().safe_pc() < 0x100000) //bios | |
189 | 189 | return state->m_mainram[0x178f4 / 2]; |
190 | 190 | else //game |
191 | 191 | return state->m_mainram[0x178d8 / 2]; |
r17963 | r17964 | |
---|---|---|
115 | 115 | /* TODO: what type of DMA this is, burst or cycle steal? Docs doesn't explain it (4 usec is the DRAM refresh). */ |
116 | 116 | static TIMER_CALLBACK( vidc_video_tick ) |
117 | 117 | { |
118 | address_space | |
118 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
119 | 119 | static UINT8 *vram = machine.root_device().memregion("vram")->base(); |
120 | 120 | UINT32 size; |
121 | 121 | |
122 | 122 | size = vidc_vidend-vidc_vidstart+0x10; |
123 | 123 | |
124 | 124 | for(vidc_vidcur = 0;vidc_vidcur < size;vidc_vidcur++) |
125 | vram[vidc_vidcur] = (space | |
125 | vram[vidc_vidcur] = (space.read_byte(vidc_vidstart+vidc_vidcur)); | |
126 | 126 | |
127 | 127 | if(video_dma_on) |
128 | vid_timer->adjust(space | |
128 | vid_timer->adjust(space.machine().primary_screen->time_until_pos(vidc_regs[0xb4])); | |
129 | 129 | else |
130 | 130 | vid_timer->adjust(attotime::never); |
131 | 131 | } |
r17963 | r17964 | |
133 | 133 | /* audio DMA */ |
134 | 134 | static TIMER_CALLBACK( vidc_audio_tick ) |
135 | 135 | { |
136 | address_space | |
136 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
137 | 137 | UINT8 ulaw_comp; |
138 | 138 | INT16 res; |
139 | 139 | UINT8 ch; |
r17963 | r17964 | |
176 | 176 | |
177 | 177 | for(ch=0;ch<8;ch++) |
178 | 178 | { |
179 | UINT8 ulaw_temp = (space | |
179 | UINT8 ulaw_temp = (space.read_byte(vidc_sndstart+vidc_sndcur + ch)) ^ 0xff; | |
180 | 180 | |
181 | 181 | ulaw_comp = (ulaw_temp>>1) | ((ulaw_temp&1)<<7); |
182 | 182 | |
183 | 183 | res = mulawTable[ulaw_comp]; |
184 | 184 | |
185 | space | |
185 | space.machine().device<dac_device>(dac_port[ch & 7])->write_signed16(res^0x8000); | |
186 | 186 | } |
187 | 187 | |
188 | 188 | vidc_sndcur+=8; |
r17963 | r17964 | |
196 | 196 | { |
197 | 197 | snd_timer->adjust(attotime::never); |
198 | 198 | for(ch=0;ch<8;ch++) |
199 | space | |
199 | space.machine().device<dac_device>(dac_port[ch & 7])->write_signed16(0x8000); | |
200 | 200 | } |
201 | 201 | } |
202 | 202 | } |
r17963 | r17964 | |
289 | 289 | { |
290 | 290 | UINT32 *rom; |
291 | 291 | |
292 | rom = (UINT32 *)space | |
292 | rom = (UINT32 *)space.machine().root_device().memregion("maincpu")->base(); | |
293 | 293 | |
294 | 294 | return rom[offset & 0x1fffff]; |
295 | 295 | } |
r17963 | r17964 | |
355 | 355 | { |
356 | 356 | UINT32 *rom; |
357 | 357 | |
358 | rom = (UINT32 *)space | |
358 | rom = (UINT32 *)space.machine().root_device().memregion("maincpu")->base(); | |
359 | 359 | |
360 | 360 | return rom[offset & 0x1fffff]; |
361 | 361 | } |
r17963 | r17964 | |
423 | 423 | void archimedes_driver_init(running_machine &machine) |
424 | 424 | { |
425 | 425 | archimedes_memc_physmem = reinterpret_cast<UINT32 *>(machine.root_device().memshare("physicalram")->ptr()); |
426 | // address_space *space = machine.device<arm_device>("maincpu")->space(AS_PROGRAM); | |
427 | // space->set_direct_update_handler(direct_update_delegate(FUNC(a310_setopbase), &machine)); | |
426 | // address_space &space = *machine.device<arm_device>("maincpu")->space(AS_PROGRAM); | |
427 | // space.set_direct_update_handler(direct_update_delegate(FUNC(a310_setopbase), &machine)); | |
428 | 428 | } |
429 | 429 | |
430 | 430 | static const char *const ioc_regnames[] = |
r17963 | r17964 | |
474 | 474 | static READ32_HANDLER( ioc_ctrl_r ) |
475 | 475 | { |
476 | 476 | if(IOC_LOG) |
477 | logerror("IOC: R %s = %02x (PC=%x) %02x\n", ioc_regnames[offset&0x1f], ioc_regs[offset&0x1f], space | |
477 | logerror("IOC: R %s = %02x (PC=%x) %02x\n", ioc_regnames[offset&0x1f], ioc_regs[offset&0x1f], space.device() .safe_pc( ),offset & 0x1f); | |
478 | 478 | |
479 | 479 | switch (offset & 0x1f) |
480 | 480 | { |
r17963 | r17964 | |
484 | 484 | static UINT8 flyback; //internal name for vblank here |
485 | 485 | int vert_pos; |
486 | 486 | |
487 | vert_pos = space | |
487 | vert_pos = space.machine().primary_screen->vpos(); | |
488 | 488 | flyback = (vert_pos <= vidc_regs[VIDC_VDSR] || vert_pos >= vidc_regs[VIDC_VDER]) ? 0x80 : 0x00; |
489 | 489 | |
490 | i2c_data = (i2cmem_sda_read(space | |
490 | i2c_data = (i2cmem_sda_read(space.machine().device("i2cmem")) & 1); | |
491 | 491 | |
492 | 492 | return (flyback) | (ioc_regs[CONTROL] & 0x7c) | (i2c_clk<<1) | i2c_data; |
493 | 493 | } |
494 | 494 | |
495 | 495 | case KART: // keyboard read |
496 | archimedes_request_irq_b(space | |
496 | archimedes_request_irq_b(space.machine(), ARCHIMEDES_IRQB_KBD_XMIT_EMPTY); | |
497 | 497 | break; |
498 | 498 | |
499 | 499 | case IRQ_STATUS_A: |
r17963 | r17964 | |
536 | 536 | case T3_LATCH_HI: return (ioc_timerout[3]>>8)&0xff; |
537 | 537 | default: |
538 | 538 | if(!IOC_LOG) |
539 | logerror("IOC: R %s = %02x (PC=%x) %02x\n", ioc_regnames[offset&0x1f], ioc_regs[offset&0x1f], space | |
539 | logerror("IOC: R %s = %02x (PC=%x) %02x\n", ioc_regnames[offset&0x1f], ioc_regs[offset&0x1f], space.device() .safe_pc( ),offset & 0x1f); | |
540 | 540 | break; |
541 | 541 | } |
542 | 542 | |
r17963 | r17964 | |
547 | 547 | static WRITE32_HANDLER( ioc_ctrl_w ) |
548 | 548 | { |
549 | 549 | if(IOC_LOG) |
550 | logerror("IOC: W %02x @ reg %s (PC=%x)\n", data&0xff, ioc_regnames[offset&0x1f], space | |
550 | logerror("IOC: W %02x @ reg %s (PC=%x)\n", data&0xff, ioc_regnames[offset&0x1f], space.device() .safe_pc( )); | |
551 | 551 | |
552 | 552 | switch (offset&0x1f) |
553 | 553 | { |
554 | 554 | case CONTROL: // I2C bus control |
555 | 555 | //logerror("IOC I2C: CLK %d DAT %d\n", (data>>1)&1, data&1); |
556 | i2cmem_sda_write(space->machine().device("i2cmem"), data & 0x01); | |
557 | i2cmem_scl_write(space->machine().device("i2cmem"), (data & 0x02) >> 1); | |
556 | i2cmem_sda_write(space.machine().device("i2cmem"), data & 0x01); | |
557 | i2cmem_scl_write(space.machine().device("i2cmem"), (data & 0x02) >> 1); | |
558 | 558 | i2c_clk = (data & 2) >> 1; |
559 | 559 | break; |
560 | 560 | |
r17963 | r17964 | |
571 | 571 | ioc_regs[IRQ_MASK_A] = data & 0xff; |
572 | 572 | |
573 | 573 | if(data & 0x80) //force an IRQ |
574 | archimedes_request_irq_a(space | |
574 | archimedes_request_irq_a(space.machine(),ARCHIMEDES_IRQA_FORCE); | |
575 | 575 | |
576 | 576 | if(data & 0x08) //set up the VBLANK timer |
577 | vbl_timer->adjust(space | |
577 | vbl_timer->adjust(space.machine().primary_screen->time_until_pos(vidc_regs[0xb4])); | |
578 | 578 | |
579 | 579 | break; |
580 | 580 | |
r17963 | r17964 | |
582 | 582 | ioc_regs[FIQ_MASK] = data & 0xff; |
583 | 583 | |
584 | 584 | if(data & 0x80) //force a FIRQ |
585 | archimedes_request_fiq(space | |
585 | archimedes_request_fiq(space.machine(),ARCHIMEDES_FIQ_FORCE); | |
586 | 586 | |
587 | 587 | break; |
588 | 588 | |
r17963 | r17964 | |
593 | 593 | //if (ioc_regs[IRQ_STATUS_A] == 0) |
594 | 594 | { |
595 | 595 | //printf("IRQ clear A\n"); |
596 | space | |
596 | space.machine().device("maincpu")->execute().set_input_line(ARM_IRQ_LINE, CLEAR_LINE); | |
597 | 597 | } |
598 | 598 | break; |
599 | 599 | |
r17963 | r17964 | |
655 | 655 | |
656 | 656 | default: |
657 | 657 | if(!IOC_LOG) |
658 | logerror("IOC: W %02x @ reg %s (PC=%x)\n", data&0xff, ioc_regnames[offset&0x1f], space | |
658 | logerror("IOC: W %02x @ reg %s (PC=%x)\n", data&0xff, ioc_regnames[offset&0x1f], space.device() .safe_pc( )); | |
659 | 659 | |
660 | 660 | ioc_regs[offset&0x1f] = data & 0xff; |
661 | 661 | break; |
r17963 | r17964 | |
665 | 665 | READ32_HANDLER(archimedes_ioc_r) |
666 | 666 | { |
667 | 667 | UINT32 ioc_addr; |
668 | device_t *fdc = (device_t *)space | |
668 | device_t *fdc = (device_t *)space.machine().device("wd1772"); | |
669 | 669 | |
670 | 670 | ioc_addr = offset*4; |
671 | 671 | |
r17963 | r17964 | |
684 | 684 | case 1: |
685 | 685 | if (fdc) { |
686 | 686 | logerror("17XX: R @ addr %x mask %08x\n", offset*4, mem_mask); |
687 | return wd17xx_data_r(fdc, | |
687 | return wd17xx_data_r(fdc, space, offset&0xf); | |
688 | 688 | } else { |
689 | 689 | logerror("Read from FDC device?\n"); |
690 | 690 | return 0; |
r17963 | r17964 | |
721 | 721 | WRITE32_HANDLER(archimedes_ioc_w) |
722 | 722 | { |
723 | 723 | UINT32 ioc_addr; |
724 | device_t *fdc = (device_t *)space | |
724 | device_t *fdc = (device_t *)space.machine().device("wd1772"); | |
725 | 725 | |
726 | 726 | ioc_addr = offset*4; |
727 | 727 | |
r17963 | r17964 | |
740 | 740 | case 1: |
741 | 741 | if (fdc) { |
742 | 742 | logerror("17XX: %x to addr %x mask %08x\n", data, offset*4, mem_mask); |
743 | wd17xx_data_w(fdc, | |
743 | wd17xx_data_w(fdc, space, offset&0xf, data&0xff); | |
744 | 744 | } else { |
745 | 745 | logerror("Write to FDC device?\n"); |
746 | 746 | } |
r17963 | r17964 | |
779 | 779 | } |
780 | 780 | |
781 | 781 | |
782 | logerror("(PC=%08x) I/O: W %x @ %x (mask %08x)\n", space | |
782 | logerror("(PC=%08x) I/O: W %x @ %x (mask %08x)\n", space.device().safe_pc(), data, (offset*4)+0x3000000, mem_mask); | |
783 | 783 | } |
784 | 784 | |
785 | 785 | READ32_HANDLER(archimedes_vidc_r) |
r17963 | r17964 | |
866 | 866 | r = (val & 0x000f) >> 0; |
867 | 867 | |
868 | 868 | if(reg == 0x40 && val & 0xfff) |
869 | logerror("WARNING: border color write here (PC=%08x)!\n",space | |
869 | logerror("WARNING: border color write here (PC=%08x)!\n",space.device().safe_pc()); | |
870 | 870 | |
871 | palette_set_color_rgb(space | |
871 | palette_set_color_rgb(space.machine(), reg >> 2, pal4bit(r), pal4bit(g), pal4bit(b) ); | |
872 | 872 | |
873 | 873 | /* handle 8bpp colors here */ |
874 | 874 | if(reg <= 0x3c) |
r17963 | r17964 | |
881 | 881 | g = ((val & 0x030) >> 4) | ((i & 0x20) >> 3) | ((i & 0x40) >> 3); |
882 | 882 | r = ((val & 0x007) >> 0) | ((i & 0x10) >> 1); |
883 | 883 | |
884 | palette_set_color_rgb(space | |
884 | palette_set_color_rgb(space.machine(), (reg >> 2) + 0x100 + i, pal4bit(r), pal4bit(g), pal4bit(b) ); | |
885 | 885 | } |
886 | 886 | } |
887 | 887 | |
r17963 | r17964 | |
921 | 921 | logerror("VIDC: %s = %d\n", vrnames[(reg-0x80)/4], vidc_regs[reg]); |
922 | 922 | //#endif |
923 | 923 | |
924 | vidc_dynamic_res_change(space | |
924 | vidc_dynamic_res_change(space.machine()); | |
925 | 925 | } |
926 | 926 | else if(reg == 0xe0) |
927 | 927 | { |
928 | 928 | vidc_bpp_mode = ((val & 0x0c) >> 2); |
929 | 929 | vidc_interlace = ((val & 0x40) >> 6); |
930 | 930 | vidc_pixel_clk = (val & 0x03); |
931 | vidc_dynamic_res_change(space | |
931 | vidc_dynamic_res_change(space.machine()); | |
932 | 932 | } |
933 | 933 | else |
934 | 934 | { |
r17963 | r17964 | |
977 | 977 | |
978 | 978 | case 6: |
979 | 979 | vidc_sndcur = 0; |
980 | archimedes_request_irq_b(space | |
980 | archimedes_request_irq_b(space.machine(), ARCHIMEDES_IRQB_SOUND_EMPTY); | |
981 | 981 | break; |
982 | 982 | |
983 | 983 | case 7: /* Control */ |
984 | 984 | memc_pagesize = ((data>>2) & 3); |
985 | 985 | |
986 | logerror("(PC = %08x) MEMC: %x to Control (page size %d, %s, %s)\n", space | |
986 | logerror("(PC = %08x) MEMC: %x to Control (page size %d, %s, %s)\n", space.device().safe_pc(), data & 0x1ffc, page_sizes[memc_pagesize], ((data>>10)&1) ? "Video DMA on" : "Video DMA off", ((data>>11)&1) ? "Sound DMA on" : "Sound DMA off"); | |
987 | 987 | |
988 | 988 | video_dma_on = ((data>>10)&1); |
989 | 989 | audio_dma_on = ((data>>11)&1); |
r17963 | r17964 | |
991 | 991 | if ((data>>10)&1) |
992 | 992 | { |
993 | 993 | vidc_vidcur = 0; |
994 | vid_timer->adjust(space | |
994 | vid_timer->adjust(space.machine().primary_screen->time_until_pos(vidc_regs[0xb4])); | |
995 | 995 | } |
996 | 996 | |
997 | 997 | if ((data>>11)&1) |
r17963 | r17964 | |
1088 | 1088 | // now go ahead and set the mapping in the page table |
1089 | 1089 | memc_pages[log] = phys + (memc*0x80); |
1090 | 1090 | |
1091 | // printf("PC=%08x = MEMC_PAGE(%d): W %08x: log %x to phys %x, MEMC %d, perms %d\n", space | |
1091 | // printf("PC=%08x = MEMC_PAGE(%d): W %08x: log %x to phys %x, MEMC %d, perms %d\n", space.device().safe_pc(),memc_pagesize, data, log, phys, memc, perms); | |
1092 | 1092 | } |
1093 | 1093 |
r17963 | r17964 | |
---|---|---|
319 | 319 | DRIVER_INIT_MEMBER(galaxold_state,moonqsr) |
320 | 320 | { |
321 | 321 | offs_t i; |
322 | address_space | |
322 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
323 | 323 | UINT8 *rom = machine().root_device().memregion("maincpu")->base(); |
324 | 324 | UINT8 *decrypt = auto_alloc_array(machine(), UINT8, 0x8000); |
325 | 325 | |
326 | space | |
326 | space.set_decrypted_region(0x0000, 0x7fff, decrypt); | |
327 | 327 | |
328 | 328 | for (i = 0;i < 0x8000;i++) |
329 | 329 | decrypt[i] = decode_mooncrst(rom[i],i); |
r17963 | r17964 | |
397 | 397 | |
398 | 398 | DRIVER_INIT_MEMBER(galaxold_state,4in1) |
399 | 399 | { |
400 | address_space | |
400 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
401 | 401 | offs_t i, len = memregion("maincpu")->bytes(); |
402 | 402 | UINT8 *RAM = memregion("maincpu")->base(); |
403 | 403 | |
r17963 | r17964 | |
408 | 408 | /* games are banked at 0x0000 - 0x3fff */ |
409 | 409 | membank("bank1")->configure_entries(0, 4, &RAM[0x10000], 0x4000); |
410 | 410 | |
411 | _4in1_bank_w( | |
411 | _4in1_bank_w(space, 0, 0); /* set the initial CPU bank */ | |
412 | 412 | |
413 | 413 | state_save_register_global(machine(), m__4in1_bank); |
414 | 414 | } |
r17963 | r17964 | |
---|---|---|
411 | 411 | |
412 | 412 | READ8_HANDLER( slikz80_port_r ) |
413 | 413 | { |
414 | itech8_state *state = space | |
414 | itech8_state *state = space.machine().driver_data<itech8_state>(); | |
415 | 415 | int result = 0; |
416 | 416 | |
417 | 417 | /* if we have nothing, return 0x03 */ |
r17963 | r17964 | |
442 | 442 | |
443 | 443 | WRITE8_HANDLER( slikz80_port_w ) |
444 | 444 | { |
445 | itech8_state *state = space | |
445 | itech8_state *state = space.machine().driver_data<itech8_state>(); | |
446 | 446 | state->m_z80_port_val = data; |
447 | 447 | state->m_z80_clear_to_send = 0; |
448 | 448 | } |
r17963 | r17964 | |
457 | 457 | |
458 | 458 | READ8_HANDLER( slikshot_z80_r ) |
459 | 459 | { |
460 | itech8_state *state = space | |
460 | itech8_state *state = space.machine().driver_data<itech8_state>(); | |
461 | 461 | /* allow the Z80 to send us stuff now */ |
462 | 462 | state->m_z80_clear_to_send = 1; |
463 | 463 | return state->m_z80_port_val; |
r17963 | r17964 | |
473 | 473 | |
474 | 474 | READ8_HANDLER( slikshot_z80_control_r ) |
475 | 475 | { |
476 | itech8_state *state = space | |
476 | itech8_state *state = space.machine().driver_data<itech8_state>(); | |
477 | 477 | return state->m_z80_ctrl; |
478 | 478 | } |
479 | 479 | |
r17963 | r17964 | |
513 | 513 | |
514 | 514 | WRITE8_HANDLER( slikshot_z80_control_w ) |
515 | 515 | { |
516 | space | |
516 | space.machine().scheduler().synchronize(FUNC(delayed_z80_control_w), data); | |
517 | 517 | } |
518 | 518 | |
519 | 519 |
r17963 | r17964 | |
---|---|---|
120 | 120 | |
121 | 121 | |
122 | 122 | |
123 | UINT16 gaelco_decrypt(address_space | |
123 | UINT16 gaelco_decrypt(address_space &space, int offset, int data, int param1, int param2) | |
124 | 124 | { |
125 | 125 | static int lastpc, lastoffset, lastencword, lastdecword; |
126 | 126 | |
127 | int thispc = space | |
127 | int thispc = space.device().safe_pc(); | |
128 | 128 | // int savedata = data; |
129 | 129 | |
130 | 130 | /* check if 2nd half of 32 bit */ |
r17963 | r17964 | |
146 | 146 | |
147 | 147 | lastdecword = data; |
148 | 148 | |
149 | // logerror("%s : data1 = %4x > %4x @ %8x\n",space | |
149 | // logerror("%s : data1 = %4x > %4x @ %8x\n",space.machine().describe_context(),savedata,data,lastoffset); | |
150 | 150 | } |
151 | 151 | return data; |
152 | 152 | } |
r17963 | r17964 | |
---|---|---|
456 | 456 | static void williams2_postload(running_machine &machine) |
457 | 457 | { |
458 | 458 | williams_state *state = machine.driver_data<williams_state>(); |
459 | address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); | |
460 | state->williams2_bank_select_w(*space, 0, state->m_vram_bank); | |
459 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
460 | state->williams2_bank_select_w(space, 0, state->m_vram_bank); | |
461 | 461 | } |
462 | 462 | |
463 | 463 | |
r17963 | r17964 | |
475 | 475 | |
476 | 476 | MACHINE_RESET_MEMBER(williams_state,williams2) |
477 | 477 | { |
478 | address_space | |
478 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
479 | 479 | |
480 | 480 | /* make sure our banking is reset */ |
481 | williams2_bank_select_w( | |
481 | williams2_bank_select_w(space, 0, 0); | |
482 | 482 | |
483 | 483 | /* set a timer to go off every 16 scanlines, to toggle the VA11 line and update the screen */ |
484 | 484 | timer_device *scan_timer = machine().device<timer_device>("scan_timer"); |
r17963 | r17964 | |
759 | 759 | static void defender_postload(running_machine &machine) |
760 | 760 | { |
761 | 761 | williams_state *state = machine.driver_data<williams_state>(); |
762 | address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); | |
763 | state->defender_bank_select_w(*space, 0, state->m_vram_bank); | |
762 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
763 | state->defender_bank_select_w(space, 0, state->m_vram_bank); | |
764 | 764 | } |
765 | 765 | |
766 | 766 | |
r17963 | r17964 | |
777 | 777 | |
778 | 778 | MACHINE_RESET_MEMBER(williams_state,defender) |
779 | 779 | { |
780 | address_space | |
780 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
781 | 781 | |
782 | 782 | MACHINE_RESET_CALL_MEMBER(williams_common); |
783 | 783 | |
784 | defender_bank_select_w( | |
784 | defender_bank_select_w(space, 0, 0); | |
785 | 785 | } |
786 | 786 | |
787 | 787 | |
r17963 | r17964 | |
800 | 800 | { |
801 | 801 | /* page 0 is I/O &space */ |
802 | 802 | case 0: |
803 | defender_install_io_space( | |
803 | defender_install_io_space(space); | |
804 | 804 | break; |
805 | 805 | |
806 | 806 | /* pages 1-9 map to ROM banks */ |
r17963 | r17964 | |
---|---|---|
83 | 83 | { |
84 | 84 | cc_port = data; |
85 | 85 | |
86 | coin_lockout_w(space->machine(), 1, data & 0x08); | |
87 | coin_lockout_w(space->machine(), 0, data & 0x04); | |
88 | coin_counter_w(space->machine(), 1, data & 0x02); | |
89 | coin_counter_w(space->machine(), 0, data & 0x01); | |
86 | coin_lockout_w(space.machine(), 1, data & 0x08); | |
87 | coin_lockout_w(space.machine(), 0, data & 0x04); | |
88 | coin_counter_w(space.machine(), 1, data & 0x02); | |
89 | coin_counter_w(space.machine(), 0, data & 0x01); | |
90 | 90 | } |
91 | 91 | else |
92 | 92 | { |
93 | logerror("cchip1_w pc: %06x bank %02x offset %04x: %02x\n",space | |
93 | logerror("cchip1_w pc: %06x bank %02x offset %04x: %02x\n",space.device().safe_pc(),current_bank,offset,data); | |
94 | 94 | } |
95 | 95 | } |
96 | 96 | |
r17963 | r17964 | |
117 | 117 | { |
118 | 118 | switch (offset) |
119 | 119 | { |
120 | case 0x00: return space->machine().root_device().ioport("IN0")->read(); /* Player 1 controls + START1 */ | |
121 | case 0x01: return space->machine().root_device().ioport("IN1")->read(); /* Player 2 controls + START2 */ | |
122 | case 0x02: return space->machine().root_device().ioport("IN2")->read(); /* COINn + SERVICE1 + TILT */ | |
120 | case 0x00: return space.machine().root_device().ioport("IN0")->read(); /* Player 1 controls + START1 */ | |
121 | case 0x01: return space.machine().root_device().ioport("IN1")->read(); /* Player 2 controls + START2 */ | |
122 | case 0x02: return space.machine().root_device().ioport("IN2")->read(); /* COINn + SERVICE1 + TILT */ | |
123 | 123 | case 0x03: return cc_port; |
124 | 124 | } |
125 | 125 | } |
r17963 | r17964 | |
---|---|---|
209 | 209 | int rombank; |
210 | 210 | |
211 | 211 | /* get top 8 bits of the I/O port address */ |
212 | offset = (offset << 8) | (space | |
212 | offset = (offset << 8) | (space.device().state().state_int(Z80_BC) >> 8); | |
213 | 213 | |
214 | 214 | switch (nb1413m3_type) |
215 | 215 | { |
r17963 | r17964 | |
296 | 296 | popmessage("Sound ROM %02X:%05X [B1:%02X B2:%02X]", rombank, offset, nb1413m3_sndrombank1, nb1413m3_sndrombank2); |
297 | 297 | #endif |
298 | 298 | |
299 | if (offset < space->machine().root_device().memregion(nb1413m3_sndromrgntag)->bytes()) | |
300 | return space->machine().root_device().memregion(nb1413m3_sndromrgntag)->base()[offset]; | |
299 | if (offset < space.machine().root_device().memregion(nb1413m3_sndromrgntag)->bytes()) | |
300 | return space.machine().root_device().memregion(nb1413m3_sndromrgntag)->base()[offset]; | |
301 | 301 | else |
302 | 302 | { |
303 | 303 | popmessage("read past sound ROM length (%05x[%02X])",offset, rombank); |
r17963 | r17964 | |
320 | 320 | |
321 | 321 | READ8_HANDLER( nb1413m3_gfxrom_r ) |
322 | 322 | { |
323 | UINT8 *GFXROM = space | |
323 | UINT8 *GFXROM = space.machine().root_device().memregion("gfx1")->base(); | |
324 | 324 | |
325 | 325 | return GFXROM[(0x20000 * (nb1413m3_gfxrombank | ((nb1413m3_sndrombank1 & 0x02) << 3))) + ((0x0200 * nb1413m3_gfxradr_h) + (0x0002 * nb1413m3_gfxradr_l)) + (offset & 0x01)]; |
326 | 326 | } |
r17963 | r17964 | |
363 | 363 | |
364 | 364 | READ8_HANDLER( nb1413m3_inputport0_r ) |
365 | 365 | { |
366 | return ((space | |
366 | return ((space.machine().root_device().ioport("SYSTEM")->read() & 0xfd) | ((nb1413m3_outcoin_flag & 0x01) << 1)); | |
367 | 367 | } |
368 | 368 | |
369 | 369 | READ8_HANDLER( nb1413m3_inputport1_r ) |
370 | 370 | { |
371 | device_t &root = space | |
371 | device_t &root = space.machine().root_device(); | |
372 | 372 | switch (nb1413m3_type) |
373 | 373 | { |
374 | 374 | case NB1413M3_HYHOO: |
r17963 | r17964 | |
420 | 420 | |
421 | 421 | READ8_HANDLER( nb1413m3_inputport2_r ) |
422 | 422 | { |
423 | device_t &root = space | |
423 | device_t &root = space.machine().root_device(); | |
424 | 424 | switch (nb1413m3_type) |
425 | 425 | { |
426 | 426 | case NB1413M3_HYHOO: |
r17963 | r17964 | |
495 | 495 | |
496 | 496 | READ8_HANDLER( nb1413m3_dipsw1_r ) |
497 | 497 | { |
498 | device_t &root = space | |
498 | device_t &root = space.machine().root_device(); | |
499 | 499 | switch (nb1413m3_type) |
500 | 500 | { |
501 | 501 | case NB1413M3_KANATUEN: |
r17963 | r17964 | |
533 | 533 | ((root.ioport("DSWA")->read() & 0x01) << 4) | ((root.ioport("DSWA")->read() & 0x04) << 3) | |
534 | 534 | ((root.ioport("DSWA")->read() & 0x10) << 2) | ((root.ioport("DSWA")->read() & 0x40) << 1)); |
535 | 535 | default: |
536 | return space | |
536 | return space.machine().root_device().ioport("DSWA")->read(); | |
537 | 537 | } |
538 | 538 | } |
539 | 539 | |
540 | 540 | READ8_HANDLER( nb1413m3_dipsw2_r ) |
541 | 541 | { |
542 | device_t &root = space | |
542 | device_t &root = space.machine().root_device(); | |
543 | 543 | switch (nb1413m3_type) |
544 | 544 | { |
545 | 545 | case NB1413M3_KANATUEN: |
r17963 | r17964 | |
577 | 577 | ((root.ioport("DSWA")->read() & 0x02) << 3) | ((root.ioport("DSWA")->read() & 0x08) << 2) | |
578 | 578 | ((root.ioport("DSWA")->read() & 0x20) << 1) | ((root.ioport("DSWA")->read() & 0x80) << 0)); |
579 | 579 | default: |
580 | return space | |
580 | return space.machine().root_device().ioport("DSWB")->read(); | |
581 | 581 | } |
582 | 582 | } |
583 | 583 | |
584 | 584 | READ8_HANDLER( nb1413m3_dipsw3_l_r ) |
585 | 585 | { |
586 | return ((space | |
586 | return ((space.machine().root_device().ioport("DSWC")->read() & 0xf0) >> 4); | |
587 | 587 | } |
588 | 588 | |
589 | 589 | READ8_HANDLER( nb1413m3_dipsw3_h_r ) |
590 | 590 | { |
591 | return ((space | |
591 | return ((space.machine().root_device().ioport("DSWC")->read() & 0x0f) >> 0); | |
592 | 592 | } |
593 | 593 | |
594 | 594 | WRITE8_HANDLER( nb1413m3_outcoin_w ) |
r17963 | r17964 | |
629 | 629 | break; |
630 | 630 | } |
631 | 631 | |
632 | set_led_status(space | |
632 | set_led_status(space.machine(), 2, nb1413m3_outcoin_flag); // out coin | |
633 | 633 | } |
634 | 634 | |
635 | 635 | WRITE8_HANDLER( nb1413m3_vcrctrl_w ) |
r17963 | r17964 | |
637 | 637 | if (data & 0x08) |
638 | 638 | { |
639 | 639 | popmessage(" ** VCR CONTROL ** "); |
640 | set_led_status(space | |
640 | set_led_status(space.machine(), 2, 1); | |
641 | 641 | } |
642 | 642 | else |
643 | 643 | { |
644 | set_led_status(space | |
644 | set_led_status(space.machine(), 2, 0); | |
645 | 645 | } |
646 | 646 | } |
647 | 647 |
r17963 | r17964 | |
---|---|---|
20 | 20 | |
21 | 21 | WRITE16_MEMBER(wrally_state::wrally_vram_w) |
22 | 22 | { |
23 | data = gaelco_decrypt( | |
23 | data = gaelco_decrypt(space, offset, data, 0x1f, 0x522a); | |
24 | 24 | COMBINE_DATA(&m_videoram[offset]); |
25 | 25 | |
26 | 26 | m_pant[(offset & 0x1fff) >> 12]->mark_tile_dirty(((offset << 1) & 0x1fff) >> 2); |
r17963 | r17964 | |
---|---|---|
1607 | 1607 | |
1608 | 1608 | static WRITE16_HANDLER( seibu_common_video_regs_w ) |
1609 | 1609 | { |
1610 | legionna_state *state = space | |
1610 | legionna_state *state = space.machine().driver_data<legionna_state>(); | |
1611 | 1611 | COMBINE_DATA(&seibu_vregs[offset]); |
1612 | 1612 | |
1613 | 1613 | switch(offset) |
r17963 | r17964 | |
1749 | 1749 | |
1750 | 1750 | READ16_HANDLER( copdxbl_0_r ) |
1751 | 1751 | { |
1752 | get_ram(space | |
1752 | get_ram(space.machine()); | |
1753 | 1753 | UINT16 retvalue = cop_mcu_ram[offset]; |
1754 | 1754 | |
1755 | 1755 | switch(offset) |
1756 | 1756 | { |
1757 | 1757 | default: |
1758 | 1758 | { |
1759 | logerror("%06x: COPX unhandled read returning %04x from offset %04x\n", space | |
1759 | logerror("%06x: COPX unhandled read returning %04x from offset %04x\n", space.device().safe_pc(), retvalue, offset*2); | |
1760 | 1760 | return retvalue; |
1761 | 1761 | } |
1762 | 1762 | |
r17963 | r17964 | |
1765 | 1765 | //case (0x5b4/2): |
1766 | 1766 | // return cop_mcu_ram[offset]; |
1767 | 1767 | |
1768 | case (0x700/2): return space->machine().root_device().ioport("DSW1")->read(); | |
1769 | case (0x704/2): return space->machine().root_device().ioport("PLAYERS12")->read(); | |
1770 | case (0x708/2): return space->machine().root_device().ioport("PLAYERS34")->read(); | |
1771 | case (0x70c/2): return space->machine().root_device().ioport("SYSTEM")->read(); | |
1772 | case (0x71c/2): return space->machine().root_device().ioport("DSW2")->read(); | |
1768 | case (0x700/2): return space.machine().root_device().ioport("DSW1")->read(); | |
1769 | case (0x704/2): return space.machine().root_device().ioport("PLAYERS12")->read(); | |
1770 | case (0x708/2): return space.machine().root_device().ioport("PLAYERS34")->read(); | |
1771 | case (0x70c/2): return space.machine().root_device().ioport("SYSTEM")->read(); | |
1772 | case (0x71c/2): return space.machine().root_device().ioport("DSW2")->read(); | |
1773 | 1773 | } |
1774 | 1774 | } |
1775 | 1775 | |
1776 | 1776 | WRITE16_HANDLER( copdxbl_0_w ) |
1777 | 1777 | { |
1778 | legionna_state *state = space->machine().driver_data<legionna_state>(); | |
1779 | get_ram(space->machine()); | |
1778 | legionna_state *state = space.machine().driver_data<legionna_state>(); | |
1779 | get_ram(space.machine()); | |
1780 | 1780 | COMBINE_DATA(&cop_mcu_ram[offset]); |
1781 | 1781 | |
1782 | 1782 | switch(offset) |
1783 | 1783 | { |
1784 | 1784 | default: |
1785 | 1785 | { |
1786 | logerror("%06x: COPX unhandled write data %04x at offset %04x\n", space | |
1786 | logerror("%06x: COPX unhandled write data %04x at offset %04x\n", space.device().safe_pc(), data, offset*2); | |
1787 | 1787 | break; |
1788 | 1788 | } |
1789 | 1789 | |
r17963 | r17964 | |
1799 | 1799 | |
1800 | 1800 | case (0x740/2): |
1801 | 1801 | { |
1802 | state->soundlatch_byte_w(*space, 0, data & 0xff); | |
1803 | space->machine().device("audiocpu")->execute().set_input_line(INPUT_LINE_NMI, PULSE_LINE ); | |
1802 | state->soundlatch_byte_w(space, 0, data & 0xff); | |
1803 | space.machine().device("audiocpu")->execute().set_input_line(INPUT_LINE_NMI, PULSE_LINE ); | |
1804 | 1804 | break; |
1805 | 1805 | } |
1806 | 1806 | } |
r17963 | r17964 | |
1908 | 1908 | static READ16_HANDLER( generic_cop_r ) |
1909 | 1909 | { |
1910 | 1910 | UINT16 retvalue; |
1911 | get_ram(space | |
1911 | get_ram(space.machine()); | |
1912 | 1912 | retvalue = cop_mcu_ram[offset]; |
1913 | 1913 | |
1914 | 1914 | |
r17963 | r17964 | |
1952 | 1952 | case 0x1a2/2: |
1953 | 1953 | case 0x1a4/2: |
1954 | 1954 | case 0x1a6/2: |
1955 | return space | |
1955 | return space.machine().firstcpu->total_cycles() % (cop_rng_max_value+1); | |
1956 | 1956 | |
1957 | 1957 | case 0x1b0/2: |
1958 | 1958 | return cop_status; |
r17963 | r17964 | |
1964 | 1964 | return cop_angle; |
1965 | 1965 | |
1966 | 1966 | default: |
1967 | seibu_cop_log("%06x: COPX unhandled read returning %04x from offset %04x\n", space | |
1967 | seibu_cop_log("%06x: COPX unhandled read returning %04x from offset %04x\n", space.device().safe_pc(), retvalue, offset*2); | |
1968 | 1968 | return retvalue; |
1969 | 1969 | } |
1970 | 1970 | } |
r17963 | r17964 | |
1978 | 1978 | static WRITE16_HANDLER( generic_cop_w ) |
1979 | 1979 | { |
1980 | 1980 | UINT32 temp32; |
1981 | get_ram(space | |
1981 | get_ram(space.machine()); | |
1982 | 1982 | |
1983 | 1983 | switch (offset) |
1984 | 1984 | { |
1985 | 1985 | default: |
1986 | seibu_cop_log("%06x: COPX unhandled write data %04x at offset %04x\n", space | |
1986 | seibu_cop_log("%06x: COPX unhandled write data %04x at offset %04x\n", space.device().safe_pc(), data, offset*2); | |
1987 | 1987 | break; |
1988 | 1988 | |
1989 | 1989 | /* Sprite DMA */ |
r17963 | r17964 | |
2051 | 2051 | break; |
2052 | 2052 | |
2053 | 2053 | /* Command tables for 0x500 / 0x502 commands */ |
2054 | case (0x032/2): { copd2_set_tabledata(space->machine(), data); break; } | |
2055 | case (0x034/2): { copd2_set_tableoffset(space->machine(), data); break; } | |
2054 | case (0x032/2): { copd2_set_tabledata(space.machine(), data); break; } | |
2055 | case (0x034/2): { copd2_set_tableoffset(space.machine(), data); break; } | |
2056 | 2056 | case (0x038/2): { cop_438 = data; break; } |
2057 | 2057 | case (0x03a/2): { cop_43a = data; break; } |
2058 | 2058 | case (0x03c/2): { cop_43c = data; break; } |
r17963 | r17964 | |
2090 | 2090 | case (0x078/2): /* DMA source address */ |
2091 | 2091 | { |
2092 | 2092 | cop_dma_src[cop_dma_trigger] = data; // << 6 to get actual address |
2093 | //seibu_cop_log("%06x: COPX set layer clear address to %04x (actual %08x)\n", space | |
2093 | //seibu_cop_log("%06x: COPX set layer clear address to %04x (actual %08x)\n", space.device().safe_pc(), data, data<<6); | |
2094 | 2094 | break; |
2095 | 2095 | } |
2096 | 2096 | |
2097 | 2097 | case (0x07a/2): /* DMA length */ |
2098 | 2098 | { |
2099 | 2099 | cop_dma_size[cop_dma_trigger] = data; |
2100 | //seibu_cop_log("%06x: COPX set layer clear length to %04x (actual %08x)\n", space | |
2100 | //seibu_cop_log("%06x: COPX set layer clear length to %04x (actual %08x)\n", space.device().safe_pc(), data, data<<5); | |
2101 | 2101 | break; |
2102 | 2102 | } |
2103 | 2103 | |
2104 | 2104 | case (0x07c/2): /* DMA destination */ |
2105 | 2105 | { |
2106 | 2106 | cop_dma_dst[cop_dma_trigger] = data; |
2107 | //seibu_cop_log("%06x: COPX set layer clear value to %04x (actual %08x)\n", space | |
2107 | //seibu_cop_log("%06x: COPX set layer clear value to %04x (actual %08x)\n", space.device().safe_pc(), data, data<<6); | |
2108 | 2108 | break; |
2109 | 2109 | } |
2110 | 2110 | |
2111 | 2111 | case (0x07e/2): /* DMA parameter */ |
2112 | 2112 | { |
2113 | 2113 | cop_dma_trigger = data; |
2114 | //seibu_cop_log("%06x: COPX set layer clear trigger? to %04x\n", space | |
2114 | //seibu_cop_log("%06x: COPX set layer clear trigger? to %04x\n", space.device().safe_pc(), data); | |
2115 | 2115 | if (data>=0x1ff) |
2116 | 2116 | { |
2117 | 2117 | seibu_cop_log("invalid DMA trigger!, >0x1ff\n"); |
r17963 | r17964 | |
2161 | 2161 | int command; |
2162 | 2162 | |
2163 | 2163 | #if LOG_CMDS |
2164 | seibu_cop_log("%06x: COPX execute table macro command %04x %04x | regs %08x %08x %08x %08x %08x\n", space | |
2164 | seibu_cop_log("%06x: COPX execute table macro command %04x %04x | regs %08x %08x %08x %08x %08x\n", space.device().safe_pc(), data, cop_mcu_ram[offset], cop_register[0], cop_register[1], cop_register[2], cop_register[3], cop_register[4]); | |
2165 | 2165 | #endif |
2166 | 2166 | |
2167 | 2167 | command = -1; |
r17963 | r17964 | |
2230 | 2230 | |
2231 | 2231 | /* TODO: 0x1c operation? */ |
2232 | 2232 | |
2233 | space | |
2233 | space.write_dword(cop_register[0] + 0x04 + offs, space.read_dword(cop_register[0] + 0x04 + offs) + space.read_dword(cop_register[0] + 0x10 + offs)); | |
2234 | 2234 | return; |
2235 | 2235 | } |
2236 | 2236 | |
r17963 | r17964 | |
2245 | 2245 | /* add 0x10 + offs */ |
2246 | 2246 | /* write 0x10 + offs */ |
2247 | 2247 | |
2248 | space | |
2248 | space.write_dword(cop_register[0] + 0x10 + offs, space.read_dword(cop_register[0] + 0x10 + offs) + space.read_dword(cop_register[0] + 0x28 + offs)); | |
2249 | 2249 | return; |
2250 | 2250 | } |
2251 | 2251 | |
r17963 | r17964 | |
2263 | 2263 | */ |
2264 | 2264 | if(COP_CMD(0xb9a,0xb88,0x888,0x000,0x000,0x000,0x000,0x000,7,0xfdfb)) |
2265 | 2265 | { |
2266 | int raw_angle = (space | |
2266 | int raw_angle = (space.read_word(cop_register[0]+(0x34^2)) & 0xff); | |
2267 | 2267 | double angle = raw_angle * M_PI / 128; |
2268 | double amp = (65536 >> 5)*(space | |
2268 | double amp = (65536 >> 5)*(space.read_word(cop_register[0]+(0x36^2)) & 0xff); | |
2269 | 2269 | int res; |
2270 | 2270 | |
2271 | 2271 | /* TODO: up direction, why? */ |
r17963 | r17964 | |
2274 | 2274 | |
2275 | 2275 | res = int(amp*sin(angle)) << cop_scale; |
2276 | 2276 | |
2277 | space | |
2277 | space.write_dword(cop_register[0] + 0x10, res); | |
2278 | 2278 | return; |
2279 | 2279 | } |
2280 | 2280 | |
r17963 | r17964 | |
2292 | 2292 | */ |
2293 | 2293 | if(COP_CMD(0xb9a,0xb8a,0x88a,0x000,0x000,0x000,0x000,0x000,7,0xfdfb)) |
2294 | 2294 | { |
2295 | int raw_angle = (space | |
2295 | int raw_angle = (space.read_word(cop_register[0]+(0x34^2)) & 0xff); | |
2296 | 2296 | double angle = raw_angle * M_PI / 128; |
2297 | double amp = (65536 >> 5)*(space | |
2297 | double amp = (65536 >> 5)*(space.read_word(cop_register[0]+(0x36^2)) & 0xff); | |
2298 | 2298 | int res; |
2299 | 2299 | |
2300 | 2300 | /* TODO: left direction, why? */ |
r17963 | r17964 | |
2303 | 2303 | |
2304 | 2304 | res = int(amp*cos(angle)) << cop_scale; |
2305 | 2305 | |
2306 | space | |
2306 | space.write_dword(cop_register[0] + 20, res); | |
2307 | 2307 | return; |
2308 | 2308 | } |
2309 | 2309 | |
2310 | 2310 | /* 0x130e / 0x138e */ |
2311 | 2311 | if(COP_CMD(0x984,0xaa4,0xd82,0xaa2,0x39b,0xb9a,0xb9a,0xa9a,5,0xbf7f)) |
2312 | 2312 | { |
2313 | int dy = space->read_dword(cop_register[1]+4) - space->read_dword(cop_register[0]+4); | |
2314 | int dx = space->read_dword(cop_register[1]+8) - space->read_dword(cop_register[0]+8); | |
2313 | int dy = space.read_dword(cop_register[1]+4) - space.read_dword(cop_register[0]+4); | |
2314 | int dx = space.read_dword(cop_register[1]+8) - space.read_dword(cop_register[0]+8); | |
2315 | 2315 | |
2316 | 2316 | cop_status = 7; |
2317 | 2317 | if(!dx) { |
r17963 | r17964 | |
2326 | 2326 | //printf("%d %d %f %04x\n",dx,dy,atan(double(dy)/double(dx)) * 128 / M_PI,cop_angle); |
2327 | 2327 | |
2328 | 2328 | if(cop_mcu_ram[offset] & 0x80) |
2329 | space | |
2329 | space.write_word(cop_register[0]+(0x34^2), cop_angle); | |
2330 | 2330 | return; |
2331 | 2331 | } |
2332 | 2332 | |
r17963 | r17964 | |
2334 | 2334 | //(heatbrl) | 5 | bf7f | 138e | 984 aa4 d82 aa2 39b b9a b9a b9a |
2335 | 2335 | if(COP_CMD(0x984,0xaa4,0xd82,0xaa2,0x39b,0xb9a,0xb9a,0xb9a,5,0xbf7f)) |
2336 | 2336 | { |
2337 | int dy = space->read_dword(cop_register[1]+4) - space->read_dword(cop_register[0]+4); | |
2338 | int dx = space->read_dword(cop_register[1]+8) - space->read_dword(cop_register[0]+8); | |
2337 | int dy = space.read_dword(cop_register[1]+4) - space.read_dword(cop_register[0]+4); | |
2338 | int dx = space.read_dword(cop_register[1]+8) - space.read_dword(cop_register[0]+8); | |
2339 | 2339 | |
2340 | 2340 | cop_status = 7; |
2341 | 2341 | if(!dx) { |
r17963 | r17964 | |
2351 | 2351 | r1 = dx; |
2352 | 2352 | |
2353 | 2353 | if(cop_mcu_ram[offset] & 0x80) |
2354 | space | |
2354 | space.write_word(cop_register[0]+(0x34^2), cop_angle); | |
2355 | 2355 | return; |
2356 | 2356 | } |
2357 | 2357 | |
r17963 | r17964 | |
2373 | 2373 | cop_dist = sqrt((double)(dx*dx+dy*dy)); |
2374 | 2374 | |
2375 | 2375 | if(cop_mcu_ram[offset] & 0x80) |
2376 | space | |
2376 | space.write_word(cop_register[0]+(0x38^2), cop_dist); | |
2377 | 2377 | return; |
2378 | 2378 | } |
2379 | 2379 | |
r17963 | r17964 | |
2391 | 2391 | /* TODO: this is WRONG! */ |
2392 | 2392 | if(COP_CMD(0xf9a,0xb9a,0xb9c,0xb9c,0xb9c,0x29c,0x000,0x000,5,0xfcdd)) |
2393 | 2393 | { |
2394 | int div = space | |
2394 | int div = space.read_word(cop_register[0]+(0x36^2)); | |
2395 | 2395 | int res; |
2396 | 2396 | |
2397 | 2397 | if(!div) |
r17963 | r17964 | |
2400 | 2400 | div = 1; |
2401 | 2401 | } |
2402 | 2402 | |
2403 | res = space | |
2403 | res = space.read_word(cop_register[0]+(0x38^2)) / div; | |
2404 | 2404 | res <<= cop_scale + 2; /* TODO: check this */ |
2405 | 2405 | |
2406 | space | |
2406 | space.write_word(cop_register[0]+(0x38^2), res); | |
2407 | 2407 | return; |
2408 | 2408 | } |
2409 | 2409 | |
2410 | 2410 | /* |
2411 | 2411 | collision detection: |
2412 | 2412 | |
2413 | int dy_0 = space->read_dword(cop_register[0]+4); | |
2414 | int dx_0 = space->read_dword(cop_register[0]+8); | |
2415 | int dy_1 = space->read_dword(cop_register[1]+4); | |
2416 | int dx_1 = space->read_dword(cop_register[1]+8); | |
2417 | int hitbox_param1 = space->read_dword(cop_register[2]); | |
2418 | int hitbox_param2 = space->read_dword(cop_register[3]); | |
2413 | int dy_0 = space.read_dword(cop_register[0]+4); | |
2414 | int dx_0 = space.read_dword(cop_register[0]+8); | |
2415 | int dy_1 = space.read_dword(cop_register[1]+4); | |
2416 | int dx_1 = space.read_dword(cop_register[1]+8); | |
2417 | int hitbox_param1 = space.read_dword(cop_register[2]); | |
2418 | int hitbox_param2 = space.read_dword(cop_register[3]); | |
2419 | 2419 | |
2420 | 2420 | TODO: we are ignoring the u1 / u2 params for now |
2421 | 2421 | */ |
2422 | 2422 | |
2423 | 2423 | if(COP_CMD(0xb80,0xb82,0xb84,0xb86,0x000,0x000,0x000,0x000,u1,u2)) |
2424 | 2424 | { |
2425 | cop_collision_info[0].y = (space->read_dword(cop_register[0]+4)); | |
2426 | cop_collision_info[0].x = (space->read_dword(cop_register[0]+8)); | |
2425 | cop_collision_info[0].y = (space.read_dword(cop_register[0]+4)); | |
2426 | cop_collision_info[0].x = (space.read_dword(cop_register[0]+8)); | |
2427 | 2427 | return; |
2428 | 2428 | } |
2429 | 2429 | |
2430 | 2430 | //(heatbrl) | 9 | ffff | b080 | b40 bc0 bc2 |
2431 | 2431 | if(COP_CMD(0xb40,0xbc0,0xbc2,0x000,0x000,0x000,0x000,0x000,u1,u2)) |
2432 | 2432 | { |
2433 | cop_collision_info[0].hitbox = space->read_word(cop_register[2]); | |
2434 | cop_collision_info[0].hitbox_y = space->read_word((cop_register[2]&0xffff0000)|(cop_collision_info[0].hitbox)); | |
2435 | cop_collision_info[0].hitbox_x = space->read_word(((cop_register[2]&0xffff0000)|(cop_collision_info[0].hitbox))+2); | |
2433 | cop_collision_info[0].hitbox = space.read_word(cop_register[2]); | |
2434 | cop_collision_info[0].hitbox_y = space.read_word((cop_register[2]&0xffff0000)|(cop_collision_info[0].hitbox)); | |
2435 | cop_collision_info[0].hitbox_x = space.read_word(((cop_register[2]&0xffff0000)|(cop_collision_info[0].hitbox))+2); | |
2436 | 2436 | |
2437 | 2437 | /* do the math */ |
2438 | 2438 | cop_take_hit_box_params(0); |
2439 | cop_hit_status = cop_calculate_collsion_detection(space | |
2439 | cop_hit_status = cop_calculate_collsion_detection(space.machine()); | |
2440 | 2440 | |
2441 | 2441 | return; |
2442 | 2442 | } |
2443 | 2443 | |
2444 | 2444 | if(COP_CMD(0xba0,0xba2,0xba4,0xba6,0x000,0x000,0x000,0x000,u1,u2)) |
2445 | 2445 | { |
2446 | cop_collision_info[1].y = (space->read_dword(cop_register[1]+4)); | |
2447 | cop_collision_info[1].x = (space->read_dword(cop_register[1]+8)); | |
2446 | cop_collision_info[1].y = (space.read_dword(cop_register[1]+4)); | |
2447 | cop_collision_info[1].x = (space.read_dword(cop_register[1]+8)); | |
2448 | 2448 | return; |
2449 | 2449 | } |
2450 | 2450 | |
2451 | 2451 | //(heatbrl) | 6 | ffff | b880 | b60 be0 be2 |
2452 | 2452 | if(COP_CMD(0xb60,0xbe0,0xbe2,0x000,0x000,0x000,0x000,0x000,u1,u2)) |
2453 | 2453 | { |
2454 | cop_collision_info[1].hitbox = space->read_word(cop_register[3]); | |
2455 | cop_collision_info[1].hitbox_y = space->read_word((cop_register[3]&0xffff0000)|(cop_collision_info[1].hitbox)); | |
2456 | cop_collision_info[1].hitbox_x = space->read_word(((cop_register[3]&0xffff0000)|(cop_collision_info[1].hitbox))+2); | |
2454 | cop_collision_info[1].hitbox = space.read_word(cop_register[3]); | |
2455 | cop_collision_info[1].hitbox_y = space.read_word((cop_register[3]&0xffff0000)|(cop_collision_info[1].hitbox)); | |
2456 | cop_collision_info[1].hitbox_x = space.read_word(((cop_register[3]&0xffff0000)|(cop_collision_info[1].hitbox))+2); | |
2457 | 2457 | |
2458 | 2458 | /* do the math */ |
2459 | 2459 | cop_take_hit_box_params(1); |
2460 | cop_hit_status = cop_calculate_collsion_detection(space | |
2460 | cop_hit_status = cop_calculate_collsion_detection(space.machine()); | |
2461 | 2461 | return; |
2462 | 2462 | } |
2463 | 2463 | |
r17963 | r17964 | |
2470 | 2470 | offs = (offset & 3) * 4; |
2471 | 2471 | |
2472 | 2472 | /* TODO: I really suspect that following two are actually taken from the 0xa180 macro command then internally loaded */ |
2473 | abs_x = space->read_word(cop_register[0] + 8) - cop_sprite_dma_abs_x; | |
2474 | abs_y = space->read_word(cop_register[0] + 4) - cop_sprite_dma_abs_y; | |
2475 | rel_xy = space->read_word(cop_sprite_dma_src + 4 + offs); | |
2473 | abs_x = space.read_word(cop_register[0] + 8) - cop_sprite_dma_abs_x; | |
2474 | abs_y = space.read_word(cop_register[0] + 4) - cop_sprite_dma_abs_y; | |
2475 | rel_xy = space.read_word(cop_sprite_dma_src + 4 + offs); | |
2476 | 2476 | |
2477 | 2477 | //if(rel_xy & 0x0706) |
2478 | 2478 | // printf("sprite rel_xy = %04x\n",rel_xy); |
2479 | 2479 | |
2480 | 2480 | if(rel_xy & 1) |
2481 | space | |
2481 | space.write_word(cop_register[4] + offs + 4,0xc0 + abs_x - (rel_xy & 0xf8)); | |
2482 | 2482 | else |
2483 | space | |
2483 | space.write_word(cop_register[4] + offs + 4,(((rel_xy & 0x78) + (abs_x) - ((rel_xy & 0x80) ? 0x80 : 0)))); | |
2484 | 2484 | |
2485 | space | |
2485 | space.write_word(cop_register[4] + offs + 6,(((rel_xy & 0x7800) >> 8) + (abs_y) - ((rel_xy & 0x8000) ? 0x80 : 0))); | |
2486 | 2486 | return; |
2487 | 2487 | } |
2488 | 2488 | |
r17963 | r17964 | |
2493 | 2493 | |
2494 | 2494 | offs = (offset & 3) * 4; |
2495 | 2495 | |
2496 | space->write_word(cop_register[4] + offs + 0,space->read_word(cop_sprite_dma_src + offs) + (cop_sprite_dma_param & 0x3f)); | |
2497 | //space->write_word(cop_register[4] + offs + 2,space->read_word(cop_sprite_dma_src+2 + offs)); | |
2496 | space.write_word(cop_register[4] + offs + 0,space.read_word(cop_sprite_dma_src + offs) + (cop_sprite_dma_param & 0x3f)); | |
2497 | //space.write_word(cop_register[4] + offs + 2,space.read_word(cop_sprite_dma_src+2 + offs)); | |
2498 | 2498 | return; |
2499 | 2499 | } |
2500 | 2500 | |
r17963 | r17964 | |
2518 | 2518 | |
2519 | 2519 | offs = (offset & 3) * 4; |
2520 | 2520 | |
2521 | div = space->read_word(cop_register[4] + offs) + 1; | |
2522 | // offs_val = space->read_word(cop_register[3] + offs); | |
2521 | div = space.read_word(cop_register[4] + offs) + 1; | |
2522 | // offs_val = space.read_word(cop_register[3] + offs); | |
2523 | 2523 | //420 / 180 = 500 : 400 = 30 / 50 = 98 / 18 |
2524 | 2524 | |
2525 | 2525 | if(div == 0) { div = 1; } |
2526 | 2526 | |
2527 | space | |
2527 | space.write_word((cop_register[6] + offs + 4), ((space.read_word(cop_register[5] + offs + 4)) / div)); | |
2528 | 2528 | return; |
2529 | 2529 | } |
2530 | 2530 | |
r17963 | r17964 | |
2539 | 2539 | /* 0 [1] */ |
2540 | 2540 | /* 0xc [1] */ |
2541 | 2541 | |
2542 | cur_angle = space->read_byte(cop_register[1] + (0xc ^ 3)); | |
2543 | space->write_byte(cop_register[1] + (0^3),space->read_byte(cop_register[1] + (0^3)) & 0xfb); //correct? | |
2542 | cur_angle = space.read_byte(cop_register[1] + (0xc ^ 3)); | |
2543 | space.write_byte(cop_register[1] + (0^3),space.read_byte(cop_register[1] + (0^3)) & 0xfb); //correct? | |
2544 | 2544 | |
2545 | 2545 | if(cur_angle >= cop_angle_compare) |
2546 | 2546 | { |
r17963 | r17964 | |
2548 | 2548 | if(cur_angle <= cop_angle_compare) |
2549 | 2549 | { |
2550 | 2550 | cur_angle = cop_angle_compare; |
2551 | space | |
2551 | space.write_byte(cop_register[1] + (0^3),space.read_byte(cop_register[1] + (0^3)) | 2); | |
2552 | 2552 | } |
2553 | 2553 | } |
2554 | 2554 | else if(cur_angle <= cop_angle_compare) |
r17963 | r17964 | |
2557 | 2557 | if(cur_angle >= cop_angle_compare) |
2558 | 2558 | { |
2559 | 2559 | cur_angle = cop_angle_compare; |
2560 | space | |
2560 | space.write_byte(cop_register[1] + (0^3),space.read_byte(cop_register[1] + (0^3)) | 2); | |
2561 | 2561 | } |
2562 | 2562 | } |
2563 | 2563 | |
2564 | space | |
2564 | space.write_byte(cop_register[1] + (0xc ^ 3),cur_angle); | |
2565 | 2565 | return; |
2566 | 2566 | } |
2567 | 2567 | |
r17963 | r17964 | |
2572 | 2572 | { |
2573 | 2573 | INT8 cur_angle; |
2574 | 2574 | |
2575 | cur_angle = space->read_byte(cop_register[0] + (0x34 ^ 3)); | |
2576 | //space->write_byte(cop_register[0] + (0^3),space->read_byte(cop_register[0] + (0^3)) & 0xfb); //correct? | |
2575 | cur_angle = space.read_byte(cop_register[0] + (0x34 ^ 3)); | |
2576 | //space.write_byte(cop_register[0] + (0^3),space.read_byte(cop_register[0] + (0^3)) & 0xfb); //correct? | |
2577 | 2577 | |
2578 | 2578 | if(cur_angle >= cop_angle_compare) |
2579 | 2579 | { |
r17963 | r17964 | |
2582 | 2582 | if(cur_angle <= cop_angle_compare) |
2583 | 2583 | { |
2584 | 2584 | cur_angle = cop_angle_compare; |
2585 | //space | |
2585 | //space.write_byte(cop_register[0] + (0^3),space.read_byte(cop_register[0] + (0^3)) | 2); | |
2586 | 2586 | } |
2587 | 2587 | } |
2588 | 2588 | else if(cur_angle <= cop_angle_compare) |
r17963 | r17964 | |
2592 | 2592 | if(cur_angle >= cop_angle_compare) |
2593 | 2593 | { |
2594 | 2594 | cur_angle = cop_angle_compare; |
2595 | //space | |
2595 | //space.write_byte(cop_register[0] + (0^3),space.read_byte(cop_register[0] + (0^3)) | 2); | |
2596 | 2596 | } |
2597 | 2597 | } |
2598 | 2598 | |
2599 | space | |
2599 | space.write_byte(cop_register[0] + (0x34 ^ 3),cur_angle); | |
2600 | 2600 | return; |
2601 | 2601 | } |
2602 | 2602 | |
r17963 | r17964 | |
2607 | 2607 | /* DMA go register */ |
2608 | 2608 | case (0x2fc/2): |
2609 | 2609 | { |
2610 | //seibu_cop_log("%06x: COPX execute current layer clear??? %04x\n", space | |
2610 | //seibu_cop_log("%06x: COPX execute current layer clear??? %04x\n", space.device().safe_pc(), data); | |
2611 | 2611 | |
2612 | 2612 | if (cop_dma_trigger >= 0x80 && cop_dma_trigger <= 0x87) |
2613 | 2613 | { |
r17963 | r17964 | |
2642 | 2642 | |
2643 | 2643 | if(pal_brightness_mode == 5) |
2644 | 2644 | { |
2645 | bt = ((space | |
2645 | bt = ((space.read_word(src + (cop_dma_fade_table * 0x400))) & 0x7c00) >> 5; | |
2646 | 2646 | bt = fade_table(bt|(pal_brightness_val ^ 0)); |
2647 | b = ((space | |
2647 | b = ((space.read_word(src)) & 0x7c00) >> 5; | |
2648 | 2648 | b = fade_table(b|(pal_brightness_val ^ 0x1f)); |
2649 | 2649 | pal_val = ((b + bt) & 0x1f) << 10; |
2650 | gt = ((space | |
2650 | gt = ((space.read_word(src + (cop_dma_fade_table * 0x400))) & 0x03e0); | |
2651 | 2651 | gt = fade_table(gt|(pal_brightness_val ^ 0)); |
2652 | g = ((space | |
2652 | g = ((space.read_word(src)) & 0x03e0); | |
2653 | 2653 | g = fade_table(g|(pal_brightness_val ^ 0x1f)); |
2654 | 2654 | pal_val |= ((g + gt) & 0x1f) << 5; |
2655 | rt = ((space | |
2655 | rt = ((space.read_word(src + (cop_dma_fade_table * 0x400))) & 0x001f) << 5; | |
2656 | 2656 | rt = fade_table(rt|(pal_brightness_val ^ 0)); |
2657 | r = ((space | |
2657 | r = ((space.read_word(src)) & 0x001f) << 5; | |
2658 | 2658 | r = fade_table(r|(pal_brightness_val ^ 0x1f)); |
2659 | 2659 | pal_val |= ((r + rt) & 0x1f); |
2660 | 2660 | } |
2661 | 2661 | else if(pal_brightness_mode == 4) //Denjin Makai |
2662 | 2662 | { |
2663 | bt =(space->read_word(src + (cop_dma_fade_table * 0x400)) & 0x7c00) >> 10; | |
2664 | b = (space->read_word(src) & 0x7c00) >> 10; | |
2665 | gt =(space->read_word(src + (cop_dma_fade_table * 0x400)) & 0x03e0) >> 5; | |
2666 | g = (space->read_word(src) & 0x03e0) >> 5; | |
2667 | rt =(space->read_word(src + (cop_dma_fade_table * 0x400)) & 0x001f) >> 0; | |
2668 | r = (space->read_word(src) & 0x001f) >> 0; | |
2663 | bt =(space.read_word(src + (cop_dma_fade_table * 0x400)) & 0x7c00) >> 10; | |
2664 | b = (space.read_word(src) & 0x7c00) >> 10; | |
2665 | gt =(space.read_word(src + (cop_dma_fade_table * 0x400)) & 0x03e0) >> 5; | |
2666 | g = (space.read_word(src) & 0x03e0) >> 5; | |
2667 | rt =(space.read_word(src + (cop_dma_fade_table * 0x400)) & 0x001f) >> 0; | |
2668 | r = (space.read_word(src) & 0x001f) >> 0; | |
2669 | 2669 | |
2670 | 2670 | if(pal_brightness_val == 0x10) |
2671 | 2671 | pal_val = bt << 10 | gt << 5 | rt << 0; |
r17963 | r17964 | |
2687 | 2687 | else |
2688 | 2688 | { |
2689 | 2689 | printf("Warning: palette DMA used with mode %02x!\n",pal_brightness_mode); |
2690 | pal_val = space | |
2690 | pal_val = space.read_word(src); | |
2691 | 2691 | } |
2692 | 2692 | |
2693 | space | |
2693 | space.write_word(dst, pal_val); | |
2694 | 2694 | src+=2; |
2695 | 2695 | dst+=2; |
2696 | 2696 | } |
r17963 | r17964 | |
2709 | 2709 | |
2710 | 2710 | for(i = 0;i < size;i++) |
2711 | 2711 | { |
2712 | space | |
2712 | space.write_word(dst, space.read_word(src)); | |
2713 | 2713 | src+=2; |
2714 | 2714 | dst+=2; |
2715 | 2715 | } |
r17963 | r17964 | |
2732 | 2732 | |
2733 | 2733 | for (i=address;i<address+length;i+=4) |
2734 | 2734 | { |
2735 | space | |
2735 | space.write_dword(i, fill_val); | |
2736 | 2736 | } |
2737 | 2737 | |
2738 | 2738 | return; |
r17963 | r17964 | |
2752 | 2752 | |
2753 | 2753 | for (i=address;i<address+length;i+=4) |
2754 | 2754 | { |
2755 | space | |
2755 | space.write_dword(i, fill_val); | |
2756 | 2756 | } |
2757 | 2757 | |
2758 | 2758 | return; |
r17963 | r17964 | |
2790 | 2790 | { |
2791 | 2791 | for(j=i-2;j<sort_size;j+=2) |
2792 | 2792 | { |
2793 | addri = cop_sort_ram_addr+space->read_word(cop_sort_lookup+i); | |
2794 | addrj = cop_sort_ram_addr+space->read_word(cop_sort_lookup+j); | |
2793 | addri = cop_sort_ram_addr+space.read_word(cop_sort_lookup+i); | |
2794 | addrj = cop_sort_ram_addr+space.read_word(cop_sort_lookup+j); | |
2795 | 2795 | |
2796 | vali = space->read_word(addri); | |
2797 | valj = space->read_word(addrj); | |
2796 | vali = space.read_word(addri); | |
2797 | valj = space.read_word(addrj); | |
2798 | 2798 | |
2799 | 2799 | //printf("%08x %08x %04x %04x\n",addri,addrj,vali,valj); |
2800 | 2800 | |
r17963 | r17964 | |
2809 | 2809 | { |
2810 | 2810 | UINT16 xch_val; |
2811 | 2811 | |
2812 | xch_val = space->read_word(cop_sort_lookup+i); | |
2813 | space->write_word(cop_sort_lookup+i,space->read_word(cop_sort_lookup+j)); | |
2814 | space->write_word(cop_sort_lookup+j,xch_val); | |
2812 | xch_val = space.read_word(cop_sort_lookup+i); | |
2813 | space.write_word(cop_sort_lookup+i,space.read_word(cop_sort_lookup+j)); | |
2814 | space.write_word(cop_sort_lookup+j,xch_val); | |
2815 | 2815 | } |
2816 | 2816 | } |
2817 | 2817 | } |
r17963 | r17964 | |
2836 | 2836 | { |
2837 | 2837 | static const char *const portnames[] = { "DSW1", "PLAYERS12", "PLAYERS34", "SYSTEM" }; |
2838 | 2838 | |
2839 | return space | |
2839 | return space.machine().root_device().ioport(portnames[(offset >> 1) & 3])->read(); | |
2840 | 2840 | } |
2841 | 2841 | |
2842 | 2842 | return generic_cop_r(space, offset, mem_mask); |
r17963 | r17964 | |
2844 | 2844 | |
2845 | 2845 | WRITE16_HANDLER( heatbrl_mcu_w ) |
2846 | 2846 | { |
2847 | get_ram(space | |
2847 | get_ram(space.machine()); | |
2848 | 2848 | COMBINE_DATA(&cop_mcu_ram[offset]); |
2849 | 2849 | |
2850 | 2850 | /* external pin register, used for banking */ |
2851 | 2851 | if(offset == 0x070/2) |
2852 | 2852 | { |
2853 | heatbrl_setgfxbank(space | |
2853 | heatbrl_setgfxbank(space.machine(), cop_mcu_ram[offset]); | |
2854 | 2854 | return; |
2855 | 2855 | } |
2856 | 2856 | |
r17963 | r17964 | |
2887 | 2887 | { |
2888 | 2888 | static const char *const portnames[] = { "DSW1", "PLAYERS12", "PLAYERS34", "SYSTEM" }; |
2889 | 2889 | |
2890 | return space | |
2890 | return space.machine().root_device().ioport(portnames[(offset >> 1) & 3])->read(); | |
2891 | 2891 | } |
2892 | 2892 | |
2893 | 2893 | if(offset == 0x35c/2) |
2894 | 2894 | { |
2895 | return space | |
2895 | return space.machine().root_device().ioport("DSW2")->read(); | |
2896 | 2896 | } |
2897 | 2897 | |
2898 | 2898 | return generic_cop_r(space, offset, mem_mask); |
r17963 | r17964 | |
2900 | 2900 | |
2901 | 2901 | WRITE16_HANDLER( cupsoc_mcu_w ) |
2902 | 2902 | { |
2903 | get_ram(space | |
2903 | get_ram(space.machine()); | |
2904 | 2904 | COMBINE_DATA(&cop_mcu_ram[offset]); |
2905 | 2905 | |
2906 | 2906 | if(offset == 0x280/2) //irq ack / sprite buffering? |
r17963 | r17964 | |
2930 | 2930 | { |
2931 | 2931 | static const char *const portnames[] = { "DSW1", "PLAYERS12", "PLAYERS34", "SYSTEM" }; |
2932 | 2932 | |
2933 | return space | |
2933 | return space.machine().root_device().ioport(portnames[(offset >> 1) & 3])->read(); | |
2934 | 2934 | } |
2935 | 2935 | |
2936 | 2936 | if(offset == 0x31c/2) |
2937 | 2937 | { |
2938 | return space | |
2938 | return space.machine().root_device().ioport("DSW2")->read(); | |
2939 | 2939 | } |
2940 | 2940 | |
2941 | 2941 | return generic_cop_r(space, offset, mem_mask); |
r17963 | r17964 | |
2943 | 2943 | |
2944 | 2944 | WRITE16_HANDLER( cupsocs_mcu_w ) |
2945 | 2945 | { |
2946 | get_ram(space | |
2946 | get_ram(space.machine()); | |
2947 | 2947 | COMBINE_DATA(&cop_mcu_ram[offset]); |
2948 | 2948 | |
2949 | 2949 | if(offset == 0x280/2) //irq ack / sprite buffering? |
r17963 | r17964 | |
2983 | 2983 | { |
2984 | 2984 | static const char *const portnames[] = { "DSW1", "PLAYERS12", "PLAYERS34", "SYSTEM" }; |
2985 | 2985 | |
2986 | return space | |
2986 | return space.machine().root_device().ioport(portnames[(offset >> 1) & 3])->read(); | |
2987 | 2987 | } |
2988 | 2988 | |
2989 | 2989 | return generic_cop_r(space, offset, mem_mask); |
r17963 | r17964 | |
2991 | 2991 | |
2992 | 2992 | WRITE16_HANDLER( godzilla_mcu_w ) |
2993 | 2993 | { |
2994 | get_ram(space | |
2994 | get_ram(space.machine()); | |
2995 | 2995 | COMBINE_DATA(&cop_mcu_ram[offset]); |
2996 | 2996 | |
2997 | 2997 | if(offset == 0x070/2) |
2998 | 2998 | { |
2999 | denjinmk_setgfxbank(space | |
2999 | denjinmk_setgfxbank(space.machine(), cop_mcu_ram[offset]); | |
3000 | 3000 | return; |
3001 | 3001 | } |
3002 | 3002 | |
r17963 | r17964 | |
3031 | 3031 | { |
3032 | 3032 | static const char *const portnames[] = { "DSW1", "PLAYERS12", "PLAYERS34", "SYSTEM" }; |
3033 | 3033 | |
3034 | return space | |
3034 | return space.machine().root_device().ioport(portnames[(offset >> 1) & 3])->read(); | |
3035 | 3035 | } |
3036 | 3036 | |
3037 | 3037 | if(offset == 0x35c/2) |
3038 | 3038 | { |
3039 | return space | |
3039 | return space.machine().root_device().ioport("DSW2")->read(); | |
3040 | 3040 | } |
3041 | 3041 | |
3042 | 3042 | return generic_cop_r(space, offset, mem_mask); |
r17963 | r17964 | |
3044 | 3044 | |
3045 | 3045 | WRITE16_HANDLER( denjinmk_mcu_w ) |
3046 | 3046 | { |
3047 | get_ram(space | |
3047 | get_ram(space.machine()); | |
3048 | 3048 | COMBINE_DATA(&cop_mcu_ram[offset]); |
3049 | 3049 | |
3050 | 3050 | if(offset == 0x280/2) //irq ack / sprite buffering? |
r17963 | r17964 | |
3052 | 3052 | |
3053 | 3053 | if(offset == 0x070/2) |
3054 | 3054 | { |
3055 | denjinmk_setgfxbank(space | |
3055 | denjinmk_setgfxbank(space.machine(), cop_mcu_ram[offset]); | |
3056 | 3056 | return; |
3057 | 3057 | } |
3058 | 3058 | |
r17963 | r17964 | |
3084 | 3084 | { |
3085 | 3085 | static const char *const portnames[] = { "DSW1", "PLAYERS12", "PLAYERS34", "SYSTEM" }; |
3086 | 3086 | |
3087 | return space | |
3087 | return space.machine().root_device().ioport(portnames[(offset >> 1) & 3])->read(); | |
3088 | 3088 | } |
3089 | 3089 | |
3090 | 3090 | if(offset == 0x35c/2) |
3091 | 3091 | { |
3092 | return space | |
3092 | return space.machine().root_device().ioport("DSW2")->read(); | |
3093 | 3093 | } |
3094 | 3094 | |
3095 | 3095 | return generic_cop_r(space, offset, mem_mask); |
r17963 | r17964 | |
3098 | 3098 | |
3099 | 3099 | WRITE16_HANDLER( grainbow_mcu_w ) |
3100 | 3100 | { |
3101 | get_ram(space | |
3101 | get_ram(space.machine()); | |
3102 | 3102 | COMBINE_DATA(&cop_mcu_ram[offset]); |
3103 | 3103 | |
3104 | 3104 | if(offset == 0x280/2) //irq ack / sprite buffering? |
r17963 | r17964 | |
3133 | 3133 | { |
3134 | 3134 | static const char *const portnames[] = { "DSW1", "PLAYERS12", "UNK", "SYSTEM" }; |
3135 | 3135 | |
3136 | return space | |
3136 | return space.machine().root_device().ioport(portnames[(offset >> 1) & 3])->read(); | |
3137 | 3137 | } |
3138 | 3138 | |
3139 | 3139 | return generic_cop_r(space, offset, mem_mask); |
r17963 | r17964 | |
3141 | 3141 | |
3142 | 3142 | WRITE16_HANDLER( legionna_mcu_w ) |
3143 | 3143 | { |
3144 | get_ram(space | |
3144 | get_ram(space.machine()); | |
3145 | 3145 | COMBINE_DATA(&cop_mcu_ram[offset]); |
3146 | 3146 | |
3147 | 3147 | if(offset == 0x070/2) //external pin: puts bit 13 high, delay, reads 0x748, writes bit 13 low |
r17963 | r17964 | |
---|---|---|
864 | 864 | * |
865 | 865 | *************************************/ |
866 | 866 | |
867 | static int alt2_kludge(address_space | |
867 | static int alt2_kludge(address_space &space, offs_t offset) | |
868 | 868 | { |
869 | 869 | /* Of the 3 alternate addresses, only the middle one needs to actually hit |
870 | 870 | in the slapstic region; the first and third ones can be anywhere in the |
r17963 | r17964 | |
876 | 876 | if (access_68k) |
877 | 877 | { |
878 | 878 | /* first verify that the prefetched PC matches the first alternate */ |
879 | if (MATCHES_MASK_VALUE(space | |
879 | if (MATCHES_MASK_VALUE(space.device().safe_pc() >> 1, slapstic.alt1)) | |
880 | 880 | { |
881 | 881 | /* now look for a move.w (An),(An) or cmpm.w (An)+,(An)+ */ |
882 | UINT16 opcode = space | |
882 | UINT16 opcode = space.direct().read_decrypted_word(space.device().safe_pcbase() & 0xffffff); | |
883 | 883 | if ((opcode & 0xf1f8) == 0x3090 || (opcode & 0xf1f8) == 0xb148) |
884 | 884 | { |
885 | 885 | /* fetch the value of the register for the second operand, and see */ |
886 | 886 | /* if it matches the third alternate */ |
887 | UINT32 regval = space | |
887 | UINT32 regval = space.device().state().state_int(M68K_A0 + ((opcode >> 9) & 7)) >> 1; | |
888 | 888 | if (MATCHES_MASK_VALUE(regval, slapstic.alt3)) |
889 | 889 | { |
890 | 890 | alt_bank = (regval >> slapstic.altshift) & 3; |
r17963 | r17964 | |
911 | 911 | * |
912 | 912 | *************************************/ |
913 | 913 | |
914 | int slapstic_tweak(address_space | |
914 | int slapstic_tweak(address_space &space, offs_t offset) | |
915 | 915 | { |
916 | 916 | /* reset is universal */ |
917 | 917 | if (offset == 0x0000) |
r17963 | r17964 | |
1121 | 1121 | |
1122 | 1122 | /* log this access */ |
1123 | 1123 | if (LOG_SLAPSTIC) |
1124 | slapstic_log(space | |
1124 | slapstic_log(space.machine(), offset); | |
1125 | 1125 | |
1126 | 1126 | /* return the active bank */ |
1127 | 1127 | return current_bank; |
r17963 | r17964 | |
---|---|---|
210 | 210 | |
211 | 211 | MACHINE_RESET_MEMBER(bagman_state,bagman) |
212 | 212 | { |
213 | address_space *space = machine().device("maincpu")->memory().space(AS_PROGRAM); | |
214 | bagman_pal16r6_w(*space, 0, 1); /*pin 2*/ | |
215 | bagman_pal16r6_w(*space, 1, 1); /*pin 3*/ | |
216 | bagman_pal16r6_w(*space, 2, 1); /*pin 4*/ | |
217 | bagman_pal16r6_w(*space, 3, 1); /*pin 5*/ | |
218 | bagman_pal16r6_w(*space, 4, 1); /*pin 6*/ | |
219 | bagman_pal16r6_w(*space, 5, 1); /*pin 7*/ | |
220 | bagman_pal16r6_w(*space, 6, 1); /*pin 8*/ | |
221 | bagman_pal16r6_w(*space, 7, 1); /*pin 9*/ | |
213 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
214 | bagman_pal16r6_w(space, 0, 1); /*pin 2*/ | |
215 | bagman_pal16r6_w(space, 1, 1); /*pin 3*/ | |
216 | bagman_pal16r6_w(space, 2, 1); /*pin 4*/ | |
217 | bagman_pal16r6_w(space, 3, 1); /*pin 5*/ | |
218 | bagman_pal16r6_w(space, 4, 1); /*pin 6*/ | |
219 | bagman_pal16r6_w(space, 5, 1); /*pin 7*/ | |
220 | bagman_pal16r6_w(space, 6, 1); /*pin 8*/ | |
221 | bagman_pal16r6_w(space, 7, 1); /*pin 9*/ | |
222 | 222 | update_pal(); |
223 | 223 | } |
224 | 224 |
r17963 | r17964 | |
---|---|---|
415 | 415 | |
416 | 416 | READ16_HANDLER( scc68070_periphs_r ) |
417 | 417 | { |
418 | cdi_state *state = space | |
418 | cdi_state *state = space.machine().driver_data<cdi_state>(); | |
419 | 419 | scc68070_regs_t *scc68070 = &state->m_scc68070_regs; |
420 | 420 | |
421 | 421 | switch(offset) |
r17963 | r17964 | |
428 | 428 | case 0x2000/2: |
429 | 429 | if(ACCESSING_BITS_0_7) |
430 | 430 | { |
431 | verboselog(space | |
431 | verboselog(space.machine(), 2, "scc68070_periphs_w: I2C Data Register: %04x & %04x\n", scc68070->i2c.data_register, mem_mask); | |
432 | 432 | } |
433 | 433 | return scc68070->i2c.data_register; |
434 | 434 | case 0x2002/2: |
435 | 435 | if(ACCESSING_BITS_0_7) |
436 | 436 | { |
437 | verboselog(space | |
437 | verboselog(space.machine(), 2, "scc68070_periphs_w: I2C Address Register: %04x & %04x\n", scc68070->i2c.address_register, mem_mask); | |
438 | 438 | } |
439 | 439 | return scc68070->i2c.address_register; |
440 | 440 | case 0x2004/2: |
441 | 441 | if(ACCESSING_BITS_0_7) |
442 | 442 | { |
443 | verboselog(space | |
443 | verboselog(space.machine(), 2, "scc68070_periphs_w: I2C Status Register: %04x & %04x\n", scc68070->i2c.status_register, mem_mask); | |
444 | 444 | } |
445 | 445 | return scc68070->i2c.status_register; |
446 | 446 | case 0x2006/2: |
447 | 447 | if(ACCESSING_BITS_0_7) |
448 | 448 | { |
449 | verboselog(space | |
449 | verboselog(space.machine(), 2, "scc68070_periphs_w: I2C Control Register: %04x & %04x\n", scc68070->i2c.control_register, mem_mask); | |
450 | 450 | } |
451 | 451 | return scc68070->i2c.control_register; |
452 | 452 | case 0x2008/2: |
453 | 453 | if(ACCESSING_BITS_0_7) |
454 | 454 | { |
455 | verboselog(space | |
455 | verboselog(space.machine(), 2, "scc68070_periphs_w: I2C Clock Control Register: %04x & %04x\n", scc68070->i2c.clock_control_register, mem_mask); | |
456 | 456 | } |
457 | 457 | return scc68070->i2c.clock_control_register; |
458 | 458 | |
r17963 | r17964 | |
460 | 460 | case 0x2010/2: |
461 | 461 | if(ACCESSING_BITS_0_7) |
462 | 462 | { |
463 | verboselog(space | |
463 | verboselog(space.machine(), 2, "scc68070_periphs_r: UART Mode Register: %04x & %04x\n", scc68070->uart.mode_register, mem_mask); | |
464 | 464 | } |
465 | 465 | else |
466 | 466 | { |
467 | verboselog(space | |
467 | verboselog(space.machine(), 0, "scc68070_periphs_r: Unknown address: %04x & %04x\n", offset * 2, mem_mask); | |
468 | 468 | } |
469 | 469 | return scc68070->uart.mode_register | 0x20; |
470 | 470 | case 0x2012/2: |
471 | 471 | scc68070->uart.status_register |= (1 << 1); |
472 | 472 | if(ACCESSING_BITS_0_7) |
473 | 473 | { |
474 | verboselog(space | |
474 | verboselog(space.machine(), 2, "scc68070_periphs_r: UART Status Register: %04x & %04x\n", scc68070->uart.status_register, mem_mask); | |
475 | 475 | } |
476 | 476 | else |
477 | 477 | { |
478 | verboselog(space | |
478 | verboselog(space.machine(), 0, "scc68070_periphs_r: Unknown address: %04x & %04x\n", offset * 2, mem_mask); | |
479 | 479 | } |
480 | 480 | |
481 | 481 | if((scc68070->picr2 >> 4) & 7) |
482 | 482 | { |
483 | space | |
483 | space.machine().device("maincpu")->execute().set_input_line(M68K_IRQ_1 + (((scc68070->picr2 >> 4) & 7) - 1), ASSERT_LINE); | |
484 | 484 | } |
485 | 485 | |
486 | 486 | if(scc68070->picr2 & 7) |
487 | 487 | { |
488 | space | |
488 | space.machine().device("maincpu")->execute().set_input_line(M68K_IRQ_1 + ((scc68070->picr2 & 7) - 1), ASSERT_LINE); | |
489 | 489 | } |
490 | 490 | |
491 | 491 | return scc68070->uart.status_register; |
r17963 | r17964 | |
493 | 493 | case 0x2014/2: |
494 | 494 | if(ACCESSING_BITS_0_7) |
495 | 495 | { |
496 | verboselog(space | |
496 | verboselog(space.machine(), 2, "scc68070_periphs_r: UART Clock Select: %04x & %04x\n", scc68070->uart.clock_select, mem_mask); | |
497 | 497 | } |
498 | 498 | else |
499 | 499 | { |
500 | verboselog(space | |
500 | verboselog(space.machine(), 0, "scc68070_periphs_r: Unknown address: %04x & %04x\n", offset * 2, mem_mask); | |
501 | 501 | } |
502 | 502 | return scc68070->uart.clock_select | 0x08; |
503 | 503 | case 0x2016/2: |
504 | 504 | if(ACCESSING_BITS_0_7) |
505 | 505 | { |
506 | verboselog(space | |
506 | verboselog(space.machine(), 2, "scc68070_periphs_r: UART Command Register: %02x & %04x\n", scc68070->uart.command_register, mem_mask); | |
507 | 507 | } |
508 | 508 | else |
509 | 509 | { |
510 | verboselog(space | |
510 | verboselog(space.machine(), 0, "scc68070_periphs_r: Unknown address: %04x & %04x\n", offset * 2, mem_mask); | |
511 | 511 | } |
512 | 512 | return scc68070->uart.command_register | 0x80; |
513 | 513 | case 0x2018/2: |
514 | 514 | if(ACCESSING_BITS_0_7) |
515 | 515 | { |
516 | verboselog(space | |
516 | verboselog(space.machine(), 2, "scc68070_periphs_r: UART Transmit Holding Register: %02x & %04x\n", scc68070->uart.transmit_holding_register, mem_mask); | |
517 | 517 | } |
518 | 518 | else |
519 | 519 | { |
520 | verboselog(space | |
520 | verboselog(space.machine(), 0, "scc68070_periphs_r: Unknown address: %04x & %04x\n", offset * 2, mem_mask); | |
521 | 521 | } |
522 | 522 | return scc68070->uart.transmit_holding_register; |
523 | 523 | case 0x201a/2: |
524 | 524 | if(ACCESSING_BITS_0_7) |
525 | 525 | { |
526 | verboselog(space | |
526 | verboselog(space.machine(), 2, "scc68070_periphs_r: UART Receive Holding Register: %02x & %04x\n", scc68070->uart.receive_holding_register, mem_mask); | |
527 | 527 | } |
528 | 528 | else |
529 | 529 | { |
530 | verboselog(space | |
530 | verboselog(space.machine(), 0, "scc68070_periphs_r: Unknown address: %04x & %04x\n", offset * 2, mem_mask); | |
531 | 531 | } |
532 | 532 | if((scc68070->picr2 >> 4) & 7) |
533 | 533 | { |
534 | space | |
534 | space.machine().device("maincpu")->execute().set_input_line(M68K_IRQ_1 + (((scc68070->picr2 >> 4) & 7) - 1), CLEAR_LINE); | |
535 | 535 | } |
536 | 536 | |
537 | 537 | scc68070->uart.receive_holding_register = scc68070->uart.receive_buffer[0]; |
r17963 | r17964 | |
550 | 550 | case 0x2020/2: |
551 | 551 | if(ACCESSING_BITS_0_7) |
552 | 552 | { |
553 | verboselog(space | |
553 | verboselog(space.machine(), 2, "scc68070_periphs_r: Timer Control Register: %02x & %04x\n", scc68070->timers.timer_control_register, mem_mask); | |
554 | 554 | } |
555 | 555 | if(ACCESSING_BITS_8_15) |
556 | 556 | { |
557 | verboselog(space | |
557 | verboselog(space.machine(), 12, "scc68070_periphs_r: Timer Status Register: %02x & %04x\n", scc68070->timers.timer_status_register, mem_mask); | |
558 | 558 | } |
559 | 559 | return (scc68070->timers.timer_status_register << 8) | scc68070->timers.timer_control_register; |
560 | 560 | case 0x2022/2: |
561 | verboselog(space | |
561 | verboselog(space.machine(), 2, "scc68070_periphs_r: Timer Reload Register: %04x & %04x\n", scc68070->timers.reload_register, mem_mask); | |
562 | 562 | return scc68070->timers.reload_register; |
563 | 563 | case 0x2024/2: |
564 | verboselog(space | |
564 | verboselog(space.machine(), 2, "scc68070_periphs_r: Timer 0: %04x & %04x\n", scc68070->timers.timer0, mem_mask); | |
565 | 565 | return scc68070->timers.timer0; |
566 | 566 | case 0x2026/2: |
567 | verboselog(space | |
567 | verboselog(space.machine(), 2, "scc68070_periphs_r: Timer 1: %04x & %04x\n", scc68070->timers.timer1, mem_mask); | |
568 | 568 | return scc68070->timers.timer1; |
569 | 569 | case 0x2028/2: |
570 | verboselog(space | |
570 | verboselog(space.machine(), 2, "scc68070_periphs_r: Timer 2: %04x & %04x\n", scc68070->timers.timer2, mem_mask); | |
571 | 571 | return scc68070->timers.timer2; |
572 | 572 | |
573 | 573 | // PICR1: 80002045 |
574 | 574 | case 0x2044/2: |
575 | 575 | if(ACCESSING_BITS_0_7) |
576 | 576 | { |
577 | verboselog(space | |
577 | verboselog(space.machine(), 2, "scc68070_periphs_r: Peripheral Interrupt Control Register 1: %02x & %04x\n", scc68070->picr1, mem_mask); | |
578 | 578 | } |
579 | 579 | return scc68070->picr1; |
580 | 580 | |
r17963 | r17964 | |
582 | 582 | case 0x2046/2: |
583 | 583 | if(ACCESSING_BITS_0_7) |
584 | 584 | { |
585 | verboselog(space | |
585 | verboselog(space.machine(), 2, "scc68070_periphs_r: Peripheral Interrupt Control Register 2: %02x & %04x\n", scc68070->picr2, mem_mask); | |
586 | 586 | } |
587 | 587 | return scc68070->picr2 & 0x77; |
588 | 588 | |
r17963 | r17964 | |
591 | 591 | case 0x4040/2: |
592 | 592 | if(ACCESSING_BITS_0_7) |
593 | 593 | { |
594 | verboselog(space | |
594 | verboselog(space.machine(), 2, "scc68070_periphs_r: DMA(%d) Error Register: %04x & %04x\n", (offset - 0x2000) / 32, scc68070->dma.channel[(offset - 0x2000) / 32].channel_error, mem_mask); | |
595 | 595 | } |
596 | 596 | if(ACCESSING_BITS_8_15) |
597 | 597 | { |
598 | verboselog(space | |
598 | verboselog(space.machine(), 2, "scc68070_periphs_r: DMA(%d) Status Register: %04x & %04x\n", (offset - 0x2000) / 32, scc68070->dma.channel[(offset - 0x2000) / 32].channel_status, mem_mask); | |
599 | 599 | } |
600 | 600 | return (scc68070->dma.channel[(offset - 0x2000) / 32].channel_status << 8) | scc68070->dma.channel[(offset - 0x2000) / 32].channel_error; |
601 | 601 | case 0x4004/2: |
602 | 602 | case 0x4044/2: |
603 | 603 | if(ACCESSING_BITS_0_7) |
604 | 604 | { |
605 | verboselog(space | |
605 | verboselog(space.machine(), 2, "scc68070_periphs_r: DMA(%d) Operation Control Register: %02x & %04x\n", (offset - 0x2000) / 32, scc68070->dma.channel[(offset - 0x2000) / 32].operation_control, mem_mask); | |
606 | 606 | } |
607 | 607 | if(ACCESSING_BITS_8_15) |
608 | 608 | { |
609 | verboselog(space | |
609 | verboselog(space.machine(), 2, "scc68070_periphs_r: DMA(%d) Device Control Register: %02x & %04x\n", (offset - 0x2000) / 32, scc68070->dma.channel[(offset - 0x2000) / 32].device_control, mem_mask); | |
610 | 610 | } |
611 | 611 | return (scc68070->dma.channel[(offset - 0x2000) / 32].device_control << 8) | scc68070->dma.channel[(offset - 0x2000) / 32].operation_control; |
612 | 612 | case 0x4006/2: |
613 | 613 | case 0x4046/2: |
614 | 614 | if(ACCESSING_BITS_0_7) |
615 | 615 | { |
616 | verboselog(space | |
616 | verboselog(space.machine(), 2, "scc68070_periphs_r: DMA(%d) Channel Control Register: %02x & %04x\n", (offset - 0x2000) / 32, scc68070->dma.channel[(offset - 0x2000) / 32].channel_control, mem_mask); | |
617 | 617 | } |
618 | 618 | if(ACCESSING_BITS_8_15) |
619 | 619 | { |
620 | verboselog(space | |
620 | verboselog(space.machine(), 2, "scc68070_periphs_r: DMA(%d) Sequence Control Register: %02x & %04x\n", (offset - 0x2000) / 32, scc68070->dma.channel[(offset - 0x2000) / 32].sequence_control, mem_mask); | |
621 | 621 | } |
622 | 622 | return (scc68070->dma.channel[(offset - 0x2000) / 32].sequence_control << 8) | scc68070->dma.channel[(offset - 0x2000) / 32].channel_control; |
623 | 623 | case 0x400a/2: |
624 | verboselog(space | |
624 | verboselog(space.machine(), 2, "scc68070_periphs_r: DMA(%d) Memory Transfer Counter: %04x & %04x\n", (offset - 0x2000) / 32, scc68070->dma.channel[(offset - 0x2000) / 32].transfer_counter, mem_mask); | |
625 | 625 | return scc68070->dma.channel[(offset - 0x2000) / 32].transfer_counter; |
626 | 626 | case 0x400c/2: |
627 | 627 | case 0x404c/2: |
628 | verboselog(space | |
628 | verboselog(space.machine(), 2, "scc68070_periphs_r: DMA(%d) Memory Address Counter (High Word): %04x & %04x\n", (offset - 0x2000) / 32, (scc68070->dma.channel[(offset - 0x2000) / 32].memory_address_counter >> 16), mem_mask); | |
629 | 629 | return (scc68070->dma.channel[(offset - 0x2000) / 32].memory_address_counter >> 16); |
630 | 630 | case 0x400e/2: |
631 | 631 | case 0x404e/2: |
632 | verboselog(space | |
632 | verboselog(space.machine(), 2, "scc68070_periphs_r: DMA(%d) Memory Address Counter (Low Word): %04x & %04x\n", (offset - 0x2000) / 32, scc68070->dma.channel[(offset - 0x2000) / 32].memory_address_counter, mem_mask); | |
633 | 633 | return scc68070->dma.channel[(offset - 0x2000) / 32].memory_address_counter; |
634 | 634 | case 0x4014/2: |
635 | 635 | case 0x4054/2: |
636 | verboselog(space | |
636 | verboselog(space.machine(), 2, "scc68070_periphs_r: DMA(%d) Device Address Counter (High Word): %04x & %04x\n", (offset - 0x2000) / 32, (scc68070->dma.channel[(offset - 0x2000) / 32].device_address_counter >> 16), mem_mask); | |
637 | 637 | return (scc68070->dma.channel[(offset - 0x2000) / 32].device_address_counter >> 16); |
638 | 638 | case 0x4016/2: |
639 | 639 | case 0x4056/2: |
640 | verboselog(space | |
640 | verboselog(space.machine(), 2, "scc68070_periphs_r: DMA(%d) Device Address Counter (Low Word): %04x & %04x\n", (offset - 0x2000) / 32, scc68070->dma.channel[(offset - 0x2000) / 32].device_address_counter, mem_mask); | |
641 | 641 | return scc68070->dma.channel[(offset - 0x2000) / 32].device_address_counter; |
642 | 642 | |
643 | 643 | // MMU: 80008000 to 8000807f |
644 | 644 | case 0x8000/2: // Status / Control register |
645 | 645 | if(ACCESSING_BITS_0_7) |
646 | 646 | { // Control |
647 | verboselog(space | |
647 | verboselog(space.machine(), 2, "scc68070_periphs_r: MMU Control: %02x & %04x\n", scc68070->mmu.control, mem_mask); | |
648 | 648 | return scc68070->mmu.control; |
649 | 649 | } // Status |
650 | 650 | else |
651 | 651 | { |
652 | verboselog(space | |
652 | verboselog(space.machine(), 2, "scc68070_periphs_r: MMU Status: %02x & %04x\n", scc68070->mmu.status, mem_mask); | |
653 | 653 | return scc68070->mmu.status; |
654 | 654 | } |
655 | 655 | break; |
r17963 | r17964 | |
661 | 661 | case 0x8068/2: |
662 | 662 | case 0x8070/2: |
663 | 663 | case 0x8078/2: // Attributes (SD0-7) |
664 | verboselog(space | |
664 | verboselog(space.machine(), 2, "scc68070_periphs_r: MMU descriptor %d attributes: %04x & %04x\n", (offset - 0x4020) / 4, scc68070->mmu.desc[(offset - 0x4020) / 4].attr, mem_mask); | |
665 | 665 | return scc68070->mmu.desc[(offset - 0x4020) / 4].attr; |
666 | 666 | case 0x8042/2: |
667 | 667 | case 0x804a/2: |
r17963 | r17964 | |
671 | 671 | case 0x806a/2: |
672 | 672 | case 0x8072/2: |
673 | 673 | case 0x807a/2: // Segment Length (SD0-7) |
674 | verboselog(space | |
674 | verboselog(space.machine(), 2, "scc68070_periphs_r: MMU descriptor %d length: %04x & %04x\n", (offset - 0x4020) / 4, scc68070->mmu.desc[(offset - 0x4020) / 4].length, mem_mask); | |
675 | 675 | return scc68070->mmu.desc[(offset - 0x4020) / 4].length; |
676 | 676 | case 0x8044/2: |
677 | 677 | case 0x804c/2: |
r17963 | r17964 | |
683 | 683 | case 0x807c/2: // Segment Number (SD0-7, A0=1 only) |
684 | 684 | if(ACCESSING_BITS_0_7) |
685 | 685 | { |
686 | verboselog(space | |
686 | verboselog(space.machine(), 2, "scc68070_periphs_r: MMU descriptor %d segment: %02x & %04x\n", (offset - 0x4020) / 4, scc68070->mmu.desc[(offset - 0x4020) / 4].segment, mem_mask); | |
687 | 687 | return scc68070->mmu.desc[(offset - 0x4020) / 4].segment; |
688 | 688 | } |
689 | 689 | break; |
r17963 | r17964 | |
695 | 695 | case 0x806e/2: |
696 | 696 | case 0x8076/2: |
697 | 697 | case 0x807e/2: // Base Address (SD0-7) |
698 | verboselog(space | |
698 | verboselog(space.machine(), 2, "scc68070_periphs_r: MMU descriptor %d base: %04x & %04x\n", (offset - 0x4020) / 4, scc68070->mmu.desc[(offset - 0x4020) / 4].base, mem_mask); | |
699 | 699 | return scc68070->mmu.desc[(offset - 0x4020) / 4].base; |
700 | 700 | default: |
701 | verboselog(space | |
701 | verboselog(space.machine(), 0, "scc68070_periphs_r: Unknown address: %04x & %04x\n", offset * 2, mem_mask); | |
702 | 702 | break; |
703 | 703 | } |
704 | 704 | |
r17963 | r17964 | |
707 | 707 | |
708 | 708 | WRITE16_HANDLER( scc68070_periphs_w ) |
709 | 709 | { |
710 | cdi_state *state = space | |
710 | cdi_state *state = space.machine().driver_data<cdi_state>(); | |
711 | 711 | scc68070_regs_t *scc68070 = &state->m_scc68070_regs; |
712 | 712 | |
713 | 713 | switch(offset) |
714 | 714 | { |
715 | 715 | // Interrupts: 80001001 |
716 | 716 | case 0x1000/2: // LIR priority level |
717 | verboselog(space | |
717 | verboselog(space.machine(), 2, "scc68070_periphs_w: LIR: %04x & %04x\n", data, mem_mask); | |
718 | 718 | COMBINE_DATA(&scc68070->lir); |
719 | 719 | break; |
720 | 720 | |
r17963 | r17964 | |
722 | 722 | case 0x2000/2: |
723 | 723 | if(ACCESSING_BITS_0_7) |
724 | 724 | { |
725 | verboselog(space | |
725 | verboselog(space.machine(), 2, "scc68070_periphs_w: I2C Data Register: %04x & %04x\n", data, mem_mask); | |
726 | 726 | scc68070->i2c.data_register = data & 0x00ff; |
727 | 727 | } |
728 | 728 | break; |
729 | 729 | case 0x2002/2: |
730 | 730 | if(ACCESSING_BITS_0_7) |
731 | 731 | { |
732 | verboselog(space | |
732 | verboselog(space.machine(), 2, "scc68070_periphs_w: I2C Address Register: %04x & %04x\n", data, mem_mask); | |
733 | 733 | scc68070->i2c.address_register = data & 0x00ff; |
734 | 734 | } |
735 | 735 | break; |
736 | 736 | case 0x2004/2: |
737 | 737 | if(ACCESSING_BITS_0_7) |
738 | 738 | { |
739 | verboselog(space | |
739 | verboselog(space.machine(), 2, "scc68070_periphs_w: I2C Status Register: %04x & %04x\n", data, mem_mask); | |
740 | 740 | scc68070->i2c.status_register = data & 0x00ff; |
741 | 741 | } |
742 | 742 | break; |
743 | 743 | case 0x2006/2: |
744 | 744 | if(ACCESSING_BITS_0_7) |
745 | 745 | { |
746 | verboselog(space | |
746 | verboselog(space.machine(), 2, "scc68070_periphs_w: I2C Control Register: %04x & %04x\n", data, mem_mask); | |
747 | 747 | scc68070->i2c.control_register = data & 0x00ff; |
748 | 748 | } |
749 | 749 | break; |
750 | 750 | case 0x2008/2: |
751 | 751 | if(ACCESSING_BITS_0_7) |
752 | 752 | { |
753 | verboselog(space | |
753 | verboselog(space.machine(), 2, "scc68070_periphs_w: I2C Clock Control Register: %04x & %04x\n", data, mem_mask); | |
754 | 754 | scc68070->i2c.clock_control_register = data & 0x00ff; |
755 | 755 | } |
756 | 756 | break; |
r17963 | r17964 | |
759 | 759 | case 0x2010/2: |
760 | 760 | if(ACCESSING_BITS_0_7) |
761 | 761 | { |
762 | verboselog(space | |
762 | verboselog(space.machine(), 2, "scc68070_periphs_w: UART Mode Register: %04x & %04x\n", data, mem_mask); | |
763 | 763 | scc68070->uart.mode_register = data & 0x00ff; |
764 | 764 | } |
765 | 765 | else |
766 | 766 | { |
767 | verboselog(space | |
767 | verboselog(space.machine(), 0, "scc68070_periphs_w: Unknown address: %04x = %04x & %04x\n", offset * 2, data, mem_mask); | |
768 | 768 | } |
769 | 769 | break; |
770 | 770 | case 0x2012/2: |
771 | 771 | if(ACCESSING_BITS_0_7) |
772 | 772 | { |
773 | verboselog(space | |
773 | verboselog(space.machine(), 2, "scc68070_periphs_w: UART Status Register: %04x & %04x\n", data, mem_mask); | |
774 | 774 | scc68070->uart.status_register = data & 0x00ff; |
775 | 775 | } |
776 | 776 | else |
777 | 777 | { |
778 | verboselog(space | |
778 | verboselog(space.machine(), 0, "scc68070_periphs_w: Unknown address: %04x = %04x & %04x\n", offset * 2, data, mem_mask); | |
779 | 779 | } |
780 | 780 | break; |
781 | 781 | case 0x2014/2: |
782 | 782 | if(ACCESSING_BITS_0_7) |
783 | 783 | { |
784 | verboselog(space | |
784 | verboselog(space.machine(), 2, "scc68070_periphs_w: UART Clock Select: %04x & %04x\n", data, mem_mask); | |
785 | 785 | scc68070->uart.clock_select = data & 0x00ff; |
786 | 786 | } |
787 | 787 | else |
788 | 788 | { |
789 | verboselog(space | |
789 | verboselog(space.machine(), 0, "scc68070_periphs_w: Unknown address: %04x = %04x & %04x\n", offset * 2, data, mem_mask); | |
790 | 790 | } |
791 | 791 | break; |
792 | 792 | case 0x2016/2: |
793 | 793 | if(ACCESSING_BITS_0_7) |
794 | 794 | { |
795 | verboselog(space | |
795 | verboselog(space.machine(), 2, "scc68070_periphs_w: UART Command Register: %04x & %04x\n", data, mem_mask); | |
796 | 796 | scc68070->uart.command_register = data & 0x00ff; |
797 | scc68070_uart_rx_check(space->machine(), scc68070); | |
798 | scc68070_uart_tx_check(space->machine(), scc68070); | |
797 | scc68070_uart_rx_check(space.machine(), scc68070); | |
798 | scc68070_uart_tx_check(space.machine(), scc68070); | |
799 | 799 | } |
800 | 800 | else |
801 | 801 | { |
802 | verboselog(space | |
802 | verboselog(space.machine(), 0, "scc68070_periphs_w: Unknown address: %04x = %04x & %04x\n", offset * 2, data, mem_mask); | |
803 | 803 | } |
804 | 804 | break; |
805 | 805 | case 0x2018/2: |
806 | 806 | if(ACCESSING_BITS_0_7) |
807 | 807 | { |
808 | verboselog(space->machine(), 2, "scc68070_periphs_w: UART Transmit Holding Register: %04x & %04x: %c\n", data, mem_mask, (data >= 0x20 && data < 0x7f) ? (data & 0x00ff) : ' '); | |
809 | scc68070_uart_tx(space->machine(), scc68070, data & 0x00ff); | |
808 | verboselog(space.machine(), 2, "scc68070_periphs_w: UART Transmit Holding Register: %04x & %04x: %c\n", data, mem_mask, (data >= 0x20 && data < 0x7f) ? (data & 0x00ff) : ' '); | |
809 | scc68070_uart_tx(space.machine(), scc68070, data & 0x00ff); | |
810 | 810 | scc68070->uart.transmit_holding_register = data & 0x00ff; |
811 | 811 | } |
812 | 812 | else |
813 | 813 | { |
814 | verboselog(space | |
814 | verboselog(space.machine(), 0, "scc68070_periphs_w: Unknown address: %04x = %04x & %04x\n", offset * 2, data, mem_mask); | |
815 | 815 | } |
816 | 816 | break; |
817 | 817 | case 0x201a/2: |
818 | 818 | if(ACCESSING_BITS_0_7) |
819 | 819 | { |
820 | verboselog(space | |
820 | verboselog(space.machine(), 2, "scc68070_periphs_w: UART Receive Holding Register: %04x & %04x\n", data, mem_mask); | |
821 | 821 | scc68070->uart.receive_holding_register = data & 0x00ff; |
822 | 822 | } |
823 | 823 | else |
824 | 824 | { |
825 | verboselog(space | |
825 | verboselog(space.machine(), 0, "scc68070_periphs_w: Unknown address: %04x = %04x & %04x\n", offset * 2, data, mem_mask); | |
826 | 826 | } |
827 | 827 | break; |
828 | 828 | |
r17963 | r17964 | |
830 | 830 | case 0x2020/2: |
831 | 831 | if(ACCESSING_BITS_0_7) |
832 | 832 | { |
833 | verboselog(space | |
833 | verboselog(space.machine(), 2, "scc68070_periphs_w: Timer Control Register: %04x & %04x\n", data, mem_mask); | |
834 | 834 | scc68070->timers.timer_control_register = data & 0x00ff; |
835 | 835 | } |
836 | 836 | if(ACCESSING_BITS_8_15) |
837 | 837 | { |
838 | verboselog(space | |
838 | verboselog(space.machine(), 12, "scc68070_periphs_w: Timer Status Register: %04x & %04x\n", data, mem_mask); | |
839 | 839 | scc68070->timers.timer_status_register &= ~(data >> 8); |
840 | 840 | if(!scc68070->timers.timer_status_register) |
841 | 841 | { |
842 | 842 | UINT8 interrupt = scc68070->picr1 & 7; |
843 | space | |
843 | space.machine().device("maincpu")->execute().set_input_line(M68K_IRQ_1 + (interrupt - 1), CLEAR_LINE); | |
844 | 844 | } |
845 | 845 | } |
846 | 846 | break; |
847 | 847 | case 0x2022/2: |
848 | verboselog(space | |
848 | verboselog(space.machine(), 2, "scc68070_periphs_w: Timer Reload Register: %04x & %04x\n", data, mem_mask); | |
849 | 849 | COMBINE_DATA(&scc68070->timers.reload_register); |
850 | 850 | break; |
851 | 851 | case 0x2024/2: |
852 | verboselog(space | |
852 | verboselog(space.machine(), 2, "scc68070_periphs_w: Timer 0: %04x & %04x\n", data, mem_mask); | |
853 | 853 | COMBINE_DATA(&scc68070->timers.timer0); |
854 | 854 | scc68070_set_timer_callback(&state->m_scc68070_regs, 0); |
855 | 855 | break; |
856 | 856 | case 0x2026/2: |
857 | verboselog(space | |
857 | verboselog(space.machine(), 2, "scc68070_periphs_w: Timer 1: %04x & %04x\n", data, mem_mask); | |
858 | 858 | COMBINE_DATA(&scc68070->timers.timer1); |
859 | 859 | break; |
860 | 860 | case 0x2028/2: |
861 | verboselog(space | |
861 | verboselog(space.machine(), 2, "scc68070_periphs_w: Timer 2: %04x & %04x\n", data, mem_mask); | |
862 | 862 | COMBINE_DATA(&scc68070->timers.timer2); |
863 | 863 | break; |
864 | 864 | |
r17963 | r17964 | |
866 | 866 | case 0x2044/2: |
867 | 867 | if(ACCESSING_BITS_0_7) |
868 | 868 | { |
869 | verboselog(space | |
869 | verboselog(space.machine(), 2, "scc68070_periphs_w: Peripheral Interrupt Control Register 1: %04x & %04x\n", data, mem_mask); | |
870 | 870 | scc68070->picr1 = data & 0x00ff; |
871 | 871 | } |
872 | 872 | break; |
r17963 | r17964 | |
875 | 875 | case 0x2046/2: |
876 | 876 | if(ACCESSING_BITS_0_7) |
877 | 877 | { |
878 | verboselog(space | |
878 | verboselog(space.machine(), 2, "scc68070_periphs_w: Peripheral Interrupt Control Register 2: %04x & %04x\n", data, mem_mask); | |
879 | 879 | scc68070->picr2 = data & 0x00ff; |
880 | 880 | } |
881 | 881 | break; |
r17963 | r17964 | |
885 | 885 | case 0x4040/2: |
886 | 886 | if(ACCESSING_BITS_0_7) |
887 | 887 | { |
888 | verboselog(space | |
888 | verboselog(space.machine(), 2, "scc68070_periphs_w: DMA(%d) Error (invalid): %04x & %04x\n", (offset - 0x2000) / 32, data, mem_mask); | |
889 | 889 | } |
890 | 890 | if(ACCESSING_BITS_8_15) |
891 | 891 | { |
892 | verboselog(space | |
892 | verboselog(space.machine(), 2, "scc68070_periphs_w: DMA(%d) Status: %04x & %04x\n", (offset - 0x2000) / 32, data, mem_mask); | |
893 | 893 | scc68070->dma.channel[(offset - 0x2000) / 32].channel_status &= ~(data & 0xb0); |
894 | 894 | } |
895 | 895 | break; |
r17963 | r17964 | |
897 | 897 | case 0x4044/2: |
898 | 898 | if(ACCESSING_BITS_0_7) |
899 | 899 | { |
900 | verboselog(space | |
900 | verboselog(space.machine(), 2, "scc68070_periphs_w: DMA(%d) Operation Control Register: %04x & %04x\n", (offset - 0x2000) / 32, data, mem_mask); | |
901 | 901 | scc68070->dma.channel[(offset - 0x2000) / 32].operation_control = data & 0x00ff; |
902 | 902 | } |
903 | 903 | if(ACCESSING_BITS_8_15) |
904 | 904 | { |
905 | verboselog(space | |
905 | verboselog(space.machine(), 2, "scc68070_periphs_w: DMA(%d) Device Control Register: %04x & %04x\n", (offset - 0x2000) / 32, data, mem_mask); | |
906 | 906 | scc68070->dma.channel[(offset - 0x2000) / 32].device_control = data >> 8; |
907 | 907 | } |
908 | 908 | break; |
r17963 | r17964 | |
910 | 910 | case 0x4046/2: |
911 | 911 | if(ACCESSING_BITS_0_7) |
912 | 912 | { |
913 | verboselog(space | |
913 | verboselog(space.machine(), 2, "scc68070_periphs_w: DMA(%d) Channel Control Register: %04x & %04x\n", (offset - 0x2000) / 32, data, mem_mask); | |
914 | 914 | scc68070->dma.channel[(offset - 0x2000) / 32].channel_control = data & 0x007f; |
915 | 915 | if(data & CCR_SO) |
916 | 916 | { |
r17963 | r17964 | |
919 | 919 | } |
920 | 920 | if(ACCESSING_BITS_8_15) |
921 | 921 | { |
922 | verboselog(space | |
922 | verboselog(space.machine(), 2, "scc68070_periphs_w: DMA(%d) Sequence Control Register: %04x & %04x\n", (offset - 0x2000) / 32, data, mem_mask); | |
923 | 923 | scc68070->dma.channel[(offset - 0x2000) / 32].sequence_control = data >> 8; |
924 | 924 | } |
925 | 925 | break; |
926 | 926 | case 0x400a/2: |
927 | verboselog(space | |
927 | verboselog(space.machine(), 2, "scc68070_periphs_w: DMA(%d) Memory Transfer Counter: %04x & %04x\n", (offset - 0x2000) / 32, data, mem_mask); | |
928 | 928 | COMBINE_DATA(&scc68070->dma.channel[(offset - 0x2000) / 32].transfer_counter); |
929 | 929 | break; |
930 | 930 | case 0x400c/2: |
931 | 931 | case 0x404c/2: |
932 | verboselog(space | |
932 | verboselog(space.machine(), 2, "scc68070_periphs_w: DMA(%d) Memory Address Counter (High Word): %04x & %04x\n", (offset - 0x2000) / 32, data, mem_mask); | |
933 | 933 | scc68070->dma.channel[(offset - 0x2000) / 32].memory_address_counter &= ~(mem_mask << 16); |
934 | 934 | scc68070->dma.channel[(offset - 0x2000) / 32].memory_address_counter |= data << 16; |
935 | 935 | break; |
936 | 936 | case 0x400e/2: |
937 | 937 | case 0x404e/2: |
938 | verboselog(space | |
938 | verboselog(space.machine(), 2, "scc68070_periphs_w: DMA(%d) Memory Address Counter (Low Word): %04x & %04x\n", (offset - 0x2000) / 32, data, mem_mask); | |
939 | 939 | scc68070->dma.channel[(offset - 0x2000) / 32].memory_address_counter &= ~mem_mask; |
940 | 940 | scc68070->dma.channel[(offset - 0x2000) / 32].memory_address_counter |= data; |
941 | 941 | break; |
942 | 942 | case 0x4014/2: |
943 | 943 | case 0x4054/2: |
944 | verboselog(space | |
944 | verboselog(space.machine(), 2, "scc68070_periphs_w: DMA(%d) Device Address Counter (High Word): %04x & %04x\n", (offset - 0x2000) / 32, data, mem_mask); | |
945 | 945 | scc68070->dma.channel[(offset - 0x2000) / 32].device_address_counter &= ~(mem_mask << 16); |
946 | 946 | scc68070->dma.channel[(offset - 0x2000) / 32].device_address_counter |= data << 16; |
947 | 947 | break; |
948 | 948 | case 0x4016/2: |
949 | 949 | case 0x4056/2: |
950 | verboselog(space | |
950 | verboselog(space.machine(), 2, "scc68070_periphs_w: DMA(%d) Device Address Counter (Low Word): %04x & %04x\n", (offset - 0x2000) / 32, data, mem_mask); | |
951 | 951 | scc68070->dma.channel[(offset - 0x2000) / 32].device_address_counter &= ~mem_mask; |
952 | 952 | scc68070->dma.channel[(offset - 0x2000) / 32].device_address_counter |= data; |
953 | 953 | break; |
r17963 | r17964 | |
956 | 956 | case 0x8000/2: // Status / Control register |
957 | 957 | if(ACCESSING_BITS_0_7) |
958 | 958 | { // Control |
959 | verboselog(space | |
959 | verboselog(space.machine(), 2, "scc68070_periphs_w: MMU Control: %04x & %04x\n", data, mem_mask); | |
960 | 960 | scc68070->mmu.control = data & 0x00ff; |
961 | 961 | } // Status |
962 | 962 | else |
963 | 963 | { |
964 | verboselog(space | |
964 | verboselog(space.machine(), 0, "scc68070_periphs_w: MMU Status (invalid): %04x & %04x\n", data, mem_mask); | |
965 | 965 | } |
966 | 966 | break; |
967 | 967 | case 0x8040/2: |
r17963 | r17964 | |
972 | 972 | case 0x8068/2: |
973 | 973 | case 0x8070/2: |
974 | 974 | case 0x8078/2: // Attributes (SD0-7) |
975 | verboselog(space | |
975 | verboselog(space.machine(), 2, "scc68070_periphs_w: MMU descriptor %d attributes: %04x & %04x\n", (offset - 0x4020) / 4, data, mem_mask); | |
976 | 976 | COMBINE_DATA(&scc68070->mmu.desc[(offset - 0x4020) / 4].attr); |
977 | 977 | break; |
978 | 978 | case 0x8042/2: |
r17963 | r17964 | |
983 | 983 | case 0x806a/2: |
984 | 984 | case 0x8072/2: |
985 | 985 | case 0x807a/2: // Segment Length (SD0-7) |
986 | verboselog(space | |
986 | verboselog(space.machine(), 2, "scc68070_periphs_w: MMU descriptor %d length: %04x & %04x\n", (offset - 0x4020) / 4, data, mem_mask); | |
987 | 987 | COMBINE_DATA(&scc68070->mmu.desc[(offset - 0x4020) / 4].length); |
988 | 988 | break; |
989 | 989 | case 0x8044/2: |
r17963 | r17964 | |
996 | 996 | case 0x807c/2: // Segment Number (SD0-7, A0=1 only) |
997 | 997 | if(ACCESSING_BITS_0_7) |
998 | 998 | { |
999 | verboselog(space | |
999 | verboselog(space.machine(), 2, "scc68070_periphs_w: MMU descriptor %d segment: %04x & %04x\n", (offset - 0x4020) / 4, data, mem_mask); | |
1000 | 1000 | scc68070->mmu.desc[(offset - 0x4020) / 4].segment = data & 0x00ff; |
1001 | 1001 | } |
1002 | 1002 | break; |
r17963 | r17964 | |
1008 | 1008 | case 0x806e/2: |
1009 | 1009 | case 0x8076/2: |
1010 | 1010 | case 0x807e/2: // Base Address (SD0-7) |
1011 | verboselog(space | |
1011 | verboselog(space.machine(), 2, "scc68070_periphs_w: MMU descriptor %d base: %04x & %04x\n", (offset - 0x4020) / 4, data, mem_mask); | |
1012 | 1012 | COMBINE_DATA(&scc68070->mmu.desc[(offset - 0x4020) / 4].base); |
1013 | 1013 | break; |
1014 | 1014 | default: |
1015 | verboselog(space | |
1015 | verboselog(space.machine(), 0, "scc68070_periphs_w: Unknown address: %04x = %04x & %04x\n", offset * 2, data, mem_mask); | |
1016 | 1016 | break; |
1017 | 1017 | } |
1018 | 1018 | } |
r17963 | r17964 | |
---|---|---|
129 | 129 | |
130 | 130 | |
131 | 131 | |
132 | void midyunit_to_shiftreg(address_space *space, UINT32 address, UINT16 *shiftreg); | |
133 | void midyunit_from_shiftreg(address_space *space, UINT32 address, UINT16 *shiftreg); | |
132 | void midyunit_to_shiftreg(address_space &space, UINT32 address, UINT16 *shiftreg); | |
133 | void midyunit_from_shiftreg(address_space &space, UINT32 address, UINT16 *shiftreg); | |
134 | 134 | |
135 | 135 | |
136 | 136 |
r17963 | r17964 | |
---|---|---|
122 | 122 | |
123 | 123 | |
124 | 124 | |
125 | void nbmj9195_clutsel_w(address_space *space, int data); | |
126 | void nbmj9195_gfxflag2_w(address_space *space, int data); | |
125 | void nbmj9195_clutsel_w(address_space &space, int data); | |
126 | void nbmj9195_gfxflag2_w(address_space &space, int data); |
r17963 | r17964 | |
---|---|---|
56 | 56 | |
57 | 57 | |
58 | 58 | |
59 | void artmagic_to_shiftreg(address_space *space, offs_t address, UINT16 *data); | |
60 | void artmagic_from_shiftreg(address_space *space, offs_t address, UINT16 *data); | |
59 | void artmagic_to_shiftreg(address_space &space, offs_t address, UINT16 *data); | |
60 | void artmagic_from_shiftreg(address_space &space, offs_t address, UINT16 *data); | |
61 | 61 | |
62 | 62 | |
63 | 63 | void artmagic_scanline(screen_device &screen, bitmap_rgb32 &bitmap, int scanline, const tms34010_display_params *params); |
r17963 | r17964 | |
---|---|---|
43 | 43 | |
44 | 44 | void exterm_scanline_update(screen_device &screen, bitmap_ind16 &bitmap, int scanline, const tms34010_display_params *params); |
45 | 45 | |
46 | void exterm_to_shiftreg_master(address_space *space, UINT32 address, UINT16* shiftreg); | |
47 | void exterm_from_shiftreg_master(address_space *space, UINT32 address, UINT16* shiftreg); | |
48 | void exterm_to_shiftreg_slave(address_space *space, UINT32 address, UINT16* shiftreg); | |
49 | void exterm_from_shiftreg_slave(address_space *space, UINT32 address, UINT16* shiftreg); | |
46 | void exterm_to_shiftreg_master(address_space &space, UINT32 address, UINT16* shiftreg); | |
47 | void exterm_from_shiftreg_master(address_space &space, UINT32 address, UINT16* shiftreg); | |
48 | void exterm_to_shiftreg_slave(address_space &space, UINT32 address, UINT16* shiftreg); | |
49 | void exterm_from_shiftreg_slave(address_space &space, UINT32 address, UINT16* shiftreg); |
r17963 | r17964 | |
---|---|---|
87 | 87 | |
88 | 88 | |
89 | 89 | |
90 | void midtunit_to_shiftreg(address_space *space, UINT32 address, UINT16 *shiftreg); | |
91 | void midtunit_from_shiftreg(address_space *space, UINT32 address, UINT16 *shiftreg); | |
90 | void midtunit_to_shiftreg(address_space &space, UINT32 address, UINT16 *shiftreg); | |
91 | void midtunit_from_shiftreg(address_space &space, UINT32 address, UINT16 *shiftreg); | |
92 | 92 | |
93 | 93 | |
94 | 94 |
r17963 | r17964 | |
---|---|---|
101 | 101 | |
102 | 102 | // wrappers for legacy functions (to be removed) |
103 | 103 | template<read16_space_func _Legacy> |
104 | READ16_MEMBER( legacy_wrapper_r ) { return _Legacy( | |
104 | READ16_MEMBER( legacy_wrapper_r ) { return _Legacy(space, offset, mem_mask); } | |
105 | 105 | template<write16_space_func _Legacy> |
106 | WRITE16_MEMBER( legacy_wrapper ) { _Legacy( | |
106 | WRITE16_MEMBER( legacy_wrapper ) { _Legacy(space, offset, data, mem_mask); } | |
107 | 107 | |
108 | 108 | protected: |
109 | 109 | // timer IDs |
r17963 | r17964 | |
---|---|---|
77 | 77 | DECLARE_WRITE16_MEMBER(hyprduel_window_w); |
78 | 78 | DECLARE_WRITE16_MEMBER(hyprduel_scrollreg_w); |
79 | 79 | DECLARE_WRITE16_MEMBER(hyprduel_scrollreg_init_w); |
80 | void blt_write( address_space | |
80 | void blt_write( address_space &space, const int tmap, const offs_t offs, const UINT16 data, const UINT16 mask ); | |
81 | 81 | DECLARE_DRIVER_INIT(magerror); |
82 | 82 | DECLARE_DRIVER_INIT(hyprduel); |
83 | 83 | TILE_GET_INFO_MEMBER(get_tile_info_0_8bit); |
r17963 | r17964 | |
---|---|---|
114 | 114 | /*----------- defined in video/jpmimpct.c -----------*/ |
115 | 115 | |
116 | 116 | |
117 | void jpmimpct_to_shiftreg(address_space *space, UINT32 address, UINT16 *shiftreg); | |
118 | void jpmimpct_from_shiftreg(address_space *space, UINT32 address, UINT16 *shiftreg); | |
117 | void jpmimpct_to_shiftreg(address_space &space, UINT32 address, UINT16 *shiftreg); | |
118 | void jpmimpct_from_shiftreg(address_space &space, UINT32 address, UINT16 *shiftreg); | |
119 | 119 | void jpmimpct_scanline_update(screen_device &screen, bitmap_rgb32 &bitmap, int scanline, const tms34010_display_params *params); |
120 | 120 | |
121 | 121 |
r17963 | r17964 | |
---|---|---|
220 | 220 | SCREEN_UPDATE_IND16(model3); |
221 | 221 | |
222 | 222 | void real3d_display_list_end(running_machine &machine); |
223 | void real3d_display_list1_dma(address_space *space, UINT32 src, UINT32 dst, int length, int byteswap); | |
224 | void real3d_display_list2_dma(address_space *space, UINT32 src, UINT32 dst, int length, int byteswap); | |
225 | void real3d_vrom_texture_dma(address_space *space, UINT32 src, UINT32 dst, int length, int byteswap); | |
226 | void real3d_texture_fifo_dma(address_space *space, UINT32 src, int length, int byteswap); | |
227 | void real3d_polygon_ram_dma(address_space *space, UINT32 src, UINT32 dst, int length, int byteswap); | |
223 | void real3d_display_list1_dma(address_space &space, UINT32 src, UINT32 dst, int length, int byteswap); | |
224 | void real3d_display_list2_dma(address_space &space, UINT32 src, UINT32 dst, int length, int byteswap); | |
225 | void real3d_vrom_texture_dma(address_space &space, UINT32 src, UINT32 dst, int length, int byteswap); | |
226 | void real3d_texture_fifo_dma(address_space &space, UINT32 src, int length, int byteswap); | |
227 | void real3d_polygon_ram_dma(address_space &space, UINT32 src, UINT32 dst, int length, int byteswap); |
r17963 | r17964 | |
---|---|---|
44 | 44 | |
45 | 45 | |
46 | 46 | |
47 | int pastelg_blitter_src_addr_r(address_space | |
47 | int pastelg_blitter_src_addr_r(address_space &space); |
r17963 | r17964 | |
---|---|---|
57 | 57 | DECLARE_READ16_MEMBER( vram_fg_display_r ); |
58 | 58 | DECLARE_READ16_MEMBER( vram_fg_draw_r ); |
59 | 59 | void render_sprite_row(UINT16 *sprite_source, UINT32 address); |
60 | void to_shiftreg(address_space *space, UINT32 address, UINT16 *shiftreg); | |
61 | static void static_to_shiftreg(address_space *space, UINT32 address, UINT16 *shiftreg) { space->machine().driver_data<btoads_state>()->to_shiftreg(space, address, shiftreg); } | |
62 | void from_shiftreg(address_space *space, UINT32 address, UINT16 *shiftreg); | |
63 | static void static_from_shiftreg(address_space *space, UINT32 address, UINT16 *shiftreg) { space->machine().driver_data<btoads_state>()->from_shiftreg(space, address, shiftreg); } | |
60 | void to_shiftreg(address_space &space, UINT32 address, UINT16 *shiftreg); | |
61 | static void static_to_shiftreg(address_space &space, UINT32 address, UINT16 *shiftreg) { space.machine().driver_data<btoads_state>()->to_shiftreg(space, address, shiftreg); } | |
62 | void from_shiftreg(address_space &space, UINT32 address, UINT16 *shiftreg); | |
63 | static void static_from_shiftreg(address_space &space, UINT32 address, UINT16 *shiftreg) { space.machine().driver_data<btoads_state>()->from_shiftreg(space, address, shiftreg); } | |
64 | 64 | void scanline_update(screen_device &screen, bitmap_rgb32 &bitmap, int scanline, const tms34010_display_params *params); |
65 | 65 | static void static_scanline_update(screen_device &screen, bitmap_rgb32 &bitmap, int scanline, const tms34010_display_params *params) { screen.machine().driver_data<btoads_state>()->scanline_update(screen, bitmap, scanline, params); } |
66 | 66 |
r17963 | r17964 | |
---|---|---|
1 | 1 | /*----------- defined in machine/gaelcrpt.c -----------*/ |
2 | 2 | |
3 | UINT16 gaelco_decrypt(address_space | |
3 | UINT16 gaelco_decrypt(address_space &space, int offset, int data, int param1, int param2); |
r17963 | r17964 | |
---|---|---|
132 | 132 | DECLARE_WRITE16_MEMBER(metro_vram_1_w); |
133 | 133 | DECLARE_WRITE16_MEMBER(metro_vram_2_w); |
134 | 134 | DECLARE_WRITE16_MEMBER(metro_window_w); |
135 | void blt_write( address_space | |
135 | void blt_write( address_space &space, const int tmap, const offs_t offs, const UINT16 data, const UINT16 mask ); | |
136 | 136 | DECLARE_CUSTOM_INPUT_MEMBER(custom_soundstatus_r); |
137 | 137 | DECLARE_WRITE16_MEMBER(gakusai_oki_bank_hi_w); |
138 | 138 | DECLARE_WRITE16_MEMBER(gakusai_oki_bank_lo_w); |
r17963 | r17964 | |
---|---|---|
15 | 15 | void slapstic_reset(void); |
16 | 16 | |
17 | 17 | int slapstic_bank(void); |
18 | int slapstic_tweak(address_space | |
18 | int slapstic_tweak(address_space &space, offs_t offset); |
r17963 | r17964 | |
---|---|---|
85 | 85 | SCREEN_UPDATE_IND16( ojankohs ); |
86 | 86 | SCREEN_UPDATE_IND16( ojankoc ); |
87 | 87 | |
88 | void ojankoc_flipscreen(address_space | |
88 | void ojankoc_flipscreen(address_space &space, int data); | |
89 | 89 |
r17963 | r17964 | |
---|---|---|
1 | void nb_1414m4_exec(address_space | |
1 | void nb_1414m4_exec(address_space &space,UINT16 mcu_cmd,UINT8 *vram,UINT16 &scrollx,UINT16 &scrolly,tilemap_t *tilemap); |
r17963 | r17964 | |
---|---|---|
356 | 356 | /*----------- defined in video/harddriv.c -----------*/ |
357 | 357 | |
358 | 358 | |
359 | void hdgsp_write_to_shiftreg(address_space *space, UINT32 address, UINT16 *shiftreg); | |
360 | void hdgsp_read_from_shiftreg(address_space *space, UINT32 address, UINT16 *shiftreg); | |
359 | void hdgsp_write_to_shiftreg(address_space &space, UINT32 address, UINT16 *shiftreg); | |
360 | void hdgsp_read_from_shiftreg(address_space &space, UINT32 address, UINT16 *shiftreg); | |
361 | 361 | |
362 | 362 | READ16_HANDLER( hdgsp_control_lo_r ); |
363 | 363 | WRITE16_HANDLER( hdgsp_control_lo_w ); |
r17963 | r17964 | |
---|---|---|
213 | 213 | UINT16 data[HWIDTH]; /* graphics data buffer (text through chargen) */ |
214 | 214 | }; |
215 | 215 | |
216 | typedef void (*atari_renderer_func)(address_space | |
216 | typedef void (*atari_renderer_func)(address_space &space, VIDEO *video); | |
217 | 217 | |
218 | 218 | struct ANTIC { |
219 | 219 | atari_renderer_func renderer; /* current renderer */ |
r17963 | r17964 | |
263 | 263 | bitmap_ind16 *bitmap; |
264 | 264 | }; |
265 | 265 | |
266 | #define RDANTIC(space) space->read_byte(antic.dpage+antic.doffs) | |
267 | #define RDVIDEO(space,o) space->read_byte(antic.vpage+((antic.voffs+(o))&VOFFS)) | |
268 | #define RDCHGEN(space,o) space->read_byte(antic.chbase+(o)) | |
269 | #define RDPMGFXS(space,o) space->read_byte(antic.pmbase_s+(o)+(antic.scanline>>1)) | |
270 | #define RDPMGFXD(space,o) space->read_byte(antic.pmbase_d+(o)+antic.scanline) | |
266 | #define RDANTIC(space) space.read_byte(antic.dpage+antic.doffs) | |
267 | #define RDVIDEO(space,o) space.read_byte(antic.vpage+((antic.voffs+(o))&VOFFS)) | |
268 | #define RDCHGEN(space,o) space.read_byte(antic.chbase+(o)) | |
269 | #define RDPMGFXS(space,o) space.read_byte(antic.pmbase_s+(o)+(antic.scanline>>1)) | |
270 | #define RDPMGFXD(space,o) space.read_byte(antic.pmbase_d+(o)+antic.scanline) | |
271 | 271 | |
272 | 272 | #define PREPARE() \ |
273 | 273 | UINT32 *dst = (UINT32 *)&antic.cclock[PMOFFSET] |
r17963 | r17964 | |
538 | 538 | READ8_HANDLER ( atari_antic_r ); |
539 | 539 | WRITE8_HANDLER ( atari_antic_w ); |
540 | 540 | |
541 | #define ANTIC_RENDERER(name) void name(address_space | |
541 | #define ANTIC_RENDERER(name) void name(address_space &space, VIDEO *video) | |
542 | 542 | |
543 | 543 | ANTIC_RENDERER( antic_mode_0_xx ); |
544 | 544 | ANTIC_RENDERER( antic_mode_2_32 ); |
r17963 | r17964 | |
---|---|---|
1 | 1 | /*----------- defined in drivers/eolithsp.c -----------*/ |
2 | 2 | |
3 | void eolith_speedup_read(address_space | |
3 | void eolith_speedup_read(address_space &space); | |
4 | 4 | void init_eolith_speedup(running_machine &machine); |
5 | 5 | TIMER_DEVICE_CALLBACK( eolith_speedup ); |
6 | 6 |
r17963 | r17964 | |
---|---|---|
213 | 213 | /*----------- defined in drivers/neogeo.c -----------*/ |
214 | 214 | |
215 | 215 | void neogeo_set_display_position_interrupt_control(running_machine &machine, UINT16 data); |
216 | void neogeo_set_display_counter_msb(address_space *space, UINT16 data); | |
217 | void neogeo_set_display_counter_lsb(address_space *space, UINT16 data); | |
216 | void neogeo_set_display_counter_msb(address_space &space, UINT16 data); | |
217 | void neogeo_set_display_counter_lsb(address_space &space, UINT16 data); | |
218 | 218 | void neogeo_acknowledge_interrupt(running_machine &machine, UINT16 data); |
219 | void neogeo_set_main_cpu_bank_address(address_space | |
219 | void neogeo_set_main_cpu_bank_address(address_space &space, UINT32 bank_address); | |
220 | 220 | DEVICE_IMAGE_LOAD( neo_cartridge ); |
221 | 221 | |
222 | 222 |
r17963 | r17964 | |
---|---|---|
141 | 141 | |
142 | 142 | // wrappers for legacy functions (to be removed) |
143 | 143 | template<write16_space_func _Legacy> |
144 | WRITE16_MEMBER( legacy_wrapper ) { _Legacy( | |
144 | WRITE16_MEMBER( legacy_wrapper ) { _Legacy(space, offset, data, mem_mask); } | |
145 | 145 | |
146 | 146 | protected: |
147 | 147 | // internal types |
r17963 | r17964 | |
---|---|---|
123 | 123 | |
124 | 124 | /*----------- defined in drivers/williams.c -----------*/ |
125 | 125 | |
126 | void defender_install_io_space(address_space | |
126 | void defender_install_io_space(address_space &space); | |
127 | 127 | |
128 | 128 | |
129 | 129 | /*----------- defined in machine/williams.c -----------*/ |
r17963 | r17964 | |
---|---|---|
38 | 38 | |
39 | 39 | required_shared_ptr<UINT32> m_mo_command; |
40 | 40 | |
41 | void (*m_protection_w)(address_space *space, offs_t offset, UINT16 data); | |
42 | void (*m_protection_r)(address_space *space, offs_t offset, UINT16 *data); | |
41 | void (*m_protection_w)(address_space &space, offs_t offset, UINT16 data); | |
42 | void (*m_protection_r)(address_space &space, offs_t offset, UINT16 *data); | |
43 | 43 | |
44 | 44 | UINT8 m_ignore_writes; |
45 | 45 | offs_t m_protaddr[ADDRSEQ_COUNT]; |
r17963 | r17964 | |
---|---|---|
113 | 113 | |
114 | 114 | // wrappers for legacy functions (to be removed) |
115 | 115 | template<read16_space_func _Legacy> |
116 | READ16_MEMBER( legacy_wrapper_r ) { return _Legacy( | |
116 | READ16_MEMBER( legacy_wrapper_r ) { return _Legacy(space, offset, mem_mask); } | |
117 | 117 | template<write16_space_func _Legacy> |
118 | WRITE16_MEMBER( legacy_wrapper ) { _Legacy( | |
118 | WRITE16_MEMBER( legacy_wrapper ) { _Legacy(space, offset, data, mem_mask); } | |
119 | 119 | |
120 | 120 | protected: |
121 | 121 | // timer IDs |
r17963 | r17964 | |
---|---|---|
90 | 90 | data = antic.r.antic09; |
91 | 91 | break; |
92 | 92 | case 10: /* WSYNC read */ |
93 | space | |
93 | space.machine().device("maincpu")->execute().spin_until_trigger(TRIGGER_HSYNC); | |
94 | 94 | antic.w.wsync = 1; |
95 | 95 | data = antic.r.antic0a; |
96 | 96 | break; |
r17963 | r17964 | |
200 | 200 | break; |
201 | 201 | case 10: /* WSYNC write */ |
202 | 202 | LOG(("ANTIC 0A write WSYNC $%02X\n", data)); |
203 | space | |
203 | space.machine().device("maincpu")->execute().spin_until_trigger(TRIGGER_HSYNC); | |
204 | 204 | antic.w.wsync = 1; |
205 | 205 | break; |
206 | 206 | case 11: |
r17963 | r17964 | |
---|---|---|
240 | 240 | |
241 | 241 | WRITE8_HANDLER( xevious_fg_videoram_w ) |
242 | 242 | { |
243 | xevious_state *state = space | |
243 | xevious_state *state = space.machine().driver_data<xevious_state>(); | |
244 | 244 | |
245 | 245 | state->m_xevious_fg_videoram[offset] = data; |
246 | 246 | state->m_fg_tilemap->mark_tile_dirty(offset); |
r17963 | r17964 | |
248 | 248 | |
249 | 249 | WRITE8_HANDLER( xevious_fg_colorram_w ) |
250 | 250 | { |
251 | xevious_state *state = space | |
251 | xevious_state *state = space.machine().driver_data<xevious_state>(); | |
252 | 252 | |
253 | 253 | state->m_xevious_fg_colorram[offset] = data; |
254 | 254 | state->m_fg_tilemap->mark_tile_dirty(offset); |
r17963 | r17964 | |
256 | 256 | |
257 | 257 | WRITE8_HANDLER( xevious_bg_videoram_w ) |
258 | 258 | { |
259 | xevious_state *state = space | |
259 | xevious_state *state = space.machine().driver_data<xevious_state>(); | |
260 | 260 | |
261 | 261 | state->m_xevious_bg_videoram[offset] = data; |
262 | 262 | state->m_bg_tilemap->mark_tile_dirty(offset); |
r17963 | r17964 | |
264 | 264 | |
265 | 265 | WRITE8_HANDLER( xevious_bg_colorram_w ) |
266 | 266 | { |
267 | xevious_state *state = space | |
267 | xevious_state *state = space.machine().driver_data<xevious_state>(); | |
268 | 268 | |
269 | 269 | state->m_xevious_bg_colorram[offset] = data; |
270 | 270 | state->m_bg_tilemap->mark_tile_dirty(offset); |
r17963 | r17964 | |
272 | 272 | |
273 | 273 | WRITE8_HANDLER( xevious_vh_latch_w ) |
274 | 274 | { |
275 | xevious_state *state = space | |
275 | xevious_state *state = space.machine().driver_data<xevious_state>(); | |
276 | 276 | |
277 | 277 | int reg; |
278 | 278 | int scroll = data + ((offset&0x01)<<8); /* A0 -> D8 */ |
r17963 | r17964 | |
306 | 306 | /* emulation for schematic 9B */ |
307 | 307 | WRITE8_HANDLER( xevious_bs_w ) |
308 | 308 | { |
309 | xevious_state *state = space | |
309 | xevious_state *state = space.machine().driver_data<xevious_state>(); | |
310 | 310 | |
311 | 311 | state->m_xevious_bs[offset & 1] = data; |
312 | 312 | } |
313 | 313 | |
314 | 314 | READ8_HANDLER( xevious_bb_r ) |
315 | 315 | { |
316 | xevious_state *state = space | |
316 | xevious_state *state = space.machine().driver_data<xevious_state>(); | |
317 | 317 | |
318 | 318 | UINT8 *rom2a = state->memregion("gfx4")->base(); |
319 | 319 | UINT8 *rom2b = rom2a+0x1000; |
r17963 | r17964 | |
---|---|---|
1353 | 1353 | |
1354 | 1354 | READ16_HANDLER( mcd212_r ) |
1355 | 1355 | { |
1356 | cdi_state *state = space | |
1356 | cdi_state *state = space.machine().driver_data<cdi_state>(); | |
1357 | 1357 | mcd212_regs_t *mcd212 = &state->m_mcd212_regs; |
1358 | 1358 | UINT8 channel = 1 - (offset / 8); |
1359 | 1359 | |
r17963 | r17964 | |
1363 | 1363 | case 0x10/2: |
1364 | 1364 | if(ACCESSING_BITS_0_7) |
1365 | 1365 | { |
1366 | verboselog(space | |
1366 | verboselog(space.machine(), 12, "mcd212_r: Status Register %d: %02x & %04x\n", channel + 1, mcd212->channel[1 - (offset / 8)].csrr, mem_mask); | |
1367 | 1367 | if(channel == 0) |
1368 | 1368 | { |
1369 | 1369 | return mcd212->channel[0].csrr; |
r17963 | r17964 | |
1376 | 1376 | mcd212->channel[1].csrr &= ~(MCD212_CSR2R_IT1 | MCD212_CSR2R_IT2); |
1377 | 1377 | if(interrupt1) |
1378 | 1378 | { |
1379 | space | |
1379 | space.machine().device("maincpu")->execute().set_input_line(M68K_IRQ_1 + (interrupt1 - 1), CLEAR_LINE); | |
1380 | 1380 | } |
1381 | 1381 | //if(interrupt2) |
1382 | 1382 | //{ |
1383 | // space | |
1383 | // space.machine().device("maincpu")->execute().set_input_line(M68K_IRQ_1 + (interrupt2 - 1), CLEAR_LINE); | |
1384 | 1384 | //} |
1385 | 1385 | return old_csr; |
1386 | 1386 | } |
1387 | 1387 | } |
1388 | 1388 | else |
1389 | 1389 | { |
1390 | verboselog(space | |
1390 | verboselog(space.machine(), 2, "mcd212_r: Unknown Register %d: %04x\n", channel + 1, mem_mask); | |
1391 | 1391 | } |
1392 | 1392 | break; |
1393 | 1393 | case 0x02/2: |
1394 | 1394 | case 0x12/2: |
1395 | verboselog(space | |
1395 | verboselog(space.machine(), 2, "mcd212_r: Display Command Register %d: %04x & %04x\n", (1 - (offset / 8)) + 1, mcd212->channel[1 - (offset / 8)].dcr, mem_mask); | |
1396 | 1396 | return mcd212->channel[1 - (offset / 8)].dcr; |
1397 | 1397 | case 0x04/2: |
1398 | 1398 | case 0x14/2: |
1399 | verboselog(space | |
1399 | verboselog(space.machine(), 2, "mcd212_r: Video Start Register %d: %04x & %04x\n", (1 - (offset / 8)) + 1, mcd212->channel[1 - (offset / 8)].vsr, mem_mask); | |
1400 | 1400 | return mcd212->channel[1 - (offset / 8)].vsr; |
1401 | 1401 | case 0x08/2: |
1402 | 1402 | case 0x18/2: |
1403 | verboselog(space | |
1403 | verboselog(space.machine(), 2, "mcd212_r: Display Decoder Register %d: %04x & %04x\n", (1 - (offset / 8)) + 1, mcd212->channel[1 - (offset / 8)].ddr, mem_mask); | |
1404 | 1404 | return mcd212->channel[1 - (offset / 8)].ddr; |
1405 | 1405 | case 0x0a/2: |
1406 | 1406 | case 0x1a/2: |
1407 | verboselog(space | |
1407 | verboselog(space.machine(), 2, "mcd212_r: DCA Pointer Register %d: %04x & %04x\n", (1 - (offset / 8)) + 1, mcd212->channel[1 - (offset / 8)].dcp, mem_mask); | |
1408 | 1408 | return mcd212->channel[1 - (offset / 8)].dcp; |
1409 | 1409 | default: |
1410 | verboselog(space | |
1410 | verboselog(space.machine(), 2, "mcd212_r: Unknown Register %d & %04x\n", (1 - (offset / 8)) + 1, mem_mask); | |
1411 | 1411 | break; |
1412 | 1412 | } |
1413 | 1413 | |
r17963 | r17964 | |
1416 | 1416 | |
1417 | 1417 | WRITE16_HANDLER( mcd212_w ) |
1418 | 1418 | { |
1419 | cdi_state *state = space | |
1419 | cdi_state *state = space.machine().driver_data<cdi_state>(); | |
1420 | 1420 | mcd212_regs_t *mcd212 = &state->m_mcd212_regs; |
1421 | 1421 | |
1422 | 1422 | switch(offset) |
1423 | 1423 | { |
1424 | 1424 | case 0x00/2: |
1425 | 1425 | case 0x10/2: |
1426 | verboselog(space | |
1426 | verboselog(space.machine(), 2, "mcd212_w: Status Register %d: %04x & %04x\n", (1 - (offset / 8)) + 1, data, mem_mask); | |
1427 | 1427 | COMBINE_DATA(&mcd212->channel[1 - (offset / 8)].csrw); |
1428 | mcd212_update_visible_area(space | |
1428 | mcd212_update_visible_area(space.machine()); | |
1429 | 1429 | break; |
1430 | 1430 | case 0x02/2: |
1431 | 1431 | case 0x12/2: |
1432 | verboselog(space | |
1432 | verboselog(space.machine(), 2, "mcd212_w: Display Command Register %d: %04x & %04x\n", (1 - (offset / 8)) + 1, data, mem_mask); | |
1433 | 1433 | COMBINE_DATA(&mcd212->channel[1 - (offset / 8)].dcr); |
1434 | mcd212_update_visible_area(space | |
1434 | mcd212_update_visible_area(space.machine()); | |
1435 | 1435 | break; |
1436 | 1436 | case 0x04/2: |
1437 | 1437 | case 0x14/2: |
1438 | verboselog(space | |
1438 | verboselog(space.machine(), 2, "mcd212_w: Video Start Register %d: %04x & %04x\n", (1 - (offset / 8)) + 1, data, mem_mask); | |
1439 | 1439 | COMBINE_DATA(&mcd212->channel[1 - (offset / 8)].vsr); |
1440 | 1440 | break; |
1441 | 1441 | case 0x08/2: |
1442 | 1442 | case 0x18/2: |
1443 | verboselog(space | |
1443 | verboselog(space.machine(), 2, "mcd212_w: Display Decoder Register %d: %04x & %04x\n", (1 - (offset / 8)) + 1, data, mem_mask); | |
1444 | 1444 | COMBINE_DATA(&mcd212->channel[1 - (offset / 8)].ddr); |
1445 | 1445 | break; |
1446 | 1446 | case 0x0a/2: |
1447 | 1447 | case 0x1a/2: |
1448 | verboselog(space | |
1448 | verboselog(space.machine(), 2, "mcd212_w: DCA Pointer Register %d: %04x & %04x\n", (1 - (offset / 8)) + 1, data, mem_mask); | |
1449 | 1449 | COMBINE_DATA(&mcd212->channel[1 - (offset / 8)].dcp); |
1450 | 1450 | break; |
1451 | 1451 | default: |
1452 | verboselog(space | |
1452 | verboselog(space.machine(), 2, "mcd212_w: Unknown Register %d: %04x & %04x\n", (1 - (offset / 8)) + 1, data, mem_mask); | |
1453 | 1453 | break; |
1454 | 1454 | } |
1455 | 1455 | } |
r17963 | r17964 | |
---|---|---|
171 | 171 | * |
172 | 172 | *************************************/ |
173 | 173 | |
174 | void midyunit_to_shiftreg(address_space | |
174 | void midyunit_to_shiftreg(address_space &space, UINT32 address, UINT16 *shiftreg) | |
175 | 175 | { |
176 | midyunit_state *state = space | |
176 | midyunit_state *state = space.machine().driver_data<midyunit_state>(); | |
177 | 177 | memcpy(shiftreg, &state->m_local_videoram[address >> 3], 2 * 512 * sizeof(UINT16)); |
178 | 178 | } |
179 | 179 | |
180 | 180 | |
181 | void midyunit_from_shiftreg(address_space | |
181 | void midyunit_from_shiftreg(address_space &space, UINT32 address, UINT16 *shiftreg) | |
182 | 182 | { |
183 | midyunit_state *state = space | |
183 | midyunit_state *state = space.machine().driver_data<midyunit_state>(); | |
184 | 184 | memcpy(&state->m_local_videoram[address >> 3], shiftreg, 2 * 512 * sizeof(UINT16)); |
185 | 185 | } |
186 | 186 |
r17963 | r17964 | |
---|---|---|
1211 | 1211 | if (++p3_state == 3) |
1212 | 1212 | { |
1213 | 1213 | p3_state = 0; |
1214 | palette_set_color_rgb(space | |
1214 | palette_set_color_rgb(space.machine(),ygv608.regs.s.cc, | |
1215 | 1215 | pal6bit(ygv608.colour_palette[ygv608.regs.s.cc][0]), |
1216 | 1216 | pal6bit(ygv608.colour_palette[ygv608.regs.s.cc][1]), |
1217 | 1217 | pal6bit(ygv608.colour_palette[ygv608.regs.s.cc][2]) ); |
r17963 | r17964 | |
1228 | 1228 | #endif |
1229 | 1229 | SetPreShortcuts (regNum, data); |
1230 | 1230 | ygv608.regs.b[regNum] = data; |
1231 | SetPostShortcuts (space | |
1231 | SetPostShortcuts (space.machine(), regNum); | |
1232 | 1232 | if (ygv608.ports.s.p5 & p5_rwai) |
1233 | 1233 | { |
1234 | 1234 | regNum ++; |
r17963 | r17964 | |
1255 | 1255 | case 0x07: /* P#7 - system control port */ |
1256 | 1256 | ygv608.ports.b[7] = data; |
1257 | 1257 | if (ygv608.ports.b[7] & 0x3e) |
1258 | HandleRomTransfers(space | |
1258 | HandleRomTransfers(space.machine()); | |
1259 | 1259 | if (ygv608.ports.b[7] & 0x01) |
1260 | HandleYGV608Reset(space | |
1260 | HandleYGV608Reset(space.machine()); | |
1261 | 1261 | break; |
1262 | 1262 | |
1263 | 1263 | default: |
r17963 | r17964 | |
---|---|---|
166 | 166 | |
167 | 167 | READ16_HANDLER( saturn_vdp1_regs_r ) |
168 | 168 | { |
169 | saturn_state *state = space | |
169 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
170 | 170 | |
171 | //logerror ("cpu %s (PC=%08X) VDP1: Read from Registers, Offset %04x\n", space | |
171 | //logerror ("cpu %s (PC=%08X) VDP1: Read from Registers, Offset %04x\n", space.device().tag(), space.device().safe_pc(), offset); | |
172 | 172 | |
173 | 173 | switch(offset) |
174 | 174 | { |
r17963 | r17964 | |
194 | 194 | |
195 | 195 | return modr; |
196 | 196 | default: |
197 | printf ("cpu %s (PC=%08X) VDP1: Read from Registers, Offset %04x\n", space | |
197 | printf ("cpu %s (PC=%08X) VDP1: Read from Registers, Offset %04x\n", space.device().tag(), space.device().safe_pc(), offset*2); | |
198 | 198 | break; |
199 | 199 | } |
200 | 200 | |
r17963 | r17964 | |
288 | 288 | |
289 | 289 | WRITE16_HANDLER( saturn_vdp1_regs_w ) |
290 | 290 | { |
291 | saturn_state *state = space | |
291 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
292 | 292 | COMBINE_DATA(&state->m_vdp1_regs[offset]); |
293 | 293 | |
294 | 294 | switch(offset) |
295 | 295 | { |
296 | 296 | case 0x00/2: |
297 | stv_set_framebuffer_config(space | |
297 | stv_set_framebuffer_config(space.machine()); | |
298 | 298 | if ( VDP1_LOG ) logerror( "VDP1: Access to register TVMR = %1X\n", STV_VDP1_TVMR ); |
299 | 299 | |
300 | 300 | break; |
301 | 301 | case 0x02/2: |
302 | stv_set_framebuffer_config(space | |
302 | stv_set_framebuffer_config(space.machine()); | |
303 | 303 | if ( VDP1_LOG ) logerror( "VDP1: Access to register FBCR = %1X\n", STV_VDP1_FBCR ); |
304 | 304 | state->m_vdp1.fbcr_accessed = 1; |
305 | 305 | break; |
306 | 306 | case 0x04/2: |
307 | 307 | if ( VDP1_LOG ) logerror( "VDP1: Access to register PTMR = %1X\n", STV_VDP1_PTM ); |
308 | 308 | if ( STV_VDP1_PTMR == 1 ) |
309 | stv_vdp1_process_list( space | |
309 | stv_vdp1_process_list( space.machine() ); | |
310 | 310 | |
311 | 311 | break; |
312 | 312 | case 0x06/2: |
r17963 | r17964 | |
332 | 332 | |
333 | 333 | READ32_HANDLER ( saturn_vdp1_vram_r ) |
334 | 334 | { |
335 | saturn_state *state = space | |
335 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
336 | 336 | return state->m_vdp1_vram[offset]; |
337 | 337 | } |
338 | 338 | |
339 | 339 | |
340 | 340 | WRITE32_HANDLER ( saturn_vdp1_vram_w ) |
341 | 341 | { |
342 | saturn_state *state = space | |
342 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
343 | 343 | UINT8 *vdp1 = state->m_vdp1.gfx_decode; |
344 | 344 | |
345 | 345 | COMBINE_DATA (&state->m_vdp1_vram[offset]); |
346 | 346 | |
347 | 347 | // if (((offset * 4) > 0xdf) && ((offset * 4) < 0x140)) |
348 | 348 | // { |
349 | // logerror("cpu %s (PC=%08X): VRAM dword write to %08X = %08X & %08X\n", space | |
349 | // logerror("cpu %s (PC=%08X): VRAM dword write to %08X = %08X & %08X\n", space.device().tag(), space.device().safe_pc(), offset*4, data, mem_mask); | |
350 | 350 | // } |
351 | 351 | |
352 | 352 | data = state->m_vdp1_vram[offset]; |
r17963 | r17964 | |
359 | 359 | |
360 | 360 | WRITE32_HANDLER ( saturn_vdp1_framebuffer0_w ) |
361 | 361 | { |
362 | saturn_state *state = space | |
362 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
363 | 363 | //popmessage ("STV VDP1 Framebuffer 0 WRITE offset %08x data %08x",offset, data); |
364 | 364 | if ( STV_VDP1_TVM & 1 ) |
365 | 365 | { |
r17963 | r17964 | |
402 | 402 | |
403 | 403 | READ32_HANDLER ( saturn_vdp1_framebuffer0_r ) |
404 | 404 | { |
405 | saturn_state *state = space | |
405 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
406 | 406 | UINT32 result = 0; |
407 | 407 | //popmessage ("STV VDP1 Framebuffer 0 READ offset %08x",offset); |
408 | 408 | if ( STV_VDP1_TVM & 1 ) |
r17963 | r17964 | |
---|---|---|
68 | 68 | |
69 | 69 | |
70 | 70 | ******************************************************************************/ |
71 | static int nbmj9195_blitter_r(address_space | |
71 | static int nbmj9195_blitter_r(address_space &space, int offset, int vram) | |
72 | 72 | { |
73 | nbmj9195_state *state = space | |
73 | nbmj9195_state *state = space.machine().driver_data<nbmj9195_state>(); | |
74 | 74 | int ret; |
75 | 75 | UINT8 *GFXROM = state->memregion("gfx1")->base(); |
76 | 76 | |
r17963 | r17964 | |
84 | 84 | return ret; |
85 | 85 | } |
86 | 86 | |
87 | static void nbmj9195_blitter_w(address_space | |
87 | static void nbmj9195_blitter_w(address_space &space, int offset, int data, int vram) | |
88 | 88 | { |
89 | nbmj9195_state *state = space | |
89 | nbmj9195_state *state = space.machine().driver_data<nbmj9195_state>(); | |
90 | 90 | int new_line; |
91 | 91 | |
92 | 92 | switch (offset) |
r17963 | r17964 | |
99 | 99 | // if (data & 0x20) popmessage("Unknown GFX Flag!! (0x20)"); |
100 | 100 | state->m_flipscreen[vram] = (data & 0x40) ? 0 : 1; |
101 | 101 | state->m_dispflag[vram] = (data & 0x80) ? 1 : 0; |
102 | nbmj9195_vramflip(space | |
102 | nbmj9195_vramflip(space.machine(), vram); | |
103 | 103 | break; |
104 | 104 | case 0x01: state->m_scrollx[vram] = (state->m_scrollx[vram] & 0x0100) | data; break; |
105 | 105 | case 0x02: state->m_scrollx[vram] = (state->m_scrollx[vram] & 0x00ff) | ((data << 8) & 0x0100); |
106 | new_line = space | |
106 | new_line = space.machine().primary_screen->vpos(); | |
107 | 107 | if (state->m_flipscreen[vram]) |
108 | 108 | { |
109 | 109 | for ( ; state->m_scanline[vram] < new_line; state->m_scanline[vram]++) |
r17963 | r17964 | |
126 | 126 | case 0x0b: state->m_blitter_destx[vram] = (state->m_blitter_destx[vram] & 0x00ff) | (data << 8); break; |
127 | 127 | case 0x0c: state->m_blitter_desty[vram] = (state->m_blitter_desty[vram] & 0xff00) | data; break; |
128 | 128 | case 0x0d: state->m_blitter_desty[vram] = (state->m_blitter_desty[vram] & 0x00ff) | (data << 8); |
129 | nbmj9195_gfxdraw(space | |
129 | nbmj9195_gfxdraw(space.machine(), vram); | |
130 | 130 | break; |
131 | 131 | default: break; |
132 | 132 | } |
133 | 133 | } |
134 | 134 | |
135 | void nbmj9195_clutsel_w(address_space | |
135 | void nbmj9195_clutsel_w(address_space &space, int data) | |
136 | 136 | { |
137 | nbmj9195_state *state = space | |
137 | nbmj9195_state *state = space.machine().driver_data<nbmj9195_state>(); | |
138 | 138 | state->m_clutsel = data; |
139 | 139 | } |
140 | 140 | |
141 | static void nbmj9195_clut_w(address_space | |
141 | static void nbmj9195_clut_w(address_space &space, int offset, int data, int vram) | |
142 | 142 | { |
143 | nbmj9195_state *state = space | |
143 | nbmj9195_state *state = space.machine().driver_data<nbmj9195_state>(); | |
144 | 144 | state->m_clut[vram][((state->m_clutsel & 0xff) * 0x10) + (offset & 0x0f)] = data; |
145 | 145 | } |
146 | 146 | |
147 | void nbmj9195_gfxflag2_w(address_space | |
147 | void nbmj9195_gfxflag2_w(address_space &space, int data) | |
148 | 148 | { |
149 | nbmj9195_state *state = space | |
149 | nbmj9195_state *state = space.machine().driver_data<nbmj9195_state>(); | |
150 | 150 | state->m_gfxflag2 = data; |
151 | 151 | } |
152 | 152 | |
r17963 | r17964 | |
371 | 371 | |
372 | 372 | |
373 | 373 | ******************************************************************************/ |
374 | WRITE8_MEMBER(nbmj9195_state::nbmj9195_blitter_0_w){ nbmj9195_blitter_w(&space, offset, data, 0); } | |
375 | WRITE8_MEMBER(nbmj9195_state::nbmj9195_blitter_1_w){ nbmj9195_blitter_w(&space, offset, data, 1); } | |
374 | WRITE8_MEMBER(nbmj9195_state::nbmj9195_blitter_0_w){ nbmj9195_blitter_w(space, offset, data, 0); } | |
375 | WRITE8_MEMBER(nbmj9195_state::nbmj9195_blitter_1_w){ nbmj9195_blitter_w(space, offset, data, 1); } | |
376 | 376 | |
377 | READ8_MEMBER(nbmj9195_state::nbmj9195_blitter_0_r){ return nbmj9195_blitter_r(&space, offset, 0); } | |
378 | READ8_MEMBER(nbmj9195_state::nbmj9195_blitter_1_r){ return nbmj9195_blitter_r(&space, offset, 1); } | |
377 | READ8_MEMBER(nbmj9195_state::nbmj9195_blitter_0_r){ return nbmj9195_blitter_r(space, offset, 0); } | |
378 | READ8_MEMBER(nbmj9195_state::nbmj9195_blitter_1_r){ return nbmj9195_blitter_r(space, offset, 1); } | |
379 | 379 | |
380 | WRITE8_MEMBER(nbmj9195_state::nbmj9195_clut_0_w){ nbmj9195_clut_w(&space, offset, data, 0); } | |
381 | WRITE8_MEMBER(nbmj9195_state::nbmj9195_clut_1_w){ nbmj9195_clut_w(&space, offset, data, 1); } | |
380 | WRITE8_MEMBER(nbmj9195_state::nbmj9195_clut_0_w){ nbmj9195_clut_w(space, offset, data, 0); } | |
381 | WRITE8_MEMBER(nbmj9195_state::nbmj9195_clut_1_w){ nbmj9195_clut_w(space, offset, data, 1); } | |
382 | 382 | |
383 | 383 | /****************************************************************************** |
384 | 384 |
r17963 | r17964 | |
---|---|---|
57 | 57 | * |
58 | 58 | *************************************/ |
59 | 59 | |
60 | void artmagic_to_shiftreg(address_space | |
60 | void artmagic_to_shiftreg(address_space &space, offs_t address, UINT16 *data) | |
61 | 61 | { |
62 | artmagic_state *state = space | |
62 | artmagic_state *state = space.machine().driver_data<artmagic_state>(); | |
63 | 63 | UINT16 *vram = address_to_vram(state, &address); |
64 | 64 | if (vram) |
65 | 65 | memcpy(data, &vram[address], TOBYTE(0x2000)); |
66 | 66 | } |
67 | 67 | |
68 | 68 | |
69 | void artmagic_from_shiftreg(address_space | |
69 | void artmagic_from_shiftreg(address_space &space, offs_t address, UINT16 *data) | |
70 | 70 | { |
71 | artmagic_state *state = space | |
71 | artmagic_state *state = space.machine().driver_data<artmagic_state>(); | |
72 | 72 | UINT16 *vram = address_to_vram(state, &address); |
73 | 73 | if (vram) |
74 | 74 | memcpy(&vram[address], data, TOBYTE(0x2000)); |
r17963 | r17964 | |
---|---|---|
25 | 25 | |
26 | 26 | |
27 | 27 | #ifdef UNUSED_DEFINITION |
28 | INLINE UINT16 galpani2_bg8_regs_r(address_space | |
28 | INLINE UINT16 galpani2_bg8_regs_r(address_space &space, offs_t offset, int n) | |
29 | 29 | { |
30 | galpani2_state *state = space | |
30 | galpani2_state *state = space.machine().driver_data<galpani2_state>(); | |
31 | 31 | switch (offset * 2) |
32 | 32 | { |
33 | case 0x16: return space | |
33 | case 0x16: return space.machine().rand() & 1; | |
34 | 34 | default: |
35 | logerror("CPU #0 PC %06X : Warning, bg8 #%d screen reg %04X read\n",space | |
35 | logerror("CPU #0 PC %06X : Warning, bg8 #%d screen reg %04X read\n",space.cpu->safe_pc(),_n_,offset*2); | |
36 | 36 | } |
37 | 37 | return state->m_bg8_regs[_n_][offset]; |
38 | 38 | } |
r17963 | r17964 | |
44 | 44 | c04 0003 flip, 0300 flip? |
45 | 45 | c1c/e 01ff scroll, 3000 ? |
46 | 46 | */ |
47 | INLINE void galpani2_bg8_regs_w(address_space | |
47 | INLINE void galpani2_bg8_regs_w(address_space &space, offs_t offset, UINT16 data, UINT16 mem_mask, int _n_) | |
48 | 48 | { |
49 | galpani2_state *state = space | |
49 | galpani2_state *state = space.machine().driver_data<galpani2_state>(); | |
50 | 50 | COMBINE_DATA(&state->m_bg8_regs[_n_][offset]); |
51 | 51 | } |
52 | 52 | |
r17963 | r17964 | |
57 | 57 | WRITE16_HANDLER( galpani2_bg8_regs_1_w ) { galpani2_bg8_regs_w(space, offset, data, mem_mask, 1); } |
58 | 58 | #endif |
59 | 59 | |
60 | INLINE void galpani2_bg8_w(address_space | |
60 | INLINE void galpani2_bg8_w(address_space &space, offs_t offset, UINT16 data, UINT16 mem_mask, int _n_) | |
61 | 61 | { |
62 | galpani2_state *state = space | |
62 | galpani2_state *state = space.machine().driver_data<galpani2_state>(); | |
63 | 63 | int x,y,pen; |
64 | 64 | UINT16 newword = COMBINE_DATA(&state->m_bg8[_n_][offset]); |
65 | 65 | pen = newword & 0xff; |
r17963 | r17964 | |
71 | 71 | WRITE16_HANDLER( galpani2_bg8_0_w ) { galpani2_bg8_w(space, offset, data, mem_mask, 0); } |
72 | 72 | WRITE16_HANDLER( galpani2_bg8_1_w ) { galpani2_bg8_w(space, offset, data, mem_mask, 1); } |
73 | 73 | |
74 | INLINE void galpani2_palette_w(address_space | |
74 | INLINE void galpani2_palette_w(address_space &space, offs_t offset, UINT16 data, UINT16 mem_mask, int _n_) | |
75 | 75 | { |
76 | galpani2_state *state = space | |
76 | galpani2_state *state = space.machine().driver_data<galpani2_state>(); | |
77 | 77 | UINT16 newword = COMBINE_DATA(&state->m_palette[_n_][offset]); |
78 | palette_set_color_rgb( space | |
78 | palette_set_color_rgb( space.machine(), offset + 0x4000 + _n_ * 0x100, pal5bit(newword >> 5), pal5bit(newword >> 10), pal5bit(newword >> 0) ); | |
79 | 79 | } |
80 | 80 | |
81 | 81 | WRITE16_HANDLER( galpani2_palette_0_w ) { galpani2_palette_w(space, offset, data, mem_mask, 0); } |
r17963 | r17964 | |
93 | 93 | /* 8 horizontal pages of 256x256 pixels? */ |
94 | 94 | WRITE16_HANDLER( galpani2_bg15_w ) |
95 | 95 | { |
96 | galpani2_state *state = space | |
96 | galpani2_state *state = space.machine().driver_data<galpani2_state>(); | |
97 | 97 | UINT16 newword = COMBINE_DATA(&state->m_bg15[offset]); |
98 | 98 | |
99 | 99 | int x = (offset % 256) + (offset / (256*256)) * 256 ; |
r17963 | r17964 | |
---|---|---|
32 | 32 | * |
33 | 33 | *************************************/ |
34 | 34 | |
35 | void exterm_to_shiftreg_master(address_space | |
35 | void exterm_to_shiftreg_master(address_space &space, UINT32 address, UINT16 *shiftreg) | |
36 | 36 | { |
37 | exterm_state *state = space | |
37 | exterm_state *state = space.machine().driver_data<exterm_state>(); | |
38 | 38 | memcpy(shiftreg, &state->m_master_videoram[TOWORD(address)], 256 * sizeof(UINT16)); |
39 | 39 | } |
40 | 40 | |
41 | 41 | |
42 | void exterm_from_shiftreg_master(address_space | |
42 | void exterm_from_shiftreg_master(address_space &space, UINT32 address, UINT16 *shiftreg) | |
43 | 43 | { |
44 | exterm_state *state = space | |
44 | exterm_state *state = space.machine().driver_data<exterm_state>(); | |
45 | 45 | memcpy(&state->m_master_videoram[TOWORD(address)], shiftreg, 256 * sizeof(UINT16)); |
46 | 46 | } |
47 | 47 | |
48 | 48 | |
49 | void exterm_to_shiftreg_slave(address_space | |
49 | void exterm_to_shiftreg_slave(address_space &space, UINT32 address, UINT16 *shiftreg) | |
50 | 50 | { |
51 | exterm_state *state = space | |
51 | exterm_state *state = space.machine().driver_data<exterm_state>(); | |
52 | 52 | memcpy(shiftreg, &state->m_slave_videoram[TOWORD(address)], 256 * 2 * sizeof(UINT8)); |
53 | 53 | } |
54 | 54 | |
55 | 55 | |
56 | void exterm_from_shiftreg_slave(address_space | |
56 | void exterm_from_shiftreg_slave(address_space &space, UINT32 address, UINT16 *shiftreg) | |
57 | 57 | { |
58 | exterm_state *state = space | |
58 | exterm_state *state = space.machine().driver_data<exterm_state>(); | |
59 | 59 | memcpy(&state->m_slave_videoram[TOWORD(address)], shiftreg, 256 * 2 * sizeof(UINT8)); |
60 | 60 | } |
61 | 61 |
r17963 | r17964 | |
---|---|---|
223 | 223 | * |
224 | 224 | *************************************/ |
225 | 225 | |
226 | void midtunit_to_shiftreg(address_space | |
226 | void midtunit_to_shiftreg(address_space &space, UINT32 address, UINT16 *shiftreg) | |
227 | 227 | { |
228 | 228 | memcpy(shiftreg, &local_videoram[address >> 3], 2 * 512 * sizeof(UINT16)); |
229 | 229 | } |
230 | 230 | |
231 | 231 | |
232 | void midtunit_from_shiftreg(address_space | |
232 | void midtunit_from_shiftreg(address_space &space, UINT32 address, UINT16 *shiftreg) | |
233 | 233 | { |
234 | 234 | memcpy(&local_videoram[address >> 3], shiftreg, 2 * 512 * sizeof(UINT16)); |
235 | 235 | } |
r17963 | r17964 | |
---|---|---|
5361 | 5361 | |
5362 | 5362 | WRITE32_HANDLER ( saturn_vdp2_vram_w ) |
5363 | 5363 | { |
5364 | saturn_state *state = space | |
5364 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
5365 | 5365 | UINT8* gfxdata = state->m_vdp2.gfx_decode; |
5366 | 5366 | |
5367 | 5367 | COMBINE_DATA(&state->m_vdp2_vram[offset]); |
r17963 | r17964 | |
5373 | 5373 | gfxdata[offset*4+2] = (data & 0x0000ff00) >> 8; |
5374 | 5374 | gfxdata[offset*4+3] = (data & 0x000000ff) >> 0; |
5375 | 5375 | |
5376 | space->machine().gfx[0]->mark_dirty(offset/8); | |
5377 | space->machine().gfx[1]->mark_dirty(offset/8); | |
5378 | space->machine().gfx[2]->mark_dirty(offset/8); | |
5379 | space->machine().gfx[3]->mark_dirty(offset/8); | |
5376 | space.machine().gfx[0]->mark_dirty(offset/8); | |
5377 | space.machine().gfx[1]->mark_dirty(offset/8); | |
5378 | space.machine().gfx[2]->mark_dirty(offset/8); | |
5379 | space.machine().gfx[3]->mark_dirty(offset/8); | |
5380 | 5380 | |
5381 | 5381 | /* 8-bit tiles overlap, so this affects the previous one as well */ |
5382 | 5382 | if (offset/8 != 0) |
5383 | 5383 | { |
5384 | space->machine().gfx[2]->mark_dirty(offset/8 - 1); | |
5385 | space->machine().gfx[3]->mark_dirty(offset/8 - 1); | |
5384 | space.machine().gfx[2]->mark_dirty(offset/8 - 1); | |
5385 | space.machine().gfx[3]->mark_dirty(offset/8 - 1); | |
5386 | 5386 | } |
5387 | 5387 | |
5388 | 5388 | if ( stv_rbg_cache_data.watch_vdp2_vram_writes ) |
r17963 | r17964 | |
5418 | 5418 | |
5419 | 5419 | READ16_HANDLER ( saturn_vdp2_regs_r ) |
5420 | 5420 | { |
5421 | saturn_state *state = space | |
5421 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
5422 | 5422 | |
5423 | 5423 | switch(offset) |
5424 | 5424 | { |
r17963 | r17964 | |
5428 | 5428 | if(!STV_VDP2_EXLTEN) |
5429 | 5429 | { |
5430 | 5430 | /* TODO: handle various h/v settings. */ |
5431 | if(!space | |
5431 | if(!space.debugger_access()) | |
5432 | 5432 | { |
5433 | state->m_vdp2.h_count = space->machine().primary_screen->hpos() & 0x3ff; | |
5434 | state->m_vdp2.v_count = space->machine().primary_screen->vpos() & (STV_VDP2_LSMD == 3 ? 0x7ff : 0x3ff); | |
5433 | state->m_vdp2.h_count = space.machine().primary_screen->hpos() & 0x3ff; | |
5434 | state->m_vdp2.v_count = space.machine().primary_screen->vpos() & (STV_VDP2_LSMD == 3 ? 0x7ff : 0x3ff); | |
5435 | 5435 | /* latch flag */ |
5436 | 5436 | state->m_vdp2.exltfg |= 1; |
5437 | 5437 | } |
r17963 | r17964 | |
5445 | 5445 | /*VBLANK HBLANK ODD PAL */ |
5446 | 5446 | state->m_vdp2_regs[offset] = (state->m_vdp2.exltfg<<9) | |
5447 | 5447 | (state->m_vdp2.exsyfg<<8) | |
5448 | (get_vblank(space->machine()) << 3) | | |
5449 | (get_hblank(space->machine()) << 2) | | |
5450 | (get_odd_bit(space->machine()) << 1) | | |
5448 | (get_vblank(space.machine()) << 3) | | |
5449 | (get_hblank(space.machine()) << 2) | | |
5450 | (get_odd_bit(space.machine()) << 1) | | |
5451 | 5451 | (state->m_vdp2.pal << 0); |
5452 | 5452 | |
5453 | 5453 | /* vblank bit is always 1 if DISP bit is disabled */ |
r17963 | r17964 | |
5455 | 5455 | state->m_vdp2_regs[offset] |= 1 << 3; |
5456 | 5456 | |
5457 | 5457 | /* HV latches clears if this register is read */ |
5458 | if(!space | |
5458 | if(!space.debugger_access()) | |
5459 | 5459 | { |
5460 | 5460 | state->m_vdp2.exltfg &= ~1; |
5461 | 5461 | state->m_vdp2.exsyfg &= ~1; |
r17963 | r17964 | |
5467 | 5467 | state->m_vdp2_regs[offset] = (STV_VDP2_VRAMSZ << 15) | |
5468 | 5468 | ((0 << 0) & 0xf); // VDP2 version |
5469 | 5469 | |
5470 | if(!space | |
5470 | if(!space.debugger_access()) | |
5471 | 5471 | printf("Warning: VDP2 version read\n"); |
5472 | 5472 | break; |
5473 | 5473 | } |
r17963 | r17964 | |
5487 | 5487 | } |
5488 | 5488 | |
5489 | 5489 | default: |
5490 | //if(!space | |
5490 | //if(!space.debugger_access()) | |
5491 | 5491 | // printf("VDP2: read from register %08x %08x\n",offset*4,mem_mask); |
5492 | 5492 | break; |
5493 | 5493 | } |
r17963 | r17964 | |
5497 | 5497 | |
5498 | 5498 | READ32_HANDLER ( saturn_vdp2_cram_r ) |
5499 | 5499 | { |
5500 | saturn_state *state = space | |
5500 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
5501 | 5501 | |
5502 | 5502 | offset &= (0xfff) >> (2); |
5503 | 5503 | |
r17963 | r17964 | |
5507 | 5507 | |
5508 | 5508 | READ32_HANDLER ( saturn_vdp2_vram_r ) |
5509 | 5509 | { |
5510 | saturn_state *state = space | |
5510 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
5511 | 5511 | |
5512 | 5512 | return state->m_vdp2_vram[offset]; |
5513 | 5513 | } |
5514 | 5514 | |
5515 | 5515 | WRITE32_HANDLER ( saturn_vdp2_cram_w ) |
5516 | 5516 | { |
5517 | saturn_state *state = space | |
5517 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
5518 | 5518 | int r,g,b; |
5519 | 5519 | UINT8 cmode0; |
5520 | 5520 | |
r17963 | r17964 | |
5534 | 5534 | b = ((state->m_vdp2_cram[offset] & 0x00ff0000) >> 16); |
5535 | 5535 | g = ((state->m_vdp2_cram[offset] & 0x0000ff00) >> 8); |
5536 | 5536 | r = ((state->m_vdp2_cram[offset] & 0x000000ff) >> 0); |
5537 | palette_set_color(space->machine(),offset,MAKE_RGB(r,g,b)); | |
5538 | palette_set_color(space->machine(),offset^0x400,MAKE_RGB(r,g,b)); | |
5537 | palette_set_color(space.machine(),offset,MAKE_RGB(r,g,b)); | |
5538 | palette_set_color(space.machine(),offset^0x400,MAKE_RGB(r,g,b)); | |
5539 | 5539 | } |
5540 | 5540 | break; |
5541 | 5541 | /*Mode 0*/ |
r17963 | r17964 | |
5547 | 5547 | b = ((state->m_vdp2_cram[offset] & 0x00007c00) >> 10); |
5548 | 5548 | g = ((state->m_vdp2_cram[offset] & 0x000003e0) >> 5); |
5549 | 5549 | r = ((state->m_vdp2_cram[offset] & 0x0000001f) >> 0); |
5550 | palette_set_color_rgb(space | |
5550 | palette_set_color_rgb(space.machine(),(offset*2)+1,pal5bit(r),pal5bit(g),pal5bit(b)); | |
5551 | 5551 | if(cmode0) |
5552 | palette_set_color_rgb(space | |
5552 | palette_set_color_rgb(space.machine(),((offset*2)+1)^0x400,pal5bit(r),pal5bit(g),pal5bit(b)); | |
5553 | 5553 | |
5554 | 5554 | b = ((state->m_vdp2_cram[offset] & 0x7c000000) >> 26); |
5555 | 5555 | g = ((state->m_vdp2_cram[offset] & 0x03e00000) >> 21); |
5556 | 5556 | r = ((state->m_vdp2_cram[offset] & 0x001f0000) >> 16); |
5557 | palette_set_color_rgb(space | |
5557 | palette_set_color_rgb(space.machine(),offset*2,pal5bit(r),pal5bit(g),pal5bit(b)); | |
5558 | 5558 | if(cmode0) |
5559 | palette_set_color_rgb(space | |
5559 | palette_set_color_rgb(space.machine(),(offset*2)^0x400,pal5bit(r),pal5bit(g),pal5bit(b)); | |
5560 | 5560 | } |
5561 | 5561 | break; |
5562 | 5562 | } |
r17963 | r17964 | |
5623 | 5623 | |
5624 | 5624 | WRITE16_HANDLER ( saturn_vdp2_regs_w ) |
5625 | 5625 | { |
5626 | saturn_state *state = space | |
5626 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
5627 | 5627 | COMBINE_DATA(&state->m_vdp2_regs[offset]); |
5628 | 5628 | |
5629 | 5629 | if(state->m_vdp2.old_crmd != STV_VDP2_CRMD) |
5630 | 5630 | { |
5631 | 5631 | state->m_vdp2.old_crmd = STV_VDP2_CRMD; |
5632 | refresh_palette_data(space | |
5632 | refresh_palette_data(space.machine()); | |
5633 | 5633 | } |
5634 | 5634 | if(state->m_vdp2.old_tvmd != STV_VDP2_TVMD) |
5635 | 5635 | { |
5636 | 5636 | state->m_vdp2.old_tvmd = STV_VDP2_TVMD; |
5637 | stv_vdp2_dynamic_res_change(space | |
5637 | stv_vdp2_dynamic_res_change(space.machine()); | |
5638 | 5638 | } |
5639 | 5639 | |
5640 | 5640 | if(STV_VDP2_VRAMSZ) |
5641 | 5641 | printf("VDP2 sets up 8 Mbit VRAM!\n"); |
5642 | 5642 | |
5643 | 5643 | #if NEW_VIDEO_CODE |
5644 | saturn_vdp2_assign_variables(space | |
5644 | saturn_vdp2_assign_variables(space.machine(),offset,state->m_vdp2_regs[offset]); | |
5645 | 5645 | #endif |
5646 | 5646 | } |
5647 | 5647 |
r17963 | r17964 | |
---|---|---|
206 | 206 | { |
207 | 207 | if (LOG_COPPER) |
208 | 208 | logerror("%02X.%02X: Write to %s = %04x\n", state->m_last_scanline, xpos / 2, amiga_custom_names[state->m_copper_pending_offset & 0xff], state->m_copper_pending_data); |
209 | amiga_custom_w(machine.device("maincpu")->memory().space(AS_PROGRAM), state->m_copper_pending_offset, state->m_copper_pending_data, 0xffff); | |
209 | amiga_custom_w(*machine.device("maincpu")->memory().space(AS_PROGRAM), state->m_copper_pending_offset, state->m_copper_pending_data, 0xffff); | |
210 | 210 | state->m_copper_pending_offset = 0; |
211 | 211 | } |
212 | 212 | |
r17963 | r17964 | |
262 | 262 | { |
263 | 263 | if (LOG_COPPER) |
264 | 264 | logerror("%02X.%02X: Write to %s = %04x\n", state->m_last_scanline, xpos / 2, amiga_custom_names[word0 & 0xff], word1); |
265 | amiga_custom_w(machine.device("maincpu")->memory().space(AS_PROGRAM), word0, word1, 0xffff); | |
265 | amiga_custom_w(*machine.device("maincpu")->memory().space(AS_PROGRAM), word0, word1, 0xffff); | |
266 | 266 | } |
267 | 267 | else // additional 2 cycles needed for non-Agnus registers |
268 | 268 | { |
r17963 | r17964 | |
---|---|---|
115 | 115 | |
116 | 116 | WRITE8_HANDLER( fastfred_videoram_w ) |
117 | 117 | { |
118 | fastfred_state *state = space | |
118 | fastfred_state *state = space.machine().driver_data<fastfred_state>(); | |
119 | 119 | state->m_videoram[offset] = data; |
120 | 120 | state->m_bg_tilemap->mark_tile_dirty(offset); |
121 | 121 | } |
r17963 | r17964 | |
123 | 123 | |
124 | 124 | WRITE8_HANDLER( fastfred_attributes_w ) |
125 | 125 | { |
126 | fastfred_state *state = space | |
126 | fastfred_state *state = space.machine().driver_data<fastfred_state>(); | |
127 | 127 | if (state->m_attributesram[offset] != data) |
128 | 128 | { |
129 | 129 | if (offset & 0x01) |
r17963 | r17964 | |
147 | 147 | |
148 | 148 | WRITE8_HANDLER( fastfred_charbank1_w ) |
149 | 149 | { |
150 | fastfred_state *state = space | |
150 | fastfred_state *state = space.machine().driver_data<fastfred_state>(); | |
151 | 151 | UINT16 new_data = (state->m_charbank & 0x0200) | ((data & 0x01) << 8); |
152 | 152 | |
153 | 153 | if (new_data != state->m_charbank) |
r17963 | r17964 | |
160 | 160 | |
161 | 161 | WRITE8_HANDLER( fastfred_charbank2_w ) |
162 | 162 | { |
163 | fastfred_state *state = space | |
163 | fastfred_state *state = space.machine().driver_data<fastfred_state>(); | |
164 | 164 | UINT16 new_data = (state->m_charbank & 0x0100) | ((data & 0x01) << 9); |
165 | 165 | |
166 | 166 | if (new_data != state->m_charbank) |
r17963 | r17964 | |
174 | 174 | |
175 | 175 | WRITE8_HANDLER( fastfred_colorbank1_w ) |
176 | 176 | { |
177 | fastfred_state *state = space | |
177 | fastfred_state *state = space.machine().driver_data<fastfred_state>(); | |
178 | 178 | UINT8 new_data = (state->m_colorbank & 0x10) | ((data & 0x01) << 3); |
179 | 179 | |
180 | 180 | if (new_data != state->m_colorbank) |
r17963 | r17964 | |
187 | 187 | |
188 | 188 | WRITE8_HANDLER( fastfred_colorbank2_w ) |
189 | 189 | { |
190 | fastfred_state *state = space | |
190 | fastfred_state *state = space.machine().driver_data<fastfred_state>(); | |
191 | 191 | UINT8 new_data = (state->m_colorbank & 0x08) | ((data & 0x01) << 4); |
192 | 192 | |
193 | 193 | if (new_data != state->m_colorbank) |
r17963 | r17964 | |
202 | 202 | |
203 | 203 | WRITE8_HANDLER( fastfred_flip_screen_x_w ) |
204 | 204 | { |
205 | fastfred_state *state = space | |
205 | fastfred_state *state = space.machine().driver_data<fastfred_state>(); | |
206 | 206 | if (state->flip_screen_x() != (data & 0x01)) |
207 | 207 | { |
208 | 208 | state->flip_screen_x_set(data & 0x01); |
r17963 | r17964 | |
213 | 213 | |
214 | 214 | WRITE8_HANDLER( fastfred_flip_screen_y_w ) |
215 | 215 | { |
216 | fastfred_state *state = space | |
216 | fastfred_state *state = space.machine().driver_data<fastfred_state>(); | |
217 | 217 | if (state->flip_screen_y() != (data & 0x01)) |
218 | 218 | { |
219 | 219 | state->flip_screen_y_set(data & 0x01); |
r17963 | r17964 | |
329 | 329 | |
330 | 330 | WRITE8_HANDLER( imago_fg_videoram_w ) |
331 | 331 | { |
332 | fastfred_state *state = space | |
332 | fastfred_state *state = space.machine().driver_data<fastfred_state>(); | |
333 | 333 | state->m_imago_fg_videoram[offset] = data; |
334 | 334 | state->m_fg_tilemap->mark_tile_dirty(offset); |
335 | 335 | } |
336 | 336 | |
337 | 337 | WRITE8_HANDLER( imago_charbank_w ) |
338 | 338 | { |
339 | fastfred_state *state = space | |
339 | fastfred_state *state = space.machine().driver_data<fastfred_state>(); | |
340 | 340 | if( state->m_charbank != data ) |
341 | 341 | { |
342 | 342 | state->m_charbank = data; |
r17963 | r17964 | |
---|---|---|
24 | 24 | |
25 | 25 | WRITE16_HANDLER( galpanic_bgvideoram_w ) |
26 | 26 | { |
27 | galpanic_state *state = space | |
27 | galpanic_state *state = space.machine().driver_data<galpanic_state>(); | |
28 | 28 | int sx,sy; |
29 | 29 | |
30 | 30 | |
r17963 | r17964 | |
38 | 38 | |
39 | 39 | WRITE16_HANDLER( galpanic_paletteram_w ) |
40 | 40 | { |
41 | galpanic_state *state = space | |
41 | galpanic_state *state = space.machine().driver_data<galpanic_state>(); | |
42 | 42 | data = COMBINE_DATA(&state->m_generic_paletteram_16[offset]); |
43 | 43 | /* bit 0 seems to be a transparency flag for the front bitmap */ |
44 | palette_set_color_rgb(space | |
44 | palette_set_color_rgb(space.machine(),offset,pal5bit(data >> 6),pal5bit(data >> 11),pal5bit(data >> 1)); | |
45 | 45 | } |
46 | 46 | |
47 | 47 |
r17963 | r17964 | |
---|---|---|
168 | 168 | |
169 | 169 | READ32_HANDLER(K001006_0_r) |
170 | 170 | { |
171 | return K001006_r(space | |
171 | return K001006_r(space.machine(), 0, offset, mem_mask); | |
172 | 172 | } |
173 | 173 | |
174 | 174 | WRITE32_HANDLER(K001006_0_w) |
r17963 | r17964 | |
178 | 178 | |
179 | 179 | READ32_HANDLER(K001006_1_r) |
180 | 180 | { |
181 | return K001006_r(space | |
181 | return K001006_r(space.machine(), 1, offset, mem_mask); | |
182 | 182 | } |
183 | 183 | |
184 | 184 | WRITE32_HANDLER(K001006_1_w) |
r17963 | r17964 | |
357 | 357 | { |
358 | 358 | if (K001005_fifo_read_ptr < 0x3ff) |
359 | 359 | { |
360 | //space->machine().device("dsp")->execute().set_input_line(SHARC_INPUT_FLAG1, CLEAR_LINE); | |
361 | sharc_set_flag_input(space->machine().device("dsp"), 1, CLEAR_LINE); | |
360 | //space.machine().device("dsp")->execute().set_input_line(SHARC_INPUT_FLAG1, CLEAR_LINE); | |
361 | sharc_set_flag_input(space.machine().device("dsp"), 1, CLEAR_LINE); | |
362 | 362 | } |
363 | 363 | else |
364 | 364 | { |
365 | //space->machine().device("dsp")->execute().set_input_line(SHARC_INPUT_FLAG1, ASSERT_LINE); | |
366 | sharc_set_flag_input(space->machine().device("dsp"), 1, ASSERT_LINE); | |
365 | //space.machine().device("dsp")->execute().set_input_line(SHARC_INPUT_FLAG1, ASSERT_LINE); | |
366 | sharc_set_flag_input(space.machine().device("dsp"), 1, ASSERT_LINE); | |
367 | 367 | } |
368 | 368 | } |
369 | 369 | else |
370 | 370 | { |
371 | //space->machine().device("dsp")->execute().set_input_line(SHARC_INPUT_FLAG1, ASSERT_LINE); | |
372 | sharc_set_flag_input(space->machine().device("dsp"), 1, ASSERT_LINE); | |
371 | //space.machine().device("dsp")->execute().set_input_line(SHARC_INPUT_FLAG1, ASSERT_LINE); | |
372 | sharc_set_flag_input(space.machine().device("dsp"), 1, ASSERT_LINE); | |
373 | 373 | } |
374 | 374 | |
375 | 375 | K001005_fifo_read_ptr++; |
r17963 | r17964 | |
394 | 394 | } |
395 | 395 | |
396 | 396 | default: |
397 | mame_printf_debug("K001005_r: %08X, %08X at %08X\n", offset, mem_mask, space | |
397 | mame_printf_debug("K001005_r: %08X, %08X at %08X\n", offset, mem_mask, space.device().safe_pc()); | |
398 | 398 | break; |
399 | 399 | } |
400 | 400 | return 0; |
r17963 | r17964 | |
410 | 410 | { |
411 | 411 | if (K001005_fifo_write_ptr < 0x400) |
412 | 412 | { |
413 | //space->machine().device("dsp")->execute().set_input_line(SHARC_INPUT_FLAG1, ASSERT_LINE); | |
414 | sharc_set_flag_input(space->machine().device("dsp"), 1, ASSERT_LINE); | |
413 | //space.machine().device("dsp")->execute().set_input_line(SHARC_INPUT_FLAG1, ASSERT_LINE); | |
414 | sharc_set_flag_input(space.machine().device("dsp"), 1, ASSERT_LINE); | |
415 | 415 | } |
416 | 416 | else |
417 | 417 | { |
418 | //space->machine().device("dsp")->execute().set_input_line(SHARC_INPUT_FLAG1, CLEAR_LINE); | |
419 | sharc_set_flag_input(space->machine().device("dsp"), 1, CLEAR_LINE); | |
418 | //space.machine().device("dsp")->execute().set_input_line(SHARC_INPUT_FLAG1, CLEAR_LINE); | |
419 | sharc_set_flag_input(space.machine().device("dsp"), 1, CLEAR_LINE); | |
420 | 420 | } |
421 | 421 | } |
422 | 422 | else |
423 | 423 | { |
424 | //space->machine().device("dsp")->execute().set_input_line(SHARC_INPUT_FLAG1, ASSERT_LINE); | |
425 | sharc_set_flag_input(space->machine().device("dsp"), 1, ASSERT_LINE); | |
424 | //space.machine().device("dsp")->execute().set_input_line(SHARC_INPUT_FLAG1, ASSERT_LINE); | |
425 | sharc_set_flag_input(space.machine().device("dsp"), 1, ASSERT_LINE); | |
426 | 426 | } |
427 | 427 | |
428 | // mame_printf_debug("K001005 FIFO write: %08X at %08X\n", data, space | |
428 | // mame_printf_debug("K001005 FIFO write: %08X at %08X\n", data, space.device().safe_pc()); | |
429 | 429 | K001005_fifo[K001005_fifo_write_ptr] = data; |
430 | 430 | K001005_fifo_write_ptr++; |
431 | 431 | K001005_fifo_write_ptr &= 0x7ff; |
r17963 | r17964 | |
433 | 433 | // process the current vertex data if a sync command is being sent (usually means the global registers are being changed) |
434 | 434 | if (data == 0x80000000) |
435 | 435 | { |
436 | render_polygons(space | |
436 | render_polygons(space.machine()); | |
437 | 437 | K001005_3d_fifo_ptr = 0; |
438 | 438 | } |
439 | 439 | |
r17963 | r17964 | |
450 | 450 | #endif |
451 | 451 | |
452 | 452 | // !!! HACK to get past the FIFO B test (GTI Club & Thunder Hurricane) !!! |
453 | if (space | |
453 | if (space.device().safe_pc() == 0x201ee) | |
454 | 454 | { |
455 | 455 | // This is used to make the SHARC timeout |
456 | space | |
456 | space.device().execute().spin_until_trigger(10000); | |
457 | 457 | } |
458 | 458 | // !!! HACK to get past the FIFO B test (Winding Heat & Midnight Run) !!! |
459 | if (space | |
459 | if (space.device().safe_pc() == 0x201e6) | |
460 | 460 | { |
461 | 461 | // This is used to make the SHARC timeout |
462 | space | |
462 | space.device().execute().spin_until_trigger(10000); | |
463 | 463 | } |
464 | 464 | |
465 | 465 | break; |
r17963 | r17964 | |
514 | 514 | |
515 | 515 | if (data == 2 && K001005_3d_fifo_ptr > 0) |
516 | 516 | { |
517 | render_polygons(space | |
517 | render_polygons(space.machine()); | |
518 | 518 | poly_wait(poly, "render_polygons"); |
519 | 519 | |
520 | 520 | #if LOG_POLY_FIFO |
r17963 | r17964 | |
524 | 524 | #endif |
525 | 525 | |
526 | 526 | K001005_3d_fifo_ptr = 0; |
527 | K001005_swap_buffers(space | |
527 | K001005_swap_buffers(space.machine()); | |
528 | 528 | } |
529 | 529 | break; |
530 | 530 | |
r17963 | r17964 | |
549 | 549 | break; |
550 | 550 | |
551 | 551 | default: |
552 | //mame_printf_debug("K001005_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, space | |
552 | //mame_printf_debug("K001005_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, space.device().safe_pc()); | |
553 | 553 | break; |
554 | 554 | } |
555 | 555 |
r17963 | r17964 | |
---|---|---|
622 | 622 | return (temp); |
623 | 623 | } |
624 | 624 | |
625 | WRITE8_HANDLER( vdc_0_w ) { vdc_w( space->machine(), 0, offset, data ); } | |
626 | WRITE8_HANDLER( vdc_1_w ) { vdc_w( space->machine(), 1, offset, data ); } | |
627 | READ8_HANDLER( vdc_0_r ) { return vdc_r( space->machine(), 0, offset ); } | |
628 | READ8_HANDLER( vdc_1_r ) { return vdc_r( space->machine(), 1, offset ); } | |
625 | WRITE8_HANDLER( vdc_0_w ) { vdc_w( space.machine(), 0, offset, data ); } | |
626 | WRITE8_HANDLER( vdc_1_w ) { vdc_w( space.machine(), 1, offset, data ); } | |
627 | READ8_HANDLER( vdc_0_r ) { return vdc_r( space.machine(), 0, offset ); } | |
628 | READ8_HANDLER( vdc_1_r ) { return vdc_r( space.machine(), 1, offset ); } | |
629 | 629 | |
630 | 630 | PALETTE_INIT( vce ) |
631 | 631 | { |
r17963 | r17964 | |
1185 | 1185 | |
1186 | 1186 | static void vpc_init( running_machine &machine ) |
1187 | 1187 | { |
1188 | address_space | |
1188 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
1189 | 1189 | vpc_w( space, 0, 0x11 ); |
1190 | 1190 | vpc_w( space, 1, 0x11 ); |
1191 | 1191 | vpc.window1.w = 0; |
r17963 | r17964 | |
---|---|---|
118 | 118 | |
119 | 119 | WRITE16_HANDLER( gauntlet_xscroll_w ) |
120 | 120 | { |
121 | gauntlet_state *state = space | |
121 | gauntlet_state *state = space.machine().driver_data<gauntlet_state>(); | |
122 | 122 | UINT16 oldxscroll = *state->m_xscroll; |
123 | 123 | COMBINE_DATA(state->m_xscroll); |
124 | 124 | |
125 | 125 | /* if something changed, force a partial update */ |
126 | 126 | if (*state->m_xscroll != oldxscroll) |
127 | 127 | { |
128 | space | |
128 | space.machine().primary_screen->update_partial(space.machine().primary_screen->vpos()); | |
129 | 129 | |
130 | 130 | /* adjust the scrolls */ |
131 | 131 | state->m_playfield_tilemap->set_scrollx(0, *state->m_xscroll); |
r17963 | r17964 | |
143 | 143 | |
144 | 144 | WRITE16_HANDLER( gauntlet_yscroll_w ) |
145 | 145 | { |
146 | gauntlet_state *state = space | |
146 | gauntlet_state *state = space.machine().driver_data<gauntlet_state>(); | |
147 | 147 | UINT16 oldyscroll = *state->m_yscroll; |
148 | 148 | COMBINE_DATA(state->m_yscroll); |
149 | 149 | |
150 | 150 | /* if something changed, force a partial update */ |
151 | 151 | if (*state->m_yscroll != oldyscroll) |
152 | 152 | { |
153 | space | |
153 | space.machine().primary_screen->update_partial(space.machine().primary_screen->vpos()); | |
154 | 154 | |
155 | 155 | /* if the bank changed, mark all tiles dirty */ |
156 | 156 | if (state->m_playfield_tile_bank != (*state->m_yscroll & 3)) |
r17963 | r17964 | |
---|---|---|
93 | 93 | void simpsons_video_banking( running_machine &machine, int bank ) |
94 | 94 | { |
95 | 95 | simpsons_state *state = machine.driver_data<simpsons_state>(); |
96 | address_space | |
96 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
97 | 97 | |
98 | 98 | if (bank & 1) |
99 | 99 | { |
100 | space->install_read_bank(0x0000, 0x0fff, "bank5"); | |
101 | space->install_write_handler(0x0000, 0x0fff, write8_delegate(FUNC(simpsons_state::paletteram_xBBBBBGGGGGRRRRR_byte_be_w), state)); | |
100 | space.install_read_bank(0x0000, 0x0fff, "bank5"); | |
101 | space.install_write_handler(0x0000, 0x0fff, write8_delegate(FUNC(simpsons_state::paletteram_xBBBBBGGGGGRRRRR_byte_be_w), state)); | |
102 | 102 | state->membank("bank5")->set_base(state->m_generic_paletteram_8); |
103 | 103 | } |
104 | 104 | else |
105 | space | |
105 | space.install_legacy_readwrite_handler(*state->m_k052109, 0x0000, 0x0fff, FUNC(k052109_r), FUNC(k052109_w)); | |
106 | 106 | |
107 | 107 | if (bank & 2) |
108 | space | |
108 | space.install_readwrite_handler(0x2000, 0x3fff, read8_delegate(FUNC(simpsons_state::simpsons_k053247_r),state), write8_delegate(FUNC(simpsons_state::simpsons_k053247_w),state)); | |
109 | 109 | else |
110 | space | |
110 | space.install_readwrite_handler(0x2000, 0x3fff, read8_delegate(FUNC(simpsons_state::simpsons_k052109_r),state), write8_delegate(FUNC(simpsons_state::simpsons_k052109_w),state)); | |
111 | 111 | } |
112 | 112 | |
113 | 113 |
r17963 | r17964 | |
---|---|---|
27 | 27 | { |
28 | 28 | int i; |
29 | 29 | taitob_state *state = machine.driver_data<taitob_state>(); |
30 | address_space | |
30 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
31 | 31 | |
32 | 32 | for (i = 0; i < 0x40000; i++) |
33 | state->hitice_pixelram_w( | |
33 | state->hitice_pixelram_w(space, i, 0, 0xffff); | |
34 | 34 | } |
35 | 35 | |
36 | 36 | WRITE16_MEMBER(taitob_state::realpunc_video_ctrl_w) |
r17963 | r17964 | |
---|---|---|
4839 | 4839 | return tc0110pcr->ram[tc0110pcr->addr]; |
4840 | 4840 | |
4841 | 4841 | default: |
4842 | //logerror("PC %06x: warning - read TC0110PCR address %02x\n",space | |
4842 | //logerror("PC %06x: warning - read TC0110PCR address %02x\n",space.device().safe_pc(),offset); | |
4843 | 4843 | return 0xff; |
4844 | 4844 | } |
4845 | 4845 | } |
r17963 | r17964 | |
4863 | 4863 | break; |
4864 | 4864 | |
4865 | 4865 | default: |
4866 | //logerror("PC %06x: warning - write %04x to TC0110PCR address %02x\n",space | |
4866 | //logerror("PC %06x: warning - write %04x to TC0110PCR address %02x\n",space.device().safe_pc(),data,offset); | |
4867 | 4867 | break; |
4868 | 4868 | } |
4869 | 4869 | } |
r17963 | r17964 | |
4886 | 4886 | break; |
4887 | 4887 | |
4888 | 4888 | default: |
4889 | //logerror("PC %06x: warning - write %04x to TC0110PCR address %02x\n",space | |
4889 | //logerror("PC %06x: warning - write %04x to TC0110PCR address %02x\n",space.device().safe_pc(),data,offset); | |
4890 | 4890 | break; |
4891 | 4891 | } |
4892 | 4892 | } |
r17963 | r17964 | |
4911 | 4911 | break; |
4912 | 4912 | |
4913 | 4913 | default: |
4914 | //logerror("PC %06x: warning - write %04x to TC0110PCR offset %02x\n",space | |
4914 | //logerror("PC %06x: warning - write %04x to TC0110PCR offset %02x\n",space.device().safe_pc(),data,offset); | |
4915 | 4915 | break; |
4916 | 4916 | } |
4917 | 4917 | } |
r17963 | r17964 | |
4936 | 4936 | break; |
4937 | 4937 | |
4938 | 4938 | default: |
4939 | //logerror("PC %06x: warning - write %04x to TC0110PCR address %02x\n",space | |
4939 | //logerror("PC %06x: warning - write %04x to TC0110PCR address %02x\n",space.device().safe_pc(),data,offset); | |
4940 | 4940 | break; |
4941 | 4941 | } |
4942 | 4942 | } |
r17963 | r17964 | |
---|---|---|
187 | 187 | } |
188 | 188 | } |
189 | 189 | |
190 | static void scroll_w(address_space | |
190 | static void scroll_w(address_space &space, int offset, int data, int layer) | |
191 | 191 | { |
192 | namcos86_state *state = space | |
192 | namcos86_state *state = space.machine().driver_data<namcos86_state>(); | |
193 | 193 | switch (offset) |
194 | 194 | { |
195 | 195 | case 0: |
r17963 | r17964 | |
206 | 206 | |
207 | 207 | WRITE8_MEMBER(namcos86_state::rthunder_scroll0_w) |
208 | 208 | { |
209 | scroll_w( | |
209 | scroll_w(space,offset,data,0); | |
210 | 210 | } |
211 | 211 | WRITE8_MEMBER(namcos86_state::rthunder_scroll1_w) |
212 | 212 | { |
213 | scroll_w( | |
213 | scroll_w(space,offset,data,1); | |
214 | 214 | } |
215 | 215 | WRITE8_MEMBER(namcos86_state::rthunder_scroll2_w) |
216 | 216 | { |
217 | scroll_w( | |
217 | scroll_w(space,offset,data,2); | |
218 | 218 | } |
219 | 219 | WRITE8_MEMBER(namcos86_state::rthunder_scroll3_w) |
220 | 220 | { |
221 | scroll_w( | |
221 | scroll_w(space,offset,data,3); | |
222 | 222 | } |
223 | 223 | |
224 | 224 | WRITE8_MEMBER(namcos86_state::rthunder_backcolor_w) |
r17963 | r17964 | |
---|---|---|
280 | 280 | * |
281 | 281 | *************************************/ |
282 | 282 | |
283 | static void perform_blit(address_space | |
283 | static void perform_blit(address_space &space) | |
284 | 284 | { |
285 | itech8_state *state = space | |
285 | itech8_state *state = space.machine().driver_data<itech8_state>(); | |
286 | 286 | struct tms34061_display &tms_state = state->m_tms_state; |
287 | 287 | UINT8 *blitter_data = state->m_blitter_data; |
288 | 288 | offs_t addr = state->m_tms_state.regs[TMS34061_XYADDRESS] | ((tms_state.regs[TMS34061_XYOFFSET] & 0x300) << 8); |
r17963 | r17964 | |
303 | 303 | /* debugging */ |
304 | 304 | if (FULL_LOGGING) |
305 | 305 | logerror("Blit: scan=%d src=%06x @ (%05x) for %dx%d ... flags=%02x\n", |
306 | space | |
306 | space.machine().primary_screen->vpos(), | |
307 | 307 | (state->m_grom_bank << 16) | (BLITTER_ADDRHI << 8) | BLITTER_ADDRLO, |
308 | 308 | tms_state.regs[TMS34061_XYADDRESS] | ((tms_state.regs[TMS34061_XYOFFSET] & 0x300) << 8), |
309 | 309 | BLITTER_WIDTH, BLITTER_HEIGHT, BLITTER_FLAGS); |
r17963 | r17964 | |
498 | 498 | } |
499 | 499 | |
500 | 500 | /* perform the blit */ |
501 | perform_blit( | |
501 | perform_blit(space); | |
502 | 502 | m_blit_in_progress = 1; |
503 | 503 | |
504 | 504 | /* set a timer to go off when we're done */ |
r17963 | r17964 | |
528 | 528 | col ^= 2; |
529 | 529 | |
530 | 530 | /* Row address (RA0-RA8) is not dependent on the offset */ |
531 | tms34061_w( | |
531 | tms34061_w(space, col, 0xff, func, data); | |
532 | 532 | } |
533 | 533 | |
534 | 534 | |
r17963 | r17964 | |
543 | 543 | col ^= 2; |
544 | 544 | |
545 | 545 | /* Row address (RA0-RA8) is not dependent on the offset */ |
546 | return tms34061_r( | |
546 | return tms34061_r(space, col, 0xff, func); | |
547 | 547 | } |
548 | 548 | |
549 | 549 |
r17963 | r17964 | |
---|---|---|
131 | 131 | * |
132 | 132 | *************************************/ |
133 | 133 | |
134 | static void leland_video_addr_w(address_space | |
134 | static void leland_video_addr_w(address_space &space, int offset, int data, int num) | |
135 | 135 | { |
136 | leland_state *drvstate = space | |
136 | leland_state *drvstate = space.machine().driver_data<leland_state>(); | |
137 | 137 | struct vram_state_data *state = drvstate->m_vram_state + num; |
138 | 138 | |
139 | 139 | if (!offset) |
r17963 | r17964 | |
150 | 150 | * |
151 | 151 | *************************************/ |
152 | 152 | |
153 | static int leland_vram_port_r(address_space | |
153 | static int leland_vram_port_r(address_space &space, int offset, int num) | |
154 | 154 | { |
155 | leland_state *drvstate = space | |
155 | leland_state *drvstate = space.machine().driver_data<leland_state>(); | |
156 | 156 | struct vram_state_data *state = drvstate->m_vram_state + num; |
157 | 157 | int addr = state->m_addr; |
158 | 158 | int inc = (offset >> 2) & 2; |
r17963 | r17964 | |
178 | 178 | |
179 | 179 | default: |
180 | 180 | logerror("%s: Warning: Unknown video port %02x read (address=%04x)\n", |
181 | space | |
181 | space.machine().describe_context(), offset, addr); | |
182 | 182 | ret = 0; |
183 | 183 | break; |
184 | 184 | } |
185 | 185 | state->m_addr = addr; |
186 | 186 | |
187 | 187 | if (LOG_COMM && addr >= 0xf000) |
188 | logerror("%s:%s comm read %04X = %02X\n", space | |
188 | logerror("%s:%s comm read %04X = %02X\n", space.machine().describe_context(), num ? "slave" : "master", addr, ret); | |
189 | 189 | |
190 | 190 | return ret; |
191 | 191 | } |
r17963 | r17964 | |
198 | 198 | * |
199 | 199 | *************************************/ |
200 | 200 | |
201 | static void leland_vram_port_w(address_space | |
201 | static void leland_vram_port_w(address_space &space, int offset, int data, int num) | |
202 | 202 | { |
203 | leland_state *drvstate = space | |
203 | leland_state *drvstate = space.machine().driver_data<leland_state>(); | |
204 | 204 | UINT8 *video_ram = drvstate->m_video_ram; |
205 | 205 | struct vram_state_data *state = drvstate->m_vram_state + num; |
206 | 206 | int addr = state->m_addr; |
r17963 | r17964 | |
209 | 209 | |
210 | 210 | /* don't fully understand why this is needed. Isn't the |
211 | 211 | video RAM just one big RAM? */ |
212 | int scanline = space | |
212 | int scanline = space.machine().primary_screen->vpos(); | |
213 | 213 | if (scanline > 0) |
214 | space | |
214 | space.machine().primary_screen->update_partial(scanline - 1); | |
215 | 215 | |
216 | 216 | if (LOG_COMM && addr >= 0xf000) |
217 | logerror("%s:%s comm write %04X = %02X\n", space | |
217 | logerror("%s:%s comm write %04X = %02X\n", space.machine().describe_context(), num ? "slave" : "master", addr, data); | |
218 | 218 | |
219 | 219 | /* based on the low 3 bits of the offset, update the destination */ |
220 | 220 | switch (offset & 7) |
r17963 | r17964 | |
266 | 266 | |
267 | 267 | default: |
268 | 268 | logerror("%s:Warning: Unknown video port write (address=%04x value=%02x)\n", |
269 | space | |
269 | space.machine().describe_context(), offset, addr); | |
270 | 270 | break; |
271 | 271 | } |
272 | 272 | |
r17963 | r17964 | |
284 | 284 | |
285 | 285 | WRITE8_MEMBER(leland_state::leland_master_video_addr_w) |
286 | 286 | { |
287 | leland_video_addr_w( | |
287 | leland_video_addr_w(space, offset, data, 0); | |
288 | 288 | } |
289 | 289 | |
290 | 290 | |
291 | 291 | static TIMER_CALLBACK( leland_delayed_mvram_w ) |
292 | 292 | { |
293 | address_space | |
293 | address_space &space = *machine.device("master")->memory().space(AS_PROGRAM); | |
294 | 294 | |
295 | 295 | int num = (param >> 16) & 1; |
296 | 296 | int offset = (param >> 8) & 0xff; |
r17963 | r17964 | |
307 | 307 | |
308 | 308 | READ8_MEMBER(leland_state::leland_mvram_port_r) |
309 | 309 | { |
310 | return leland_vram_port_r( | |
310 | return leland_vram_port_r(space, offset, 0); | |
311 | 311 | } |
312 | 312 | |
313 | 313 | |
r17963 | r17964 | |
320 | 320 | |
321 | 321 | WRITE8_MEMBER(leland_state::leland_slave_video_addr_w) |
322 | 322 | { |
323 | leland_video_addr_w( | |
323 | leland_video_addr_w(space, offset, data, 1); | |
324 | 324 | } |
325 | 325 | |
326 | 326 | |
327 | 327 | WRITE8_MEMBER(leland_state::leland_svram_port_w) |
328 | 328 | { |
329 | leland_vram_port_w( | |
329 | leland_vram_port_w(space, offset, data, 1); | |
330 | 330 | } |
331 | 331 | |
332 | 332 | |
333 | 333 | READ8_MEMBER(leland_state::leland_svram_port_r) |
334 | 334 | { |
335 | return leland_vram_port_r( | |
335 | return leland_vram_port_r(space, offset, 1); | |
336 | 336 | } |
337 | 337 | |
338 | 338 | |
r17963 | r17964 | |
353 | 353 | WRITE8_MEMBER(leland_state::ataxx_svram_port_w) |
354 | 354 | { |
355 | 355 | offset = ((offset >> 1) & 0x07) | ((offset << 3) & 0x08) | (offset & 0x10); |
356 | leland_vram_port_w( | |
356 | leland_vram_port_w(space, offset, data, 1); | |
357 | 357 | } |
358 | 358 | |
359 | 359 | |
r17963 | r17964 | |
367 | 367 | READ8_MEMBER(leland_state::ataxx_mvram_port_r) |
368 | 368 | { |
369 | 369 | offset = ((offset >> 1) & 0x07) | ((offset << 3) & 0x08) | (offset & 0x10); |
370 | return leland_vram_port_r( | |
370 | return leland_vram_port_r(space, offset, 0); | |
371 | 371 | } |
372 | 372 | |
373 | 373 | |
374 | 374 | READ8_MEMBER(leland_state::ataxx_svram_port_r) |
375 | 375 | { |
376 | 376 | offset = ((offset >> 1) & 0x07) | ((offset << 3) & 0x08) | (offset & 0x10); |
377 | return leland_vram_port_r( | |
377 | return leland_vram_port_r(space, offset, 1); | |
378 | 378 | } |
379 | 379 | |
380 | 380 |
r17963 | r17964 | |
---|---|---|
277 | 277 | { |
278 | 278 | popeye_state *state = machine.driver_data<popeye_state>(); |
279 | 279 | int offs; |
280 | address_space | |
280 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
281 | 281 | |
282 | 282 | if (state->m_lastflip != state->flip_screen()) |
283 | 283 | { |
284 | 284 | for (offs = 0;offs < popeye_bitmapram_size;offs++) |
285 | state->popeye_bitmap_w( | |
285 | state->popeye_bitmap_w(space,offs,state->m_bitmapram[offs]); | |
286 | 286 | |
287 | 287 | state->m_lastflip = state->flip_screen(); |
288 | 288 | } |
r17963 | r17964 | |
---|---|---|
75 | 75 | TILE_GET_INFO_MEMBER(lordgun_state::get_tile_info_2){ get_tile_info(machine(), tileinfo, tile_index, 2); } |
76 | 76 | TILE_GET_INFO_MEMBER(lordgun_state::get_tile_info_3){ get_tile_info(machine(), tileinfo, tile_index, 3); } |
77 | 77 | |
78 | INLINE void lordgun_vram_w(address_space | |
78 | INLINE void lordgun_vram_w(address_space &space, offs_t offset, UINT16 data, UINT16 mem_mask, int _N_) | |
79 | 79 | { |
80 | lordgun_state *state = space | |
80 | lordgun_state *state = space.machine().driver_data<lordgun_state>(); | |
81 | 81 | COMBINE_DATA(&state->m_vram[_N_][offset]); |
82 | 82 | state->m_tilemap[_N_]->mark_tile_dirty(offset/2); |
83 | 83 | } |
84 | 84 | |
85 | WRITE16_MEMBER(lordgun_state::lordgun_vram_0_w){ lordgun_vram_w(&space, offset, data, mem_mask, 0); } | |
86 | WRITE16_MEMBER(lordgun_state::lordgun_vram_1_w){ lordgun_vram_w(&space, offset, data, mem_mask, 1); } | |
87 | WRITE16_MEMBER(lordgun_state::lordgun_vram_2_w){ lordgun_vram_w(&space, offset, data, mem_mask, 2); } | |
88 | WRITE16_MEMBER(lordgun_state::lordgun_vram_3_w){ lordgun_vram_w(&space, offset, data, mem_mask, 3); } | |
85 | WRITE16_MEMBER(lordgun_state::lordgun_vram_0_w){ lordgun_vram_w(space, offset, data, mem_mask, 0); } | |
86 | WRITE16_MEMBER(lordgun_state::lordgun_vram_1_w){ lordgun_vram_w(space, offset, data, mem_mask, 1); } | |
87 | WRITE16_MEMBER(lordgun_state::lordgun_vram_2_w){ lordgun_vram_w(space, offset, data, mem_mask, 2); } | |
88 | WRITE16_MEMBER(lordgun_state::lordgun_vram_3_w){ lordgun_vram_w(space, offset, data, mem_mask, 3); } | |
89 | 89 | |
90 | 90 | /*************************************************************************** |
91 | 91 |
r17963 | r17964 | |
---|---|---|
286 | 286 | static void rallybik_flipscreen(running_machine &machine) |
287 | 287 | { |
288 | 288 | toaplan1_state *state = machine.driver_data<toaplan1_state>(); |
289 | address_space | |
289 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
290 | 290 | |
291 | state->rallybik_bcu_flipscreen_w( | |
291 | state->rallybik_bcu_flipscreen_w(space, 0, state->m_bcu_flipscreen, 0xffff); | |
292 | 292 | } |
293 | 293 | |
294 | 294 | static void toaplan1_flipscreen(running_machine &machine) |
295 | 295 | { |
296 | 296 | toaplan1_state *state = machine.driver_data<toaplan1_state>(); |
297 | address_space | |
297 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
298 | 298 | |
299 | state->toaplan1_bcu_flipscreen_w( | |
299 | state->toaplan1_bcu_flipscreen_w(space, 0, state->m_bcu_flipscreen, 0xffff); | |
300 | 300 | } |
301 | 301 | |
302 | 302 | static void register_common(running_machine &machine) |
r17963 | r17964 | |
---|---|---|
86 | 86 | * |
87 | 87 | *************************************/ |
88 | 88 | |
89 | void jpmimpct_to_shiftreg(address_space | |
89 | void jpmimpct_to_shiftreg(address_space &space, UINT32 address, UINT16 *shiftreg) | |
90 | 90 | { |
91 | jpmimpct_state *state = space | |
91 | jpmimpct_state *state = space.machine().driver_data<jpmimpct_state>(); | |
92 | 92 | memcpy(shiftreg, &state->m_vram[TOWORD(address)], 512 * sizeof(UINT16)); |
93 | 93 | } |
94 | 94 | |
95 | void jpmimpct_from_shiftreg(address_space | |
95 | void jpmimpct_from_shiftreg(address_space &space, UINT32 address, UINT16 *shiftreg) | |
96 | 96 | { |
97 | jpmimpct_state *state = space | |
97 | jpmimpct_state *state = space.machine().driver_data<jpmimpct_state>(); | |
98 | 98 | memcpy(&state->m_vram[TOWORD(address)], shiftreg, 512 * sizeof(UINT16)); |
99 | 99 | } |
100 | 100 |
r17963 | r17964 | |
---|---|---|
129 | 129 | static UINT32 dilated1[15][1024]; |
130 | 130 | static int dilatechose[64]; |
131 | 131 | static float wbuffer[480][640]; |
132 | static void pvr_accumulationbuffer_to_framebuffer(address_space | |
132 | static void pvr_accumulationbuffer_to_framebuffer(address_space &space, int x,int y); | |
133 | 133 | |
134 | 134 | // the real accumulation buffer is a 32x32x8bpp buffer into which tiles get rendered before they get copied to the framebuffer |
135 | 135 | // our implementation is not currently tile based, and thus the accumulation buffer is screen sized |
r17963 | r17964 | |
981 | 981 | |
982 | 982 | READ64_HANDLER( pvr_ta_r ) |
983 | 983 | { |
984 | dc_state *state = space | |
984 | dc_state *state = space.machine().driver_data<dc_state>(); | |
985 | 985 | int reg; |
986 | 986 | UINT64 shift; |
987 | 987 | |
r17963 | r17964 | |
993 | 993 | { |
994 | 994 | UINT8 fieldnum,vsync,hsync,blank; |
995 | 995 | |
996 | fieldnum = (space | |
996 | fieldnum = (space.machine().primary_screen->frame_number() & 1) ? 1 : 0; | |
997 | 997 | |
998 | vsync = space | |
998 | vsync = space.machine().primary_screen->vblank() ? 1 : 0; | |
999 | 999 | if(spg_vsync_pol) { vsync^=1; } |
1000 | 1000 | |
1001 | hsync = space | |
1001 | hsync = space.machine().primary_screen->hblank() ? 1 : 0; | |
1002 | 1002 | if(spg_hsync_pol) { hsync^=1; } |
1003 | 1003 | |
1004 | 1004 | /* FIXME: following is just a wild guess */ |
1005 | blank = (space | |
1005 | blank = (space.machine().primary_screen->vblank() | space.machine().primary_screen->hblank()) ? 0 : 1; | |
1006 | 1006 | if(spg_blank_pol) { blank^=1; } |
1007 | 1007 | |
1008 | state->pvrta_regs[reg] = (vsync << 13) | (hsync << 12) | (blank << 11) | (fieldnum << 10) | (space | |
1008 | state->pvrta_regs[reg] = (vsync << 13) | (hsync << 12) | (blank << 11) | (fieldnum << 10) | (space.machine().primary_screen->vpos() & 0x3ff); | |
1009 | 1009 | break; |
1010 | 1010 | } |
1011 | 1011 | case SPG_TRIGGER_POS: |
r17963 | r17964 | |
1017 | 1017 | |
1018 | 1018 | #if DEBUG_PVRTA_REGS |
1019 | 1019 | if (reg != 0x43) |
1020 | mame_printf_verbose("PVRTA: [%08x] read %x @ %x (reg %x), mask %" I64FMT "x (PC=%x)\n", 0x5f8000+reg*4, state->pvrta_regs[reg], offset, reg, mem_mask, space | |
1020 | mame_printf_verbose("PVRTA: [%08x] read %x @ %x (reg %x), mask %" I64FMT "x (PC=%x)\n", 0x5f8000+reg*4, state->pvrta_regs[reg], offset, reg, mem_mask, space.device().safe_pc()); | |
1021 | 1021 | #endif |
1022 | 1022 | return (UINT64)state->pvrta_regs[reg] << shift; |
1023 | 1023 | } |
1024 | 1024 | |
1025 | 1025 | WRITE64_HANDLER( pvr_ta_w ) |
1026 | 1026 | { |
1027 | dc_state *state = space | |
1027 | dc_state *state = space.machine().driver_data<dc_state>(); | |
1028 | 1028 | int reg; |
1029 | 1029 | UINT64 shift; |
1030 | 1030 | UINT32 dat; |
r17963 | r17964 | |
1099 | 1099 | |
1100 | 1100 | // we've got a request to draw, so, draw to the accumulation buffer! |
1101 | 1101 | // this should really be done for each tile! |
1102 | render_to_accumulation_buffer(space | |
1102 | render_to_accumulation_buffer(space.machine(),*fake_accumulationbuffer_bitmap,clip); | |
1103 | 1103 | |
1104 | 1104 | state->endofrender_timer_isp->adjust(attotime::from_usec(4000) ); // hack, make sure render takes some amount of time |
1105 | 1105 | |
r17963 | r17964 | |
1118 | 1118 | { |
1119 | 1119 | UINT32 st[6]; |
1120 | 1120 | |
1121 | st[0]=space->read_dword((0x05000000+offsetra)); | |
1122 | st[1]=space->read_dword((0x05000004+offsetra)); // Opaque List Pointer | |
1123 | st[2]=space->read_dword((0x05000008+offsetra)); // Opaque Modifier Volume List Pointer | |
1124 | st[3]=space->read_dword((0x0500000c+offsetra)); // Translucent List Pointer | |
1125 | st[4]=space->read_dword((0x05000010+offsetra)); // Translucent Modifier Volume List Pointer | |
1121 | st[0]=space.read_dword((0x05000000+offsetra)); | |
1122 | st[1]=space.read_dword((0x05000004+offsetra)); // Opaque List Pointer | |
1123 | st[2]=space.read_dword((0x05000008+offsetra)); // Opaque Modifier Volume List Pointer | |
1124 | st[3]=space.read_dword((0x0500000c+offsetra)); // Translucent List Pointer | |
1125 | st[4]=space.read_dword((0x05000010+offsetra)); // Translucent Modifier Volume List Pointer | |
1126 | 1126 | |
1127 | 1127 | if (sizera == 6) |
1128 | 1128 | { |
1129 | st[5] = space | |
1129 | st[5] = space.read_dword((0x05000014+offsetra)); // Punch Through List Pointer | |
1130 | 1130 | offsetra+=0x18; |
1131 | 1131 | } |
1132 | 1132 | else |
r17963 | r17964 | |
1241 | 1241 | |
1242 | 1242 | // hack, this interrupt is generated after transfering a set amount of data |
1243 | 1243 | //state->dc_sysctrl_regs[SB_ISTNRM] |= IST_EOXFER_YUV; |
1244 | //dc_update_interrupt_status(space | |
1244 | //dc_update_interrupt_status(space.machine()); | |
1245 | 1245 | |
1246 | 1246 | break; |
1247 | 1247 | case TA_YUV_TEX_CTRL: |
r17963 | r17964 | |
1253 | 1253 | state->vbin_timer->adjust(attotime::never); |
1254 | 1254 | state->vbout_timer->adjust(attotime::never); |
1255 | 1255 | |
1256 | state->vbin_timer->adjust(space->machine().primary_screen->time_until_pos(spg_vblank_in_irq_line_num)); | |
1257 | state->vbout_timer->adjust(space->machine().primary_screen->time_until_pos(spg_vblank_out_irq_line_num)); | |
1256 | state->vbin_timer->adjust(space.machine().primary_screen->time_until_pos(spg_vblank_in_irq_line_num)); | |
1257 | state->vbout_timer->adjust(space.machine().primary_screen->time_until_pos(spg_vblank_out_irq_line_num)); | |
1258 | 1258 | break; |
1259 | 1259 | /* TODO: timer adjust for SPG_HBLANK_INT too */ |
1260 | 1260 | case TA_LIST_CONT: |
r17963 | r17964 | |
1273 | 1273 | case VO_STARTX: |
1274 | 1274 | case VO_STARTY: |
1275 | 1275 | { |
1276 | rectangle visarea = space | |
1276 | rectangle visarea = space.machine().primary_screen->visible_area(); | |
1277 | 1277 | /* FIXME: right visible area calculations aren't known yet*/ |
1278 | 1278 | visarea.min_x = 0; |
1279 | 1279 | visarea.max_x = ((spg_hbstart - spg_hbend - vo_horz_start_pos) <= 0x180 ? 320 : 640) - 1; |
r17963 | r17964 | |
1281 | 1281 | visarea.max_y = ((spg_vbstart - spg_vbend - vo_vert_start_pos_f1) <= 0x100 ? 240 : 480) - 1; |
1282 | 1282 | |
1283 | 1283 | |
1284 | space | |
1284 | space.machine().primary_screen->configure(spg_hbstart, spg_vbstart, visarea, space.machine().primary_screen->frame_period().attoseconds ); | |
1285 | 1285 | } |
1286 | 1286 | break; |
1287 | 1287 | } |
r17963 | r17964 | |
1628 | 1628 | |
1629 | 1629 | WRITE64_HANDLER( ta_fifo_poly_w ) |
1630 | 1630 | { |
1631 | dc_state *state = space | |
1631 | dc_state *state = space.machine().driver_data<dc_state>(); | |
1632 | 1632 | |
1633 | 1633 | if (mem_mask == U64(0xffffffffffffffff)) // 64 bit |
1634 | 1634 | { |
r17963 | r17964 | |
1648 | 1648 | |
1649 | 1649 | // if the command is complete, process it |
1650 | 1650 | if (state_ta.tafifo_pos == 0) |
1651 | process_ta_fifo(space | |
1651 | process_ta_fifo(space.machine()); | |
1652 | 1652 | |
1653 | 1653 | } |
1654 | 1654 | |
1655 | 1655 | WRITE64_HANDLER( ta_fifo_yuv_w ) |
1656 | 1656 | { |
1657 | //dc_state *state = space | |
1657 | //dc_state *state = space.machine().driver_data<dc_state>(); | |
1658 | 1658 | |
1659 | 1659 | // int reg; |
1660 | 1660 | // UINT64 shift; |
r17963 | r17964 | |
1975 | 1975 | static void render_to_accumulation_buffer(running_machine &machine,bitmap_rgb32 &bitmap,const rectangle &cliprect) |
1976 | 1976 | { |
1977 | 1977 | dc_state *state = machine.driver_data<dc_state>(); |
1978 | address_space | |
1978 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
1979 | 1979 | int cs,rs,ns; |
1980 | 1980 | UINT32 c; |
1981 | 1981 | #if 0 |
r17963 | r17964 | |
1992 | 1992 | |
1993 | 1993 | rs=state_ta.renderselect; |
1994 | 1994 | c=state->pvrta_regs[ISP_BACKGND_T]; |
1995 | c=space | |
1995 | c=space.read_dword(0x05000000+((c&0xfffff8)>>1)+(3+3)*4); | |
1996 | 1996 | bitmap.fill(c, cliprect); |
1997 | 1997 | |
1998 | 1998 | |
r17963 | r17964 | |
2045 | 2045 | |
2046 | 2046 | */ |
2047 | 2047 | |
2048 | static void pvr_accumulationbuffer_to_framebuffer(address_space | |
2048 | static void pvr_accumulationbuffer_to_framebuffer(address_space &space, int x,int y) | |
2049 | 2049 | { |
2050 | dc_state *state = space | |
2050 | dc_state *state = space.machine().driver_data<dc_state>(); | |
2051 | 2051 | |
2052 | 2052 | // the accumulation buffer is always 8888 |
2053 | 2053 | // |
r17963 | r17964 | |
2083 | 2083 | ((((data & 0x0000f800) >> 11)) << 5) | |
2084 | 2084 | ((((data & 0x00f80000) >> 19)) << 10); |
2085 | 2085 | |
2086 | space | |
2086 | space.write_word(realwriteoffs+xcnt*2, newdat); | |
2087 | 2087 | } |
2088 | 2088 | } |
2089 | 2089 | } |
r17963 | r17964 | |
2107 | 2107 | ((((data & 0x0000fc00) >> 10)) << 5) | |
2108 | 2108 | ((((data & 0x00f80000) >> 19)) << 11); |
2109 | 2109 | |
2110 | space | |
2110 | space.write_word(realwriteoffs+xcnt*2, newdat); | |
2111 | 2111 | } |
2112 | 2112 | } |
2113 | 2113 | } |
r17963 | r17964 | |
2135 | 2135 | ((((data & 0x00f80000) >> 19)) << 10); |
2136 | 2136 | // alpha? |
2137 | 2137 | |
2138 | space | |
2138 | space.write_word(realwriteoffs+xcnt*2, newdat); | |
2139 | 2139 | } |
2140 | 2140 | } |
2141 | 2141 | } |
r17963 | r17964 | |
2159 | 2159 | ((((data & 0x0000fc00) >> 10)) << 5) | |
2160 | 2160 | ((((data & 0x00f80000) >> 19)) << 11); |
2161 | 2161 | |
2162 | space | |
2162 | space.write_word(realwriteoffs+xcnt*2, newdat); | |
2163 | 2163 | } |
2164 | 2164 | } |
2165 | 2165 | } |
r17963 | r17964 | |
2186 | 2186 | ((((data & 0x0000fc00) >> 10)) << 5) | |
2187 | 2187 | ((((data & 0x00f80000) >> 19)) << 11); |
2188 | 2188 | |
2189 | space | |
2189 | space.write_word(realwriteoffs+xcnt*2, newdat); | |
2190 | 2190 | } |
2191 | 2191 | } |
2192 | 2192 | } |
r17963 | r17964 | |
2741 | 2741 | case 0x78/4: // IRQ MASK |
2742 | 2742 | return 0; |
2743 | 2743 | default: |
2744 | printf("%08x %08x\n",space | |
2744 | printf("%08x %08x\n",space.device().safe_pc(),offset*4); | |
2745 | 2745 | break; |
2746 | 2746 | } |
2747 | 2747 | |
r17963 | r17964 | |
2753 | 2753 | switch(offset) |
2754 | 2754 | { |
2755 | 2755 | default: |
2756 | printf("%08x %08x %08x W\n",space | |
2756 | printf("%08x %08x %08x W\n",space.device().safe_pc(),offset*4,data); | |
2757 | 2757 | break; |
2758 | 2758 | } |
2759 | 2759 | } |
r17963 | r17964 | |
---|---|---|
1264 | 1264 | { |
1265 | 1265 | /* certain ranges need immediate updates */ |
1266 | 1266 | if (offset >= 0xe80/2) |
1267 | space | |
1267 | space.machine().primary_screen->update_partial(space.machine().primary_screen->vpos()); | |
1268 | 1268 | |
1269 | 1269 | COMBINE_DATA(&segaic16_textram_0[offset]); |
1270 | 1270 | bg_tilemap[0].textmap->mark_tile_dirty(offset); |
r17963 | r17964 | |
---|---|---|
419 | 419 | READ32_HANDLER( zeus2_r ) |
420 | 420 | { |
421 | 421 | int logit = (offset != 0x00 && offset != 0x01 && offset != 0x54 && offset != 0x48 && offset != 0x49 && offset != 0x58 && offset != 0x59 && offset != 0x5a); |
422 | midzeus_state *state = space | |
422 | midzeus_state *state = space.machine().driver_data<midzeus_state>(); | |
423 | 423 | UINT32 result = state->m_zeusbase[offset]; |
424 | 424 | |
425 | 425 | #if TRACK_REG_USAGE |
r17963 | r17964 | |
427 | 427 | #endif |
428 | 428 | |
429 | 429 | if (logit) |
430 | logerror("%06X:zeus2_r(%02X)\n", space | |
430 | logerror("%06X:zeus2_r(%02X)\n", space.device().safe_pc(), offset); | |
431 | 431 | |
432 | 432 | switch (offset) |
433 | 433 | { |
r17963 | r17964 | |
440 | 440 | /* bits $00080000 is tested in a loop until 0 */ |
441 | 441 | /* bit $00000004 is tested for toggling; probably VBLANK */ |
442 | 442 | result = 0x00; |
443 | if (space | |
443 | if (space.machine().primary_screen->vblank()) | |
444 | 444 | result |= 0x04; |
445 | 445 | break; |
446 | 446 | |
r17963 | r17964 | |
451 | 451 | |
452 | 452 | case 0x54: |
453 | 453 | /* both upper 16 bits and lower 16 bits seem to be used as vertical counters */ |
454 | result = (space | |
454 | result = (space.machine().primary_screen->vpos() << 16) | space.machine().primary_screen->vpos(); | |
455 | 455 | break; |
456 | 456 | } |
457 | 457 | |
r17963 | r17964 | |
473 | 473 | offset != 0x40 && offset != 0x41 && offset != 0x48 && offset != 0x49 && offset != 0x4e && |
474 | 474 | offset != 0x50 && offset != 0x51 && offset != 0x57 && offset != 0x58 && offset != 0x59 && offset != 0x5a && offset != 0x5e); |
475 | 475 | if (logit) |
476 | logerror("%06X:zeus2_w", space->device().safe_pc()); | |
477 | zeus_register32_w(space->machine(), offset, data, logit); | |
476 | logerror("%06X:zeus2_w", space.device().safe_pc()); | |
477 | zeus_register32_w(space.machine(), offset, data, logit); | |
478 | 478 | } |
479 | 479 | |
480 | 480 |
r17963 | r17964 | |
---|---|---|
772 | 772 | //state->m_real3d_display_list = 1; |
773 | 773 | } |
774 | 774 | |
775 | void real3d_display_list1_dma(address_space | |
775 | void real3d_display_list1_dma(address_space &space, UINT32 src, UINT32 dst, int length, int byteswap) | |
776 | 776 | { |
777 | model3_state *state = space | |
777 | model3_state *state = space.machine().driver_data<model3_state>(); | |
778 | 778 | int i; |
779 | 779 | int d = (dst & 0xffffff) / 4; |
780 | 780 | for(i=0; i < length; i+=4) { |
781 | 781 | UINT32 w; |
782 | 782 | if (byteswap) { |
783 | w = BYTE_REVERSE32(space | |
783 | w = BYTE_REVERSE32(space.read_dword(src)); | |
784 | 784 | } else { |
785 | w = space | |
785 | w = space.read_dword(src); | |
786 | 786 | } |
787 | 787 | state->m_display_list_ram[d++] = w; |
788 | 788 | src += 4; |
789 | 789 | } |
790 | 790 | } |
791 | 791 | |
792 | void real3d_display_list2_dma(address_space | |
792 | void real3d_display_list2_dma(address_space &space, UINT32 src, UINT32 dst, int length, int byteswap) | |
793 | 793 | { |
794 | model3_state *state = space | |
794 | model3_state *state = space.machine().driver_data<model3_state>(); | |
795 | 795 | int i; |
796 | 796 | int d = (dst & 0xffffff) / 4; |
797 | 797 | for(i=0; i < length; i+=4) { |
798 | 798 | UINT32 w; |
799 | 799 | if (byteswap) { |
800 | w = BYTE_REVERSE32(space | |
800 | w = BYTE_REVERSE32(space.read_dword(src)); | |
801 | 801 | } else { |
802 | w = space | |
802 | w = space.read_dword(src); | |
803 | 803 | } |
804 | 804 | state->m_culling_ram[d++] = w; |
805 | 805 | src += 4; |
806 | 806 | } |
807 | 807 | } |
808 | 808 | |
809 | void real3d_vrom_texture_dma(address_space | |
809 | void real3d_vrom_texture_dma(address_space &space, UINT32 src, UINT32 dst, int length, int byteswap) | |
810 | 810 | { |
811 | model3_state *state = space | |
811 | model3_state *state = space.machine().driver_data<model3_state>(); | |
812 | 812 | if((dst & 0xff) == 0) { |
813 | 813 | |
814 | 814 | UINT32 address, header; |
815 | 815 | |
816 | 816 | if (byteswap) { |
817 | address = BYTE_REVERSE32(space->read_dword((src+0))); | |
818 | header = BYTE_REVERSE32(space->read_dword((src+4))); | |
817 | address = BYTE_REVERSE32(space.read_dword((src+0))); | |
818 | header = BYTE_REVERSE32(space.read_dword((src+4))); | |
819 | 819 | } else { |
820 | address = space->read_dword((src+0)); | |
821 | header = space->read_dword((src+4)); | |
820 | address = space.read_dword((src+0)); | |
821 | header = space.read_dword((src+4)); | |
822 | 822 | } |
823 | real3d_upload_texture(space | |
823 | real3d_upload_texture(space.machine(), header, (UINT32*)&state->m_vrom[address]); | |
824 | 824 | } |
825 | 825 | } |
826 | 826 | |
827 | void real3d_texture_fifo_dma(address_space | |
827 | void real3d_texture_fifo_dma(address_space &space, UINT32 src, int length, int byteswap) | |
828 | 828 | { |
829 | model3_state *state = space | |
829 | model3_state *state = space.machine().driver_data<model3_state>(); | |
830 | 830 | int i; |
831 | 831 | for(i=0; i < length; i+=4) { |
832 | 832 | UINT32 w; |
833 | 833 | if (byteswap) { |
834 | w = BYTE_REVERSE32(space | |
834 | w = BYTE_REVERSE32(space.read_dword(src)); | |
835 | 835 | } else { |
836 | w = space | |
836 | w = space.read_dword(src); | |
837 | 837 | } |
838 | 838 | state->m_texture_fifo[state->m_texture_fifo_pos] = w; |
839 | 839 | state->m_texture_fifo_pos++; |
r17963 | r17964 | |
841 | 841 | } |
842 | 842 | } |
843 | 843 | |
844 | void real3d_polygon_ram_dma(address_space | |
844 | void real3d_polygon_ram_dma(address_space &space, UINT32 src, UINT32 dst, int length, int byteswap) | |
845 | 845 | { |
846 | model3_state *state = space | |
846 | model3_state *state = space.machine().driver_data<model3_state>(); | |
847 | 847 | int i; |
848 | 848 | int d = (dst & 0xffffff) / 4; |
849 | 849 | for(i=0; i < length; i+=4) { |
850 | 850 | UINT32 w; |
851 | 851 | if (byteswap) { |
852 | w = BYTE_REVERSE32(space | |
852 | w = BYTE_REVERSE32(space.read_dword(src)); | |
853 | 853 | } else { |
854 | w = space | |
854 | w = space.read_dword(src); | |
855 | 855 | } |
856 | 856 | state->m_polygon_ram[d++] = w; |
857 | 857 | src += 4; |
r17963 | r17964 | |
---|---|---|
63 | 63 | col ^= 2; |
64 | 64 | |
65 | 65 | /* Row address (RA0-RA8) is not dependent on the offset */ |
66 | tms34061_w( | |
66 | tms34061_w(space, col, *m_rowaddress, func, data); | |
67 | 67 | } |
68 | 68 | |
69 | 69 | |
r17963 | r17964 | |
78 | 78 | col ^= 2; |
79 | 79 | |
80 | 80 | /* Row address (RA0-RA8) is not dependent on the offset */ |
81 | return tms34061_r( | |
81 | return tms34061_r(space, col, *m_rowaddress, func); | |
82 | 82 | } |
83 | 83 | |
84 | 84 |
r17963 | r17964 | |
---|---|---|
103 | 103 | |
104 | 104 | WRITE16_HANDLER( skullxbo_xscroll_w ) |
105 | 105 | { |
106 | skullxbo_state *state = space | |
106 | skullxbo_state *state = space.machine().driver_data<skullxbo_state>(); | |
107 | 107 | |
108 | 108 | /* combine data */ |
109 | 109 | UINT16 oldscroll = *state->m_xscroll; |
r17963 | r17964 | |
112 | 112 | |
113 | 113 | /* if something changed, force an update */ |
114 | 114 | if (oldscroll != newscroll) |
115 | space | |
115 | space.machine().primary_screen->update_partial(space.machine().primary_screen->vpos()); | |
116 | 116 | |
117 | 117 | /* adjust the actual scrolls */ |
118 | 118 | state->m_playfield_tilemap->set_scrollx(0, 2 * (newscroll >> 7)); |
r17963 | r17964 | |
125 | 125 | |
126 | 126 | WRITE16_HANDLER( skullxbo_yscroll_w ) |
127 | 127 | { |
128 | skullxbo_state *state = space | |
128 | skullxbo_state *state = space.machine().driver_data<skullxbo_state>(); | |
129 | 129 | |
130 | 130 | /* combine data */ |
131 | int scanline = space | |
131 | int scanline = space.machine().primary_screen->vpos(); | |
132 | 132 | UINT16 oldscroll = *state->m_yscroll; |
133 | 133 | UINT16 newscroll = oldscroll; |
134 | 134 | UINT16 effscroll; |
r17963 | r17964 | |
136 | 136 | |
137 | 137 | /* if something changed, force an update */ |
138 | 138 | if (oldscroll != newscroll) |
139 | space | |
139 | space.machine().primary_screen->update_partial(scanline); | |
140 | 140 | |
141 | 141 | /* adjust the effective scroll for the current scanline */ |
142 | if (scanline > space | |
142 | if (scanline > space.machine().primary_screen->visible_area().max_y) | |
143 | 143 | scanline = 0; |
144 | 144 | effscroll = (newscroll >> 7) - scanline; |
145 | 145 | |
r17963 | r17964 | |
161 | 161 | |
162 | 162 | WRITE16_HANDLER( skullxbo_mobmsb_w ) |
163 | 163 | { |
164 | space | |
164 | space.machine().primary_screen->update_partial(space.machine().primary_screen->vpos()); | |
165 | 165 | atarimo_set_bank(0, (offset >> 9) & 1); |
166 | 166 | } |
167 | 167 | |
r17963 | r17964 | |
175 | 175 | |
176 | 176 | WRITE16_HANDLER( skullxbo_playfieldlatch_w ) |
177 | 177 | { |
178 | skullxbo_state *state = space | |
178 | skullxbo_state *state = space.machine().driver_data<skullxbo_state>(); | |
179 | 179 | atarigen_set_playfield_latch(state, data); |
180 | 180 | } |
181 | 181 |
r17963 | r17964 | |
---|---|---|
1929 | 1929 | if (h <= 4) |
1930 | 1930 | m_snes_vram[offset] = data; |
1931 | 1931 | else if (h == 6) |
1932 | m_snes_vram[offset] = snes_open_bus_r( | |
1932 | m_snes_vram[offset] = snes_open_bus_r(space, 0); | |
1933 | 1933 | else |
1934 | 1934 | { |
1935 | 1935 | //printf("%d %d VRAM write, CHECK!\n",h,v); |
r17963 | r17964 | |
2047 | 2047 | #if 0 |
2048 | 2048 | if (!snes_ppu.screen_disabled) |
2049 | 2049 | { |
2050 | UINT16 v = space->machine().primary_screen->vpos(); | |
2051 | UINT16 h = space->machine().primary_screen->hpos(); | |
2050 | UINT16 v = space.machine().primary_screen->vpos(); | |
2051 | UINT16 h = space.machine().primary_screen->hpos(); | |
2052 | 2052 | |
2053 | 2053 | if (v < snes_ppu.beam.last_visible_line && h >= 128 && h < 1096) |
2054 | 2054 | offset = 0x1ff; |
r17963 | r17964 | |
2075 | 2075 | // writes to the cgram address |
2076 | 2076 | if (!snes_ppu.screen_disabled) |
2077 | 2077 | { |
2078 | UINT16 v = space->machine().primary_screen->vpos(); | |
2079 | UINT16 h = space->machine().primary_screen->hpos(); | |
2078 | UINT16 v = space.machine().primary_screen->vpos(); | |
2079 | UINT16 h = space.machine().primary_screen->hpos(); | |
2080 | 2080 | |
2081 | 2081 | if (v < snes_ppu.beam.last_visible_line && h >= 128 && h < 1096) |
2082 | 2082 | offset = 0x1ff; |
r17963 | r17964 | |
2093 | 2093 | |
2094 | 2094 | READ8_HANDLER( snes_ppu_read ) |
2095 | 2095 | { |
2096 | snes_state *state = space | |
2096 | snes_state *state = space.machine().driver_data<snes_state>(); | |
2097 | 2097 | UINT8 value; |
2098 | 2098 | |
2099 | 2099 | switch (offset) |
r17963 | r17964 | |
2140 | 2140 | return snes_ppu.ppu1_open_bus; |
2141 | 2141 | } |
2142 | 2142 | case SLHV: /* Software latch for H/V counter */ |
2143 | snes_latch_counters(space | |
2143 | snes_latch_counters(space.machine()); | |
2144 | 2144 | return snes_open_bus_r(space, 0); /* Return value is meaningless */ |
2145 | 2145 | case ROAMDATA: /* Read data from OAM (DR) */ |
2146 | snes_ppu.ppu1_open_bus = state->snes_oam_read( | |
2146 | snes_ppu.ppu1_open_bus = state->snes_oam_read(space, snes_ppu.oam.address); | |
2147 | 2147 | snes_ram[OAMDATA] = (snes_ram[OAMDATA] + 1) % 2; |
2148 | 2148 | if (!snes_ram[OAMDATA]) |
2149 | 2149 | { |
r17963 | r17964 | |
2154 | 2154 | return snes_ppu.ppu1_open_bus; |
2155 | 2155 | case RVMDATAL: /* Read data from VRAM (low) */ |
2156 | 2156 | { |
2157 | UINT32 addr = snes_get_vram_address(space | |
2157 | UINT32 addr = snes_get_vram_address(space.machine()); | |
2158 | 2158 | snes_ppu.ppu1_open_bus = state->m_vram_read_buffer & 0xff; |
2159 | 2159 | |
2160 | 2160 | if (!state->m_vram_fgr_high) |
2161 | 2161 | { |
2162 | state->m_vram_read_buffer = state->snes_vram_read(*space, addr); | |
2163 | state->m_vram_read_buffer |= (state->snes_vram_read(*space, addr + 1) << 8); | |
2162 | state->m_vram_read_buffer = state->snes_vram_read(space, addr); | |
2163 | state->m_vram_read_buffer |= (state->snes_vram_read(space, addr + 1) << 8); | |
2164 | 2164 | |
2165 | 2165 | state->m_vmadd = (state->m_vmadd + state->m_vram_fgr_increment) & 0xffff; |
2166 | 2166 | } |
r17963 | r17964 | |
2169 | 2169 | } |
2170 | 2170 | case RVMDATAH: /* Read data from VRAM (high) */ |
2171 | 2171 | { |
2172 | UINT32 addr = snes_get_vram_address(space | |
2172 | UINT32 addr = snes_get_vram_address(space.machine()); | |
2173 | 2173 | snes_ppu.ppu1_open_bus = (state->m_vram_read_buffer >> 8) & 0xff; |
2174 | 2174 | |
2175 | 2175 | if (state->m_vram_fgr_high) |
2176 | 2176 | { |
2177 | state->m_vram_read_buffer = state->snes_vram_read(*space, addr); | |
2178 | state->m_vram_read_buffer |= (state->snes_vram_read(*space, addr + 1) << 8); | |
2177 | state->m_vram_read_buffer = state->snes_vram_read(space, addr); | |
2178 | state->m_vram_read_buffer |= (state->snes_vram_read(space, addr + 1) << 8); | |
2179 | 2179 | |
2180 | 2180 | state->m_vmadd = (state->m_vmadd + state->m_vram_fgr_increment) & 0xffff; |
2181 | 2181 | } |
r17963 | r17964 | |
2184 | 2184 | } |
2185 | 2185 | case RCGDATA: /* Read data from CGRAM */ |
2186 | 2186 | if (!(state->m_cgram_address & 0x01)) |
2187 | snes_ppu.ppu2_open_bus = state->snes_cgram_read( | |
2187 | snes_ppu.ppu2_open_bus = state->snes_cgram_read(space, state->m_cgram_address); | |
2188 | 2188 | else |
2189 | 2189 | { |
2190 | 2190 | snes_ppu.ppu2_open_bus &= 0x80; |
2191 | snes_ppu.ppu2_open_bus |= state->snes_cgram_read( | |
2191 | snes_ppu.ppu2_open_bus |= state->snes_cgram_read(space, state->m_cgram_address) & 0x7f; | |
2192 | 2192 | } |
2193 | 2193 | |
2194 | 2194 | state->m_cgram_address = (state->m_cgram_address + 1) % (SNES_CGRAM_SIZE - 2); |
r17963 | r17964 | |
2242 | 2242 | |
2243 | 2243 | WRITE8_HANDLER( snes_ppu_write ) |
2244 | 2244 | { |
2245 | snes_state *state = space | |
2245 | snes_state *state = space.machine().driver_data<snes_state>(); | |
2246 | 2246 | |
2247 | 2247 | switch (offset) |
2248 | 2248 | { |
2249 | 2249 | case INIDISP: /* Initial settings for screen */ |
2250 | 2250 | if ((snes_ppu.screen_disabled & 0x80) && (!(data & 0x80))) //a 1->0 force blank transition causes a reset OAM address |
2251 | 2251 | { |
2252 | space->write_byte(OAMADDL, snes_ppu.oam.saved_address_low); | |
2253 | space->write_byte(OAMADDH, snes_ppu.oam.saved_address_high); | |
2252 | space.write_byte(OAMADDL, snes_ppu.oam.saved_address_low); | |
2253 | space.write_byte(OAMADDH, snes_ppu.oam.saved_address_high); | |
2254 | 2254 | snes_ppu.oam.first_sprite = snes_ppu.oam.priority_rotation ? (snes_ppu.oam.address >> 1) & 127 : 0; |
2255 | 2255 | } |
2256 | 2256 | snes_ppu.screen_disabled = data & 0x80; |
r17963 | r17964 | |
2276 | 2276 | break; |
2277 | 2277 | case OAMDATA: /* Data for OAM write (DW) */ |
2278 | 2278 | if (snes_ppu.oam.address >= 0x100) |
2279 | state->snes_oam_write( | |
2279 | state->snes_oam_write(space, snes_ppu.oam.address, data); | |
2280 | 2280 | else |
2281 | 2281 | { |
2282 | 2282 | if (!snes_ram[OAMDATA]) |
r17963 | r17964 | |
2286 | 2286 | // in this case, we not only write data to the upper byte of the word, |
2287 | 2287 | // but also snes_ppu.oam.write_latch to the lower byte (recall that |
2288 | 2288 | // snes_ram[OAMDATA] is used to select high/low byte) |
2289 | state->snes_oam_write( | |
2289 | state->snes_oam_write(space, snes_ppu.oam.address, data); | |
2290 | 2290 | snes_ram[OAMDATA] = 0; |
2291 | state->snes_oam_write( | |
2291 | state->snes_oam_write(space, snes_ppu.oam.address, snes_ppu.oam.write_latch); | |
2292 | 2292 | snes_ram[OAMDATA] = 1; |
2293 | 2293 | } |
2294 | 2294 | } |
r17963 | r17964 | |
2302 | 2302 | return; |
2303 | 2303 | case BGMODE: /* BG mode and character size settings */ |
2304 | 2304 | snes_ppu.mode = data & 0x07; |
2305 | snes_dynamic_res_change(space | |
2305 | snes_dynamic_res_change(space.machine()); | |
2306 | 2306 | snes_ppu.bg3_priority_bit = BIT(data, 3); |
2307 | 2307 | snes_ppu.layer[SNES_BG1].tile_size = BIT(data, 4); |
2308 | 2308 | snes_ppu.layer[SNES_BG2].tile_size = BIT(data, 5); |
r17963 | r17964 | |
2404 | 2404 | { |
2405 | 2405 | UINT32 addr; |
2406 | 2406 | state->m_vmadd = (state->m_vmadd & 0xff00) | (data << 0); |
2407 | addr = snes_get_vram_address(space->machine()); | |
2408 | state->m_vram_read_buffer = state->snes_vram_read(*space, addr); | |
2409 | state->m_vram_read_buffer |= (state->snes_vram_read(*space, addr + 1) << 8); | |
2407 | addr = snes_get_vram_address(space.machine()); | |
2408 | state->m_vram_read_buffer = state->snes_vram_read(space, addr); | |
2409 | state->m_vram_read_buffer |= (state->snes_vram_read(space, addr + 1) << 8); | |
2410 | 2410 | } |
2411 | 2411 | break; |
2412 | 2412 | case VMADDH: /* Address for VRAM read/write (high) */ |
2413 | 2413 | { |
2414 | 2414 | UINT32 addr; |
2415 | 2415 | state->m_vmadd = (state->m_vmadd & 0x00ff) | (data << 8); |
2416 | addr = snes_get_vram_address(space->machine()); | |
2417 | state->m_vram_read_buffer = state->snes_vram_read(*space, addr); | |
2418 | state->m_vram_read_buffer |= (state->snes_vram_read(*space, addr + 1) << 8); | |
2416 | addr = snes_get_vram_address(space.machine()); | |
2417 | state->m_vram_read_buffer = state->snes_vram_read(space, addr); | |
2418 | state->m_vram_read_buffer |= (state->snes_vram_read(space, addr + 1) << 8); | |
2419 | 2419 | } |
2420 | 2420 | break; |
2421 | 2421 | case VMDATAL: /* 2118: Data for VRAM write (low) */ |
2422 | 2422 | { |
2423 | UINT32 addr = snes_get_vram_address(space->machine()); | |
2424 | state->snes_vram_write(*space, addr, data); | |
2423 | UINT32 addr = snes_get_vram_address(space.machine()); | |
2424 | state->snes_vram_write(space, addr, data); | |
2425 | 2425 | |
2426 | 2426 | if (!state->m_vram_fgr_high) |
2427 | 2427 | state->m_vmadd = (state->m_vmadd + state->m_vram_fgr_increment) & 0xffff; |
r17963 | r17964 | |
2429 | 2429 | return; |
2430 | 2430 | case VMDATAH: /* 2119: Data for VRAM write (high) */ |
2431 | 2431 | { |
2432 | UINT32 addr = snes_get_vram_address(space->machine()); | |
2433 | state->snes_vram_write(*space, addr + 1, data); | |
2432 | UINT32 addr = snes_get_vram_address(space.machine()); | |
2433 | state->snes_vram_write(space, addr + 1, data); | |
2434 | 2434 | |
2435 | 2435 | if (state->m_vram_fgr_high) |
2436 | 2436 | state->m_vmadd = (state->m_vmadd + state->m_vram_fgr_increment) & 0xffff; |
r17963 | r17964 | |
2471 | 2471 | state->m_cgram_address = data << 1; |
2472 | 2472 | break; |
2473 | 2473 | case CGDATA: /* Data for colour RAM */ |
2474 | state->snes_cgram_write( | |
2474 | state->snes_cgram_write(space, state->m_cgram_address, data); | |
2475 | 2475 | state->m_cgram_address = (state->m_cgram_address + 1) % (SNES_CGRAM_SIZE - 2); |
2476 | 2476 | break; |
2477 | 2477 | case W12SEL: /* Window mask settings for BG1-2 */ |
r17963 | r17964 | |
2633 | 2633 | snes_ppu.beam.last_visible_line = (data & 0x04) ? 240 : 225; |
2634 | 2634 | snes_ppu.pseudo_hires = BIT(data, 3); |
2635 | 2635 | snes_ppu.mode7.extbg = BIT(data, 6); |
2636 | snes_dynamic_res_change(space | |
2636 | snes_dynamic_res_change(space.machine()); | |
2637 | 2637 | #ifdef SNES_DBG_REG_W |
2638 | 2638 | if ((data & 0x8) != (snes_ram[SETINI] & 0x8)) |
2639 | 2639 | mame_printf_debug( "Pseudo 512 mode: %s\n", (data & 0x8) ? "on" : "off" ); |
r17963 | r17964 | |
---|---|---|
57 | 57 | |
58 | 58 | |
59 | 59 | ******************************************************************************/ |
60 | int pastelg_blitter_src_addr_r(address_space | |
60 | int pastelg_blitter_src_addr_r(address_space &space) | |
61 | 61 | { |
62 | pastelg_state *state = space | |
62 | pastelg_state *state = space.machine().driver_data<pastelg_state>(); | |
63 | 63 | return state->m_blitter_src_addr; |
64 | 64 | } |
65 | 65 | |
r17963 | r17964 | |
111 | 111 | int gfxlen = memregion("gfx1")->bytes(); |
112 | 112 | m_gfxrom = ((data & 0xc0) >> 6); |
113 | 113 | m_palbank = ((data & 0x10) >> 4); |
114 | nb1413m3_sndrombank1_w( | |
114 | nb1413m3_sndrombank1_w(space, 0, data); | |
115 | 115 | |
116 | 116 | if ((m_gfxrom << 16) > (gfxlen - 1)) |
117 | 117 | { |
r17963 | r17964 | |
---|---|---|
155 | 155 | |
156 | 156 | WRITE8_HANDLER( bosco_videoram_w ) |
157 | 157 | { |
158 | bosco_state *state = space | |
158 | bosco_state *state = space.machine().driver_data<bosco_state>(); | |
159 | 159 | |
160 | 160 | state->m_videoram[offset] = data; |
161 | 161 | if (offset & 0x400) |
r17963 | r17964 | |
166 | 166 | |
167 | 167 | WRITE8_HANDLER( bosco_scrollx_w ) |
168 | 168 | { |
169 | bosco_state *state = space | |
169 | bosco_state *state = space.machine().driver_data<bosco_state>(); | |
170 | 170 | |
171 | 171 | state->m_bg_tilemap->set_scrollx(0,data); |
172 | 172 | } |
173 | 173 | |
174 | 174 | WRITE8_HANDLER( bosco_scrolly_w ) |
175 | 175 | { |
176 | bosco_state *state = space | |
176 | bosco_state *state = space.machine().driver_data<bosco_state>(); | |
177 | 177 | state->m_bg_tilemap->set_scrolly(0,data); |
178 | 178 | } |
179 | 179 |
r17963 | r17964 | |
---|---|---|
257 | 257 | * |
258 | 258 | *************************************/ |
259 | 259 | |
260 | void btoads_state::to_shiftreg(address_space | |
260 | void btoads_state::to_shiftreg(address_space &space, UINT32 address, UINT16 *shiftreg) | |
261 | 261 | { |
262 | 262 | address &= ~0x40000000; |
263 | 263 | |
r17963 | r17964 | |
284 | 284 | } |
285 | 285 | |
286 | 286 | |
287 | void btoads_state::from_shiftreg(address_space | |
287 | void btoads_state::from_shiftreg(address_space &space, UINT32 address, UINT16 *shiftreg) | |
288 | 288 | { |
289 | 289 | address &= ~0x40000000; |
290 | 290 |
r17963 | r17964 | |
---|---|---|
129 | 129 | #define TILES_PER_PAGE_Y (0x20) |
130 | 130 | #define TILES_PER_PAGE (TILES_PER_PAGE_X * TILES_PER_PAGE_Y) |
131 | 131 | |
132 | INLINE void scrollram_w(address_space | |
132 | INLINE void scrollram_w(address_space &space, offs_t offset, UINT16 data, UINT16 mem_mask, int which) | |
133 | 133 | { |
134 | cischeat_state *state = space | |
134 | cischeat_state *state = space.machine().driver_data<cischeat_state>(); | |
135 | 135 | COMBINE_DATA(&state->m_scrollram[which][offset]); |
136 | 136 | if (offset < 0x40000/2 && state->m_tmap[which]) |
137 | 137 | { |
r17963 | r17964 | |
149 | 149 | } |
150 | 150 | } |
151 | 151 | |
152 | WRITE16_MEMBER(cischeat_state::cischeat_scrollram_0_w){ scrollram_w(&space, offset, data, mem_mask, 0); } | |
153 | WRITE16_MEMBER(cischeat_state::cischeat_scrollram_1_w){ scrollram_w(&space, offset, data, mem_mask, 1); } | |
154 | WRITE16_MEMBER(cischeat_state::cischeat_scrollram_2_w){ scrollram_w(&space, offset, data, mem_mask, 2); } | |
152 | WRITE16_MEMBER(cischeat_state::cischeat_scrollram_0_w){ scrollram_w(space, offset, data, mem_mask, 0); } | |
153 | WRITE16_MEMBER(cischeat_state::cischeat_scrollram_1_w){ scrollram_w(space, offset, data, mem_mask, 1); } | |
154 | WRITE16_MEMBER(cischeat_state::cischeat_scrollram_2_w){ scrollram_w(space, offset, data, mem_mask, 2); } | |
155 | 155 | |
156 | 156 | TILEMAP_MAPPER_MEMBER(cischeat_state::cischeat_scan_8x8) |
157 | 157 | { |
r17963 | r17964 | |
1423 | 1423 | if (msk != 0) state->m_active_layers &= msk; |
1424 | 1424 | #if 1 |
1425 | 1425 | { |
1426 | address_space | |
1426 | address_space &space = *screen.machine().device("maincpu")->memory().space(AS_PROGRAM); | |
1427 | 1427 | |
1428 | 1428 | popmessage("Cmd: %04X Pos:%04X Lim:%04X Inp:%04X", |
1429 | 1429 | state->m_scudhamm_motor_command, |
1430 | state->scudhamm_motor_pos_r(*space,0,0xffff), | |
1431 | state->scudhamm_motor_status_r(*space,0,0xffff), | |
1432 | state->scudhamm_analog_r(*space,0,0xffff) ); | |
1430 | state->scudhamm_motor_pos_r(space,0,0xffff), | |
1431 | state->scudhamm_motor_status_r(space,0,0xffff), | |
1432 | state->scudhamm_analog_r(space,0,0xffff) ); | |
1433 | 1433 | } |
1434 | 1434 | #endif |
1435 | 1435 |
r17963 | r17964 | |
---|---|---|
47 | 47 | #define ALLOW_MEMDUMP 0 |
48 | 48 | |
49 | 49 | #if ALLOW_MEMDUMP |
50 | static void Dump( address_space | |
50 | static void Dump( address_space &space, FILE *f, unsigned addr1, unsigned addr2, const char *name ) | |
51 | 51 | { |
52 | 52 | unsigned addr; |
53 | 53 | fprintf( f, "%s:\n", name ); |
r17963 | r17964 | |
58 | 58 | int i; |
59 | 59 | for( i=0; i<16; i++ ) |
60 | 60 | { |
61 | data[i] = space | |
61 | data[i] = space.read_byte(addr+i ); | |
62 | 62 | if( data[i] ) |
63 | 63 | { |
64 | 64 | bHasNonZero = 1; |
r17963 | r17964 | |
2814 | 2814 | FILE *f = fopen( "dump.txt", "wb" ); |
2815 | 2815 | if( f ) |
2816 | 2816 | { |
2817 | address_space | |
2817 | address_space &space = *state->m_maincpu->space(AS_PROGRAM); | |
2818 | 2818 | |
2819 | 2819 | if (1) // czram |
2820 | 2820 | { |
r17963 | r17964 | |
2879 | 2879 | FILE *f = fopen( "dump.txt", "wb" ); |
2880 | 2880 | if( f ) |
2881 | 2881 | { |
2882 | address_space | |
2882 | address_space &space = *state->m_maincpu->space(AS_PROGRAM); | |
2883 | 2883 | |
2884 | 2884 | //Dump(space, f,0x90000000, 0x90000003, "led?" ); |
2885 | 2885 | Dump(space, f,0x90010000, 0x90017fff, "cz_ram"); |
r17963 | r17964 | |
---|---|---|
102 | 102 | |
103 | 103 | WRITE8_HANDLER( redclash_videoram_w ) |
104 | 104 | { |
105 | ladybug_state *state = space | |
105 | ladybug_state *state = space.machine().driver_data<ladybug_state>(); | |
106 | 106 | |
107 | 107 | state->m_videoram[offset] = data; |
108 | 108 | state->m_fg_tilemap->mark_tile_dirty(offset); |
r17963 | r17964 | |
110 | 110 | |
111 | 111 | WRITE8_HANDLER( redclash_gfxbank_w ) |
112 | 112 | { |
113 | ladybug_state *state = space | |
113 | ladybug_state *state = space.machine().driver_data<ladybug_state>(); | |
114 | 114 | |
115 | 115 | if (state->m_gfxbank != (data & 0x01)) |
116 | 116 | { |
117 | 117 | state->m_gfxbank = data & 0x01; |
118 | space | |
118 | space.machine().tilemap().mark_all_dirty(); | |
119 | 119 | } |
120 | 120 | } |
121 | 121 | |
122 | 122 | WRITE8_HANDLER( redclash_flipscreen_w ) |
123 | 123 | { |
124 | ladybug_state *state = space | |
124 | ladybug_state *state = space.machine().driver_data<ladybug_state>(); | |
125 | 125 | state->flip_screen_set(data & 0x01); |
126 | 126 | } |
127 | 127 | |
r17963 | r17964 | |
141 | 141 | */ |
142 | 142 | WRITE8_HANDLER( redclash_star0_w ) |
143 | 143 | { |
144 | ladybug_state *state = space | |
144 | ladybug_state *state = space.machine().driver_data<ladybug_state>(); | |
145 | 145 | |
146 | 146 | state->m_star_speed = (state->m_star_speed & ~1) | ((data & 1) << 0); |
147 | redclash_set_stars_speed(space | |
147 | redclash_set_stars_speed(space.machine(), state->m_star_speed); | |
148 | 148 | } |
149 | 149 | |
150 | 150 | WRITE8_HANDLER( redclash_star1_w ) |
151 | 151 | { |
152 | ladybug_state *state = space | |
152 | ladybug_state *state = space.machine().driver_data<ladybug_state>(); | |
153 | 153 | |
154 | 154 | state->m_star_speed = (state->m_star_speed & ~2) | ((data & 1) << 1); |
155 | redclash_set_stars_speed(space | |
155 | redclash_set_stars_speed(space.machine(), state->m_star_speed); | |
156 | 156 | } |
157 | 157 | |
158 | 158 | WRITE8_HANDLER( redclash_star2_w ) |
159 | 159 | { |
160 | ladybug_state *state = space | |
160 | ladybug_state *state = space.machine().driver_data<ladybug_state>(); | |
161 | 161 | |
162 | 162 | state->m_star_speed = (state->m_star_speed & ~4) | ((data & 1) << 2); |
163 | redclash_set_stars_speed(space | |
163 | redclash_set_stars_speed(space.machine(), state->m_star_speed); | |
164 | 164 | } |
165 | 165 | |
166 | 166 | WRITE8_HANDLER( redclash_star_reset_w ) |
167 | 167 | { |
168 | redclash_set_stars_enable(space | |
168 | redclash_set_stars_enable(space.machine(), 1); | |
169 | 169 | } |
170 | 170 | |
171 | 171 | TILE_GET_INFO_MEMBER(ladybug_state::get_fg_tile_info) |
r17963 | r17964 | |
---|---|---|
211 | 211 | |
212 | 212 | WRITE16_HANDLER( atarisy1_bankselect_w ) |
213 | 213 | { |
214 | atarisy1_state *state = space | |
214 | atarisy1_state *state = space.machine().driver_data<atarisy1_state>(); | |
215 | 215 | UINT16 oldselect = *state->m_bankselect; |
216 | 216 | UINT16 newselect = oldselect, diff; |
217 | int scanline = space | |
217 | int scanline = space.machine().primary_screen->vpos(); | |
218 | 218 | |
219 | 219 | /* update memory */ |
220 | 220 | COMBINE_DATA(&newselect); |
r17963 | r17964 | |
223 | 223 | /* sound CPU reset */ |
224 | 224 | if (diff & 0x0080) |
225 | 225 | { |
226 | space->machine().device("audiocpu")->execute().set_input_line(INPUT_LINE_RESET, (newselect & 0x0080) ? CLEAR_LINE : ASSERT_LINE); | |
227 | if (!(newselect & 0x0080)) atarigen_sound_reset(space->machine()); | |
226 | space.machine().device("audiocpu")->execute().set_input_line(INPUT_LINE_RESET, (newselect & 0x0080) ? CLEAR_LINE : ASSERT_LINE); | |
227 | if (!(newselect & 0x0080)) atarigen_sound_reset(space.machine()); | |
228 | 228 | } |
229 | 229 | |
230 | 230 | /* if MO or playfield banks change, force a partial update */ |
231 | 231 | if (diff & 0x003c) |
232 | space | |
232 | space.machine().primary_screen->update_partial(scanline); | |
233 | 233 | |
234 | 234 | /* motion object bank select */ |
235 | 235 | atarimo_set_bank(0, (newselect >> 3) & 7); |
236 | update_timers(space | |
236 | update_timers(space.machine(), scanline); | |
237 | 237 | |
238 | 238 | /* playfield bank select */ |
239 | 239 | if (diff & 0x0004) |
r17963 | r17964 | |
256 | 256 | |
257 | 257 | WRITE16_HANDLER( atarisy1_priority_w ) |
258 | 258 | { |
259 | atarisy1_state *state = space | |
259 | atarisy1_state *state = space.machine().driver_data<atarisy1_state>(); | |
260 | 260 | UINT16 oldpens = state->m_playfield_priority_pens; |
261 | 261 | UINT16 newpens = oldpens; |
262 | 262 | |
263 | 263 | /* force a partial update in case this changes mid-screen */ |
264 | 264 | COMBINE_DATA(&newpens); |
265 | 265 | if (oldpens != newpens) |
266 | space | |
266 | space.machine().primary_screen->update_partial(space.machine().primary_screen->vpos()); | |
267 | 267 | state->m_playfield_priority_pens = newpens; |
268 | 268 | } |
269 | 269 | |
r17963 | r17964 | |
277 | 277 | |
278 | 278 | WRITE16_HANDLER( atarisy1_xscroll_w ) |
279 | 279 | { |
280 | atarisy1_state *state = space | |
280 | atarisy1_state *state = space.machine().driver_data<atarisy1_state>(); | |
281 | 281 | UINT16 oldscroll = *state->m_xscroll; |
282 | 282 | UINT16 newscroll = oldscroll; |
283 | 283 | |
284 | 284 | /* force a partial update in case this changes mid-screen */ |
285 | 285 | COMBINE_DATA(&newscroll); |
286 | 286 | if (oldscroll != newscroll) |
287 | space | |
287 | space.machine().primary_screen->update_partial(space.machine().primary_screen->vpos()); | |
288 | 288 | |
289 | 289 | /* set the new scroll value */ |
290 | 290 | state->m_playfield_tilemap->set_scrollx(0, newscroll); |
r17963 | r17964 | |
310 | 310 | |
311 | 311 | WRITE16_HANDLER( atarisy1_yscroll_w ) |
312 | 312 | { |
313 | atarisy1_state *state = space | |
313 | atarisy1_state *state = space.machine().driver_data<atarisy1_state>(); | |
314 | 314 | UINT16 oldscroll = *state->m_yscroll; |
315 | 315 | UINT16 newscroll = oldscroll; |
316 | int scanline = space | |
316 | int scanline = space.machine().primary_screen->vpos(); | |
317 | 317 | int adjusted_scroll; |
318 | 318 | |
319 | 319 | /* force a partial update in case this changes mid-screen */ |
320 | 320 | COMBINE_DATA(&newscroll); |
321 | space | |
321 | space.machine().primary_screen->update_partial(scanline); | |
322 | 322 | |
323 | 323 | /* because this latches a new value into the scroll base, |
324 | 324 | we need to adjust for the scanline */ |
325 | 325 | adjusted_scroll = newscroll; |
326 | if (scanline <= space | |
326 | if (scanline <= space.machine().primary_screen->visible_area().max_y) | |
327 | 327 | adjusted_scroll -= (scanline + 1); |
328 | 328 | state->m_playfield_tilemap->set_scrolly(0, adjusted_scroll); |
329 | 329 | |
330 | 330 | /* but since we've adjusted it, we must reset it to the normal value |
331 | 331 | once we hit scanline 0 again */ |
332 | state->m_yscroll_reset_timer->adjust(space | |
332 | state->m_yscroll_reset_timer->adjust(space.machine().primary_screen->time_until_pos(0), newscroll); | |
333 | 333 | |
334 | 334 | /* update the data */ |
335 | 335 | *state->m_yscroll = newscroll; |
r17963 | r17964 | |
359 | 359 | { |
360 | 360 | /* if the timer is in the active bank, update the display list */ |
361 | 361 | atarimo_0_spriteram_w(space, offset, data, 0xffff); |
362 | update_timers(space | |
362 | update_timers(space.machine(), space.machine().primary_screen->vpos()); | |
363 | 363 | } |
364 | 364 | |
365 | 365 | /* if we're about to modify data in the active sprite bank, make sure the video is up-to-date */ |
r17963 | r17964 | |
367 | 367 | /* renders the next scanline's sprites to the line buffers, but Road Runner still glitches */ |
368 | 368 | /* without the extra +1 */ |
369 | 369 | else |
370 | space | |
370 | space.machine().primary_screen->update_partial(space.machine().primary_screen->vpos() + 2); | |
371 | 371 | } |
372 | 372 | |
373 | 373 | /* let the MO handler do the basic work */ |
r17963 | r17964 | |
384 | 384 | |
385 | 385 | TIMER_DEVICE_CALLBACK( atarisy1_int3off_callback ) |
386 | 386 | { |
387 | address_space | |
387 | address_space &space = *timer.machine().device("maincpu")->memory().space(AS_PROGRAM); | |
388 | 388 | |
389 | 389 | /* clear the state */ |
390 | 390 | atarigen_scanline_int_ack_w(space, 0, 0, 0xffff); |
r17963 | r17964 | |
417 | 417 | |
418 | 418 | READ16_HANDLER( atarisy1_int3state_r ) |
419 | 419 | { |
420 | atarigen_state *atarigen = space | |
420 | atarigen_state *atarigen = space.machine().driver_data<atarigen_state>(); | |
421 | 421 | return atarigen->m_scanline_int_state ? 0x0080 : 0x0000; |
422 | 422 | } |
423 | 423 | |
r17963 | r17964 | |
432 | 432 | static void update_timers(running_machine &machine, int scanline) |
433 | 433 | { |
434 | 434 | atarisy1_state *state = machine.driver_data<atarisy1_state>(); |
435 | address_space | |
435 | address_space &space = state->generic_space(); | |
436 | 436 | UINT16 mem_mask = 0xffff; |
437 | 437 | int offset = atarimo_get_bank(0) * 64 * 4; |
438 | 438 | int link = 0, best = scanline, found = 0; |
r17963 | r17964 | |
---|---|---|
99 | 99 | |
100 | 100 | WRITE16_HANDLER( atarig42_mo_control_w ) |
101 | 101 | { |
102 | atarig42_state *state = space | |
102 | atarig42_state *state = space.machine().driver_data<atarig42_state>(); | |
103 | 103 | |
104 | logerror("MOCONT = %d (scan = %d)\n", data, space | |
104 | logerror("MOCONT = %d (scan = %d)\n", data, space.machine().primary_screen->vpos()); | |
105 | 105 | |
106 | 106 | /* set the control value */ |
107 | 107 | COMBINE_DATA(&state->m_current_control); |
r17963 | r17964 | |
---|---|---|
112 | 112 | int c; |
113 | 113 | |
114 | 114 | /* first blend the data */ |
115 | vindictr_state *state = space | |
115 | vindictr_state *state = space.machine().driver_data<vindictr_state>(); | |
116 | 116 | COMBINE_DATA(&state->m_generic_paletteram_16[offset]); |
117 | 117 | data = state->m_generic_paletteram_16[offset]; |
118 | 118 | |
r17963 | r17964 | |
124 | 124 | int g = ((data >> 4) & 15) * i; |
125 | 125 | int b = ((data >> 0) & 15) * i; |
126 | 126 | |
127 | palette_set_color(space | |
127 | palette_set_color(space.machine(),offset + c*2048,MAKE_RGB(r,g,b)); | |
128 | 128 | } |
129 | 129 | } |
130 | 130 |
r17963 | r17964 | |
---|---|---|
157 | 157 | static void gtia_reset(running_machine &machine) |
158 | 158 | { |
159 | 159 | int i; |
160 | address_space | |
160 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
161 | 161 | |
162 | 162 | /* reset the GTIA read/write/helper registers */ |
163 | 163 | for (i = 0; i < 32; i++) |
r17963 | r17964 | |
---|---|---|
15 | 15 | |
16 | 16 | struct gtia_interface |
17 | 17 | { |
18 | UINT8 (*console_read)(address_space *space); | |
19 | void (*console_write)(address_space *space, UINT8 data); | |
18 | UINT8 (*console_read)(address_space &space); | |
19 | void (*console_write)(address_space &space, UINT8 data); | |
20 | 20 | }; |
21 | 21 | |
22 | 22 |
r17963 | r17964 | |
---|---|---|
126 | 126 | |
127 | 127 | WRITE16_HANDLER( atarisy2_xscroll_w ) |
128 | 128 | { |
129 | atarisy2_state *state = space | |
129 | atarisy2_state *state = space.machine().driver_data<atarisy2_state>(); | |
130 | 130 | UINT16 oldscroll = *state->m_xscroll; |
131 | 131 | UINT16 newscroll = oldscroll; |
132 | 132 | COMBINE_DATA(&newscroll); |
133 | 133 | |
134 | 134 | /* if anything has changed, force a partial update */ |
135 | 135 | if (newscroll != oldscroll) |
136 | space | |
136 | space.machine().primary_screen->update_partial(space.machine().primary_screen->vpos()); | |
137 | 137 | |
138 | 138 | /* update the playfield scrolling - hscroll is clocked on the following scanline */ |
139 | 139 | state->m_playfield_tilemap->set_scrollx(0, newscroll >> 6); |
r17963 | r17964 | |
159 | 159 | |
160 | 160 | WRITE16_HANDLER( atarisy2_yscroll_w ) |
161 | 161 | { |
162 | atarisy2_state *state = space | |
162 | atarisy2_state *state = space.machine().driver_data<atarisy2_state>(); | |
163 | 163 | UINT16 oldscroll = *state->m_yscroll; |
164 | 164 | UINT16 newscroll = oldscroll; |
165 | 165 | COMBINE_DATA(&newscroll); |
166 | 166 | |
167 | 167 | /* if anything has changed, force a partial update */ |
168 | 168 | if (newscroll != oldscroll) |
169 | space | |
169 | space.machine().primary_screen->update_partial(space.machine().primary_screen->vpos()); | |
170 | 170 | |
171 | 171 | /* if bit 4 is zero, the scroll value is clocked in right away */ |
172 | 172 | if (!(newscroll & 0x10)) |
173 | state->m_playfield_tilemap->set_scrolly(0, (newscroll >> 6) - space | |
173 | state->m_playfield_tilemap->set_scrolly(0, (newscroll >> 6) - space.machine().primary_screen->vpos()); | |
174 | 174 | else |
175 | state->m_yscroll_reset_timer->adjust(space | |
175 | state->m_yscroll_reset_timer->adjust(space.machine().primary_screen->time_until_pos(0), newscroll >> 6); | |
176 | 176 | |
177 | 177 | /* update the playfield banking */ |
178 | 178 | if (state->m_playfield_tile_bank[1] != (newscroll & 0x0f) * 0x400) |
r17963 | r17964 | |
210 | 210 | |
211 | 211 | int newword, inten, red, green, blue; |
212 | 212 | |
213 | atarisy2_state *state = space | |
213 | atarisy2_state *state = space.machine().driver_data<atarisy2_state>(); | |
214 | 214 | COMBINE_DATA(&state->m_generic_paletteram_16[offset]); |
215 | 215 | newword = state->m_generic_paletteram_16[offset]; |
216 | 216 | |
r17963 | r17964 | |
218 | 218 | red = (color_table[(newword >> 12) & 15] * inten) >> 4; |
219 | 219 | green = (color_table[(newword >> 8) & 15] * inten) >> 4; |
220 | 220 | blue = (color_table[(newword >> 4) & 15] * inten) >> 4; |
221 | palette_set_color(space | |
221 | palette_set_color(space.machine(), offset, MAKE_RGB(red, green, blue)); | |
222 | 222 | } |
223 | 223 | |
224 | 224 | |
r17963 | r17964 | |
231 | 231 | |
232 | 232 | READ16_HANDLER( atarisy2_slapstic_r ) |
233 | 233 | { |
234 | atarisy2_state *state = space | |
234 | atarisy2_state *state = space.machine().driver_data<atarisy2_state>(); | |
235 | 235 | int result = state->m_slapstic_base[offset]; |
236 | 236 | slapstic_tweak(space, offset); |
237 | 237 | |
r17963 | r17964 | |
243 | 243 | |
244 | 244 | WRITE16_HANDLER( atarisy2_slapstic_w ) |
245 | 245 | { |
246 | atarisy2_state *state = space | |
246 | atarisy2_state *state = space.machine().driver_data<atarisy2_state>(); | |
247 | 247 | |
248 | 248 | slapstic_tweak(space, offset); |
249 | 249 | |
r17963 | r17964 | |
261 | 261 | |
262 | 262 | READ16_HANDLER( atarisy2_videoram_r ) |
263 | 263 | { |
264 | atarisy2_state *state = space | |
264 | atarisy2_state *state = space.machine().driver_data<atarisy2_state>(); | |
265 | 265 | int offs = offset | state->m_videobank; |
266 | 266 | if (offs >= 0xc00 && offs < 0x1000) |
267 | 267 | { |
r17963 | r17964 | |
274 | 274 | |
275 | 275 | WRITE16_HANDLER( atarisy2_videoram_w ) |
276 | 276 | { |
277 | atarisy2_state *state = space | |
277 | atarisy2_state *state = space.machine().driver_data<atarisy2_state>(); | |
278 | 278 | int offs = offset | state->m_videobank; |
279 | 279 | |
280 | 280 | /* alpharam? */ |
r17963 | r17964 | |
289 | 289 | { |
290 | 290 | /* force an update if the link of object 0 is about to change */ |
291 | 291 | if (offs == 0x0c03) |
292 | space | |
292 | space.machine().primary_screen->update_partial(space.machine().primary_screen->vpos()); | |
293 | 293 | atarimo_0_spriteram_w(space, offs - 0x0c00, data, mem_mask); |
294 | 294 | } |
295 | 295 |
r17963 | r17964 | |
---|---|---|
11 | 11 | |
12 | 12 | void skydiver_state::machine_reset() |
13 | 13 | { |
14 | address_space | |
14 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
15 | 15 | |
16 | 16 | /* reset all latches */ |
17 | skydiver_start_lamp_1_w(*space, 0, 0); | |
18 | skydiver_start_lamp_2_w(*space, 0, 0); | |
19 | skydiver_lamp_s_w(*space, 0, 0); | |
20 | skydiver_lamp_k_w(*space, 0, 0); | |
21 | skydiver_lamp_y_w(*space, 0, 0); | |
22 | skydiver_lamp_d_w(*space, 0, 0); | |
17 | skydiver_start_lamp_1_w(space, 0, 0); | |
18 | skydiver_start_lamp_2_w(space, 0, 0); | |
19 | skydiver_lamp_s_w(space, 0, 0); | |
20 | skydiver_lamp_k_w(space, 0, 0); | |
21 | skydiver_lamp_y_w(space, 0, 0); | |
22 | skydiver_lamp_d_w(space, 0, 0); | |
23 | 23 | output_set_value("lampi", 0); |
24 | 24 | output_set_value("lampv", 0); |
25 | 25 | output_set_value("lampe", 0); |
26 | 26 | output_set_value("lampr", 0); |
27 | skydiver_width_w(*space, 0, 0); | |
28 | skydiver_coin_lockout_w(*space, 0, 0); | |
27 | skydiver_width_w(space, 0, 0); | |
28 | skydiver_coin_lockout_w(space, 0, 0); | |
29 | 29 | } |
30 | 30 | |
31 | 31 |
r17963 | r17964 | |
---|---|---|
184 | 184 | |
185 | 185 | ******************************************************************************/ |
186 | 186 | |
187 | void ojankoc_flipscreen( address_space | |
187 | void ojankoc_flipscreen( address_space &space, int data ) | |
188 | 188 | { |
189 | ojankohs_state *state = space | |
189 | ojankohs_state *state = space.machine().driver_data<ojankohs_state>(); | |
190 | 190 | int x, y; |
191 | 191 | UINT8 color1, color2; |
192 | 192 | |
r17963 | r17964 | |
201 | 201 | { |
202 | 202 | color1 = state->m_videoram[0x0000 + ((y * 256) + x)]; |
203 | 203 | color2 = state->m_videoram[0x3fff - ((y * 256) + x)]; |
204 | state->ojankoc_videoram_w(*space, 0x0000 + ((y * 256) + x), color2); | |
205 | state->ojankoc_videoram_w(*space, 0x3fff - ((y * 256) + x), color1); | |
204 | state->ojankoc_videoram_w(space, 0x0000 + ((y * 256) + x), color2); | |
205 | state->ojankoc_videoram_w(space, 0x3fff - ((y * 256) + x), color1); | |
206 | 206 | |
207 | 207 | color1 = state->m_videoram[0x4000 + ((y * 256) + x)]; |
208 | 208 | color2 = state->m_videoram[0x7fff - ((y * 256) + x)]; |
209 | state->ojankoc_videoram_w(*space, 0x4000 + ((y * 256) + x), color2); | |
210 | state->ojankoc_videoram_w(*space, 0x7fff - ((y * 256) + x), color1); | |
209 | state->ojankoc_videoram_w(space, 0x4000 + ((y * 256) + x), color2); | |
210 | state->ojankoc_videoram_w(space, 0x7fff - ((y * 256) + x), color1); | |
211 | 211 | } |
212 | 212 | } |
213 | 213 | |
r17963 | r17964 | |
309 | 309 | |
310 | 310 | if (state->m_screen_refresh) |
311 | 311 | { |
312 | address_space | |
312 | address_space &space = *screen.machine().device("maincpu")->memory().space(AS_PROGRAM); | |
313 | 313 | |
314 | 314 | /* redraw bitmap */ |
315 | 315 | for (offs = 0; offs < 0x8000; offs++) |
316 | 316 | { |
317 | state->ojankoc_videoram_w( | |
317 | state->ojankoc_videoram_w(space, offs, state->m_videoram[offs]); | |
318 | 318 | } |
319 | 319 | state->m_screen_refresh = 0; |
320 | 320 | } |
r17963 | r17964 | |
---|---|---|
280 | 280 | r = ((data & 0x18)>>3) * 85; // 00011000b = 0x18 |
281 | 281 | g = ((data & 0x06)>>1) * 85; // 00000110b = 0x06 |
282 | 282 | b = ((data & 0x01) ) * 255; |
283 | palette_set_color(space | |
283 | palette_set_color(space.machine(), pal, MAKE_RGB(r,g,b)); | |
284 | 284 | } |
285 | 285 | |
286 | 286 | if ( adder2_screen_page_reg & SL_ACCESS ) |
r17963 | r17964 | |
314 | 314 | |
315 | 315 | static WRITE8_HANDLER( adder2_rom_page_w ) |
316 | 316 | { |
317 | space | |
317 | space.machine().root_device().membank("bank2")->set_entry(data&0x03); | |
318 | 318 | } |
319 | 319 | |
320 | 320 | /////////////////////////////////////////////////////////////////////////// |
r17963 | r17964 | |
---|---|---|
171 | 171 | |
172 | 172 | READ8_HANDLER( namcos1_videoram_r ) |
173 | 173 | { |
174 | namcos1_state *state = space | |
174 | namcos1_state *state = space.machine().driver_data<namcos1_state>(); | |
175 | 175 | return state->m_videoram[offset]; |
176 | 176 | } |
177 | 177 | |
178 | 178 | WRITE8_HANDLER( namcos1_videoram_w ) |
179 | 179 | { |
180 | namcos1_state *state = space | |
180 | namcos1_state *state = space.machine().driver_data<namcos1_state>(); | |
181 | 181 | state->m_videoram[offset] = data; |
182 | 182 | if (offset < 0x7000) |
183 | 183 | { /* background 0-3 */ |
r17963 | r17964 | |
197 | 197 | |
198 | 198 | WRITE8_HANDLER( namcos1_paletteram_w ) |
199 | 199 | { |
200 | namcos1_state *state = space | |
200 | namcos1_state *state = space.machine().driver_data<namcos1_state>(); | |
201 | 201 | if (state->m_paletteram[offset] == data) |
202 | 202 | return; |
203 | 203 | |
r17963 | r17964 | |
212 | 212 | r = state->m_paletteram[offset]; |
213 | 213 | g = state->m_paletteram[offset + 0x0800]; |
214 | 214 | b = state->m_paletteram[offset + 0x1000]; |
215 | palette_set_color(space | |
215 | palette_set_color(space.machine(),color,MAKE_RGB(r,g,b)); | |
216 | 216 | } |
217 | 217 | else |
218 | 218 | { |
r17963 | r17964 | |
235 | 235 | |
236 | 236 | READ8_HANDLER( namcos1_spriteram_r ) |
237 | 237 | { |
238 | namcos1_state *state = space | |
238 | namcos1_state *state = space.machine().driver_data<namcos1_state>(); | |
239 | 239 | /* 0000-07ff work ram */ |
240 | 240 | /* 0800-0fff sprite ram */ |
241 | 241 | if (offset < 0x1000) |
r17963 | r17964 | |
247 | 247 | |
248 | 248 | WRITE8_HANDLER( namcos1_spriteram_w ) |
249 | 249 | { |
250 | namcos1_state *state = space | |
250 | namcos1_state *state = space.machine().driver_data<namcos1_state>(); | |
251 | 251 | /* 0000-07ff work ram */ |
252 | 252 | /* 0800-0fff sprite ram */ |
253 | 253 | if (offset < 0x1000) |
r17963 | r17964 | |
---|---|---|
740 | 740 | } |
741 | 741 | |
742 | 742 | |
743 | static void execute_blit(address_space | |
743 | static void execute_blit(address_space &space) | |
744 | 744 | { |
745 | astrocde_state *state = space | |
745 | astrocde_state *state = space.machine().driver_data<astrocde_state>(); | |
746 | 746 | /* |
747 | 747 | state->m_pattern_source = counter set U7/U16/U25/U34 |
748 | 748 | state->m_pattern_dest = counter set U9/U18/U30/U39 |
r17963 | r17964 | |
795 | 795 | if (curwidth == 0 && (state->m_pattern_mode & 0x08) != 0) |
796 | 796 | busdata = 0; |
797 | 797 | else |
798 | busdata = space | |
798 | busdata = space.read_byte(busaddr); | |
799 | 799 | |
800 | 800 | /* increment the appropriate address */ |
801 | 801 | if ((state->m_pattern_mode & 0x01) == 0) |
r17963 | r17964 | |
807 | 807 | |
808 | 808 | /* address is selected between source/dest based on mode.d0 */ |
809 | 809 | busaddr = ((state->m_pattern_mode & 0x01) != 0) ? state->m_pattern_source : state->m_pattern_dest; |
810 | space | |
810 | space.write_byte(busaddr, busdata); | |
811 | 811 | |
812 | 812 | /* increment the appropriate address */ |
813 | 813 | if ((state->m_pattern_mode & 0x01) == 0) |
r17963 | r17964 | |
833 | 833 | } while (state->m_pattern_height-- != 0); |
834 | 834 | |
835 | 835 | /* count cycles we ran the bus */ |
836 | space | |
836 | space.device().execute().adjust_icount(-cycles); | |
837 | 837 | } |
838 | 838 | |
839 | 839 | |
r17963 | r17964 | |
868 | 868 | |
869 | 869 | case 6: /* height of blit and initiator */ |
870 | 870 | m_pattern_height = data; |
871 | execute_blit(space.device().memory().space(AS_PROGRAM)); | |
871 | execute_blit(*space.device().memory().space(AS_PROGRAM)); | |
872 | 872 | break; |
873 | 873 | } |
874 | 874 | } |
r17963 | r17964 | |
---|---|---|
594 | 594 | |
595 | 595 | ******************************************************************************/ |
596 | 596 | |
597 | static void nbmj8688_HD61830B_instr_w(address_space | |
597 | static void nbmj8688_HD61830B_instr_w(address_space &space,int offset,int data,int chip) | |
598 | 598 | { |
599 | nbmj8688_state *state = space | |
599 | nbmj8688_state *state = space.machine().driver_data<nbmj8688_state>(); | |
600 | 600 | state->m_HD61830B_instr[chip] = data; |
601 | 601 | } |
602 | 602 | |
603 | static void nbmj8688_HD61830B_data_w(address_space | |
603 | static void nbmj8688_HD61830B_data_w(address_space &space,int offset,int data,int chip) | |
604 | 604 | { |
605 | nbmj8688_state *state = space | |
605 | nbmj8688_state *state = space.machine().driver_data<nbmj8688_state>(); | |
606 | 606 | switch (state->m_HD61830B_instr[chip]) |
607 | 607 | { |
608 | 608 | case 0x0a: // set cursor address (low order) |
r17963 | r17964 | |
622 | 622 | |
623 | 623 | WRITE8_MEMBER(nbmj8688_state::nbmj8688_HD61830B_0_instr_w) |
624 | 624 | { |
625 | nbmj8688_HD61830B_instr_w( | |
625 | nbmj8688_HD61830B_instr_w(space,offset,data,0); | |
626 | 626 | } |
627 | 627 | |
628 | 628 | WRITE8_MEMBER(nbmj8688_state::nbmj8688_HD61830B_1_instr_w) |
629 | 629 | { |
630 | nbmj8688_HD61830B_instr_w( | |
630 | nbmj8688_HD61830B_instr_w(space,offset,data,1); | |
631 | 631 | } |
632 | 632 | |
633 | 633 | WRITE8_MEMBER(nbmj8688_state::nbmj8688_HD61830B_both_instr_w) |
634 | 634 | { |
635 | nbmj8688_HD61830B_instr_w(&space,offset,data,0); | |
636 | nbmj8688_HD61830B_instr_w(&space,offset,data,1); | |
635 | nbmj8688_HD61830B_instr_w(space,offset,data,0); | |
636 | nbmj8688_HD61830B_instr_w(space,offset,data,1); | |
637 | 637 | } |
638 | 638 | |
639 | 639 | WRITE8_MEMBER(nbmj8688_state::nbmj8688_HD61830B_0_data_w) |
640 | 640 | { |
641 | nbmj8688_HD61830B_data_w( | |
641 | nbmj8688_HD61830B_data_w(space,offset,data,0); | |
642 | 642 | } |
643 | 643 | |
644 | 644 | WRITE8_MEMBER(nbmj8688_state::nbmj8688_HD61830B_1_data_w) |
645 | 645 | { |
646 | nbmj8688_HD61830B_data_w( | |
646 | nbmj8688_HD61830B_data_w(space,offset,data,1); | |
647 | 647 | } |
648 | 648 | |
649 | 649 | WRITE8_MEMBER(nbmj8688_state::nbmj8688_HD61830B_both_data_w) |
650 | 650 | { |
651 | nbmj8688_HD61830B_data_w(&space,offset,data,0); | |
652 | nbmj8688_HD61830B_data_w(&space,offset,data,1); | |
651 | nbmj8688_HD61830B_data_w(space,offset,data,0); | |
652 | nbmj8688_HD61830B_data_w(space,offset,data,1); | |
653 | 653 | } |
654 | 654 | |
655 | 655 |
r17963 | r17964 | |
---|---|---|
216 | 216 | |
217 | 217 | if (state->m_lastflip != state->flip_screen() || state->m_lastpixcolor != state->m_pixcolor) |
218 | 218 | { |
219 | address_space | |
219 | address_space &space = *screen.machine().device("maincpu")->memory().space(AS_PROGRAM); | |
220 | 220 | |
221 | 221 | state->m_lastflip = state->flip_screen(); |
222 | 222 | state->m_lastpixcolor = state->m_pixcolor; |
223 | 223 | |
224 | 224 | for (offs = 0; offs < BITMAPRAM_SIZE; offs++) |
225 | state->internal_bitmapram_w( | |
225 | state->internal_bitmapram_w(space, offs, state->m_bitmapram[offs]); | |
226 | 226 | } |
227 | 227 | |
228 | 228 |
r17963 | r17964 | |
---|---|---|
1258 | 1258 | */ |
1259 | 1259 | vector_clear_list(); |
1260 | 1260 | } |
1261 | vg_flush(space | |
1261 | vg_flush(space.machine()); | |
1262 | 1262 | |
1263 | 1263 | vg_set_halt(0); |
1264 | 1264 | vg_run_timer->adjust(attotime::zero); |
r17963 | r17964 | |
1289 | 1289 | |
1290 | 1290 | MACHINE_RESET( avgdvg ) |
1291 | 1291 | { |
1292 | avgdvg_reset_w (machine.device("maincpu")->memory().space(AS_PROGRAM),0,0); | |
1292 | avgdvg_reset_w (*machine.device("maincpu")->memory().space(AS_PROGRAM),0,0); | |
1293 | 1293 | } |
1294 | 1294 | |
1295 | 1295 |
r17963 | r17964 | |
---|---|---|
288 | 288 | { |
289 | 289 | COMBINE_DATA(&m_rozram[offset]); |
290 | 290 | m_tilemap_roz->mark_tile_dirty(offset); |
291 | // if( space | |
291 | // if( space.machine().input().code_pressed(KEYCODE_Q) ) | |
292 | 292 | // { |
293 | // debugger_break(space | |
293 | // debugger_break(space.machine()); | |
294 | 294 | // } |
295 | 295 | } |
296 | 296 |
r17963 | r17964 | |
---|---|---|
89 | 89 | |
90 | 90 | static TIMER_CALLBACK( irq_off ) |
91 | 91 | { |
92 | address_space | |
92 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
93 | 93 | |
94 | 94 | /* clear the interrupt */ |
95 | 95 | atarigen_scanline_int_ack_w(space, 0, 0, 0xffff); |
r17963 | r17964 | |
---|---|---|
1400 | 1400 | // in this window, +0 = 32 bits from one set of ROMs, and +8 = 32 bits from another set |
1401 | 1401 | READ16_HANDLER( K055673_rom_word_r ) // 5bpp |
1402 | 1402 | { |
1403 | UINT8 *ROM8 = (UINT8 *)space->machine().root_device().memregion(K053247_memory_region)->base(); | |
1404 | UINT16 *ROM = (UINT16 *)space->machine().root_device().memregion(K053247_memory_region)->base(); | |
1405 | int size4 = (space->machine().root_device().memregion(K053247_memory_region)->bytes()/(1024*1024))/5; | |
1403 | UINT8 *ROM8 = (UINT8 *)space.machine().root_device().memregion(K053247_memory_region)->base(); | |
1404 | UINT16 *ROM = (UINT16 *)space.machine().root_device().memregion(K053247_memory_region)->base(); | |
1405 | int size4 = (space.machine().root_device().memregion(K053247_memory_region)->bytes()/(1024*1024))/5; | |
1406 | 1406 | int romofs; |
1407 | 1407 | |
1408 | 1408 | size4 *= 4*1024*1024; // get offset to 5th bit |
r17963 | r17964 | |
1438 | 1438 | |
1439 | 1439 | READ16_HANDLER( K055673_GX6bpp_rom_word_r ) |
1440 | 1440 | { |
1441 | UINT16 *ROM = (UINT16 *)space | |
1441 | UINT16 *ROM = (UINT16 *)space.machine().root_device().memregion(K053247_memory_region)->base(); | |
1442 | 1442 | int romofs; |
1443 | 1443 | |
1444 | 1444 | romofs = K053246_regs[6]<<16 | K053246_regs[7]<<8 | K053246_regs[4]; |
r17963 | r17964 | |
1463 | 1463 | case 7: |
1464 | 1464 | return ROM[romofs+2]; |
1465 | 1465 | default: |
1466 | LOG(("55673_rom_word_r: Unknown read offset %x (PC=%x)\n", offset, space | |
1466 | LOG(("55673_rom_word_r: Unknown read offset %x (PC=%x)\n", offset, space.device().safe_pc())); | |
1467 | 1467 | break; |
1468 | 1468 | } |
1469 | 1469 | |
r17963 | r17964 | |
1666 | 1666 | |
1667 | 1667 | static WRITE8_HANDLER( K054000_w ) |
1668 | 1668 | { |
1669 | //logerror("%04x: write %02x to 054000 address %02x\n",space | |
1669 | //logerror("%04x: write %02x to 054000 address %02x\n",space.device().safe_pc(),data,offset); | |
1670 | 1670 | |
1671 | 1671 | K054000_ram[offset] = data; |
1672 | 1672 | } |
r17963 | r17964 | |
1676 | 1676 | int Acx,Acy,Aax,Aay; |
1677 | 1677 | int Bcx,Bcy,Bax,Bay; |
1678 | 1678 | |
1679 | //logerror("%04x: read 054000 address %02x\n",space | |
1679 | //logerror("%04x: read 054000 address %02x\n",space.device().safe_pc(),offset); | |
1680 | 1680 | |
1681 | 1681 | if (offset != 0x18) return 0; |
1682 | 1682 | |
r17963 | r17964 | |
2249 | 2249 | { |
2250 | 2250 | if (mem_mask == 0xff000000) |
2251 | 2251 | { |
2252 | return K056832_rom_read_b(space | |
2252 | return K056832_rom_read_b(space.machine(), offset*4, 4, 5, 0)<<24; | |
2253 | 2253 | } |
2254 | 2254 | else if (mem_mask == 0x00ff0000) |
2255 | 2255 | { |
2256 | return K056832_rom_read_b(space | |
2256 | return K056832_rom_read_b(space.machine(), offset*4+1, 4, 5, 0)<<16; | |
2257 | 2257 | } |
2258 | 2258 | else if (mem_mask == 0x0000ff00) |
2259 | 2259 | { |
2260 | return K056832_rom_read_b(space | |
2260 | return K056832_rom_read_b(space.machine(), offset*4+2, 4, 5, 0)<<8; | |
2261 | 2261 | } |
2262 | 2262 | else if (mem_mask == 0x000000ff) |
2263 | 2263 | { |
2264 | return K056832_rom_read_b(space | |
2264 | return K056832_rom_read_b(space.machine(), offset*4+3, 4, 5, 1); | |
2265 | 2265 | } |
2266 | 2266 | else |
2267 | 2267 | { |
2268 | LOG(("Non-byte read of tilemap ROM, PC=%x (mask=%x)\n", space | |
2268 | LOG(("Non-byte read of tilemap ROM, PC=%x (mask=%x)\n", space.device().safe_pc(), mem_mask)); | |
2269 | 2269 | } |
2270 | 2270 | return 0; |
2271 | 2271 | } |
r17963 | r17964 | |
2274 | 2274 | { |
2275 | 2275 | if (mem_mask == 0xff000000) |
2276 | 2276 | { |
2277 | return K056832_rom_read_b(space | |
2277 | return K056832_rom_read_b(space.machine(), offset*4, 4, 6, 0)<<24; | |
2278 | 2278 | } |
2279 | 2279 | else if (mem_mask == 0x00ff0000) |
2280 | 2280 | { |
2281 | return K056832_rom_read_b(space | |
2281 | return K056832_rom_read_b(space.machine(), offset*4+1, 4, 6, 0)<<16; | |
2282 | 2282 | } |
2283 | 2283 | else if (mem_mask == 0x0000ff00) |
2284 | 2284 | { |
2285 | return K056832_rom_read_b(space | |
2285 | return K056832_rom_read_b(space.machine(), offset*4+2, 4, 6, 0)<<8; | |
2286 | 2286 | } |
2287 | 2287 | else if (mem_mask == 0x000000ff) |
2288 | 2288 | { |
2289 | return K056832_rom_read_b(space | |
2289 | return K056832_rom_read_b(space.machine(), offset*4+3, 4, 6, 0); | |
2290 | 2290 | } |
2291 | 2291 | else |
2292 | 2292 | { |
2293 | LOG(("Non-byte read of tilemap ROM, PC=%x (mask=%x)\n", space | |
2293 | LOG(("Non-byte read of tilemap ROM, PC=%x (mask=%x)\n", space.device().safe_pc(), mem_mask)); | |
2294 | 2294 | } |
2295 | 2295 | return 0; |
2296 | 2296 | } |
r17963 | r17964 | |
2305 | 2305 | |
2306 | 2306 | if (!K056832_rombase) |
2307 | 2307 | { |
2308 | K056832_rombase = space | |
2308 | K056832_rombase = space.machine().root_device().memregion(K056832_memory_region)->base(); | |
2309 | 2309 | } |
2310 | 2310 | |
2311 | 2311 | if (K056832_regsb[2] & 0x8) |
r17963 | r17964 | |
---|---|---|
95 | 95 | * |
96 | 96 | *************************************/ |
97 | 97 | |
98 | void hdgsp_write_to_shiftreg(address_space | |
98 | void hdgsp_write_to_shiftreg(address_space &space, UINT32 address, UINT16 *shiftreg) | |
99 | 99 | { |
100 | harddriv_state *state = space | |
100 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
101 | 101 | |
102 | 102 | /* access to the 1bpp/2bpp area */ |
103 | 103 | if (address >= 0x02000000 && address <= 0x020fffff) |
r17963 | r17964 | |
123 | 123 | } |
124 | 124 | |
125 | 125 | |
126 | void hdgsp_read_from_shiftreg(address_space | |
126 | void hdgsp_read_from_shiftreg(address_space &space, UINT32 address, UINT16 *shiftreg) | |
127 | 127 | { |
128 | harddriv_state *state = space | |
128 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
129 | 129 | |
130 | 130 | if (!state->m_shiftreg_enable) |
131 | 131 | return; |
r17963 | r17964 | |
178 | 178 | |
179 | 179 | READ16_HANDLER( hdgsp_control_lo_r ) |
180 | 180 | { |
181 | harddriv_state *state = space | |
181 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
182 | 182 | return state->m_gsp_control_lo[offset]; |
183 | 183 | } |
184 | 184 | |
185 | 185 | |
186 | 186 | WRITE16_HANDLER( hdgsp_control_lo_w ) |
187 | 187 | { |
188 | harddriv_state *state = space | |
188 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
189 | 189 | int oldword = state->m_gsp_control_lo[offset]; |
190 | 190 | int newword; |
191 | 191 | |
r17963 | r17964 | |
206 | 206 | |
207 | 207 | READ16_HANDLER( hdgsp_control_hi_r ) |
208 | 208 | { |
209 | harddriv_state *state = space | |
209 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
210 | 210 | return state->m_gsp_control_hi[offset]; |
211 | 211 | } |
212 | 212 | |
213 | 213 | |
214 | 214 | WRITE16_HANDLER( hdgsp_control_hi_w ) |
215 | 215 | { |
216 | harddriv_state *state = space | |
216 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
217 | 217 | int val = (offset >> 3) & 1; |
218 | 218 | |
219 | 219 | int oldword = state->m_gsp_control_hi[offset]; |
r17963 | r17964 | |
230 | 230 | |
231 | 231 | case 0x01: |
232 | 232 | data = data & (15 >> state->m_gsp_multisync); |
233 | space | |
233 | space.machine().primary_screen->update_partial(space.machine().primary_screen->vpos() - 1); | |
234 | 234 | state->m_gfx_finescroll = data; |
235 | 235 | break; |
236 | 236 | |
237 | 237 | case 0x02: |
238 | update_palette_bank(space | |
238 | update_palette_bank(space.machine(), (state->m_gfx_palettebank & ~1) | val); | |
239 | 239 | break; |
240 | 240 | |
241 | 241 | case 0x03: |
242 | update_palette_bank(space | |
242 | update_palette_bank(space.machine(), (state->m_gfx_palettebank & ~2) | (val << 1)); | |
243 | 243 | break; |
244 | 244 | |
245 | 245 | case 0x04: |
246 | if (space->machine().total_colors() >= 256 * 8) | |
247 | update_palette_bank(space->machine(), (state->m_gfx_palettebank & ~4) | (val << 2)); | |
246 | if (space.machine().total_colors() >= 256 * 8) | |
247 | update_palette_bank(space.machine(), (state->m_gfx_palettebank & ~4) | (val << 2)); | |
248 | 248 | break; |
249 | 249 | |
250 | 250 | case 0x07: |
r17963 | r17964 | |
274 | 274 | |
275 | 275 | WRITE16_HANDLER( hdgsp_vram_1bpp_w ) |
276 | 276 | { |
277 | harddriv_state *state = space | |
277 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
278 | 278 | UINT32 *dest = (UINT32 *)&state->m_gsp_vram[offset * 16]; |
279 | 279 | UINT32 *mask = &state->m_mask_table[data * 4]; |
280 | 280 | UINT32 color = state->m_gsp_control_lo[0] & 0xff; |
r17963 | r17964 | |
303 | 303 | |
304 | 304 | WRITE16_HANDLER( hdgsp_vram_2bpp_w ) |
305 | 305 | { |
306 | harddriv_state *state = space | |
306 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
307 | 307 | UINT32 *dest = (UINT32 *)&state->m_gsp_vram[offset * 8]; |
308 | 308 | UINT32 *mask = &state->m_mask_table[data * 2]; |
309 | 309 | UINT32 color = state->m_gsp_control_lo[0]; |
r17963 | r17964 | |
340 | 340 | |
341 | 341 | READ16_HANDLER( hdgsp_paletteram_lo_r ) |
342 | 342 | { |
343 | harddriv_state *state = space | |
343 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
344 | 344 | |
345 | 345 | /* note that the palette is only accessed via the first 256 entries */ |
346 | 346 | /* others are selected via the palette bank */ |
r17963 | r17964 | |
352 | 352 | |
353 | 353 | WRITE16_HANDLER( hdgsp_paletteram_lo_w ) |
354 | 354 | { |
355 | harddriv_state *state = space | |
355 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
356 | 356 | |
357 | 357 | /* note that the palette is only accessed via the first 256 entries */ |
358 | 358 | /* others are selected via the palette bank */ |
359 | 359 | offset = state->m_gfx_palettebank * 0x100 + (offset & 0xff); |
360 | 360 | |
361 | 361 | COMBINE_DATA(&state->m_gsp_paletteram_lo[offset]); |
362 | gsp_palette_change(space | |
362 | gsp_palette_change(space.machine(), offset); | |
363 | 363 | } |
364 | 364 | |
365 | 365 | |
r17963 | r17964 | |
372 | 372 | |
373 | 373 | READ16_HANDLER( hdgsp_paletteram_hi_r ) |
374 | 374 | { |
375 | harddriv_state *state = space | |
375 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
376 | 376 | |
377 | 377 | /* note that the palette is only accessed via the first 256 entries */ |
378 | 378 | /* others are selected via the palette bank */ |
r17963 | r17964 | |
384 | 384 | |
385 | 385 | WRITE16_HANDLER( hdgsp_paletteram_hi_w ) |
386 | 386 | { |
387 | harddriv_state *state = space | |
387 | harddriv_state *state = space.machine().driver_data<harddriv_state>(); | |
388 | 388 | |
389 | 389 | /* note that the palette is only accessed via the first 256 entries */ |
390 | 390 | /* others are selected via the palette bank */ |
391 | 391 | offset = state->m_gfx_palettebank * 0x100 + (offset & 0xff); |
392 | 392 | |
393 | 393 | COMBINE_DATA(&state->m_gsp_paletteram_hi[offset]); |
394 | gsp_palette_change(space | |
394 | gsp_palette_change(space.machine(), offset); | |
395 | 395 | } |
396 | 396 | |
397 | 397 |
r17963 | r17964 | |
---|---|---|
396 | 396 | TILENAME(16,1,2), |
397 | 397 | }; |
398 | 398 | |
399 | #define Packet(i) space | |
399 | #define Packet(i) space.read_word(PacketPtr + 2 * i) | |
400 | 400 | |
401 | 401 | //Returns TRUE if the operation was a flip (sync or async) |
402 | 402 | int vrender0_ProcessPacket(device_t *device, UINT32 PacketPtr, UINT16 *Dest, UINT8 *TEXTURE) |
403 | 403 | { |
404 | 404 | vr0video_state *vr0 = get_safe_token(device); |
405 | address_space | |
405 | address_space &space = *vr0->cpu->memory().space(AS_PROGRAM); | |
406 | 406 | UINT32 Dx = Packet(1) & 0x3ff; |
407 | 407 | UINT32 Dy = Packet(2) & 0x1ff; |
408 | 408 | UINT32 Endx = Packet(3) & 0x3ff; |
r17963 | r17964 | |
---|---|---|
78 | 78 | |
79 | 79 | WRITE16_HANDLER( atarig1_mo_control_w ) |
80 | 80 | { |
81 | atarig1_state *state = space | |
81 | atarig1_state *state = space.machine().driver_data<atarig1_state>(); | |
82 | 82 | |
83 | logerror("MOCONT = %d (scan = %d)\n", data, space | |
83 | logerror("MOCONT = %d (scan = %d)\n", data, space.machine().primary_screen->vpos()); | |
84 | 84 | |
85 | 85 | /* set the control value */ |
86 | 86 | COMBINE_DATA(&state->m_current_control); |
r17963 | r17964 | |
---|---|---|
109 | 109 | |
110 | 110 | WRITE16_HANDLER( toobin_paletteram_w ) |
111 | 111 | { |
112 | toobin_state *state = space | |
112 | toobin_state *state = space.machine().driver_data<toobin_state>(); | |
113 | 113 | int newword; |
114 | 114 | |
115 | 115 | COMBINE_DATA(&state->m_generic_paletteram_16[offset]); |
r17963 | r17964 | |
124 | 124 | if (green) green += 38; |
125 | 125 | if (blue) blue += 38; |
126 | 126 | |
127 | palette_set_color(space | |
127 | palette_set_color(space.machine(), offset & 0x3ff, MAKE_RGB(red, green, blue)); | |
128 | 128 | if (!(newword & 0x8000)) |
129 | palette_set_pen_contrast(space | |
129 | palette_set_pen_contrast(space.machine(), offset & 0x3ff, state->m_brightness); | |
130 | 130 | else |
131 | palette_set_pen_contrast(space | |
131 | palette_set_pen_contrast(space.machine(), offset & 0x3ff, 1.0); | |
132 | 132 | } |
133 | 133 | } |
134 | 134 | |
135 | 135 | |
136 | 136 | WRITE16_HANDLER( toobin_intensity_w ) |
137 | 137 | { |
138 | toobin_state *state = space | |
138 | toobin_state *state = space.machine().driver_data<toobin_state>(); | |
139 | 139 | int i; |
140 | 140 | |
141 | 141 | if (ACCESSING_BITS_0_7) |
r17963 | r17964 | |
144 | 144 | |
145 | 145 | for (i = 0; i < 0x400; i++) |
146 | 146 | if (!(state->m_generic_paletteram_16[i] & 0x8000)) |
147 | palette_set_pen_contrast(space | |
147 | palette_set_pen_contrast(space.machine(), i, state->m_brightness); | |
148 | 148 | } |
149 | 149 | } |
150 | 150 | |
r17963 | r17964 | |
158 | 158 | |
159 | 159 | WRITE16_HANDLER( toobin_xscroll_w ) |
160 | 160 | { |
161 | toobin_state *state = space | |
161 | toobin_state *state = space.machine().driver_data<toobin_state>(); | |
162 | 162 | UINT16 oldscroll = *state->m_xscroll; |
163 | 163 | UINT16 newscroll = oldscroll; |
164 | 164 | COMBINE_DATA(&newscroll); |
165 | 165 | |
166 | 166 | /* if anything has changed, force a partial update */ |
167 | 167 | if (newscroll != oldscroll) |
168 | space | |
168 | space.machine().primary_screen->update_partial(space.machine().primary_screen->vpos()); | |
169 | 169 | |
170 | 170 | /* update the playfield scrolling - hscroll is clocked on the following scanline */ |
171 | 171 | state->m_playfield_tilemap->set_scrollx(0, newscroll >> 6); |
r17963 | r17964 | |
178 | 178 | |
179 | 179 | WRITE16_HANDLER( toobin_yscroll_w ) |
180 | 180 | { |
181 | toobin_state *state = space | |
181 | toobin_state *state = space.machine().driver_data<toobin_state>(); | |
182 | 182 | UINT16 oldscroll = *state->m_yscroll; |
183 | 183 | UINT16 newscroll = oldscroll; |
184 | 184 | COMBINE_DATA(&newscroll); |
185 | 185 | |
186 | 186 | /* if anything has changed, force a partial update */ |
187 | 187 | if (newscroll != oldscroll) |
188 | space | |
188 | space.machine().primary_screen->update_partial(space.machine().primary_screen->vpos()); | |
189 | 189 | |
190 | 190 | /* if bit 4 is zero, the scroll value is clocked in right away */ |
191 | 191 | state->m_playfield_tilemap->set_scrolly(0, newscroll >> 6); |
r17963 | r17964 | |
211 | 211 | |
212 | 212 | /* if the SLIP is changing, force a partial update first */ |
213 | 213 | if (oldslip != newslip) |
214 | space | |
214 | space.machine().primary_screen->update_partial(space.machine().primary_screen->vpos()); | |
215 | 215 | |
216 | 216 | /* update the data */ |
217 | 217 | atarimo_0_slipram_w(space, offset, data, mem_mask); |
r17963 | r17964 | |
---|---|---|
165 | 165 | |
166 | 166 | WRITE8_HANDLER( digdug_videoram_w ) |
167 | 167 | { |
168 | digdug_state *state = space | |
168 | digdug_state *state = space.machine().driver_data<digdug_state>(); | |
169 | 169 | |
170 | 170 | state->m_videoram[offset] = data; |
171 | 171 | state->m_fg_tilemap->mark_tile_dirty(offset & 0x3ff); |
r17963 | r17964 | |
173 | 173 | |
174 | 174 | WRITE8_HANDLER( digdug_PORT_w ) |
175 | 175 | { |
176 | digdug_state *state = space | |
176 | digdug_state *state = space.machine().driver_data<digdug_state>(); | |
177 | 177 | |
178 | 178 | switch (offset) |
179 | 179 | { |
r17963 | r17964 | |
---|---|---|
223 | 223 | |
224 | 224 | WRITE16_HANDLER( cyberbal_paletteram_0_w ) |
225 | 225 | { |
226 | cyberbal_state *state = space | |
226 | cyberbal_state *state = space.machine().driver_data<cyberbal_state>(); | |
227 | 227 | COMBINE_DATA(&state->m_paletteram_0[offset]); |
228 | set_palette_entry(space | |
228 | set_palette_entry(space.machine(), offset, state->m_paletteram_0[offset]); | |
229 | 229 | } |
230 | 230 | |
231 | 231 | READ16_HANDLER( cyberbal_paletteram_0_r ) |
232 | 232 | { |
233 | cyberbal_state *state = space | |
233 | cyberbal_state *state = space.machine().driver_data<cyberbal_state>(); | |
234 | 234 | return state->m_paletteram_0[offset]; |
235 | 235 | } |
236 | 236 | |
237 | 237 | |
238 | 238 | WRITE16_HANDLER( cyberbal_paletteram_1_w ) |
239 | 239 | { |
240 | cyberbal_state *state = space | |
240 | cyberbal_state *state = space.machine().driver_data<cyberbal_state>(); | |
241 | 241 | COMBINE_DATA(&state->m_paletteram_1[offset]); |
242 | set_palette_entry(space | |
242 | set_palette_entry(space.machine(), offset + 0x800, state->m_paletteram_1[offset]); | |
243 | 243 | } |
244 | 244 | |
245 | 245 | READ16_HANDLER( cyberbal_paletteram_1_r ) |
246 | 246 | { |
247 | cyberbal_state *state = space | |
247 | cyberbal_state *state = space.machine().driver_data<cyberbal_state>(); | |
248 | 248 | return state->m_paletteram_1[offset]; |
249 | 249 | } |
250 | 250 |
r17963 | r17964 | |
---|---|---|
1174 | 1174 | *****************************************************************************/ |
1175 | 1175 | static TIMER_CALLBACK( antic_scanline_render ) |
1176 | 1176 | { |
1177 | address_space | |
1177 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
1178 | 1178 | |
1179 | 1179 | VIDEO *video = antic.video[antic.scanline]; |
1180 | 1180 | LOG((" @cycle #%3d render mode $%X lines to go #%d\n", cycle(machine), (antic.cmd & 0x0f), antic.modelines)); |
r17963 | r17964 | |
1244 | 1244 | **************************************************************/ |
1245 | 1245 | if( new_cmd & ANTIC_LMS ) |
1246 | 1246 | { |
1247 | address_space | |
1247 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
1248 | 1248 | int addr = RDANTIC(space); |
1249 | 1249 | antic.doffs = (antic.doffs + 1) & DOFFS; |
1250 | 1250 | addr += 256 * RDANTIC(space); |
r17963 | r17964 | |
1269 | 1269 | *****************************************************************************/ |
1270 | 1270 | static void antic_scanline_dma(running_machine &machine, int param) |
1271 | 1271 | { |
1272 | address_space | |
1272 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
1273 | 1273 | LOG((" @cycle #%3d DMA fetch\n", cycle(machine))); |
1274 | 1274 | if (antic.scanline == VBL_END) |
1275 | 1275 | antic.r.nmist &= ~VBL_NMI; |
r17963 | r17964 | |
---|---|---|
370 | 370 | } |
371 | 371 | |
372 | 372 | |
373 | INLINE UINT16 common_paletteram_r(address_space | |
373 | INLINE UINT16 common_paletteram_r(address_space &space, int which, offs_t offset) | |
374 | 374 | { |
375 | segas32_state *state = space | |
375 | segas32_state *state = space.machine().driver_data<segas32_state>(); | |
376 | 376 | int convert; |
377 | 377 | |
378 | 378 | /* the lower half of palette RAM is formatted xBBBBBGGGGGRRRRR */ |
r17963 | r17964 | |
389 | 389 | } |
390 | 390 | |
391 | 391 | |
392 | static void common_paletteram_w(address_space | |
392 | static void common_paletteram_w(address_space &space, int which, offs_t offset, UINT16 data, UINT16 mem_mask) | |
393 | 393 | { |
394 | segas32_state *state = space | |
394 | segas32_state *state = space.machine().driver_data<segas32_state>(); | |
395 | 395 | UINT16 value; |
396 | 396 | int convert; |
397 | 397 | |
r17963 | r17964 | |
408 | 408 | COMBINE_DATA(&value); |
409 | 409 | if (convert) value = xBGRBBBBGGGGRRRR_to_xBBBBBGGGGGRRRRR(value); |
410 | 410 | state->m_system32_paletteram[which][offset] = value; |
411 | update_color(space | |
411 | update_color(space.machine(), 0x4000*which + offset, value); | |
412 | 412 | |
413 | 413 | /* if blending is enabled, writes go to both halves of palette RAM */ |
414 | 414 | if (state->m_mixer_control[which][0x4e/2] & 0x0880) |
r17963 | r17964 | |
421 | 421 | COMBINE_DATA(&value); |
422 | 422 | if (convert) value = xBGRBBBBGGGGRRRR_to_xBBBBBGGGGGRRRRR(value); |
423 | 423 | state->m_system32_paletteram[which][offset] = value; |
424 | update_color(space | |
424 | update_color(space.machine(), 0x4000*which + offset, value); | |
425 | 425 | } |
426 | 426 | } |
427 | 427 | |
r17963 | r17964 | |
435 | 435 | |
436 | 436 | READ16_MEMBER(segas32_state::system32_paletteram_r) |
437 | 437 | { |
438 | return common_paletteram_r( | |
438 | return common_paletteram_r(space, 0, offset); | |
439 | 439 | } |
440 | 440 | |
441 | 441 | |
442 | 442 | WRITE16_MEMBER(segas32_state::system32_paletteram_w) |
443 | 443 | { |
444 | common_paletteram_w( | |
444 | common_paletteram_w(space, 0, offset, data, mem_mask); | |
445 | 445 | } |
446 | 446 | |
447 | 447 | |
448 | 448 | READ32_MEMBER(segas32_state::multi32_paletteram_0_r) |
449 | 449 | { |
450 | return common_paletteram_r(&space, 0, offset*2+0) | | |
451 | (common_paletteram_r(&space, 0, offset*2+1) << 16); | |
450 | return common_paletteram_r(space, 0, offset*2+0) | | |
451 | (common_paletteram_r(space, 0, offset*2+1) << 16); | |
452 | 452 | } |
453 | 453 | |
454 | 454 | |
455 | 455 | WRITE32_MEMBER(segas32_state::multi32_paletteram_0_w) |
456 | 456 | { |
457 | 457 | if (ACCESSING_BITS_0_15) |
458 | common_paletteram_w( | |
458 | common_paletteram_w(space, 0, offset*2+0, data, mem_mask); | |
459 | 459 | if (ACCESSING_BITS_16_31) |
460 | common_paletteram_w( | |
460 | common_paletteram_w(space, 0, offset*2+1, data >> 16, mem_mask >> 16); | |
461 | 461 | } |
462 | 462 | |
463 | 463 | |
464 | 464 | READ32_MEMBER(segas32_state::multi32_paletteram_1_r) |
465 | 465 | { |
466 | return common_paletteram_r(&space, 1, offset*2+0) | | |
467 | (common_paletteram_r(&space, 1, offset*2+1) << 16); | |
466 | return common_paletteram_r(space, 1, offset*2+0) | | |
467 | (common_paletteram_r(space, 1, offset*2+1) << 16); | |
468 | 468 | } |
469 | 469 | |
470 | 470 | |
471 | 471 | WRITE32_MEMBER(segas32_state::multi32_paletteram_1_w) |
472 | 472 | { |
473 | 473 | if (ACCESSING_BITS_0_15) |
474 | common_paletteram_w( | |
474 | common_paletteram_w(space, 1, offset*2+0, data, mem_mask); | |
475 | 475 | if (ACCESSING_BITS_16_31) |
476 | common_paletteram_w( | |
476 | common_paletteram_w(space, 1, offset*2+1, data >> 16, mem_mask >> 16); | |
477 | 477 | } |
478 | 478 | |
479 | 479 |
r17963 | r17964 | |
---|---|---|
91 | 91 | |
92 | 92 | WRITE16_HANDLER( badlands_pf_bank_w ) |
93 | 93 | { |
94 | badlands_state *state = space | |
94 | badlands_state *state = space.machine().driver_data<badlands_state>(); | |
95 | 95 | if (ACCESSING_BITS_0_7) |
96 | 96 | if (state->m_playfield_tile_bank != (data & 1)) |
97 | 97 | { |
98 | space | |
98 | space.machine().primary_screen->update_partial(space.machine().primary_screen->vpos()); | |
99 | 99 | state->m_playfield_tile_bank = data & 1; |
100 | 100 | state->m_playfield_tilemap->mark_all_dirty(); |
101 | 101 | } |
r17963 | r17964 | |
---|---|---|
177 | 177 | * (ME/ input on 1st paletteram, inverter -> ME/ on 2nd) |
178 | 178 | */ |
179 | 179 | offset = (offset & 31) ^ 16; |
180 | colortable_palette_set_color(space | |
180 | colortable_palette_set_color(space.machine().colortable, offset, MAKE_RGB(pal3bit(~data >> 0), pal3bit(~data >> 3), pal2bit(~data >> 6))); | |
181 | 181 | } |
182 | 182 | |
183 | 183 | WRITE8_HANDLER( decocass_charram_w ) |
184 | 184 | { |
185 | decocass_state *state = space | |
185 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
186 | 186 | state->m_charram[offset] = data; |
187 | 187 | /* dirty sprite */ |
188 | space | |
188 | space.machine().gfx[1]->mark_dirty((offset >> 5) & 255); | |
189 | 189 | /* dirty char */ |
190 | space | |
190 | space.machine().gfx[0]->mark_dirty((offset >> 3) & 1023); | |
191 | 191 | } |
192 | 192 | |
193 | 193 | |
194 | 194 | WRITE8_HANDLER( decocass_fgvideoram_w ) |
195 | 195 | { |
196 | decocass_state *state = space | |
196 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
197 | 197 | state->m_fgvideoram[offset] = data; |
198 | 198 | state->m_fg_tilemap->mark_tile_dirty(offset); |
199 | 199 | } |
200 | 200 | |
201 | 201 | WRITE8_HANDLER( decocass_colorram_w ) |
202 | 202 | { |
203 | decocass_state *state = space | |
203 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
204 | 204 | state->m_colorram[offset] = data; |
205 | 205 | state->m_fg_tilemap->mark_tile_dirty(offset); |
206 | 206 | } |
r17963 | r17964 | |
216 | 216 | |
217 | 217 | WRITE8_HANDLER( decocass_tileram_w ) |
218 | 218 | { |
219 | decocass_state *state = space | |
219 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
220 | 220 | state->m_tileram[offset] = data; |
221 | 221 | /* dirty tile (64 bytes per tile) */ |
222 | space | |
222 | space.machine().gfx[2]->mark_dirty((offset / 64) & 15); | |
223 | 223 | /* first 1KB of tile RAM is shared with tilemap RAM */ |
224 | 224 | if (offset < state->m_bgvideoram_size) |
225 | mark_bg_tile_dirty(space | |
225 | mark_bg_tile_dirty(space.machine(), offset); | |
226 | 226 | } |
227 | 227 | |
228 | 228 | WRITE8_HANDLER( decocass_objectram_w ) |
229 | 229 | { |
230 | decocass_state *state = space | |
230 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
231 | 231 | state->m_objectram[offset] = data; |
232 | 232 | /* dirty the object */ |
233 | space->machine().gfx[3]->mark_dirty(0); | |
234 | space->machine().gfx[3]->mark_dirty(1); | |
233 | space.machine().gfx[3]->mark_dirty(0); | |
234 | space.machine().gfx[3]->mark_dirty(1); | |
235 | 235 | } |
236 | 236 | |
237 | 237 | WRITE8_HANDLER( decocass_bgvideoram_w ) |
238 | 238 | { |
239 | decocass_state *state = space | |
239 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
240 | 240 | state->m_bgvideoram[offset] = data; |
241 | mark_bg_tile_dirty(space | |
241 | mark_bg_tile_dirty(space.machine(), offset); | |
242 | 242 | } |
243 | 243 | |
244 | 244 | /* The watchdog is a 4bit counter counting down every frame */ |
245 | 245 | WRITE8_HANDLER( decocass_watchdog_count_w ) |
246 | 246 | { |
247 | decocass_state *state = space | |
247 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
248 | 248 | LOG(1,("decocass_watchdog_count_w: $%02x\n", data)); |
249 | 249 | state->m_watchdog_count = data & 0x0f; |
250 | 250 | } |
251 | 251 | |
252 | 252 | WRITE8_HANDLER( decocass_watchdog_flip_w ) |
253 | 253 | { |
254 | decocass_state *state = space | |
254 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
255 | 255 | LOG(1,("decocass_watchdog_flip_w: $%02x\n", data)); |
256 | 256 | state->m_watchdog_flip = data; |
257 | 257 | } |
258 | 258 | |
259 | 259 | WRITE8_HANDLER( decocass_color_missiles_w ) |
260 | 260 | { |
261 | decocass_state *state = space | |
261 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
262 | 262 | LOG(1,("decocass_color_missiles_w: $%02x\n", data)); |
263 | 263 | /* only bits D0-D2 and D4-D6 are connected to |
264 | 264 | * the color RAM demux: |
r17963 | r17964 | |
280 | 280 | */ |
281 | 281 | WRITE8_HANDLER( decocass_mode_set_w ) |
282 | 282 | { |
283 | decocass_state *state = space | |
283 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
284 | 284 | if (data == state->m_mode_set) |
285 | 285 | return; |
286 | 286 | LOG(1,("decocass_mode_set_w: $%02x (%s%s%s%s%s%s%s%s)\n", data, |
r17963 | r17964 | |
298 | 298 | |
299 | 299 | WRITE8_HANDLER( decocass_color_center_bot_w ) |
300 | 300 | { |
301 | decocass_state *state = space | |
301 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
302 | 302 | if (data == state->m_color_center_bot) |
303 | 303 | return; |
304 | 304 | LOG(1,("decocass_color_center_bot_w: $%02x (color:%d, center_bot:%d)\n", data, data & 3, data >> 4)); |
r17963 | r17964 | |
325 | 325 | |
326 | 326 | WRITE8_HANDLER( decocass_back_h_shift_w ) |
327 | 327 | { |
328 | decocass_state *state = space | |
328 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
329 | 329 | if (data == state->m_back_h_shift) |
330 | 330 | return; |
331 | 331 | LOG(1,("decocass_back_h_shift_w: $%02x\n", data)); |
r17963 | r17964 | |
334 | 334 | |
335 | 335 | WRITE8_HANDLER( decocass_back_vl_shift_w ) |
336 | 336 | { |
337 | decocass_state *state = space | |
337 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
338 | 338 | if (data == state->m_back_vl_shift) |
339 | 339 | return; |
340 | 340 | LOG(1,("decocass_back_vl_shift_w: $%02x\n", data)); |
r17963 | r17964 | |
343 | 343 | |
344 | 344 | WRITE8_HANDLER( decocass_back_vr_shift_w ) |
345 | 345 | { |
346 | decocass_state *state = space | |
346 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
347 | 347 | if (data == state->m_back_vr_shift) |
348 | 348 | return; |
349 | 349 | LOG(1,("decocass_back_vr_shift_w: $%02x\n", data)); |
r17963 | r17964 | |
352 | 352 | |
353 | 353 | WRITE8_HANDLER( decocass_part_h_shift_w ) |
354 | 354 | { |
355 | decocass_state *state = space | |
355 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
356 | 356 | if (data == state->m_part_v_shift ) |
357 | 357 | return; |
358 | 358 | LOG(1,("decocass_part_h_shift_w: $%02x\n", data)); |
r17963 | r17964 | |
361 | 361 | |
362 | 362 | WRITE8_HANDLER( decocass_part_v_shift_w ) |
363 | 363 | { |
364 | decocass_state *state = space | |
364 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
365 | 365 | if (data == state->m_part_v_shift ) |
366 | 366 | return; |
367 | 367 | LOG(1,("decocass_part_v_shift_w: $%02x\n", data)); |
r17963 | r17964 | |
370 | 370 | |
371 | 371 | WRITE8_HANDLER( decocass_center_h_shift_space_w ) |
372 | 372 | { |
373 | decocass_state *state = space | |
373 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
374 | 374 | if (data == state->m_center_h_shift_space) |
375 | 375 | return; |
376 | 376 | LOG(1,("decocass_center_h_shift_space_w: $%02x\n", data)); |
r17963 | r17964 | |
379 | 379 | |
380 | 380 | WRITE8_HANDLER( decocass_center_v_shift_w ) |
381 | 381 | { |
382 | decocass_state *state = space | |
382 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
383 | 383 | LOG(1,("decocass_center_v_shift_w: $%02x\n", data)); |
384 | 384 | state->m_center_v_shift = data; |
385 | 385 | } |
r17963 | r17964 | |
---|---|---|
119 | 119 | if ( data & 8 ) dm01.busy = 0; |
120 | 120 | else dm01.busy = 1; |
121 | 121 | |
122 | dm01.intf->busy_func(space | |
122 | dm01.intf->busy_func(space.machine(),dm01.busy); | |
123 | 123 | } |
124 | 124 | } |
125 | 125 | |
r17963 | r17964 | |
209 | 209 | |
210 | 210 | static WRITE8_HANDLER( unknown_w ) |
211 | 211 | { |
212 | space | |
212 | space.machine().device("matrix")->execute().set_input_line(INPUT_LINE_NMI, CLEAR_LINE ); //? | |
213 | 213 | } |
214 | 214 | |
215 | 215 | /////////////////////////////////////////////////////////////////////////// |
r17963 | r17964 | |
---|---|---|
2295 | 2295 | else if (offset >= 0x3a00 && offset < 0x3c00) |
2296 | 2296 | { /* B x scroll */ } |
2297 | 2297 | // else |
2298 | //logerror("%04x: read from unknown 052109 address %04x\n",space | |
2298 | //logerror("%04x: read from unknown 052109 address %04x\n",space.device().safe_pc(),offset); | |
2299 | 2299 | } |
2300 | 2300 | |
2301 | 2301 | return k052109->ram[offset]; |
r17963 | r17964 | |
2319 | 2319 | addr = (code << 5) + (offset & 0x1f); |
2320 | 2320 | addr &= device->machine().root_device().memregion(k052109->memory_region)->bytes() - 1; |
2321 | 2321 | |
2322 | // logerror("%04x: off = %04x sub = %02x (bnk = %x) adr = %06x\n", space | |
2322 | // logerror("%04x: off = %04x sub = %02x (bnk = %x) adr = %06x\n", space.device().safe_pc(), offset, k052109->romsubbank, bank, addr); | |
2323 | 2323 | |
2324 | 2324 | return device->machine().root_device().memregion(k052109->memory_region)->base()[addr]; |
2325 | 2325 | } |
r17963 | r17964 | |
2350 | 2350 | if (k052109->scrollctrl != data) |
2351 | 2351 | { |
2352 | 2352 | //popmessage("scrollcontrol = %02x", data); |
2353 | //logerror("%04x: rowscrollcontrol = %02x\n", space | |
2353 | //logerror("%04x: rowscrollcontrol = %02x\n", space.device().safe_pc(), data); | |
2354 | 2354 | k052109->scrollctrl = data; |
2355 | 2355 | } |
2356 | 2356 | } |
2357 | 2357 | else if (offset == 0x1d00) |
2358 | 2358 | { |
2359 | //logerror("%04x: 052109 register 1d00 = %02x\n", space | |
2359 | //logerror("%04x: 052109 register 1d00 = %02x\n", space.device().safe_pc(), data); | |
2360 | 2360 | /* bit 2 = irq enable */ |
2361 | 2361 | /* the custom chip can also generate NMI and FIRQ, for use with a 6809 */ |
2362 | 2362 | k052109->irq_enabled = data & 0x04; |
r17963 | r17964 | |
2389 | 2389 | } |
2390 | 2390 | else if (offset == 0x1e00 || offset == 0x3e00) // Surprise Attack uses offset 0x3e00 |
2391 | 2391 | { |
2392 | //logerror("%04x: 052109 register 1e00 = %02x\n",space | |
2392 | //logerror("%04x: 052109 register 1e00 = %02x\n",space.device().safe_pc(),data); | |
2393 | 2393 | k052109->romsubbank = data; |
2394 | 2394 | } |
2395 | 2395 | else if (offset == 0x1e80) |
2396 | 2396 | { |
2397 | //if ((data & 0xfe)) logerror("%04x: 052109 register 1e80 = %02x\n",space | |
2397 | //if ((data & 0xfe)) logerror("%04x: 052109 register 1e80 = %02x\n",space.device().safe_pc(),data); | |
2398 | 2398 | k052109->tilemap[0]->set_flip((data & 1) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); |
2399 | 2399 | k052109->tilemap[1]->set_flip((data & 1) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); |
2400 | 2400 | k052109->tilemap[2]->set_flip((data & 1) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0); |
r17963 | r17964 | |
2449 | 2449 | k052109->charrombank_2[3] = (data >> 4) & 0x0f; |
2450 | 2450 | } |
2451 | 2451 | // else |
2452 | // logerror("%04x: write %02x to unknown 052109 address %04x\n",space | |
2452 | // logerror("%04x: write %02x to unknown 052109 address %04x\n",space.device().safe_pc(),data,offset); | |
2453 | 2453 | } |
2454 | 2454 | } |
2455 | 2455 | |
r17963 | r17964 | |
4538 | 4538 | case 7: |
4539 | 4539 | return ROM[romofs + 2]; |
4540 | 4540 | default: |
4541 | // LOG(("55673_rom_word_r: Unknown read offset %x (PC=%x)\n", offset, space | |
4541 | // LOG(("55673_rom_word_r: Unknown read offset %x (PC=%x)\n", offset, space.device().safe_pc())); | |
4542 | 4542 | break; |
4543 | 4543 | } |
4544 | 4544 | |
r17963 | r17964 | |
4555 | 4555 | addr = (k053246->kx46_regs[6] << 17) | (k053246->kx46_regs[7] << 9) | (k053246->kx46_regs[4] << 1) | ((offset & 1) ^ 1); |
4556 | 4556 | addr &= device->machine().root_device().memregion(k053246->memory_region)->bytes() - 1; |
4557 | 4557 | // if (VERBOSE) |
4558 | // popmessage("%04x: offset %02x addr %06x", space | |
4558 | // popmessage("%04x: offset %02x addr %06x", space.device().safe_pc(), offset, addr); | |
4559 | 4559 | return device->machine().root_device().memregion(k053246->memory_region)->base()[addr]; |
4560 | 4560 | } |
4561 | 4561 | else |
4562 | 4562 | { |
4563 | // LOG(("%04x: read from unknown 053246 address %x\n", space | |
4563 | // LOG(("%04x: read from unknown 053246 address %x\n", space.device().safe_pc(), offset)); | |
4564 | 4564 | return 0; |
4565 | 4565 | } |
4566 | 4566 | } |
r17963 | r17964 | |
6167 | 6167 | { |
6168 | 6168 | k054000_state *k054000 = k054000_get_safe_token(device); |
6169 | 6169 | |
6170 | //logerror("%04x: write %02x to 054000 address %02x\n",space | |
6170 | //logerror("%04x: write %02x to 054000 address %02x\n",space.device().safe_pc(),data,offset); | |
6171 | 6171 | k054000->regs[offset] = data; |
6172 | 6172 | } |
6173 | 6173 | |
r17963 | r17964 | |
6177 | 6177 | int Acx, Acy, Aax, Aay; |
6178 | 6178 | int Bcx, Bcy, Bax, Bay; |
6179 | 6179 | |
6180 | //logerror("%04x: read 054000 address %02x\n", space | |
6180 | //logerror("%04x: read 054000 address %02x\n", space.device().safe_pc(), offset); | |
6181 | 6181 | |
6182 | 6182 | if (offset != 0x18) |
6183 | 6183 | return 0; |
r17963 | r17964 | |
6313 | 6313 | WRITE8_DEVICE_HANDLER( k051733_w ) |
6314 | 6314 | { |
6315 | 6315 | k051733_state *k051733= k051733_get_safe_token(device); |
6316 | //logerror("%04x: write %02x to 051733 address %02x\n", space | |
6316 | //logerror("%04x: write %02x to 051733 address %02x\n", space.device().safe_pc(), data, offset); | |
6317 | 6317 | |
6318 | 6318 | k051733->ram[offset] = data; |
6319 | 6319 | } |
r17963 | r17964 | |
6843 | 6843 | return k056832_rom_read_b(device, offset * 2 + 1, 4, 5, 0)<<16; |
6844 | 6844 | else |
6845 | 6845 | { |
6846 | //LOG(("Non-byte read of tilemap ROM, PC=%x (mask=%x)\n", space | |
6846 | //LOG(("Non-byte read of tilemap ROM, PC=%x (mask=%x)\n", space.device().safe_pc(), mem_mask)); | |
6847 | 6847 | } |
6848 | 6848 | return 0; |
6849 | 6849 | } |
r17963 | r17964 | |
6860 | 6860 | return k056832_rom_read_b(device, offset * 4 + 3, 4, 5, 1); |
6861 | 6861 | else |
6862 | 6862 | { |
6863 | //LOG(("Non-byte read of tilemap ROM, PC=%x (mask=%x)\n", space | |
6863 | //LOG(("Non-byte read of tilemap ROM, PC=%x (mask=%x)\n", space.device().safe_pc(), mem_mask)); | |
6864 | 6864 | } |
6865 | 6865 | return 0; |
6866 | 6866 | } |
r17963 | r17964 | |
6877 | 6877 | return k056832_rom_read_b(device, offset * 4 + 3, 4, 6, 0); |
6878 | 6878 | else |
6879 | 6879 | { |
6880 | //LOG(("Non-byte read of tilemap ROM, PC=%x (mask=%x)\n", space | |
6880 | //LOG(("Non-byte read of tilemap ROM, PC=%x (mask=%x)\n", space.device().safe_pc(), mem_mask)); | |
6881 | 6881 | } |
6882 | 6882 | return 0; |
6883 | 6883 | } |
r17963 | r17964 | |
9368 | 9368 | } |
9369 | 9369 | |
9370 | 9370 | default: |
9371 | //mame_printf_debug("k001005->r: %08X, %08X at %08X\n", offset, mem_mask, space | |
9371 | //mame_printf_debug("k001005->r: %08X, %08X at %08X\n", offset, mem_mask, space.device().safe_pc()); | |
9372 | 9372 | break; |
9373 | 9373 | } |
9374 | 9374 | return 0; |
r17963 | r17964 | |
9401 | 9401 | sharc_set_flag_input(k001005->dsp, 1, ASSERT_LINE); |
9402 | 9402 | } |
9403 | 9403 | |
9404 | // mame_printf_debug("K001005 FIFO write: %08X at %08X\n", data, space | |
9404 | // mame_printf_debug("K001005 FIFO write: %08X at %08X\n", data, space.device().safe_pc()); | |
9405 | 9405 | k001005->fifo[k001005->fifo_write_ptr] = data; |
9406 | 9406 | k001005->fifo_write_ptr++; |
9407 | 9407 | k001005->fifo_write_ptr &= 0x7ff; |
r17963 | r17964 | |
9465 | 9465 | break; |
9466 | 9466 | |
9467 | 9467 | default: |
9468 | //mame_printf_debug("k001005->w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, space | |
9468 | //mame_printf_debug("k001005->w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, space.device().safe_pc()); | |
9469 | 9469 | break; |
9470 | 9470 | } |
9471 | 9471 | |
r17963 | r17964 | |
10478 | 10478 | |
10479 | 10479 | if (offset != 0x08 && offset != 0x09 && offset != 0x0a /*&& offset != 0x17 && offset != 0x18*/) |
10480 | 10480 | { |
10481 | //printf("K001604_reg_w (%d), %02X, %08X, %08X at %08X\n", chip, offset, data, mem_mask, space | |
10481 | //printf("K001604_reg_w (%d), %02X, %08X, %08X at %08X\n", chip, offset, data, mem_mask, space.device().safe_pc()); | |
10482 | 10482 | } |
10483 | 10483 | } |
10484 | 10484 |
r17963 | r17964 | |
---|---|---|
829 | 829 | case 0x01: set_videoram_data(machine(), data); break; |
830 | 830 | case 0x02: set_videoram_modulo(machine(), data); break; |
831 | 831 | case 0x03: set_video_control(machine(), data); break; |
832 | case 0x04: neogeo_set_display_counter_msb(&space, data); break; | |
833 | case 0x05: neogeo_set_display_counter_lsb(&space, data); break; | |
832 | case 0x04: neogeo_set_display_counter_msb(space, data); break; | |
833 | case 0x05: neogeo_set_display_counter_lsb(space, data); break; | |
834 | 834 | case 0x06: neogeo_acknowledge_interrupt(machine(), data); break; |
835 | 835 | case 0x07: break; /* unknown, see get_video_control */ |
836 | 836 | } |
r17963 | r17964 | |
---|---|---|
508 | 508 | |
509 | 509 | static void bootleg_draw_sprites( running_machine &machine, bitmap_ind16 &bitmap, const rectangle &cliprect, const UINT8 *source, int circuit ) |
510 | 510 | { |
511 | address_space | |
511 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
512 | 512 | gfx_element *gfx = machine.gfx[circuit + 2]; |
513 | 513 | |
514 | int limit = circuit ? (space | |
514 | int limit = circuit ? (space.read_byte(0xc2) * 256 + space.read_byte(0xc3)) : (space.read_byte(0xc0) * 256 + space.read_byte(0xc1)); | |
515 | 515 | const UINT8 *finish; |
516 | 516 | |
517 | 517 | source += 0x1000; |
r17963 | r17964 | |
---|---|---|
1271 | 1271 | * |
1272 | 1272 | *************************************/ |
1273 | 1273 | |
1274 | void ppu2c0x_device::spriteram_dma( address_space | |
1274 | void ppu2c0x_device::spriteram_dma( address_space &space, const UINT8 page ) | |
1275 | 1275 | { |
1276 | 1276 | int i; |
1277 | 1277 | int address = page << 8; |
1278 | 1278 | |
1279 | 1279 | for (i = 0; i < SPRITERAM_SIZE; i++) |
1280 | 1280 | { |
1281 | UINT8 spriteData = space->read_byte(address + i); | |
1282 | space->write_byte(0x2004, spriteData); | |
1281 | UINT8 spriteData = space.read_byte(address + i); | |
1282 | space.write_byte(0x2004, spriteData); | |
1283 | 1283 | } |
1284 | 1284 | |
1285 | 1285 | // should last 513 CPU cycles. |
1286 | space | |
1286 | space.device().execute().adjust_icount(-513); | |
1287 | 1287 | } |
1288 | 1288 | |
1289 | 1289 | /************************************* |
r17963 | r17964 | |
---|---|---|
168 | 168 | void render_scanline(); |
169 | 169 | void update_scanline(); |
170 | 170 | |
171 | void spriteram_dma(address_space | |
171 | void spriteram_dma(address_space &space, const UINT8 page ); | |
172 | 172 | void render( bitmap_ind16 &bitmap, int flipx, int flipy, int sx, int sy ); |
173 | 173 | int get_pixel( int x, int y ); |
174 | 174 |
r17963 | r17964 | |
---|---|---|
32 | 32 | |
33 | 33 | ***************************************************************************/ |
34 | 34 | |
35 | static void mrokumei_handleblit( address_space | |
35 | static void mrokumei_handleblit( address_space &space, int rom_base ) | |
36 | 36 | { |
37 | homedata_state *state = space | |
37 | homedata_state *state = space.machine().driver_data<homedata_state>(); | |
38 | 38 | int i; |
39 | 39 | int dest_param; |
40 | 40 | int source_addr; |
r17963 | r17964 | |
99 | 99 | } /* i!=0 */ |
100 | 100 | |
101 | 101 | if (data) /* 00 is a nop */ |
102 | state->mrokumei_videoram_w( | |
102 | state->mrokumei_videoram_w(space, base_addr + dest_addr, data); | |
103 | 103 | |
104 | 104 | if (state->m_vreg[1] & 0x80) /* flip screen */ |
105 | 105 | { |
r17963 | r17964 | |
119 | 119 | state->m_maincpu->set_input_line(M6809_FIRQ_LINE, HOLD_LINE); |
120 | 120 | } |
121 | 121 | |
122 | static void reikaids_handleblit( address_space | |
122 | static void reikaids_handleblit( address_space &space, int rom_base ) | |
123 | 123 | { |
124 | homedata_state *state = space | |
124 | homedata_state *state = space.machine().driver_data<homedata_state>(); | |
125 | 125 | int i; |
126 | 126 | UINT16 dest_param; |
127 | 127 | int flipx; |
r17963 | r17964 | |
202 | 202 | addr ^= 0x007c; |
203 | 203 | } |
204 | 204 | |
205 | state->reikaids_videoram_w( | |
205 | state->reikaids_videoram_w(space, addr, dat); | |
206 | 206 | } |
207 | 207 | } |
208 | 208 | |
r17963 | r17964 | |
217 | 217 | state->m_maincpu->set_input_line(M6809_FIRQ_LINE, HOLD_LINE); |
218 | 218 | } |
219 | 219 | |
220 | static void pteacher_handleblit( address_space | |
220 | static void pteacher_handleblit( address_space &space, int rom_base ) | |
221 | 221 | { |
222 | homedata_state *state = space | |
222 | homedata_state *state = space.machine().driver_data<homedata_state>(); | |
223 | 223 | int i; |
224 | 224 | int dest_param; |
225 | 225 | int source_addr; |
r17963 | r17964 | |
289 | 289 | if ((addr & 0x2080) == 0) |
290 | 290 | { |
291 | 291 | addr = ((addr & 0xc000) >> 2) | ((addr & 0x1f00) >> 1) | (addr & 0x7f); |
292 | state->mrokumei_videoram_w( | |
292 | state->mrokumei_videoram_w(space, addr, data); | |
293 | 293 | } |
294 | 294 | } |
295 | 295 | |
r17963 | r17964 | |
777 | 777 | WRITE8_MEMBER(homedata_state::mrokumei_blitter_start_w) |
778 | 778 | { |
779 | 779 | if (data & 0x80) |
780 | mrokumei_handleblit( | |
780 | mrokumei_handleblit(space, ((m_blitter_bank & 0x04) >> 2) * 0x10000); | |
781 | 781 | |
782 | 782 | /* bit 0 = bank switch; used by hourouki to access the |
783 | 783 | optional service mode ROM (not available in current dump) */ |
r17963 | r17964 | |
785 | 785 | |
786 | 786 | WRITE8_MEMBER(homedata_state::reikaids_blitter_start_w) |
787 | 787 | { |
788 | reikaids_handleblit( | |
788 | reikaids_handleblit(space, (m_blitter_bank & 3) * 0x10000); | |
789 | 789 | } |
790 | 790 | |
791 | 791 | WRITE8_MEMBER(homedata_state::pteacher_blitter_start_w) |
792 | 792 | { |
793 | pteacher_handleblit( | |
793 | pteacher_handleblit(space, (m_blitter_bank >> 5) * 0x10000 & (machine().root_device().memregion("user1")->bytes() - 1)); | |
794 | 794 | } |
795 | 795 | |
796 | 796 |
r17963 | r17964 | |
---|---|---|
1447 | 1447 | // but it could be useful |
1448 | 1448 | if ( screen.machine().input().code_pressed_once(KEYCODE_L) ) |
1449 | 1449 | { |
1450 | address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); | |
1451 | space->write_byte(0x2f27c8, 0x2); | |
1450 | address_space &space = *screen.machine().device("maincpu")->memory().space(AS_PROGRAM); | |
1451 | space.write_byte(0x2f27c8, 0x2); | |
1452 | 1452 | } |
1453 | 1453 | #endif |
1454 | 1454 |
r17963 | r17964 | |
---|---|---|
19 | 19 | switch (offset) |
20 | 20 | { |
21 | 21 | case 0x00: m_blitter_src_addr = (m_blitter_src_addr & 0xff00) | data; |
22 | nb1413m3_gfxradr_l_w( | |
22 | nb1413m3_gfxradr_l_w(space, 0, data); break; | |
23 | 23 | case 0x01: m_blitter_src_addr = (m_blitter_src_addr & 0x00ff) | (data << 8); |
24 | nb1413m3_gfxradr_h_w( | |
24 | nb1413m3_gfxradr_h_w(space, 0, data); break; | |
25 | 25 | case 0x02: m_blitter_destx = data; break; |
26 | 26 | case 0x03: m_blitter_desty = data; break; |
27 | 27 | case 0x04: m_blitter_sizex = data; break; |
r17963 | r17964 | |
44 | 44 | int gfxlen = memregion("gfx1")->bytes(); |
45 | 45 | m_gfxrom = (((data & 0xc0) >> 4) + (data & 0x03)); |
46 | 46 | m_highcolorflag = data; |
47 | nb1413m3_gfxrombank_w( | |
47 | nb1413m3_gfxrombank_w(space, 0, data); | |
48 | 48 | |
49 | 49 | if ((0x20000 * m_gfxrom) > (gfxlen - 1)) |
50 | 50 | { |
r17963 | r17964 | |
---|---|---|
99 | 99 | |
100 | 100 | WRITE16_HANDLER( atarigx2_mo_control_w ) |
101 | 101 | { |
102 | atarigx2_state *state = space | |
102 | atarigx2_state *state = space.machine().driver_data<atarigx2_state>(); | |
103 | 103 | |
104 | logerror("MOCONT = %d (scan = %d)\n", data, space | |
104 | logerror("MOCONT = %d (scan = %d)\n", data, space.machine().primary_screen->vpos()); | |
105 | 105 | |
106 | 106 | /* set the control value */ |
107 | 107 | COMBINE_DATA(&state->m_current_control); |
r17963 | r17964 | |
---|---|---|
57 | 57 | TILE_GET_INFO_MEMBER(fuuki16_state::get_tile_info_2){ get_tile_info(machine(), tileinfo, tile_index, 2); } |
58 | 58 | TILE_GET_INFO_MEMBER(fuuki16_state::get_tile_info_3){ get_tile_info(machine(), tileinfo, tile_index, 3); } |
59 | 59 | |
60 | INLINE void fuuki16_vram_w(address_space | |
60 | INLINE void fuuki16_vram_w(address_space &space, offs_t offset, UINT16 data, UINT16 mem_mask, int _N_) | |
61 | 61 | { |
62 | fuuki16_state *state = space | |
62 | fuuki16_state *state = space.machine().driver_data<fuuki16_state>(); | |
63 | 63 | COMBINE_DATA(&state->m_vram[_N_][offset]); |
64 | 64 | state->m_tilemap[_N_]->mark_tile_dirty(offset / 2); |
65 | 65 | } |
66 | 66 | |
67 | WRITE16_MEMBER(fuuki16_state::fuuki16_vram_0_w){ fuuki16_vram_w(&space, offset, data, mem_mask, 0); } | |
68 | WRITE16_MEMBER(fuuki16_state::fuuki16_vram_1_w){ fuuki16_vram_w(&space, offset, data, mem_mask, 1); } | |
69 | WRITE16_MEMBER(fuuki16_state::fuuki16_vram_2_w){ fuuki16_vram_w(&space, offset, data, mem_mask, 2); } | |
70 | WRITE16_MEMBER(fuuki16_state::fuuki16_vram_3_w){ fuuki16_vram_w(&space, offset, data, mem_mask, 3); } | |
67 | WRITE16_MEMBER(fuuki16_state::fuuki16_vram_0_w){ fuuki16_vram_w(space, offset, data, mem_mask, 0); } | |
68 | WRITE16_MEMBER(fuuki16_state::fuuki16_vram_1_w){ fuuki16_vram_w(space, offset, data, mem_mask, 1); } | |
69 | WRITE16_MEMBER(fuuki16_state::fuuki16_vram_2_w){ fuuki16_vram_w(space, offset, data, mem_mask, 2); } | |
70 | WRITE16_MEMBER(fuuki16_state::fuuki16_vram_3_w){ fuuki16_vram_w(space, offset, data, mem_mask, 3); } | |
71 | 71 | |
72 | 72 | |
73 | 73 | /*************************************************************************** |
r17963 | r17964 | |
---|---|---|
158 | 158 | } |
159 | 159 | |
160 | 160 | |
161 | static void scroll_w(address_space | |
161 | static void scroll_w(address_space &space, int layer, int offset, int data) | |
162 | 162 | { |
163 | baraduke_state *state = space | |
163 | baraduke_state *state = space.machine().driver_data<baraduke_state>(); | |
164 | 164 | switch (offset) |
165 | 165 | { |
166 | 166 | case 0: /* high scroll x */ |
r17963 | r17964 | |
177 | 177 | |
178 | 178 | WRITE8_MEMBER(baraduke_state::baraduke_scroll0_w) |
179 | 179 | { |
180 | scroll_w( | |
180 | scroll_w(space, 0, offset, data); | |
181 | 181 | } |
182 | 182 | WRITE8_MEMBER(baraduke_state::baraduke_scroll1_w) |
183 | 183 | { |
184 | scroll_w( | |
184 | scroll_w(space, 1, offset, data); | |
185 | 185 | } |
186 | 186 | |
187 | 187 |
r17963 | r17964 | |
---|---|---|
290 | 290 | #define TILES_PER_PAGE_Y (0x20) |
291 | 291 | #define TILES_PER_PAGE (TILES_PER_PAGE_X * TILES_PER_PAGE_Y) |
292 | 292 | |
293 | INLINE void scrollram_w(address_space | |
293 | INLINE void scrollram_w(address_space &space, offs_t offset, UINT16 data, UINT16 mem_mask, int which) | |
294 | 294 | { |
295 | megasys1_state *state = space | |
295 | megasys1_state *state = space.machine().driver_data<megasys1_state>(); | |
296 | 296 | COMBINE_DATA(&state->m_scrollram[which][offset]); |
297 | 297 | if (offset < 0x40000/2 && state->m_tmap[which]) |
298 | 298 | { |
r17963 | r17964 | |
310 | 310 | } |
311 | 311 | } |
312 | 312 | |
313 | WRITE16_MEMBER(megasys1_state::megasys1_scrollram_0_w){ scrollram_w(&space, offset, data, mem_mask, 0); } | |
314 | WRITE16_MEMBER(megasys1_state::megasys1_scrollram_1_w){ scrollram_w(&space, offset, data, mem_mask, 1); } | |
315 | WRITE16_MEMBER(megasys1_state::megasys1_scrollram_2_w){ scrollram_w(&space, offset, data, mem_mask, 2); } | |
313 | WRITE16_MEMBER(megasys1_state::megasys1_scrollram_0_w){ scrollram_w(space, offset, data, mem_mask, 0); } | |
314 | WRITE16_MEMBER(megasys1_state::megasys1_scrollram_1_w){ scrollram_w(space, offset, data, mem_mask, 1); } | |
315 | WRITE16_MEMBER(megasys1_state::megasys1_scrollram_2_w){ scrollram_w(space, offset, data, mem_mask, 2); } | |
316 | 316 | |
317 | 317 | |
318 | 318 |
r17963 | r17964 | |
---|---|---|
295 | 295 | } |
296 | 296 | |
297 | 297 | |
298 | INLINE void vram_w( address_space | |
298 | INLINE void vram_w( address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT16 data, ATTR_UNUSED UINT16 mem_mask, int GFX ) | |
299 | 299 | { |
300 | cave_state *state = space | |
300 | cave_state *state = space.machine().driver_data<cave_state>(); | |
301 | 301 | UINT16 *VRAM = state->m_vram[GFX]; |
302 | 302 | tilemap_t *TILEMAP = state->m_tilemap[GFX]; |
303 | 303 | |
r17963 | r17964 | |
323 | 323 | and 408000-407fff both go to the 8x8 tilemap ram. Use this function |
324 | 324 | in this cases. Note that the get_tile_info function looks in the |
325 | 325 | 4000-7fff range for tiles, so we have to write the data there. */ |
326 | INLINE void vram_8x8_w( address_space | |
326 | INLINE void vram_8x8_w( address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT16 data, ATTR_UNUSED UINT16 mem_mask, int GFX ) | |
327 | 327 | { |
328 | cave_state *state = space | |
328 | cave_state *state = space.machine().driver_data<cave_state>(); | |
329 | 329 | UINT16 *VRAM = state->m_vram[GFX]; |
330 | 330 | tilemap_t *TILEMAP = state->m_tilemap[GFX]; |
331 | 331 | |
r17963 | r17964 | |
344 | 344 | TILE_GET_INFO_MEMBER(cave_state::get_tile_info_2){ get_tile_info(machine(), tileinfo, tile_index, 2); } |
345 | 345 | TILE_GET_INFO_MEMBER(cave_state::get_tile_info_3){ get_tile_info(machine(), tileinfo, tile_index, 3); } |
346 | 346 | |
347 | WRITE16_MEMBER(cave_state::cave_vram_0_w){ vram_w(&space, offset, data, mem_mask, 0); } | |
348 | WRITE16_MEMBER(cave_state::cave_vram_1_w){ vram_w(&space, offset, data, mem_mask, 1); } | |
349 | WRITE16_MEMBER(cave_state::cave_vram_2_w){ vram_w(&space, offset, data, mem_mask, 2); } | |
350 | WRITE16_MEMBER(cave_state::cave_vram_3_w){ vram_w(&space, offset, data, mem_mask, 3); } | |
347 | WRITE16_MEMBER(cave_state::cave_vram_0_w){ vram_w(space, offset, data, mem_mask, 0); } | |
348 | WRITE16_MEMBER(cave_state::cave_vram_1_w){ vram_w(space, offset, data, mem_mask, 1); } | |
349 | WRITE16_MEMBER(cave_state::cave_vram_2_w){ vram_w(space, offset, data, mem_mask, 2); } | |
350 | WRITE16_MEMBER(cave_state::cave_vram_3_w){ vram_w(space, offset, data, mem_mask, 3); } | |
351 | 351 | |
352 | WRITE16_MEMBER(cave_state::cave_vram_0_8x8_w){ vram_8x8_w(&space, offset, data, mem_mask, 0); } | |
353 | WRITE16_MEMBER(cave_state::cave_vram_1_8x8_w){ vram_8x8_w(&space, offset, data, mem_mask, 1); } | |
354 | WRITE16_MEMBER(cave_state::cave_vram_2_8x8_w){ vram_8x8_w(&space, offset, data, mem_mask, 2); } | |
355 | WRITE16_MEMBER(cave_state::cave_vram_3_8x8_w){ vram_8x8_w(&space, offset, data, mem_mask, 3); } | |
352 | WRITE16_MEMBER(cave_state::cave_vram_0_8x8_w){ vram_8x8_w(space, offset, data, mem_mask, 0); } | |
353 | WRITE16_MEMBER(cave_state::cave_vram_1_8x8_w){ vram_8x8_w(space, offset, data, mem_mask, 1); } | |
354 | WRITE16_MEMBER(cave_state::cave_vram_2_8x8_w){ vram_8x8_w(space, offset, data, mem_mask, 2); } | |
355 | WRITE16_MEMBER(cave_state::cave_vram_3_8x8_w){ vram_8x8_w(space, offset, data, mem_mask, 3); } | |
356 | 356 | |
357 | 357 | |
358 | 358 | /*************************************************************************** |
r17963 | r17964 | |
---|---|---|
106 | 106 | static void blitter_init(running_machine &machine, int blitter_config, const UINT8 *remap_prom); |
107 | 107 | static void create_palette_lookup(running_machine &machine); |
108 | 108 | |
109 | static int blitter_core(address_space | |
109 | static int blitter_core(address_space &space, int sstart, int dstart, int w, int h, int data); | |
110 | 110 | |
111 | 111 | |
112 | 112 | |
r17963 | r17964 | |
531 | 531 | if (h == 255) h = 256; |
532 | 532 | |
533 | 533 | /* do the actual blit */ |
534 | accesses = blitter_core( | |
534 | accesses = blitter_core(space, sstart, dstart, w, h, data); | |
535 | 535 | |
536 | 536 | /* based on the number of memory accesses needed to do the blit, compute how long the blit will take */ |
537 | 537 | /* this is just a guess */ |
r17963 | r17964 | |
562 | 562 | * |
563 | 563 | *************************************/ |
564 | 564 | |
565 | INLINE void blit_pixel(address_space | |
565 | INLINE void blit_pixel(address_space &space, int offset, int srcdata, int data, int mask, int solid) | |
566 | 566 | { |
567 | williams_state *state = space | |
567 | williams_state *state = space.machine().driver_data<williams_state>(); | |
568 | 568 | /* always read from video RAM regardless of the bank setting */ |
569 | int pix = (offset < 0xc000) ? state->m_videoram[offset] : space | |
569 | int pix = (offset < 0xc000) ? state->m_videoram[offset] : space.read_byte(offset); | |
570 | 570 | |
571 | 571 | /* handle transparency */ |
572 | 572 | if (data & 0x08) |
r17963 | r17964 | |
586 | 586 | /* note that we have to allow blits to non-video RAM (e.g. tileram) because those */ |
587 | 587 | /* are not blocked by the window enable */ |
588 | 588 | if (!state->m_blitter_window_enable || offset < state->m_blitter_clip_address || offset >= 0xc000) |
589 | space | |
589 | space.write_byte(offset, pix); | |
590 | 590 | } |
591 | 591 | |
592 | 592 | |
593 | static int blitter_core(address_space | |
593 | static int blitter_core(address_space &space, int sstart, int dstart, int w, int h, int data) | |
594 | 594 | { |
595 | williams_state *state = space | |
595 | williams_state *state = space.machine().driver_data<williams_state>(); | |
596 | 596 | int source, sxadv, syadv; |
597 | 597 | int dest, dxadv, dyadv; |
598 | 598 | int i, j, solid; |
r17963 | r17964 | |
627 | 627 | /* loop over the width */ |
628 | 628 | for (j = w; j > 0; j--) |
629 | 629 | { |
630 | blit_pixel(space, dest, state->m_blitter_remap[space | |
630 | blit_pixel(space, dest, state->m_blitter_remap[space.read_byte(source)], data, keepmask, solid); | |
631 | 631 | accesses += 2; |
632 | 632 | |
633 | 633 | /* advance */ |
r17963 | r17964 | |
661 | 661 | dest = dstart & 0xffff; |
662 | 662 | |
663 | 663 | /* left edge case */ |
664 | pixdata = state->m_blitter_remap[space | |
664 | pixdata = state->m_blitter_remap[space.read_byte(source)]; | |
665 | 665 | blit_pixel(space, dest, (pixdata >> 4) & 0x0f, data, keepmask | 0xf0, solid); |
666 | 666 | accesses += 2; |
667 | 667 | |
r17963 | r17964 | |
671 | 671 | /* loop over the width */ |
672 | 672 | for (j = w - 1; j > 0; j--) |
673 | 673 | { |
674 | pixdata = (pixdata << 8) | state->m_blitter_remap[space | |
674 | pixdata = (pixdata << 8) | state->m_blitter_remap[space.read_byte(source)]; | |
675 | 675 | blit_pixel(space, dest, (pixdata >> 4) & 0xff, data, keepmask, solid); |
676 | 676 | accesses += 2; |
677 | 677 |
r17963 | r17964 | |
---|---|---|
70 | 70 | TILE_GET_INFO_MEMBER(fuuki32_state::get_tile_info_2){ get_tile_info4bpp(machine(), tileinfo, tile_index, 2); } |
71 | 71 | TILE_GET_INFO_MEMBER(fuuki32_state::get_tile_info_3){ get_tile_info4bpp(machine(), tileinfo, tile_index, 3); } |
72 | 72 | |
73 | INLINE void fuuki32_vram_w(address_space | |
73 | INLINE void fuuki32_vram_w(address_space &space, offs_t offset, UINT32 data, UINT32 mem_mask, int _N_) | |
74 | 74 | { |
75 | fuuki32_state *state = space | |
75 | fuuki32_state *state = space.machine().driver_data<fuuki32_state>(); | |
76 | 76 | COMBINE_DATA(&state->m_vram[_N_][offset]); |
77 | 77 | state->m_tilemap[_N_]->mark_tile_dirty(offset); |
78 | 78 | } |
79 | 79 | |
80 | WRITE32_MEMBER(fuuki32_state::fuuki32_vram_0_w){ fuuki32_vram_w(&space, offset, data, mem_mask, 0); } | |
81 | WRITE32_MEMBER(fuuki32_state::fuuki32_vram_1_w){ fuuki32_vram_w(&space, offset, data, mem_mask, 1); } | |
82 | WRITE32_MEMBER(fuuki32_state::fuuki32_vram_2_w){ fuuki32_vram_w(&space, offset, data, mem_mask, 2); } | |
83 | WRITE32_MEMBER(fuuki32_state::fuuki32_vram_3_w){ fuuki32_vram_w(&space, offset, data, mem_mask, 3); } | |
80 | WRITE32_MEMBER(fuuki32_state::fuuki32_vram_0_w){ fuuki32_vram_w(space, offset, data, mem_mask, 0); } | |
81 | WRITE32_MEMBER(fuuki32_state::fuuki32_vram_1_w){ fuuki32_vram_w(space, offset, data, mem_mask, 1); } | |
82 | WRITE32_MEMBER(fuuki32_state::fuuki32_vram_2_w){ fuuki32_vram_w(space, offset, data, mem_mask, 2); } | |
83 | WRITE32_MEMBER(fuuki32_state::fuuki32_vram_3_w){ fuuki32_vram_w(space, offset, data, mem_mask, 3); } | |
84 | 84 | |
85 | 85 | |
86 | 86 | /*************************************************************************** |
r17963 | r17964 | |
---|---|---|
457 | 457 | The Flare One blitter is a simpler design with slightly different parameters |
458 | 458 | and will require hardware tests to figure everything out correctly. |
459 | 459 | */ |
460 | static void RunBlit(address_space | |
460 | static void RunBlit(address_space &space) | |
461 | 461 | { |
462 | #define BLITPRG_READ(x) blitter.x = *(blitter_get_addr(space | |
462 | #define BLITPRG_READ(x) blitter.x = *(blitter_get_addr(space.machine(), blitter.program.addr++)) | |
463 | 463 | |
464 | bfcobra_state *state = space | |
464 | bfcobra_state *state = space.machine().driver_data<bfcobra_state>(); | |
465 | 465 | struct blitter_t &blitter = state->m_blitter; |
466 | 466 | int cycles_used = 0; |
467 | 467 | |
r17963 | r17964 | |
571 | 571 | blitter.source.addr0 -=blitter.step; |
572 | 572 | } |
573 | 573 | |
574 | *blitter_get_addr(space | |
574 | *blitter_get_addr(space.machine(), blitter.dest.addr) = blitter.pattern; | |
575 | 575 | cycles_used++; |
576 | 576 | |
577 | 577 | } while (--innercnt); |
r17963 | r17964 | |
585 | 585 | |
586 | 586 | if (LOOPTYPE == 3 && innercnt == blitter.innercnt) |
587 | 587 | { |
588 | srcdata = *(blitter_get_addr(space | |
588 | srcdata = *(blitter_get_addr(space.machine(), blitter.source.addr & 0xfffff)); | |
589 | 589 | blitter.source.loword++; |
590 | 590 | cycles_used++; |
591 | 591 | } |
r17963 | r17964 | |
595 | 595 | { |
596 | 596 | if (LOOPTYPE == 0 || LOOPTYPE == 1) |
597 | 597 | { |
598 | srcdata = *(blitter_get_addr(space | |
598 | srcdata = *(blitter_get_addr(space.machine(), blitter.source.addr & 0xfffff)); | |
599 | 599 | cycles_used++; |
600 | 600 | |
601 | 601 | if (blitter.modectl & MODE_SSIGN) |
r17963 | r17964 | |
610 | 610 | /* Read destination pixel? */ |
611 | 611 | if (LOOPTYPE == 0) |
612 | 612 | { |
613 | dstdata = *blitter_get_addr(space | |
613 | dstdata = *blitter_get_addr(space.machine(), blitter.dest.addr & 0xfffff); | |
614 | 614 | cycles_used++; |
615 | 615 | } |
616 | 616 | |
r17963 | r17964 | |
679 | 679 | The existing destination pixel is used as a lookup |
680 | 680 | into the table and the colours is replaced. |
681 | 681 | */ |
682 | UINT8 dest = *blitter_get_addr(space->machine(), blitter.dest.addr); | |
683 | UINT8 newcol = *(blitter_get_addr(space->machine(), (blitter.source.addr + dest) & 0xfffff)); | |
682 | UINT8 dest = *blitter_get_addr(space.machine(), blitter.dest.addr); | |
683 | UINT8 newcol = *(blitter_get_addr(space.machine(), (blitter.source.addr + dest) & 0xfffff)); | |
684 | 684 | |
685 | *blitter_get_addr(space | |
685 | *blitter_get_addr(space.machine(), blitter.dest.addr) = newcol; | |
686 | 686 | cycles_used += 3; |
687 | 687 | } |
688 | 688 | else |
r17963 | r17964 | |
701 | 701 | if (blitter.compfunc & CMPFUNC_LOG0) |
702 | 702 | final_result |= ~result & ~dstdata; |
703 | 703 | |
704 | *blitter_get_addr(space | |
704 | *blitter_get_addr(space.machine(), blitter.dest.addr) = final_result; | |
705 | 705 | cycles_used++; |
706 | 706 | } |
707 | 707 | } |
r17963 | r17964 | |
741 | 741 | } while (blitter.command & CMD_RUN); |
742 | 742 | |
743 | 743 | /* Burn Z80 cycles while blitter is in operation */ |
744 | space | |
744 | space.device().execute().spin_until_time(attotime::from_nsec( (1000000000 / Z80_XTAL)*cycles_used * 2 ) ); | |
745 | 745 | } |
746 | 746 | |
747 | 747 | |
r17963 | r17964 | |
1008 | 1008 | m_blitter.command = data; |
1009 | 1009 | |
1010 | 1010 | if (data & CMD_RUN) |
1011 | RunBlit( | |
1011 | RunBlit(space); | |
1012 | 1012 | else |
1013 | 1013 | mame_printf_debug("Blitter stopped by IO.\n"); |
1014 | 1014 |
r17963 | r17964 | |
---|---|---|
2104 | 2104 | |
2105 | 2105 | static void bootleg_decode( running_machine &machine ) |
2106 | 2106 | { |
2107 | address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); | |
2108 | space->set_decrypted_region(0x0000, 0x7fff, machine.root_device().memregion("maincpu")->base() + 0x50000); | |
2107 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
2108 | space.set_decrypted_region(0x0000, 0x7fff, machine.root_device().memregion("maincpu")->base() + 0x50000); | |
2109 | 2109 | machine.root_device().membank("bank1")->configure_decrypted_entries(0, 16, machine.root_device().memregion("maincpu")->base() + 0x60000, 0x4000); |
2110 | 2110 | } |
2111 | 2111 |
r17963 | r17964 | |
---|---|---|
619 | 619 | logerror("%06X:rascot_excs_r(%04X)\n", m_maincpu->pc(), offset*2); |
620 | 620 | |
621 | 621 | // probably receives commands from the server here |
622 | //return space | |
622 | //return space.machine().rand() & 0xff; | |
623 | 623 | |
624 | 624 | return 0xff; |
625 | 625 | } |
r17963 | r17964 | |
---|---|---|
52 | 52 | soundlatch_clear_byte_w(space, 0, 0); |
53 | 53 | } |
54 | 54 | |
55 | static void nbmj9195_outcoin_flag_w(address_space | |
55 | static void nbmj9195_outcoin_flag_w(address_space &space, int data) | |
56 | 56 | { |
57 | nbmj9195_state *state = space | |
57 | nbmj9195_state *state = space.machine().driver_data<nbmj9195_state>(); | |
58 | 58 | // bit0: coin in counter |
59 | 59 | // bit1: coin out counter |
60 | 60 | // bit2: hopper |
r17963 | r17964 | |
75 | 75 | return (((state->ioport("DSWA")->read() & 0xff) | ((state->ioport("DSWB")->read() & 0xff) << 8)) >> state->m_dipswbitsel) & 0x01; |
76 | 76 | } |
77 | 77 | |
78 | static void nbmj9195_dipswbitsel_w(address_space | |
78 | static void nbmj9195_dipswbitsel_w(address_space &space, int data) | |
79 | 79 | { |
80 | nbmj9195_state *state = space | |
80 | nbmj9195_state *state = space.machine().driver_data<nbmj9195_state>(); | |
81 | 81 | switch (data & 0xc0) |
82 | 82 | { |
83 | 83 | case 0x00: |
r17963 | r17964 | |
95 | 95 | } |
96 | 96 | } |
97 | 97 | |
98 | static void mscoutm_inputportsel_w(address_space | |
98 | static void mscoutm_inputportsel_w(address_space &space, int data) | |
99 | 99 | { |
100 | nbmj9195_state *state = space | |
100 | nbmj9195_state *state = space.machine().driver_data<nbmj9195_state>(); | |
101 | 101 | state->m_mscoutm_inputport = (data ^ 0xff); |
102 | 102 | } |
103 | 103 | |
r17963 | r17964 | |
316 | 316 | switch (offset) |
317 | 317 | { |
318 | 318 | case 0: /* PA_0 */ |
319 | mscoutm_inputportsel_w( | |
319 | mscoutm_inputportsel_w(space, data); // NB22090 | |
320 | 320 | break; |
321 | 321 | case 1: /* PB_0 */ |
322 | 322 | break; |
323 | 323 | case 2: /* PC_0 */ |
324 | 324 | break; |
325 | 325 | case 3: /* PD_0 */ |
326 | nbmj9195_clutsel_w( | |
326 | nbmj9195_clutsel_w(space, data); | |
327 | 327 | break; |
328 | 328 | case 4: /* PE_0 */ |
329 | nbmj9195_gfxflag2_w( | |
329 | nbmj9195_gfxflag2_w(space, data); // NB22090 | |
330 | 330 | break; |
331 | 331 | |
332 | 332 | case 5: /* PA_1 */ |
r17963 | r17964 | |
358 | 358 | case 1: /* PB_0 */ |
359 | 359 | break; |
360 | 360 | case 2: /* PC_0 */ |
361 | nbmj9195_dipswbitsel_w( | |
361 | nbmj9195_dipswbitsel_w(space, data); | |
362 | 362 | break; |
363 | 363 | case 3: /* PD_0 */ |
364 | nbmj9195_clutsel_w( | |
364 | nbmj9195_clutsel_w(space, data); | |
365 | 365 | break; |
366 | 366 | case 4: /* PE_0 */ |
367 | nbmj9195_outcoin_flag_w( | |
367 | nbmj9195_outcoin_flag_w(space, data); | |
368 | 368 | break; |
369 | 369 | |
370 | 370 | case 5: /* PA_1 */ |
r17963 | r17964 | |
636 | 636 | |
637 | 637 | void nbmj9195_state::machine_reset() |
638 | 638 | { |
639 | address_space | |
639 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
640 | 640 | int i; |
641 | 641 | |
642 | 642 | // initialize TMPZ84C011 PIO |
643 | 643 | for (i = 0; i < (5 * 2); i++) |
644 | 644 | { |
645 | 645 | m_pio_dir[i] = m_pio_latch[i] = 0; |
646 | tmpz84c011_pio_w( | |
646 | tmpz84c011_pio_w(space, i, 0); | |
647 | 647 | } |
648 | 648 | } |
649 | 649 | |
650 | 650 | DRIVER_INIT_MEMBER(nbmj9195_state,nbmj9195) |
651 | 651 | { |
652 | address_space | |
652 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
653 | 653 | UINT8 *ROM = memregion("audiocpu")->base(); |
654 | 654 | |
655 | 655 | // sound program patch |
656 | 656 | ROM[0x0213] = 0x00; // DI -> NOP |
657 | 657 | |
658 | 658 | // initialize sound rom bank |
659 | nbmj9195_soundbank_w( | |
659 | nbmj9195_soundbank_w(space, 0, 0); | |
660 | 660 | logerror("DRIVER_INIT( nbmj9195 )\n"); |
661 | 661 | } |
662 | 662 |
r17963 | r17964 | |
---|---|---|
585 | 585 | |
586 | 586 | void csplayh5_state::machine_reset() |
587 | 587 | { |
588 | address_space | |
588 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
589 | 589 | int i; |
590 | 590 | |
591 | 591 | // initialize TMPZ84C011 PIO |
592 | 592 | for (i = 0; i < 5; i++) |
593 | 593 | { |
594 | 594 | m_pio_dir[i] = m_pio_latch[i] = 0; |
595 | tmpz84c011_pio_w( | |
595 | tmpz84c011_pio_w(space, i, 0); | |
596 | 596 | } |
597 | 597 | } |
598 | 598 |
r17963 | r17964 | |
---|---|---|
175 | 175 | |
176 | 176 | static WRITE8_HANDLER( pipedrm_bankswitch_w ) |
177 | 177 | { |
178 | fromance_state *state = space | |
178 | fromance_state *state = space.machine().driver_data<fromance_state>(); | |
179 | 179 | /* |
180 | 180 | Bit layout: |
181 | 181 | |
r17963 | r17964 | |
191 | 191 | state->membank("bank1")->set_entry(data & 0x7); |
192 | 192 | |
193 | 193 | /* map to the fromance gfx register */ |
194 | state->fromance_gfxreg_w( | |
194 | state->fromance_gfxreg_w(space, offset, ((data >> 6) & 0x01) | /* flipscreen */ | |
195 | 195 | ((~data >> 2) & 0x02)); /* videoram select */ |
196 | 196 | } |
197 | 197 | |
198 | 198 | |
199 | 199 | static WRITE8_HANDLER( sound_bankswitch_w ) |
200 | 200 | { |
201 | space | |
201 | space.machine().root_device().membank("bank2")->set_entry(data & 0x01); | |
202 | 202 | } |
203 | 203 | |
204 | 204 | |
r17963 | r17964 | |
225 | 225 | |
226 | 226 | static WRITE8_HANDLER( sound_command_w ) |
227 | 227 | { |
228 | space | |
228 | space.machine().scheduler().synchronize(FUNC(delayed_command_w), data | 0x100); | |
229 | 229 | } |
230 | 230 | |
231 | 231 | |
232 | 232 | static WRITE8_HANDLER( sound_command_nonmi_w ) |
233 | 233 | { |
234 | space | |
234 | space.machine().scheduler().synchronize(FUNC(delayed_command_w), data); | |
235 | 235 | } |
236 | 236 | |
237 | 237 | |
238 | 238 | static WRITE8_HANDLER( pending_command_clear_w ) |
239 | 239 | { |
240 | fromance_state *state = space | |
240 | fromance_state *state = space.machine().driver_data<fromance_state>(); | |
241 | 241 | state->m_pending_command = 0; |
242 | 242 | state->m_subcpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); |
243 | 243 | } |
r17963 | r17964 | |
245 | 245 | |
246 | 246 | static READ8_HANDLER( pending_command_r ) |
247 | 247 | { |
248 | fromance_state *state = space | |
248 | fromance_state *state = space.machine().driver_data<fromance_state>(); | |
249 | 249 | return state->m_pending_command; |
250 | 250 | } |
251 | 251 | |
252 | 252 | |
253 | 253 | static READ8_HANDLER( sound_command_r ) |
254 | 254 | { |
255 | fromance_state *state = space | |
255 | fromance_state *state = space.machine().driver_data<fromance_state>(); | |
256 | 256 | return state->m_sound_command; |
257 | 257 | } |
258 | 258 |
r17963 | r17964 | |
---|---|---|
206 | 206 | { |
207 | 207 | UINT8 *ROM = machine.root_device().memregion("maincpu")->base(); |
208 | 208 | data &= 0x2f; |
209 | space | |
209 | space.machine().root_device().membank("bank1")->set_base(&ROM[0x6000 + (data * 0x1000)] ); | |
210 | 210 | } |
211 | 211 | #endif |
212 | 212 |
r17963 | r17964 | |
---|---|---|
1259 | 1259 | |
1260 | 1260 | #if SPEEDUP_HACKS |
1261 | 1261 | |
1262 | INLINE UINT32 generic_speedup(address_space | |
1262 | INLINE UINT32 generic_speedup(address_space &space, int idx) | |
1263 | 1263 | { |
1264 | mediagx_state *state = space | |
1264 | mediagx_state *state = space.machine().driver_data<mediagx_state>(); | |
1265 | 1265 | |
1266 | if (space | |
1266 | if (space.device().safe_pc() == state->m_speedup_table[idx].pc) | |
1267 | 1267 | { |
1268 | 1268 | state->m_speedup_hits[idx]++; |
1269 | space | |
1269 | space.device().execute().spin_until_interrupt(); | |
1270 | 1270 | } |
1271 | 1271 | return state->m_main_ram[state->m_speedup_table[idx].offset/4]; |
1272 | 1272 | } |
r17963 | r17964 | |
---|---|---|
165 | 165 | *************************************/ |
166 | 166 | |
167 | 167 | // TODO: Might not be used |
168 | static void skimaxx_to_shiftreg(address_space | |
168 | static void skimaxx_to_shiftreg(address_space &space, UINT32 address, UINT16 *shiftreg) | |
169 | 169 | { |
170 | skimaxx_state *state = space | |
170 | skimaxx_state *state = space.machine().driver_data<skimaxx_state>(); | |
171 | 171 | memcpy(shiftreg, &state->m_fg_buffer[TOWORD(address)], 512 * sizeof(UINT16)); |
172 | 172 | } |
173 | 173 | |
174 | static void skimaxx_from_shiftreg(address_space | |
174 | static void skimaxx_from_shiftreg(address_space &space, UINT32 address, UINT16 *shiftreg) | |
175 | 175 | { |
176 | skimaxx_state *state = space | |
176 | skimaxx_state *state = space.machine().driver_data<skimaxx_state>(); | |
177 | 177 | memcpy(&state->m_fg_buffer[TOWORD(address)], shiftreg, 512 * sizeof(UINT16)); |
178 | 178 | } |
179 | 179 |
r17963 | r17964 | |
---|---|---|
273 | 273 | - aladmdb_w : 1b2d18 - data = aa00 (only once on reset) |
274 | 274 | - aladmdb_w : 1b2d42 - data = 0000 (only once on reset) |
275 | 275 | */ |
276 | logerror("aladmdb_w : %06x - data = %04x\n",space | |
276 | logerror("aladmdb_w : %06x - data = %04x\n",space.device().safe_pc(),data); | |
277 | 277 | } |
278 | 278 | |
279 | 279 | static READ16_HANDLER( aladmdb_r ) |
280 | 280 | { |
281 | md_boot_state *state = space->machine().driver_data<md_boot_state>(); | |
282 | if (space->device().safe_pc()==0x1b2a56) | |
281 | md_boot_state *state = space.machine().driver_data<md_boot_state>(); | |
282 | if (space.device().safe_pc()==0x1b2a56) | |
283 | 283 | { |
284 | 284 | state->m_aladmdb_mcu_port = state->ioport("MCU")->read(); |
285 | 285 | |
r17963 | r17964 | |
288 | 288 | else |
289 | 289 | return (0x100); //MCU status, needed if you fall into a pitfall |
290 | 290 | } |
291 | if (space->device().safe_pc()==0x1b2a72) return 0x0000; | |
292 | if (space->device().safe_pc()==0x1b2d24) return (space->machine().root_device().ioport("MCU")->read() & 0x00f0) | 0x1200; // difficulty | |
293 | if (space->device().safe_pc()==0x1b2d4e) return 0x0000; | |
291 | if (space.device().safe_pc()==0x1b2a72) return 0x0000; | |
292 | if (space.device().safe_pc()==0x1b2d24) return (space.machine().root_device().ioport("MCU")->read() & 0x00f0) | 0x1200; // difficulty | |
293 | if (space.device().safe_pc()==0x1b2d4e) return 0x0000; | |
294 | 294 | |
295 | logerror("aladbl_r : %06x\n",space | |
295 | logerror("aladbl_r : %06x\n",space.device().safe_pc()); | |
296 | 296 | |
297 | 297 | return 0x0000; |
298 | 298 | } |
r17963 | r17964 | |
300 | 300 | static READ16_HANDLER( mk3mdb_dsw_r ) |
301 | 301 | { |
302 | 302 | static const char *const dswname[3] = { "DSWA", "DSWB", "DSWC" }; |
303 | return space | |
303 | return space.machine().root_device().ioport(dswname[offset])->read(); | |
304 | 304 | } |
305 | 305 | |
306 | 306 | static READ16_HANDLER( ssf2mdb_dsw_r ) |
307 | 307 | { |
308 | 308 | static const char *const dswname[3] = { "DSWA", "DSWB", "DSWC" }; |
309 | return space | |
309 | return space.machine().root_device().ioport(dswname[offset])->read(); | |
310 | 310 | } |
311 | 311 | |
312 | 312 | static READ16_HANDLER( srmdb_dsw_r ) |
313 | 313 | { |
314 | 314 | static const char *const dswname[3] = { "DSWA", "DSWB", "DSWC" }; |
315 | return space | |
315 | return space.machine().root_device().ioport(dswname[offset])->read(); | |
316 | 316 | } |
317 | 317 | |
318 | 318 | static READ16_HANDLER( topshoot_200051_r ) |
r17963 | r17964 | |
---|---|---|
2163 | 2163 | DRIVER_INIT_MEMBER(balsente_state,toggle) { expand_roms(machine(), EXPAND_ALL); config_shooter_adc(machine(), FALSE, 0 /* noanalog */); } |
2164 | 2164 | DRIVER_INIT_MEMBER(balsente_state,nametune) |
2165 | 2165 | { |
2166 | address_space *space = machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2167 | space->install_write_handler(0x9f00, 0x9f00, write8_delegate(FUNC(balsente_state::balsente_rombank2_select_w),this)); | |
2166 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2167 | space.install_write_handler(0x9f00, 0x9f00, write8_delegate(FUNC(balsente_state::balsente_rombank2_select_w),this)); | |
2168 | 2168 | expand_roms(machine(), EXPAND_NONE | SWAP_HALVES); config_shooter_adc(machine(), FALSE, 0 /* noanalog */); |
2169 | 2169 | } |
2170 | 2170 | DRIVER_INIT_MEMBER(balsente_state,nstocker) |
2171 | 2171 | { |
2172 | address_space *space = machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2173 | space->install_write_handler(0x9f00, 0x9f00, write8_delegate(FUNC(balsente_state::balsente_rombank2_select_w),this)); | |
2172 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2173 | space.install_write_handler(0x9f00, 0x9f00, write8_delegate(FUNC(balsente_state::balsente_rombank2_select_w),this)); | |
2174 | 2174 | expand_roms(machine(), EXPAND_NONE | SWAP_HALVES); config_shooter_adc(machine(), TRUE, 1); |
2175 | 2175 | } |
2176 | 2176 | DRIVER_INIT_MEMBER(balsente_state,sfootbal) |
2177 | 2177 | { |
2178 | address_space *space = machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2179 | space->install_write_handler(0x9f00, 0x9f00, write8_delegate(FUNC(balsente_state::balsente_rombank2_select_w),this)); | |
2178 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2179 | space.install_write_handler(0x9f00, 0x9f00, write8_delegate(FUNC(balsente_state::balsente_rombank2_select_w),this)); | |
2180 | 2180 | expand_roms(machine(), EXPAND_ALL | SWAP_HALVES); config_shooter_adc(machine(), FALSE, 0); |
2181 | 2181 | } |
2182 | 2182 | DRIVER_INIT_MEMBER(balsente_state,spiker) |
2183 | 2183 | { |
2184 | address_space *space = machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2185 | space->install_readwrite_handler(0x9f80, 0x9f8f, read8_delegate(FUNC(balsente_state::spiker_expand_r),this), write8_delegate(FUNC(balsente_state::spiker_expand_w),this)); | |
2186 | space->install_write_handler(0x9f00, 0x9f00, write8_delegate(FUNC(balsente_state::balsente_rombank2_select_w),this)); | |
2184 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2185 | space.install_readwrite_handler(0x9f80, 0x9f8f, read8_delegate(FUNC(balsente_state::spiker_expand_r),this), write8_delegate(FUNC(balsente_state::spiker_expand_w),this)); | |
2186 | space.install_write_handler(0x9f00, 0x9f00, write8_delegate(FUNC(balsente_state::balsente_rombank2_select_w),this)); | |
2187 | 2187 | expand_roms(machine(), EXPAND_ALL | SWAP_HALVES); config_shooter_adc(machine(), FALSE, 1); |
2188 | 2188 | } |
2189 | 2189 | DRIVER_INIT_MEMBER(balsente_state,stompin) |
2190 | 2190 | { |
2191 | address_space *space = machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2192 | space->install_write_handler(0x9f00, 0x9f00, write8_delegate(FUNC(balsente_state::balsente_rombank2_select_w),this)); | |
2191 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2192 | space.install_write_handler(0x9f00, 0x9f00, write8_delegate(FUNC(balsente_state::balsente_rombank2_select_w),this)); | |
2193 | 2193 | expand_roms(machine(), 0x0c | SWAP_HALVES); config_shooter_adc(machine(), FALSE, 32); |
2194 | 2194 | } |
2195 | 2195 | DRIVER_INIT_MEMBER(balsente_state,rescraid) { expand_roms(machine(), EXPAND_NONE); config_shooter_adc(machine(), FALSE, 0 /* noanalog */); } |
2196 | 2196 | DRIVER_INIT_MEMBER(balsente_state,grudge) |
2197 | 2197 | { |
2198 | address_space *space = machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2199 | space->install_read_handler(0x9400, 0x9400, read8_delegate(FUNC(balsente_state::grudge_steering_r),this)); | |
2198 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2199 | space.install_read_handler(0x9400, 0x9400, read8_delegate(FUNC(balsente_state::grudge_steering_r),this)); | |
2200 | 2200 | expand_roms(machine(), EXPAND_NONE); config_shooter_adc(machine(), FALSE, 0); |
2201 | 2201 | } |
2202 | 2202 | DRIVER_INIT_MEMBER(balsente_state,shrike) |
2203 | 2203 | { |
2204 | address_space *space = machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2205 | space->install_readwrite_handler(0x9e00, 0x9fff, read8_delegate(FUNC(balsente_state::shrike_shared_6809_r),this), write8_delegate(FUNC(balsente_state::shrike_shared_6809_w),this)); | |
2206 | space->install_write_handler(0x9e01, 0x9e01, write8_delegate(FUNC(balsente_state::shrike_sprite_select_w),this)); | |
2204 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2205 | space.install_readwrite_handler(0x9e00, 0x9fff, read8_delegate(FUNC(balsente_state::shrike_shared_6809_r),this), write8_delegate(FUNC(balsente_state::shrike_shared_6809_w),this)); | |
2206 | space.install_write_handler(0x9e01, 0x9e01, write8_delegate(FUNC(balsente_state::shrike_sprite_select_w),this)); | |
2207 | 2207 | machine().device("68k")->memory().space(AS_PROGRAM)->install_readwrite_handler(0x10000, 0x1001f, read16_delegate(FUNC(balsente_state::shrike_io_68k_r),this), write16_delegate(FUNC(balsente_state::shrike_io_68k_w),this)); |
2208 | 2208 | |
2209 | 2209 | expand_roms(machine(), EXPAND_ALL); config_shooter_adc(machine(), FALSE, 32); |
r17963 | r17964 | |
---|---|---|
1523 | 1523 | }; |
1524 | 1524 | |
1525 | 1525 | int A; |
1526 | address_space | |
1526 | address_space &space = *machine.device(cputag)->memory().space(AS_PROGRAM); | |
1527 | 1527 | UINT8 *rom = machine.root_device().memregion(cputag)->base(); |
1528 | 1528 | int size = machine.root_device().memregion(cputag)->bytes(); |
1529 | 1529 | UINT8 *decrypt = auto_alloc_array(machine, UINT8, size); |
1530 | 1530 | |
1531 | space | |
1531 | space.set_decrypted_region(0x0000, size - 1, decrypt); | |
1532 | 1532 | |
1533 | 1533 | for (A = 0x0000; A < size; A++) |
1534 | 1534 | { |
r17963 | r17964 | |
---|---|---|
89 | 89 | * |
90 | 90 | *************************************/ |
91 | 91 | |
92 | static void xtheball_to_shiftreg(address_space | |
92 | static void xtheball_to_shiftreg(address_space &space, UINT32 address, UINT16 *shiftreg) | |
93 | 93 | { |
94 | xtheball_state *state = space | |
94 | xtheball_state *state = space.machine().driver_data<xtheball_state>(); | |
95 | 95 | if (address >= 0x01000000 && address <= 0x010fffff) |
96 | 96 | memcpy(shiftreg, &state->m_vram_bg[TOWORD(address & 0xff000)], TOBYTE(0x1000)); |
97 | 97 | else if (address >= 0x02000000 && address <= 0x020fffff) |
98 | 98 | memcpy(shiftreg, &state->m_vram_fg[TOWORD(address & 0xff000)], TOBYTE(0x1000)); |
99 | 99 | else |
100 | logerror("%s:xtheball_to_shiftreg(%08X)\n", space | |
100 | logerror("%s:xtheball_to_shiftreg(%08X)\n", space.machine().describe_context(), address); | |
101 | 101 | } |
102 | 102 | |
103 | 103 | |
104 | static void xtheball_from_shiftreg(address_space | |
104 | static void xtheball_from_shiftreg(address_space &space, UINT32 address, UINT16 *shiftreg) | |
105 | 105 | { |
106 | xtheball_state *state = space | |
106 | xtheball_state *state = space.machine().driver_data<xtheball_state>(); | |
107 | 107 | if (address >= 0x01000000 && address <= 0x010fffff) |
108 | 108 | memcpy(&state->m_vram_bg[TOWORD(address & 0xff000)], shiftreg, TOBYTE(0x1000)); |
109 | 109 | else if (address >= 0x02000000 && address <= 0x020fffff) |
110 | 110 | memcpy(&state->m_vram_fg[TOWORD(address & 0xff000)], shiftreg, TOBYTE(0x1000)); |
111 | 111 | else |
112 | logerror("%s:xtheball_from_shiftreg(%08X)\n", space | |
112 | logerror("%s:xtheball_from_shiftreg(%08X)\n", space.machine().describe_context(), address); | |
113 | 113 | } |
114 | 114 | |
115 | 115 |
r17963 | r17964 | |
---|---|---|
339 | 339 | |
340 | 340 | void atvtrack_state::machine_reset() |
341 | 341 | { |
342 | address_space *as; | |
343 | ||
344 | 342 | // Probably just after reset the cpu executes some bootsrtap routine from a memory inside the fpga. |
345 | 343 | // The routine initializes the cpu, copies the boot program from the flash memories into the cpu sdram |
346 | 344 | // and finally executes it. |
347 | 345 | // Here there is the setup of the cpu, the boot program is copied in machine_start |
348 | as = machine().device("maincpu")->memory().space(AS_PROGRAM); | |
346 | address_space &as = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
349 | 347 | // set cpu PC register to 0x0c7f0000 |
350 | 348 | machine().device("maincpu")->state().set_pc(0x0c7f0000); |
351 | 349 | // set BCR2 to 1 |
r17963 | r17964 | |
---|---|---|
164 | 164 | m_nvram->store(data & 0x02); |
165 | 165 | |
166 | 166 | if (!(data & 0x04)) |
167 | atarigen_scanline_int_ack_w( | |
167 | atarigen_scanline_int_ack_w(space,0,0,0xffff); | |
168 | 168 | if (!(data & 0x08)) |
169 | atarigen_video_int_ack_w( | |
169 | atarigen_video_int_ack_w(space,0,0,0xffff); | |
170 | 170 | |
171 | 171 | output_set_led_value(0, (data >> 4) & 1); |
172 | 172 | output_set_led_value(1, (data >> 5) & 1); |
r17963 | r17964 | |
---|---|---|
688 | 688 | #endif |
689 | 689 | } |
690 | 690 | |
691 | static void blitter_w( address_space | |
691 | static void blitter_w( address_space &space, int blitter, offs_t offset, UINT8 data, int irq_vector ) | |
692 | 692 | { |
693 | dynax_state *state = space | |
693 | dynax_state *state = space.machine().driver_data<dynax_state>(); | |
694 | 694 | int hi_bits; |
695 | 695 | |
696 | 696 | g_profiler.start(PROFILER_VIDEO); |
r17963 | r17964 | |
720 | 720 | break; |
721 | 721 | |
722 | 722 | case 0x03: |
723 | ddenlovr_blit_flip_w(space | |
723 | ddenlovr_blit_flip_w(space.machine(), data); | |
724 | 724 | break; |
725 | 725 | |
726 | 726 | case 0x04: |
r17963 | r17964 | |
789 | 789 | |
790 | 790 | case 0x24: |
791 | 791 | |
792 | log_blit(space | |
792 | log_blit(space.machine(), data); | |
793 | 793 | |
794 | 794 | switch (data) |
795 | 795 | { |
796 | case 0x04: blit_fill_xy(space | |
796 | case 0x04: blit_fill_xy(space.machine(), 0, 0); | |
797 | 797 | break; |
798 | case 0x14: blit_fill_xy(space | |
798 | case 0x14: blit_fill_xy(space.machine(), state->m_ddenlovr_blit_x, state->m_ddenlovr_blit_y); | |
799 | 799 | break; |
800 | 800 | |
801 | case 0x10: state->m_ddenlovr_blit_address = blit_draw(space | |
801 | case 0x10: state->m_ddenlovr_blit_address = blit_draw(space.machine(), state->m_ddenlovr_blit_address, state->m_ddenlovr_blit_x); | |
802 | 802 | break; |
803 | 803 | |
804 | case 0x13: blit_horiz_line(space | |
804 | case 0x13: blit_horiz_line(space.machine()); | |
805 | 805 | break; |
806 | case 0x1b: blit_vert_line(space | |
806 | case 0x1b: blit_vert_line(space.machine()); | |
807 | 807 | break; |
808 | 808 | |
809 | case 0x1c: blit_rect_xywh(space | |
809 | case 0x1c: blit_rect_xywh(space.machine()); | |
810 | 810 | break; |
811 | 811 | |
812 | 812 | // These two are issued one after the other (43 then 8c) |
813 | 813 | // 8c is issued immediately after 43 has finished, without |
814 | 814 | // changing any argument |
815 | 815 | case 0x43: break; |
816 | case 0x8c: blit_rect_yh(space | |
816 | case 0x8c: blit_rect_yh(space.machine()); | |
817 | 817 | break; |
818 | 818 | |
819 | 819 | default: |
820 | 820 | ; |
821 | 821 | #ifdef MAME_DEBUG |
822 | 822 | popmessage("unknown blitter command %02x", data); |
823 | logerror("%06x: unknown blitter command %02x\n", space | |
823 | logerror("%06x: unknown blitter command %02x\n", space.device().safe_pc(), data); | |
824 | 824 | #endif |
825 | 825 | } |
826 | 826 | |
827 | 827 | if (irq_vector) |
828 | 828 | /* quizchq */ |
829 | space | |
829 | space.device().execute().set_input_line_and_vector(0, HOLD_LINE, irq_vector); | |
830 | 830 | else |
831 | 831 | { |
832 | 832 | /* ddenlovr */ |
833 | 833 | if (state->m_ddenlovr_blitter_irq_enable) |
834 | 834 | { |
835 | 835 | state->m_ddenlovr_blitter_irq_flag = 1; |
836 | space | |
836 | space.device().execute().set_input_line(1, HOLD_LINE); | |
837 | 837 | } |
838 | 838 | } |
839 | 839 | break; |
840 | 840 | |
841 | 841 | default: |
842 | logerror("%06x: Blitter %d reg %02x = %02x\n", space | |
842 | logerror("%06x: Blitter %d reg %02x = %02x\n", space.device().safe_pc(), blitter, state->m_ddenlovr_blit_regs[blitter], data); | |
843 | 843 | break; |
844 | 844 | } |
845 | 845 | } |
r17963 | r17964 | |
1205 | 1205 | |
1206 | 1206 | WRITE8_MEMBER(dynax_state::rongrong_blitter_w) |
1207 | 1207 | { |
1208 | blitter_w( | |
1208 | blitter_w(space, 0, offset, data, 0xf8); | |
1209 | 1209 | } |
1210 | 1210 | |
1211 | 1211 | WRITE16_MEMBER(dynax_state::ddenlovr_blitter_w) |
1212 | 1212 | { |
1213 | 1213 | if (ACCESSING_BITS_0_7) |
1214 | blitter_w( | |
1214 | blitter_w(space, 0, offset, data & 0xff, 0); | |
1215 | 1215 | } |
1216 | 1216 | |
1217 | 1217 | |
r17963 | r17964 | |
2080 | 2080 | |
2081 | 2081 | WRITE8_MEMBER(dynax_state::mmpanic_blitter_w) |
2082 | 2082 | { |
2083 | blitter_w( | |
2083 | blitter_w(space, 0, offset, data, 0xdf); // RST 18 | |
2084 | 2084 | } |
2085 | 2085 | WRITE8_MEMBER(dynax_state::mmpanic_blitter2_w) |
2086 | 2086 | { |
2087 | blitter_w( | |
2087 | blitter_w(space, 1, offset, data, 0xdf); // RST 18 | |
2088 | 2088 | } |
2089 | 2089 | |
2090 | 2090 | static void mmpanic_update_leds(running_machine &machine) |
r17963 | r17964 | |
2750 | 2750 | |
2751 | 2751 | WRITE8_MEMBER(dynax_state::mjmyster_blitter_w) |
2752 | 2752 | { |
2753 | blitter_w( | |
2753 | blitter_w(space, 0, offset, data, 0xfc); | |
2754 | 2754 | } |
2755 | 2755 | |
2756 | 2756 | static ADDRESS_MAP_START( mjmyster_portmap, AS_IO, 8, dynax_state ) |
r17963 | r17964 | |
2922 | 2922 | break; |
2923 | 2923 | } |
2924 | 2924 | } |
2925 | blitter_w( | |
2925 | blitter_w(space, 0, offset, data, 0xfc); | |
2926 | 2926 | } |
2927 | 2927 | |
2928 | 2928 | static ADDRESS_MAP_START( hginga_portmap, AS_IO, 8, dynax_state ) |
r17963 | r17964 | |
2956 | 2956 | Hanafuda Hana Gokou |
2957 | 2957 | ***************************************************************************/ |
2958 | 2958 | |
2959 | static UINT8 hgokou_player_r( address_space | |
2959 | static UINT8 hgokou_player_r( address_space &space, int player ) | |
2960 | 2960 | { |
2961 | dynax_state *state = space->machine().driver_data<dynax_state>(); | |
2962 | UINT8 hopper_bit = ((state->m_hopper && !(space->machine().primary_screen->frame_number() % 10)) ? 0 : (1 << 6)); | |
2961 | dynax_state *state = space.machine().driver_data<dynax_state>(); | |
2962 | UINT8 hopper_bit = ((state->m_hopper && !(space.machine().primary_screen->frame_number() % 10)) ? 0 : (1 << 6)); | |
2963 | 2963 | |
2964 | 2964 | if (!BIT(state->m_input_sel, 0)) return state->ioport(player ? "KEY5" : "KEY0")->read() | hopper_bit; |
2965 | 2965 | if (!BIT(state->m_input_sel, 1)) return state->ioport(player ? "KEY6" : "KEY1")->read() | hopper_bit; |
r17963 | r17964 | |
2980 | 2980 | switch (m_dsw_sel) |
2981 | 2981 | { |
2982 | 2982 | case 0x20: return ioport("SYSTEM")->read(); |
2983 | case 0x21: return hgokou_player_r(&space, 1); | |
2984 | case 0x22: return hgokou_player_r(&space, 0); | |
2983 | case 0x21: return hgokou_player_r(space, 1); | |
2984 | case 0x22: return hgokou_player_r(space, 0); | |
2985 | 2985 | case 0x23: return m_coins; |
2986 | 2986 | } |
2987 | 2987 | logerror("%06x: warning, unknown bits read, dsw_sel = %02x\n", space.device().safe_pc(), m_dsw_sel); |
r17963 | r17964 | |
3077 | 3077 | m_input_sel = 0xfe; |
3078 | 3078 | return 0; // discarded |
3079 | 3079 | case 0xa1: |
3080 | ret = hgokou_player_r( | |
3080 | ret = hgokou_player_r(space, 1); | |
3081 | 3081 | m_input_sel <<= 1; // auto-increment input_sel |
3082 | 3082 | m_input_sel |= 1; |
3083 | 3083 | return ret; |
3084 | 3084 | case 0xa2: |
3085 | ret = hgokou_player_r( | |
3085 | ret = hgokou_player_r(space, 0); | |
3086 | 3086 | m_input_sel <<= 1; // auto-increment input_sel |
3087 | 3087 | m_input_sel |= 1; |
3088 | 3088 | return ret; |
r17963 | r17964 | |
3389 | 3389 | |
3390 | 3390 | WRITE8_MEMBER(dynax_state::mjflove_blitter_w) |
3391 | 3391 | { |
3392 | blitter_w( | |
3392 | blitter_w(space, 0, offset, data, 0); | |
3393 | 3393 | } |
3394 | 3394 | |
3395 | 3395 | WRITE8_MEMBER(dynax_state::mjflove_coincounter_w) |
r17963 | r17964 | |
---|---|---|
135 | 135 | |
136 | 136 | static WRITE8_HANDLER( chinagat_interrupt_w ) |
137 | 137 | { |
138 | ddragon_state *state = space | |
138 | ddragon_state *state = space.machine().driver_data<ddragon_state>(); | |
139 | 139 | |
140 | 140 | switch (offset) |
141 | 141 | { |
142 | 142 | case 0: /* 3e00 - SND irq */ |
143 | state->soundlatch_byte_w( | |
143 | state->soundlatch_byte_w(space, 0, data); | |
144 | 144 | state->m_snd_cpu->execute().set_input_line(state->m_sound_irq, (state->m_sound_irq == INPUT_LINE_NMI) ? PULSE_LINE : HOLD_LINE ); |
145 | 145 | break; |
146 | 146 | |
r17963 | r17964 | |
170 | 170 | ---- -x-- Flip screen |
171 | 171 | --x- ---- Enable video ??? |
172 | 172 | ****************************/ |
173 | ddragon_state *state = space | |
173 | ddragon_state *state = space.machine().driver_data<ddragon_state>(); | |
174 | 174 | |
175 | 175 | state->m_scrolly_hi = ((data & 0x02) >> 1); |
176 | 176 | state->m_scrollx_hi = data & 0x01; |
r17963 | r17964 | |
180 | 180 | |
181 | 181 | static WRITE8_HANDLER( chinagat_bankswitch_w ) |
182 | 182 | { |
183 | space | |
183 | space.machine().root_device().membank("bank1")->set_entry(data & 0x07); // shall we check (data & 7) < 6 (# of banks)? | |
184 | 184 | } |
185 | 185 | |
186 | 186 | static WRITE8_HANDLER( chinagat_sub_bankswitch_w ) |
187 | 187 | { |
188 | space | |
188 | space.machine().root_device().membank("bank4")->set_entry(data & 0x07); // shall we check (data & 7) < 6 (# of banks)? | |
189 | 189 | } |
190 | 190 | |
191 | 191 | static READ8_HANDLER( saiyugoub1_mcu_command_r ) |
192 | 192 | { |
193 | ddragon_state *state = space | |
193 | ddragon_state *state = space.machine().driver_data<ddragon_state>(); | |
194 | 194 | #if 0 |
195 | 195 | if (state->m_mcu_command == 0x78) |
196 | 196 | { |
197 | space | |
197 | space.machine().device<cpu_device>("mcu")->suspend(SUSPEND_REASON_HALT, 1); /* Suspend (speed up) */ | |
198 | 198 | } |
199 | 199 | #endif |
200 | 200 | return state->m_mcu_command; |
r17963 | r17964 | |
202 | 202 | |
203 | 203 | static WRITE8_HANDLER( saiyugoub1_mcu_command_w ) |
204 | 204 | { |
205 | ddragon_state *state = space | |
205 | ddragon_state *state = space.machine().driver_data<ddragon_state>(); | |
206 | 206 | state->m_mcu_command = data; |
207 | 207 | #if 0 |
208 | 208 | if (data != 0x78) |
209 | 209 | { |
210 | space | |
210 | space.machine().device<cpu_device>("mcu")->resume(SUSPEND_REASON_HALT); /* Wake up */ | |
211 | 211 | } |
212 | 212 | #endif |
213 | 213 | } |
214 | 214 | |
215 | 215 | static WRITE8_HANDLER( saiyugoub1_adpcm_rom_addr_w ) |
216 | 216 | { |
217 | ddragon_state *state = space | |
217 | ddragon_state *state = space.machine().driver_data<ddragon_state>(); | |
218 | 218 | /* i8748 Port 1 write */ |
219 | 219 | state->m_i8748_P1 = data; |
220 | 220 | } |
r17963 | r17964 | |
290 | 290 | |
291 | 291 | static READ8_HANDLER( saiyugoub1_m5205_irq_r ) |
292 | 292 | { |
293 | ddragon_state *state = space | |
293 | ddragon_state *state = space.machine().driver_data<ddragon_state>(); | |
294 | 294 | if (state->m_adpcm_sound_irq) |
295 | 295 | { |
296 | 296 | state->m_adpcm_sound_irq = 0; |
r17963 | r17964 | |
---|---|---|
335 | 335 | { |
336 | 336 | okim6295_device *oki = downcast<okim6295_device *>(device); |
337 | 337 | oki->set_bank_base(0x40000 * (data & 0xf) ); |
338 | // logerror("CPU #0 PC %06X : OKI0 bank %08X\n",space | |
338 | // logerror("CPU #0 PC %06X : OKI0 bank %08X\n",space.device().safe_pc(),data); | |
339 | 339 | } |
340 | 340 | } |
341 | 341 | |
r17963 | r17964 | |
346 | 346 | { |
347 | 347 | okim6295_device *oki = downcast<okim6295_device *>(device); |
348 | 348 | oki->set_bank_base(0x40000 * data ); |
349 | // logerror("CPU #0 PC %06X : OKI1 bank %08X\n",space | |
349 | // logerror("CPU #0 PC %06X : OKI1 bank %08X\n",space.device().safe_pc(),data); | |
350 | 350 | } |
351 | 351 | } |
352 | 352 | |
r17963 | r17964 | |
476 | 476 | { |
477 | 477 | okim6295_device *oki = downcast<okim6295_device *>(device); |
478 | 478 | oki->set_bank_base( 0x40000 * (data & 0xF) ); |
479 | // logerror("CPU #0 PC %06X : OKI0 bank %08X\n",space | |
479 | // logerror("CPU #0 PC %06X : OKI0 bank %08X\n",space.device().safe_pc(),data); | |
480 | 480 | } |
481 | 481 | } |
482 | 482 | |
r17963 | r17964 | |
487 | 487 | { |
488 | 488 | okim6295_device *oki = downcast<okim6295_device *>(device); |
489 | 489 | oki->set_bank_base( 0x40000 * (data & 0x1) ); |
490 | // logerror("CPU #0 PC %06X : OKI1 bank %08X\n",space | |
490 | // logerror("CPU #0 PC %06X : OKI1 bank %08X\n",space.device().safe_pc(),data); | |
491 | 491 | } |
492 | 492 | } |
493 | 493 |
r17963 | r17964 | |
---|---|---|
145 | 145 | |
146 | 146 | static void scanline_update(screen_device &screen, int scanline) |
147 | 147 | { |
148 | address_space | |
148 | address_space &space = *screen.machine().device("audiocpu")->memory().space(AS_PROGRAM); | |
149 | 149 | |
150 | 150 | /* sound IRQ is on 32V */ |
151 | 151 | if (scanline & 32) |
r17963 | r17964 | |
---|---|---|
1132 | 1132 | /* |
1133 | 1133 | READ64_MEMBER(viper_state::epic_64be_r) |
1134 | 1134 | { |
1135 | return read64be_with_32le_handler(epic_r, | |
1135 | return read64be_with_32le_handler(epic_r, space, offset, mem_mask); | |
1136 | 1136 | } |
1137 | 1137 | WRITE64_MEMBER(viper_state::epic_64be_w) |
1138 | 1138 | { |
1139 | write64be_with_32le_handler(epic_w, | |
1139 | write64be_with_32le_handler(epic_w, space, offset, data, mem_mask); | |
1140 | 1140 | } |
1141 | 1141 | */ |
1142 | 1142 |
r17963 | r17964 | |
---|---|---|
81 | 81 | /* Non encrypted bootleg */ |
82 | 82 | DRIVER_INIT_MEMBER(suna8_state,hardhedb) |
83 | 83 | { |
84 | address_space *space = machine().device("maincpu")->memory().space(AS_PROGRAM); | |
85 | space->set_decrypted_region(0x0000, 0x7fff, machine().root_device().memregion("maincpu")->base() + 0x48000); | |
84 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
85 | space.set_decrypted_region(0x0000, 0x7fff, machine().root_device().memregion("maincpu")->base() + 0x48000); | |
86 | 86 | machine().root_device().membank("bank1")->configure_entries(0, 16, machine().root_device().memregion("maincpu")->base() + 0x10000, 0x4000); |
87 | 87 | } |
88 | 88 | |
r17963 | r17964 | |
92 | 92 | |
93 | 93 | static UINT8 *brickzn_decrypt(running_machine &machine) |
94 | 94 | { |
95 | address_space | |
95 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
96 | 96 | UINT8 *RAM = machine.root_device().memregion("maincpu")->base(); |
97 | 97 | size_t size = machine.root_device().memregion("maincpu")->bytes(); |
98 | 98 | UINT8 *decrypt = auto_alloc_array(machine, UINT8, size); |
99 | 99 | int i; |
100 | 100 | |
101 | space | |
101 | space.set_decrypted_region(0x0000, 0x7fff, decrypt); | |
102 | 102 | |
103 | 103 | /* Opcodes and data */ |
104 | 104 | for (i = 0; i < 0x50000; i++) |
r17963 | r17964 | |
222 | 222 | |
223 | 223 | DRIVER_INIT_MEMBER(suna8_state,hardhea2) |
224 | 224 | { |
225 | address_space | |
225 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
226 | 226 | UINT8 *RAM = machine().root_device().memregion("maincpu")->base(); |
227 | 227 | size_t size = machine().root_device().memregion("maincpu")->bytes(); |
228 | 228 | UINT8 *decrypt = auto_alloc_array(machine(), UINT8, size); |
229 | 229 | UINT8 x; |
230 | 230 | int i; |
231 | 231 | |
232 | space | |
232 | space.set_decrypted_region(0x0000, 0x7fff, decrypt); | |
233 | 233 | |
234 | 234 | /* Address lines scrambling */ |
235 | 235 | memcpy(decrypt, RAM, size); |
r17963 | r17964 | |
309 | 309 | |
310 | 310 | DRIVER_INIT_MEMBER(suna8_state,starfigh) |
311 | 311 | { |
312 | address_space | |
312 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
313 | 313 | UINT8 *RAM = machine().root_device().memregion("maincpu")->base(); |
314 | 314 | size_t size = machine().root_device().memregion("maincpu")->bytes(); |
315 | 315 | UINT8 *decrypt = auto_alloc_array(machine(), UINT8, size); |
316 | 316 | UINT8 x; |
317 | 317 | int i; |
318 | 318 | |
319 | space | |
319 | space.set_decrypted_region(0x0000, 0x7fff, decrypt); | |
320 | 320 | |
321 | 321 | /* Address lines scrambling */ |
322 | 322 | memcpy(decrypt, RAM, size); |
r17963 | r17964 | |
377 | 377 | |
378 | 378 | DRIVER_INIT_MEMBER(suna8_state,sparkman) |
379 | 379 | { |
380 | address_space | |
380 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
381 | 381 | UINT8 *RAM = machine().root_device().memregion("maincpu")->base(); |
382 | 382 | size_t size = machine().root_device().memregion("maincpu")->bytes(); |
383 | 383 | UINT8 *decrypt = auto_alloc_array(machine(), UINT8, size); |
384 | 384 | UINT8 x; |
385 | 385 | int i; |
386 | 386 | |
387 | space | |
387 | space.set_decrypted_region(0x0000, 0x7fff, decrypt); | |
388 | 388 | |
389 | 389 | /* Address lines scrambling */ |
390 | 390 | memcpy(decrypt, RAM, size); |
r17963 | r17964 | |
1832 | 1832 | |
1833 | 1833 | MACHINE_RESET_MEMBER(suna8_state,hardhea2) |
1834 | 1834 | { |
1835 | address_space *space = machine().device("maincpu")->memory().space(AS_PROGRAM); | |
1836 | hardhea2_rambank_0_w(*space,0,0); | |
1835 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
1836 | hardhea2_rambank_0_w(space,0,0); | |
1837 | 1837 | } |
1838 | 1838 | |
1839 | 1839 | static MACHINE_CONFIG_DERIVED( hardhea2, brickzn ) |
r17963 | r17964 | |
---|---|---|
199 | 199 | } |
200 | 200 | |
201 | 201 | |
202 | static void btime_decrypt( address_space | |
202 | static void btime_decrypt( address_space &space ) | |
203 | 203 | { |
204 | btime_state *state = space | |
204 | btime_state *state = space.machine().driver_data<btime_state>(); | |
205 | 205 | UINT8 *src, *src1; |
206 | 206 | int addr, addr1; |
207 | 207 | |
r17963 | r17964 | |
211 | 211 | /* xxxx xxx1 xxxx x1xx are encrypted. */ |
212 | 212 | |
213 | 213 | /* get the address of the next opcode */ |
214 | addr = space | |
214 | addr = space.device().safe_pc(); | |
215 | 215 | |
216 | 216 | /* however if the previous instruction was JSR (which caused a write to */ |
217 | 217 | /* the stack), fetch the address of the next instruction. */ |
218 | addr1 = space | |
218 | addr1 = space.device().safe_pcbase(); | |
219 | 219 | src1 = (addr1 < 0x9000) ? state->m_rambase : state->memregion("maincpu")->base(); |
220 | 220 | if (decrypted[addr1] == 0x20) /* JSR $xxxx */ |
221 | 221 | addr = src1[addr1 + 1] + 256 * src1[addr1 + 2]; |
r17963 | r17964 | |
280 | 280 | |
281 | 281 | m_rambase[offset] = data; |
282 | 282 | |
283 | btime_decrypt( | |
283 | btime_decrypt(space); | |
284 | 284 | } |
285 | 285 | |
286 | 286 | WRITE8_MEMBER(btime_state::tisland_w) |
r17963 | r17964 | |
299 | 299 | |
300 | 300 | m_rambase[offset] = data; |
301 | 301 | |
302 | btime_decrypt( | |
302 | btime_decrypt(space); | |
303 | 303 | } |
304 | 304 | |
305 | 305 | WRITE8_MEMBER(btime_state::zoar_w) |
r17963 | r17964 | |
317 | 317 | |
318 | 318 | m_rambase[offset] = data; |
319 | 319 | |
320 | btime_decrypt( | |
320 | btime_decrypt(space); | |
321 | 321 | } |
322 | 322 | |
323 | 323 | WRITE8_MEMBER(btime_state::disco_w) |
r17963 | r17964 | |
331 | 331 | |
332 | 332 | m_rambase[offset] = data; |
333 | 333 | |
334 | btime_decrypt( | |
334 | btime_decrypt(space); | |
335 | 335 | } |
336 | 336 | |
337 | 337 | |
r17963 | r17964 | |
2038 | 2038 | |
2039 | 2039 | static void decrypt_C10707_cpu(running_machine &machine, const char *cputag) |
2040 | 2040 | { |
2041 | address_space | |
2041 | address_space &space = *machine.device(cputag)->memory().space(AS_PROGRAM); | |
2042 | 2042 | UINT8 *decrypt = auto_alloc_array(machine, UINT8, 0x10000); |
2043 | 2043 | UINT8 *rom = machine.root_device().memregion(cputag)->base(); |
2044 | 2044 | offs_t addr; |
2045 | 2045 | |
2046 | space | |
2046 | space.set_decrypted_region(0x0000, 0xffff, decrypt); | |
2047 | 2047 | |
2048 | 2048 | /* Swap bits 5 & 6 for opcodes */ |
2049 | 2049 | for (addr = 0; addr < 0x10000; addr++) |
2050 | 2050 | decrypt[addr] = swap_bits_5_6(rom[addr]); |
2051 | 2051 | |
2052 | if (&space | |
2052 | if (&space.device() == machine.device("maincpu")) | |
2053 | 2053 | decrypted = decrypt; |
2054 | 2054 | } |
2055 | 2055 | |
r17963 | r17964 | |
2068 | 2068 | |
2069 | 2069 | static void init_rom1(running_machine &machine) |
2070 | 2070 | { |
2071 | address_space | |
2071 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
2072 | 2072 | UINT8 *rom = machine.root_device().memregion("maincpu")->base(); |
2073 | 2073 | |
2074 | 2074 | decrypted = auto_alloc_array(machine, UINT8, 0x10000); |
2075 | space | |
2075 | space.set_decrypted_region(0x0000, 0xffff, decrypted); | |
2076 | 2076 | |
2077 | 2077 | /* For now, just copy the RAM array over to ROM. Decryption will happen */ |
2078 | 2078 | /* at run time, since the CPU applies the decryption only if the previous */ |
r17963 | r17964 | |
---|---|---|
42 | 42 | |
43 | 43 | static WRITE16_HANDLER( fcrash_soundlatch_w ) |
44 | 44 | { |
45 | cps_state *state = space | |
45 | cps_state *state = space.machine().driver_data<cps_state>(); | |
46 | 46 | |
47 | 47 | if (ACCESSING_BITS_0_7) |
48 | 48 | { |
49 | state->soundlatch_byte_w( | |
49 | state->soundlatch_byte_w(space, 0, data & 0xff); | |
50 | 50 | state->m_audiocpu->set_input_line(0, HOLD_LINE); |
51 | 51 | } |
52 | 52 | } |
53 | 53 | |
54 | 54 | static WRITE8_HANDLER( fcrash_snd_bankswitch_w ) |
55 | 55 | { |
56 | cps_state *state = space | |
56 | cps_state *state = space.machine().driver_data<cps_state>(); | |
57 | 57 | |
58 | 58 | state->m_msm_1->set_output_gain(0, (data & 0x08) ? 0.0 : 1.0); |
59 | 59 | state->m_msm_2->set_output_gain(0, (data & 0x10) ? 0.0 : 1.0); |
r17963 | r17964 | |
84 | 84 | |
85 | 85 | static WRITE8_HANDLER( fcrash_msm5205_0_data_w ) |
86 | 86 | { |
87 | cps_state *state = space | |
87 | cps_state *state = space.machine().driver_data<cps_state>(); | |
88 | 88 | state->m_sample_buffer1 = data; |
89 | 89 | } |
90 | 90 | |
91 | 91 | static WRITE8_HANDLER( fcrash_msm5205_1_data_w ) |
92 | 92 | { |
93 | cps_state *state = space | |
93 | cps_state *state = space.machine().driver_data<cps_state>(); | |
94 | 94 | state->m_sample_buffer2 = data; |
95 | 95 | } |
96 | 96 |
r17963 | r17964 | |
---|---|---|
176 | 176 | |
177 | 177 | |
178 | 178 | #define COPRO_FIFOOUT_SIZE 32000 |
179 | static UINT32 copro_fifoout_pop(address_space | |
179 | static UINT32 copro_fifoout_pop(address_space &space) | |
180 | 180 | { |
181 | model2_state *state = space | |
181 | model2_state *state = space.machine().driver_data<model2_state>(); | |
182 | 182 | UINT32 r; |
183 | 183 | |
184 | 184 | if (state->m_copro_fifoout_num == 0) |
185 | 185 | { |
186 | 186 | /* Reading from empty FIFO causes the i960 to enter wait state */ |
187 | i960_stall(&space | |
187 | i960_stall(&space.device()); | |
188 | 188 | |
189 | 189 | /* spin the main cpu and let the TGP catch up */ |
190 | space | |
190 | space.device().execute().spin_until_time(attotime::from_usec(100)); | |
191 | 191 | |
192 | 192 | return 0; |
193 | 193 | } |
r17963 | r17964 | |
208 | 208 | { |
209 | 209 | if (state->m_copro_fifoout_num == COPRO_FIFOOUT_SIZE) |
210 | 210 | { |
211 | sharc_set_flag_input(space | |
211 | sharc_set_flag_input(space.machine().device("dsp"), 1, ASSERT_LINE); | |
212 | 212 | } |
213 | 213 | else |
214 | 214 | { |
215 | sharc_set_flag_input(space | |
215 | sharc_set_flag_input(space.machine().device("dsp"), 1, CLEAR_LINE); | |
216 | 216 | } |
217 | 217 | } |
218 | 218 | |
r17963 | r17964 | |
639 | 639 | READ32_MEMBER(model2_state::copro_fifo_r) |
640 | 640 | { |
641 | 641 | //logerror("copro_fifo_r: %08X, %08X\n", offset, mem_mask); |
642 | return copro_fifoout_pop( | |
642 | return copro_fifoout_pop(space); | |
643 | 643 | } |
644 | 644 | |
645 | 645 | WRITE32_MEMBER(model2_state::copro_fifo_w) |
r17963 | r17964 | |
963 | 963 | } |
964 | 964 | |
965 | 965 | |
966 | static int snd_68k_ready_r(address_space | |
966 | static int snd_68k_ready_r(address_space &space) | |
967 | 967 | { |
968 | int sr = space | |
968 | int sr = space.machine().device("audiocpu")->state().state_int(M68K_SR); | |
969 | 969 | |
970 | 970 | if ((sr & 0x0700) > 0x0100) |
971 | 971 | { |
972 | space | |
972 | space.device().execute().spin_until_time(attotime::from_usec(40)); | |
973 | 973 | return 0; // not ready yet, interrupts disabled |
974 | 974 | } |
975 | 975 | |
976 | 976 | return 0xff; |
977 | 977 | } |
978 | 978 | |
979 | static void snd_latch_to_68k_w(address_space | |
979 | static void snd_latch_to_68k_w(address_space &space, int data) | |
980 | 980 | { |
981 | model2_state *state = space | |
981 | model2_state *state = space.machine().driver_data<model2_state>(); | |
982 | 982 | if (!snd_68k_ready_r(space)) |
983 | 983 | { |
984 | space | |
984 | space.device().execute().spin_until_time(attotime::from_usec(40)); | |
985 | 985 | } |
986 | 986 | |
987 | 987 | state->m_to_68k = data; |
988 | 988 | |
989 | space | |
989 | space.machine().device("audiocpu")->execute().set_input_line(2, HOLD_LINE); | |
990 | 990 | |
991 | 991 | // give the 68k time to notice |
992 | space | |
992 | space.device().execute().spin_until_time(attotime::from_usec(40)); | |
993 | 993 | } |
994 | 994 | |
995 | 995 | READ32_MEMBER(model2_state::model2_serial_r) |
r17963 | r17964 | |
1006 | 1006 | { |
1007 | 1007 | if (mem_mask == 0x0000ffff) |
1008 | 1008 | { |
1009 | snd_latch_to_68k_w( | |
1009 | snd_latch_to_68k_w(space, data&0xff); | |
1010 | 1010 | } |
1011 | 1011 | } |
1012 | 1012 |
r17963 | r17964 | |
---|---|---|
692 | 692 | |
693 | 693 | static WRITE16_HANDLER( cps2_eeprom_port_w ) |
694 | 694 | { |
695 | cps_state *state = space | |
695 | cps_state *state = space.machine().driver_data<cps_state>(); | |
696 | 696 | |
697 | 697 | if (ACCESSING_BITS_8_15) |
698 | 698 | { |
r17963 | r17964 | |
724 | 724 | if (state->m_audiocpu != NULL) |
725 | 725 | state->m_audiocpu->set_input_line(INPUT_LINE_RESET, (data & 0x0008) ? CLEAR_LINE : ASSERT_LINE); |
726 | 726 | |
727 | coin_counter_w(space->machine(), 0, data & 0x0001); | |
728 | if ((strncmp(space->machine().system().name, "pzloop2", 8) == 0) || | |
729 | (strncmp(space->machine().system().name, "pzloop2j", 8) == 0) || | |
730 | (strncmp(space->machine().system().name, "pzloop2jr1", 8) == 0)) | |
727 | coin_counter_w(space.machine(), 0, data & 0x0001); | |
728 | if ((strncmp(space.machine().system().name, "pzloop2", 8) == 0) || | |
729 | (strncmp(space.machine().system().name, "pzloop2j", 8) == 0) || | |
730 | (strncmp(space.machine().system().name, "pzloop2jr1", 8) == 0)) | |
731 | 731 | { |
732 | 732 | // Puzz Loop 2 uses coin counter 2 input to switch between stick and paddle controls |
733 | 733 | state->m_readpaddle = data & 0x0002; |
734 | 734 | } |
735 | 735 | else |
736 | 736 | { |
737 | coin_counter_w(space | |
737 | coin_counter_w(space.machine(), 1, data & 0x0002); | |
738 | 738 | } |
739 | 739 | |
740 | if (strncmp(space | |
740 | if (strncmp(space.machine().system().name, "mmatrix", 7) == 0) // Mars Matrix seems to require the coin lockout bit to be reversed | |
741 | 741 | { |
742 | coin_lockout_w(space->machine(), 0, data & 0x0010); | |
743 | coin_lockout_w(space->machine(), 1, data & 0x0020); | |
744 | coin_lockout_w(space->machine(), 2, data & 0x0040); | |
745 | coin_lockout_w(space->machine(), 3, data & 0x0080); | |
742 | coin_lockout_w(space.machine(), 0, data & 0x0010); | |
743 | coin_lockout_w(space.machine(), 1, data & 0x0020); | |
744 | coin_lockout_w(space.machine(), 2, data & 0x0040); | |
745 | coin_lockout_w(space.machine(), 3, data & 0x0080); | |
746 | 746 | } |
747 | 747 | else |
748 | 748 | { |
749 | coin_lockout_w(space->machine(), 0, ~data & 0x0010); | |
750 | coin_lockout_w(space->machine(), 1, ~data & 0x0020); | |
751 | coin_lockout_w(space->machine(), 2, ~data & 0x0040); | |
752 | coin_lockout_w(space->machine(), 3, ~data & 0x0080); | |
749 | coin_lockout_w(space.machine(), 0, ~data & 0x0010); | |
750 | coin_lockout_w(space.machine(), 1, ~data & 0x0020); | |
751 | coin_lockout_w(space.machine(), 2, ~data & 0x0040); | |
752 | coin_lockout_w(space.machine(), 3, ~data & 0x0080); | |
753 | 753 | } |
754 | 754 | |
755 | 755 | /* |
756 | set_led_status(space->machine(), 0, data & 0x01); | |
757 | set_led_status(space->machine(), 1, data & 0x10); | |
758 | set_led_status(space->machine(), 2, data & 0x20); | |
756 | set_led_status(space.machine(), 0, data & 0x01); | |
757 | set_led_status(space.machine(), 1, data & 0x10); | |
758 | set_led_status(space.machine(), 2, data & 0x20); | |
759 | 759 | */ |
760 | 760 | } |
761 | 761 | } |
r17963 | r17964 | |
769 | 769 | |
770 | 770 | static READ16_HANDLER( cps2_qsound_volume_r ) |
771 | 771 | { |
772 | cps_state *state = space | |
772 | cps_state *state = space.machine().driver_data<cps_state>(); | |
773 | 773 | |
774 | 774 | /* Extra adapter memory (0x660000-0x663fff) available when bit 14 = 0 */ |
775 | 775 | /* Network adapter (ssf2tb) present when bit 15 = 0 */ |
r17963 | r17964 | |
795 | 795 | |
796 | 796 | static READ16_HANDLER( joy_or_paddle_r ) |
797 | 797 | { |
798 | cps_state *state = space | |
798 | cps_state *state = space.machine().driver_data<cps_state>(); | |
799 | 799 | |
800 | 800 | if (state->m_readpaddle != 0) |
801 | 801 | return (state->ioport("IN0")->read()); |
r17963 | r17964 | |
8147 | 8147 | |
8148 | 8148 | static READ16_HANDLER( gigaman2_dummyqsound_r ) |
8149 | 8149 | { |
8150 | cps_state *state = space | |
8150 | cps_state *state = space.machine().driver_data<cps_state>(); | |
8151 | 8151 | return state->m_gigaman2_dummyqsound_ram[offset]; |
8152 | 8152 | }; |
8153 | 8153 | |
8154 | 8154 | static WRITE16_HANDLER( gigaman2_dummyqsound_w ) |
8155 | 8155 | { |
8156 | cps_state *state = space | |
8156 | cps_state *state = space.machine().driver_data<cps_state>(); | |
8157 | 8157 | state->m_gigaman2_dummyqsound_ram[offset] = data; |
8158 | 8158 | }; |
8159 | 8159 | |
r17963 | r17964 | |
8176 | 8176 | |
8177 | 8177 | DRIVER_INIT_MEMBER(cps_state,gigaman2) |
8178 | 8178 | { |
8179 | address_space | |
8179 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
8180 | 8180 | UINT16 *rom = (UINT16 *)memregion("maincpu")->base(); |
8181 | 8181 | int length = memregion("maincpu")->bytes(); |
8182 | 8182 | |
r17963 | r17964 | |
8188 | 8188 | save_pointer(NAME(m_gigaman2_dummyqsound_ram), 0x20000 / 2); |
8189 | 8189 | |
8190 | 8190 | machine().device("maincpu")->memory().space(AS_PROGRAM)->install_legacy_readwrite_handler(0x618000, 0x619fff, FUNC(gigaman2_dummyqsound_r), FUNC(gigaman2_dummyqsound_w)); // no qsound.. |
8191 | space | |
8191 | space.set_decrypted_region(0x000000, (length) - 1, &rom[length/4]); | |
8192 | 8192 | m68k_set_encrypted_opcode_range(machine().device("maincpu"), 0, length); |
8193 | 8193 | } |
8194 | 8194 |
r17963 | r17964 | |
---|---|---|
1386 | 1386 | |
1387 | 1387 | MACHINE_RESET_MEMBER(namcos12_state,namcos12) |
1388 | 1388 | { |
1389 | address_space *space = machine().device("maincpu")->memory().space(AS_PROGRAM); | |
1390 | bankoffset_w(*space,0,0,0xffffffff); | |
1389 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
1390 | bankoffset_w(space,0,0,0xffffffff); | |
1391 | 1391 | |
1392 | space | |
1392 | space.install_write_handler(0x1f801000, 0x1f801003, write32_delegate(FUNC(namcos12_state::s12_dma_bias_w),this)); | |
1393 | 1393 | |
1394 | 1394 | m_has_tektagt_dma = 0; |
1395 | 1395 | |
r17963 | r17964 | |
1402 | 1402 | strcmp( machine().system().name, "tektagtja" ) == 0 ) |
1403 | 1403 | { |
1404 | 1404 | m_has_tektagt_dma = 1; |
1405 | space->install_readwrite_handler(0x1fb00000, 0x1fb00003, read32_delegate(FUNC(namcos12_state::tektagt_protection_1_r),this), write32_delegate(FUNC(namcos12_state::tektagt_protection_1_w),this)); | |
1406 | space->install_readwrite_handler(0x1fb80000, 0x1fb80003, read32_delegate(FUNC(namcos12_state::tektagt_protection_2_r),this), write32_delegate(FUNC(namcos12_state::tektagt_protection_2_w),this)); | |
1407 | space->install_read_handler(0x1f700000, 0x1f700003, read32_delegate(FUNC(namcos12_state::tektagt_protection_3_r),this)); | |
1405 | space.install_readwrite_handler(0x1fb00000, 0x1fb00003, read32_delegate(FUNC(namcos12_state::tektagt_protection_1_r),this), write32_delegate(FUNC(namcos12_state::tektagt_protection_1_w),this)); | |
1406 | space.install_readwrite_handler(0x1fb80000, 0x1fb80003, read32_delegate(FUNC(namcos12_state::tektagt_protection_2_r),this), write32_delegate(FUNC(namcos12_state::tektagt_protection_2_w),this)); | |
1407 | space.install_read_handler(0x1f700000, 0x1f700003, read32_delegate(FUNC(namcos12_state::tektagt_protection_3_r),this)); | |
1408 | 1408 | } |
1409 | 1409 | |
1410 | 1410 | if( strcmp( machine().system().name, "tektagt" ) == 0 || |
r17963 | r17964 | |
1430 | 1430 | strcmp( machine().system().name, "ghlpanic" ) == 0 ) |
1431 | 1431 | { |
1432 | 1432 | /* this is based on guesswork, it might not even be keycus. */ |
1433 | space->install_read_bank (0x1fc20280, 0x1fc2028b, "bank2" ); | |
1434 | space->install_write_handler(0x1f008000, 0x1f008003, write32_delegate(FUNC(namcos12_state::kcon_w),this)); | |
1435 | space->install_write_handler(0x1f018000, 0x1f018003, write32_delegate(FUNC(namcos12_state::kcoff_w),this)); | |
1433 | space.install_read_bank (0x1fc20280, 0x1fc2028b, "bank2" ); | |
1434 | space.install_write_handler(0x1f008000, 0x1f008003, write32_delegate(FUNC(namcos12_state::kcon_w),this)); | |
1435 | space.install_write_handler(0x1f018000, 0x1f018003, write32_delegate(FUNC(namcos12_state::kcoff_w),this)); | |
1436 | 1436 | |
1437 | 1437 | memset( m_kcram, 0, sizeof( m_kcram ) ); |
1438 | 1438 | membank( "bank2" )->set_base( m_kcram ); |
r17963 | r17964 | |
---|---|---|
283 | 283 | |
284 | 284 | else |
285 | 285 | { |
286 | return 0x7b; //fake status read (instead HD63484_status_r( | |
286 | return 0x7b; //fake status read (instead HD63484_status_r(space, 0, 0xff); ) | |
287 | 287 | } |
288 | 288 | } |
289 | 289 |
r17963 | r17964 | |
---|---|---|
524 | 524 | } |
525 | 525 | |
526 | 526 | static UINT16 |
527 | ReadWordFromSlaveInput( address_space | |
527 | ReadWordFromSlaveInput( address_space &space ) | |
528 | 528 | { |
529 | namcos21_state *state = space | |
529 | namcos21_state *state = space.machine().driver_data<namcos21_state>(); | |
530 | 530 | UINT16 data = 0; |
531 | 531 | if( state->m_mpDspState->slaveBytesAvailable>0 ) |
532 | 532 | { |
r17963 | r17964 | |
537 | 537 | { |
538 | 538 | state->m_mpDspState->slaveBytesAdvertised--; |
539 | 539 | } |
540 | if (ENABLE_LOGGING) logerror( "%s:-%04x(0x%04x)\n", space | |
540 | if (ENABLE_LOGGING) logerror( "%s:-%04x(0x%04x)\n", space.machine().describe_context(), data, state->m_mpDspState->slaveBytesAvailable ); | |
541 | 541 | } |
542 | 542 | return data; |
543 | 543 | } /* ReadWordFromSlaveInput */ |
r17963 | r17964 | |
853 | 853 | |
854 | 854 | READ16_MEMBER(namcos21_state::slave_port0_r) |
855 | 855 | { |
856 | return ReadWordFromSlaveInput( | |
856 | return ReadWordFromSlaveInput(space); | |
857 | 857 | } /* slave_port0_r */ |
858 | 858 | |
859 | 859 | WRITE16_MEMBER(namcos21_state::slave_port0_w) |
r17963 | r17964 | |
---|---|---|
303 | 303 | |
304 | 304 | READ32_MEMBER( beathead_state::sound_data_r ) |
305 | 305 | { |
306 | return atarigen_sound_r( | |
306 | return atarigen_sound_r(space, offset, 0xffff); | |
307 | 307 | } |
308 | 308 | |
309 | 309 | |
310 | 310 | WRITE32_MEMBER( beathead_state::sound_data_w ) |
311 | 311 | { |
312 | 312 | if (ACCESSING_BITS_0_7) |
313 | atarigen_sound_w( | |
313 | atarigen_sound_w(space, offset, data, mem_mask); | |
314 | 314 | } |
315 | 315 | |
316 | 316 |
r17963 | r17964 | |
---|---|---|
270 | 270 | |
271 | 271 | //popmessage("%08x %02x",((data & 0x3f) * 0x4000),data); |
272 | 272 | |
273 | // mame_printf_debug("ROM_BANK 0x8000 - %X @%X\n",data,space | |
273 | // mame_printf_debug("ROM_BANK 0x8000 - %X @%X\n",data,space.device().safe_pcbase()); | |
274 | 274 | membank("bank2")->set_base(region_base + (data&0x3f ) * 0x4000); |
275 | 275 | |
276 | 276 | m_msm_nmi_mask = data & 0x40; |
r17963 | r17964 | |
---|---|---|
260 | 260 | |
261 | 261 | void su2000_state::machine_start() |
262 | 262 | { |
263 | address_space | |
263 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
264 | 264 | |
265 | 265 | m_pit8254 = machine().device("pit8254"); |
266 | 266 | m_pic8259_1 = machine().device("pic8259_1"); |
r17963 | r17964 | |
276 | 276 | |
277 | 277 | /* HMA */ |
278 | 278 | offs_t ram_limit = 0x100000 + PC_RAM_SIZE - 0x0a0000; |
279 | space->install_read_bank(0x100000, ram_limit - 1, "hma_bank"); | |
280 | space->install_write_bank(0x100000, ram_limit - 1, "hma_bank"); | |
279 | space.install_read_bank(0x100000, ram_limit - 1, "hma_bank"); | |
280 | space.install_write_bank(0x100000, ram_limit - 1, "hma_bank"); | |
281 | 281 | membank("hma_bank")->set_base(m_pc_ram + 0xa0000); |
282 | 282 | |
283 | 283 | machine().device("maincpu")->execute().set_irq_acknowledge_callback(pc_irq_callback); |
r17963 | r17964 | |
287 | 287 | kbdc8042_init(machine(), &at8042); |
288 | 288 | |
289 | 289 | pc_vga_init(machine(), vga_setting, NULL); |
290 | pc_vga_io_init(machine(), machine().device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, machine().device("maincpu")->memory().space(AS_IO), 0x0000); | |
290 | pc_vga_io_init(machine(), *machine().device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, *machine().device("maincpu")->memory().space(AS_IO), 0x0000); | |
291 | 291 | } |
292 | 292 | |
293 | 293 | void su2000_state::machine_reset() |
r17963 | r17964 | |
---|---|---|
75 | 75 | { |
76 | 76 | |
77 | 77 | // mame_printf_debug("gaelco_vram_encrypted_w!!\n"); |
78 | data = gaelco_decrypt( | |
78 | data = gaelco_decrypt(space, offset, data, 0x0f, 0x4228); | |
79 | 79 | COMBINE_DATA(&m_videoram[offset]); |
80 | 80 | |
81 | 81 | m_tilemap[offset >> 11]->mark_tile_dirty(((offset << 1) & 0x0fff) >> 2); |
r17963 | r17964 | |
86 | 86 | { |
87 | 87 | |
88 | 88 | // mame_printf_debug("gaelco_encrypted_w!!\n"); |
89 | data = gaelco_decrypt( | |
89 | data = gaelco_decrypt(space, offset, data, 0x0f, 0x4228); | |
90 | 90 | COMBINE_DATA(&m_screen[offset]); |
91 | 91 | } |
92 | 92 | |
r17963 | r17964 | |
96 | 96 | { |
97 | 97 | |
98 | 98 | // mame_printf_debug("gaelco_vram_encrypted_w!!\n"); |
99 | data = gaelco_decrypt( | |
99 | data = gaelco_decrypt(space, offset, data, 0x0e, 0x4228); | |
100 | 100 | COMBINE_DATA(&m_videoram[offset]); |
101 | 101 | |
102 | 102 | m_tilemap[offset >> 11]->mark_tile_dirty(((offset << 1) & 0x0fff) >> 2); |
r17963 | r17964 | |
106 | 106 | { |
107 | 107 | |
108 | 108 | // mame_printf_debug("gaelco_encrypted_w!!\n"); |
109 | data = gaelco_decrypt( | |
109 | data = gaelco_decrypt(space, offset, data, 0x0e, 0x4228); | |
110 | 110 | COMBINE_DATA(&m_screen[offset]); |
111 | 111 | } |
112 | 112 |
r17963 | r17964 | |
---|---|---|
801 | 801 | m_bios_ram = auto_alloc_array(machine(), UINT32, 0x20000/4); |
802 | 802 | |
803 | 803 | pc_vga_init(machine(), vga_setting, NULL); |
804 | pc_svga_trident_io_init(machine(), machine().device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, machine().device("maincpu")->memory().space(AS_IO), 0x0000); | |
804 | pc_svga_trident_io_init(machine(), *machine().device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, *machine().device("maincpu")->memory().space(AS_IO), 0x0000); | |
805 | 805 | init_pc_common(machine(), PCCOMMON_KEYBOARD_AT, voyager_set_keyb_int); |
806 | 806 | |
807 | 807 | intel82439tx_init(machine()); |
r17963 | r17964 | |
---|---|---|
143 | 143 | |
144 | 144 | /* |
145 | 145 | { |
146 | UINT8 *ROM = space | |
146 | UINT8 *ROM = space.machine().root_device().memregion("maincpu")->base(); | |
147 | 147 | UINT32 bankaddress; |
148 | 148 | |
149 | 149 | bankaddress = 0x10000 + (0x10000 * (data & 0x03)); |
150 | space | |
150 | space.machine().root_device().membank("bank1")->set_base(&ROM[bankaddress]); | |
151 | 151 | } |
152 | 152 | */ |
153 | 153 |
r17963 | r17964 | |
---|---|---|
1125 | 1125 | |
1126 | 1126 | DRIVER_INIT_MEMBER(freekick_state,gigasb) |
1127 | 1127 | { |
1128 | address_space *space = machine().device("maincpu")->memory().space(AS_PROGRAM); | |
1129 | space->set_decrypted_region(0x0000, 0xbfff, machine().root_device().memregion("maincpu")->base() + 0x10000); | |
1128 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
1129 | space.set_decrypted_region(0x0000, 0xbfff, machine().root_device().memregion("maincpu")->base() + 0x10000); | |
1130 | 1130 | } |
1131 | 1131 | |
1132 | 1132 |
r17963 | r17964 | |
---|---|---|
27 | 27 | |
28 | 28 | static WRITE8_HANDLER( irqack_w ) |
29 | 29 | { |
30 | ladybug_state *state = space | |
30 | ladybug_state *state = space.machine().driver_data<ladybug_state>(); | |
31 | 31 | state->m_maincpu->set_input_line(0, CLEAR_LINE); |
32 | 32 | } |
33 | 33 |
r17963 | r17964 | |
---|---|---|
243 | 243 | WRITE8_MEMBER(vicdual_state::depthch_io_w) |
244 | 244 | { |
245 | 245 | if (offset & 0x01) assert_coin_status(machine()); |
246 | if (offset & 0x04) depthch_audio_w( | |
246 | if (offset & 0x04) depthch_audio_w(space, 0, data); | |
247 | 247 | } |
248 | 248 | |
249 | 249 | |
r17963 | r17964 | |
409 | 409 | WRITE8_MEMBER(vicdual_state::frogs_io_w) |
410 | 410 | { |
411 | 411 | if (offset & 0x01) assert_coin_status(machine()); |
412 | if (offset & 0x02) frogs_audio_w( | |
412 | if (offset & 0x02) frogs_audio_w(space, 0, data); | |
413 | 413 | } |
414 | 414 | |
415 | 415 | |
r17963 | r17964 | |
529 | 529 | WRITE8_MEMBER(vicdual_state::headon_io_w) |
530 | 530 | { |
531 | 531 | if (offset & 0x01) assert_coin_status(machine()); |
532 | if (offset & 0x02) headon_audio_w( | |
532 | if (offset & 0x02) headon_audio_w(space, 0, data); | |
533 | 533 | if (offset & 0x04) { /* vicdual_palette_bank_w(0, data) */ } /* not written to */ |
534 | 534 | } |
535 | 535 | |
r17963 | r17964 | |
730 | 730 | WRITE8_MEMBER(vicdual_state::headon2_io_w) |
731 | 731 | { |
732 | 732 | if (offset & 0x01) assert_coin_status(machine()); |
733 | if (offset & 0x02) headon_audio_w( | |
733 | if (offset & 0x02) headon_audio_w(space, 0, data); | |
734 | 734 | if (offset & 0x04) vicdual_palette_bank_w(space, 0, data); |
735 | 735 | if (offset & 0x08) { /* schematics show this as going into a shifer circuit, but never written to */ } |
736 | 736 | if (offset & 0x10) { /* schematics show this as going to an edge connector, but never written to */ } |
r17963 | r17964 | |
943 | 943 | |
944 | 944 | WRITE8_MEMBER(vicdual_state::invho2_io_w) |
945 | 945 | { |
946 | if (offset & 0x01) invho2_audio_w(&space, 0, data); | |
947 | if (offset & 0x02) invinco_audio_w(&space, 0, data); | |
946 | if (offset & 0x01) invho2_audio_w(space, 0, data); | |
947 | if (offset & 0x02) invinco_audio_w(space, 0, data); | |
948 | 948 | if (offset & 0x08) assert_coin_status(machine()); |
949 | 949 | if (offset & 0x40) vicdual_palette_bank_w(space, 0, data); |
950 | 950 | } |
r17963 | r17964 | |
952 | 952 | |
953 | 953 | WRITE8_MEMBER(vicdual_state::invds_io_w) |
954 | 954 | { |
955 | if (offset & 0x01) invinco_audio_w( | |
955 | if (offset & 0x01) invinco_audio_w(space, 0, data); | |
956 | 956 | if (offset & 0x02) { /* deepscan_audio_w(0, data) */ } |
957 | 957 | if (offset & 0x08) assert_coin_status(machine()); |
958 | 958 | if (offset & 0x40) vicdual_palette_bank_w(space, 0, data); |
r17963 | r17964 | |
961 | 961 | |
962 | 962 | WRITE8_MEMBER(vicdual_state::sspacaho_io_w) |
963 | 963 | { |
964 | if (offset & 0x01) invho2_audio_w(&space, 0, data); | |
965 | if (offset & 0x02) { /* s&spaceatt_audio_w(&space, 0, data) */ } | |
964 | if (offset & 0x01) invho2_audio_w(space, 0, data); | |
965 | if (offset & 0x02) { /* s&spaceatt_audio_w(space, 0, data) */ } | |
966 | 966 | if (offset & 0x08) assert_coin_status(machine()); |
967 | 967 | if (offset & 0x40) vicdual_palette_bank_w(space, 0, data); |
968 | 968 | } |
r17963 | r17964 | |
970 | 970 | |
971 | 971 | WRITE8_MEMBER(vicdual_state::tranqgun_io_w) |
972 | 972 | { |
973 | if (offset & 0x01) { /* tranqgun_audio_w( | |
973 | if (offset & 0x01) { /* tranqgun_audio_w(space, 0, data) */ } | |
974 | 974 | if (offset & 0x02) vicdual_palette_bank_w(space, 0, data); |
975 | 975 | if (offset & 0x08) assert_coin_status(machine()); |
976 | 976 | } |
r17963 | r17964 | |
978 | 978 | |
979 | 979 | WRITE8_MEMBER(vicdual_state::spacetrk_io_w) |
980 | 980 | { |
981 | if (offset & 0x01) { /* &spacetrk_audio_w(&space, 0, data) */ } | |
982 | if (offset & 0x02) { /* &spacetrk_audio_w(&space, 0, data) */ } | |
981 | if (offset & 0x01) { /* &spacetrk_audio_w(space, 0, data) */ } | |
982 | if (offset & 0x02) { /* &spacetrk_audio_w(space, 0, data) */ } | |
983 | 983 | if (offset & 0x08) assert_coin_status(machine()); |
984 | 984 | if (offset & 0x40) vicdual_palette_bank_w(space, 0, data); |
985 | 985 | } |
r17963 | r17964 | |
987 | 987 | |
988 | 988 | WRITE8_MEMBER(vicdual_state::carnival_io_w) |
989 | 989 | { |
990 | if (offset & 0x01) carnival_audio_1_w(&space, 0, data); | |
991 | if (offset & 0x02) carnival_audio_2_w(&space, 0, data); | |
990 | if (offset & 0x01) carnival_audio_1_w(space, 0, data); | |
991 | if (offset & 0x02) carnival_audio_2_w(space, 0, data); | |
992 | 992 | if (offset & 0x08) assert_coin_status(machine()); |
993 | 993 | if (offset & 0x40) vicdual_palette_bank_w(space, 0, data); |
994 | 994 | } |
r17963 | r17964 | |
996 | 996 | |
997 | 997 | WRITE8_MEMBER(vicdual_state::brdrline_io_w) |
998 | 998 | { |
999 | if (offset & 0x01) { /* brdrline_audio_w( | |
999 | if (offset & 0x01) { /* brdrline_audio_w(space, 0, data) */ } | |
1000 | 1000 | if (offset & 0x02) vicdual_palette_bank_w(space, 0, data); |
1001 | 1001 | if (offset & 0x08) assert_coin_status(machine()); |
1002 | 1002 | } |
r17963 | r17964 | |
1004 | 1004 | |
1005 | 1005 | WRITE8_MEMBER(vicdual_state::pulsar_io_w) |
1006 | 1006 | { |
1007 | if (offset & 0x01) pulsar_audio_1_w(&space, 0, data); | |
1008 | if (offset & 0x02) pulsar_audio_2_w(&space, 0, data); | |
1007 | if (offset & 0x01) pulsar_audio_1_w(space, 0, data); | |
1008 | if (offset & 0x02) pulsar_audio_2_w(space, 0, data); | |
1009 | 1009 | if (offset & 0x08) assert_coin_status(machine()); |
1010 | 1010 | if (offset & 0x40) vicdual_palette_bank_w(space, 0, data); |
1011 | 1011 | } |
r17963 | r17964 | |
2273 | 2273 | WRITE8_MEMBER(vicdual_state::invinco_io_w) |
2274 | 2274 | { |
2275 | 2275 | if (offset & 0x01) assert_coin_status(machine()); |
2276 | if (offset & 0x02) invinco_audio_w( | |
2276 | if (offset & 0x02) invinco_audio_w(space, 0, data); | |
2277 | 2277 | if (offset & 0x04) vicdual_palette_bank_w(space, 0, data); |
2278 | 2278 | } |
2279 | 2279 |
r17963 | r17964 | |
---|---|---|
133 | 133 | static void update_irq_state( running_machine &machine ) |
134 | 134 | { |
135 | 135 | metro_state *state = machine.driver_data<metro_state>(); |
136 | address_space | |
136 | address_space &space = *state->m_maincpu->space(AS_PROGRAM); | |
137 | 137 | |
138 | 138 | /* Get the pending IRQs (only the enabled ones, e.g. where irq_enable is *0*) */ |
139 | UINT16 irq = state->metro_irq_cause_r( | |
139 | UINT16 irq = state->metro_irq_cause_r(space, 0, 0xffff) & ~*state->m_irq_enable; | |
140 | 140 | |
141 | 141 | if (state->m_irq_line == -1) /* mouja, gakusai, gakusai2, dokyusei, dokyusp */ |
142 | 142 | { |
r17963 | r17964 | |
266 | 266 | static int metro_io_callback( device_t *device, int ioline, int state ) |
267 | 267 | { |
268 | 268 | metro_state *driver_state = device->machine().driver_data<metro_state>(); |
269 | address_space | |
269 | address_space &space = *driver_state->m_maincpu->space(AS_PROGRAM); | |
270 | 270 | UINT8 data = 0; |
271 | 271 | |
272 | 272 | switch (ioline) |
273 | 273 | { |
274 | 274 | case UPD7810_RXD: /* read the RxD line */ |
275 | data = driver_state->soundlatch_byte_r( | |
275 | data = driver_state->soundlatch_byte_r(space, 0); | |
276 | 276 | state = data & 1; |
277 | driver_state->soundlatch_byte_w( | |
277 | driver_state->soundlatch_byte_w(space, 0, data >> 1); | |
278 | 278 | break; |
279 | 279 | default: |
280 | 280 | logerror("upd7810 ioline %d not handled\n", ioline); |
r17963 | r17964 | |
580 | 580 | return ROM[offs]; |
581 | 581 | } |
582 | 582 | |
583 | void metro_state::blt_write( address_space | |
583 | void metro_state::blt_write( address_space &space, const int tmap, const offs_t offs, const UINT16 data, const UINT16 mask ) | |
584 | 584 | { |
585 | 585 | switch(tmap) |
586 | 586 | { |
587 | case 1: metro_vram_0_w(*space, offs, data, mask); break; | |
588 | case 2: metro_vram_1_w(*space, offs, data, mask); break; | |
589 | case 3: metro_vram_2_w(*space, offs, data, mask); break; | |
587 | case 1: metro_vram_0_w(space, offs, data, mask); break; | |
588 | case 2: metro_vram_1_w(space, offs, data, mask); break; | |
589 | case 3: metro_vram_2_w(space, offs, data, mask); break; | |
590 | 590 | } |
591 | // logerror("%s : Blitter %X] %04X <- %04X & %04X\n", space | |
591 | // logerror("%s : Blitter %X] %04X <- %04X & %04X\n", space.machine().describe_context(), tmap, offs, data, mask); | |
592 | 592 | } |
593 | 593 | |
594 | 594 | |
r17963 | r17964 | |
655 | 655 | src_offs++; |
656 | 656 | |
657 | 657 | dst_offs &= 0xffff; |
658 | blt_write( | |
658 | blt_write(space, tmap, dst_offs, b2, mask); | |
659 | 659 | dst_offs = ((dst_offs + 1) & (0x100 - 1)) | (dst_offs & (~(0x100 - 1))); |
660 | 660 | } |
661 | 661 | break; |
r17963 | r17964 | |
669 | 669 | while (count--) |
670 | 670 | { |
671 | 671 | dst_offs &= 0xffff; |
672 | blt_write( | |
672 | blt_write(space, tmap, dst_offs, b2 << shift, mask); | |
673 | 673 | dst_offs = ((dst_offs + 1) & (0x100 - 1)) | (dst_offs & (~(0x100 - 1))); |
674 | 674 | b2++; |
675 | 675 | } |
r17963 | r17964 | |
684 | 684 | while (count--) |
685 | 685 | { |
686 | 686 | dst_offs &= 0xffff; |
687 | blt_write( | |
687 | blt_write(space, tmap, dst_offs, b2, mask); | |
688 | 688 | dst_offs = ((dst_offs + 1) & (0x100 - 1)) | (dst_offs & (~(0x100 - 1))); |
689 | 689 | } |
690 | 690 | break; |
r17963 | r17964 | |
5945 | 5945 | |
5946 | 5946 | DRIVER_INIT_MEMBER(metro_state,metro) |
5947 | 5947 | { |
5948 | address_space | |
5948 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
5949 | 5949 | |
5950 | 5950 | metro_common(machine()); |
5951 | 5951 | |
5952 | 5952 | m_porta = 0x00; |
5953 | 5953 | m_portb = 0x00; |
5954 | 5954 | m_busy_sndcpu = 0; |
5955 | metro_sound_rombank_w( | |
5955 | metro_sound_rombank_w(space, 0, 0x00); | |
5956 | 5956 | } |
5957 | 5957 | |
5958 | 5958 | DRIVER_INIT_MEMBER(metro_state,karatour) |
r17963 | r17964 | |
5972 | 5972 | |
5973 | 5973 | DRIVER_INIT_MEMBER(metro_state,daitorid) |
5974 | 5974 | { |
5975 | address_space | |
5975 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
5976 | 5976 | |
5977 | 5977 | metro_common(machine()); |
5978 | 5978 | |
5979 | 5979 | m_porta = 0x00; |
5980 | 5980 | m_portb = 0x00; |
5981 | 5981 | m_busy_sndcpu = 0; |
5982 | daitorid_sound_rombank_w( | |
5982 | daitorid_sound_rombank_w(space, 0, 0x00); | |
5983 | 5983 | } |
5984 | 5984 | |
5985 | 5985 |
r17963 | r17964 | |
---|---|---|
218 | 218 | */ |
219 | 219 | |
220 | 220 | { |
221 | address_space *space = machine().device("maincpu")->memory().space(AS_PROGRAM); | |
222 | space->nop_write(0x200000, 0x201fff); | |
221 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
222 | space.nop_write(0x200000, 0x201fff); | |
223 | 223 | } |
224 | 224 | |
225 | 225 | DRIVER_INIT_CALL(megadriv); |
r17963 | r17964 | |
---|---|---|
125 | 125 | bit 8 = ??? |
126 | 126 | bit 9 = ??? |
127 | 127 | */ |
128 | eolith_speedup_read( | |
128 | eolith_speedup_read(space); | |
129 | 129 | |
130 | 130 | return (ioport("IN0")->read() & ~0x300) | (machine().rand() & 0x300); |
131 | 131 | } |
r17963 | r17964 | |
---|---|---|
619 | 619 | */ |
620 | 620 | |
621 | 621 | /* jamtable disassembler */ |
622 | static void jamtable_disasm(running_machine &machine, address_space | |
622 | static void jamtable_disasm(running_machine &machine, address_space &space,UINT32 address,UINT32 size) // 0xff000080 == fff00080 | |
623 | 623 | { |
624 | 624 | offs_t base,addr; |
625 | 625 | UINT32 opcode,op1,op2; |
r17963 | r17964 | |
636 | 636 | while (1) |
637 | 637 | { |
638 | 638 | base=addr; |
639 | opcode=space | |
639 | opcode=space.read_byte(addr); | |
640 | 640 | addr++; |
641 | op1=space | |
641 | op1=space.read_dword_unaligned(addr); | |
642 | 642 | addr+=4; |
643 | op2=space | |
643 | op2=space.read_dword_unaligned(addr); | |
644 | 644 | addr+=4; |
645 | 645 | if (opcode == 0xe1) |
646 | 646 | { |
r17963 | r17964 | |
717 | 717 | |
718 | 718 | static void jamtable_disasm_command(running_machine &machine, int ref, int params, const char **param) |
719 | 719 | { |
720 | address_space | |
720 | address_space &space=*machine.firstcpu->space(); | |
721 | 721 | UINT64 addr,size; |
722 | 722 | |
723 | 723 | if (params < 2) |
r17963 | r17964 | |
731 | 731 | |
732 | 732 | static void dump_string_command(running_machine &machine, int ref, int params, const char **param) |
733 | 733 | { |
734 | address_space | |
734 | address_space &space=*machine.firstcpu->space(); | |
735 | 735 | UINT64 addr; |
736 | 736 | offs_t address; |
737 | 737 | UINT32 length,maximumlength; |
r17963 | r17964 | |
747 | 747 | debug_console_printf(machine,"Address is unmapped.\n"); |
748 | 748 | return; |
749 | 749 | } |
750 | length=space->read_word_unaligned(address); | |
751 | maximumlength=space->read_word_unaligned(address+2); | |
752 | buffer=space->read_dword_unaligned(address+4); | |
750 | length=space.read_word_unaligned(address); | |
751 | maximumlength=space.read_word_unaligned(address+2); | |
752 | buffer=space.read_dword_unaligned(address+4); | |
753 | 753 | debug_console_printf(machine,"Length %d word\n",length); |
754 | 754 | debug_console_printf(machine,"MaximumLength %d word\n",maximumlength); |
755 | 755 | debug_console_printf(machine,"Buffer %08X byte* ",buffer); |
r17963 | r17964 | |
762 | 762 | length=256; |
763 | 763 | for (int a=0;a < length;a++) |
764 | 764 | { |
765 | UINT8 c=space | |
765 | UINT8 c=space.read_byte(buffer+a); | |
766 | 766 | debug_console_printf(machine,"%c",c); |
767 | 767 | } |
768 | 768 | debug_console_printf(machine,"\n"); |
r17963 | r17964 | |
770 | 770 | |
771 | 771 | static void dump_process_command(running_machine &machine, int ref, int params, const char **param) |
772 | 772 | { |
773 | address_space | |
773 | address_space &space=*machine.firstcpu->space(); | |
774 | 774 | UINT64 addr; |
775 | 775 | offs_t address; |
776 | 776 | |
r17963 | r17964 | |
784 | 784 | debug_console_printf(machine,"Address is unmapped.\n"); |
785 | 785 | return; |
786 | 786 | } |
787 | debug_console_printf(machine,"ReadyListHead {%08X,%08X} _LIST_ENTRY\n",space->read_dword_unaligned(address),space->read_dword_unaligned(address+4)); | |
788 | debug_console_printf(machine,"ThreadListHead {%08X,%08X} _LIST_ENTRY\n",space->read_dword_unaligned(address+8),space->read_dword_unaligned(address+12)); | |
789 | debug_console_printf(machine,"StackCount %d dword\n",space->read_dword_unaligned(address+16)); | |
790 | debug_console_printf(machine,"ThreadQuantum %d dword\n",space->read_dword_unaligned(address+20)); | |
791 | debug_console_printf(machine,"BasePriority %d byte\n",space->read_byte(address+24)); | |
792 | debug_console_printf(machine,"DisableBoost %d byte\n",space->read_byte(address+25)); | |
793 | debug_console_printf(machine,"DisableQuantum %d byte\n",space->read_byte(address+26)); | |
794 | debug_console_printf(machine,"_padding %d byte\n",space->read_byte(address+27)); | |
787 | debug_console_printf(machine,"ReadyListHead {%08X,%08X} _LIST_ENTRY\n",space.read_dword_unaligned(address),space.read_dword_unaligned(address+4)); | |
788 | debug_console_printf(machine,"ThreadListHead {%08X,%08X} _LIST_ENTRY\n",space.read_dword_unaligned(address+8),space.read_dword_unaligned(address+12)); | |
789 | debug_console_printf(machine,"StackCount %d dword\n",space.read_dword_unaligned(address+16)); | |
790 | debug_console_printf(machine,"ThreadQuantum %d dword\n",space.read_dword_unaligned(address+20)); | |
791 | debug_console_printf(machine,"BasePriority %d byte\n",space.read_byte(address+24)); | |
792 | debug_console_printf(machine,"DisableBoost %d byte\n",space.read_byte(address+25)); | |
793 | debug_console_printf(machine,"DisableQuantum %d byte\n",space.read_byte(address+26)); | |
794 | debug_console_printf(machine,"_padding %d byte\n",space.read_byte(address+27)); | |
795 | 795 | } |
796 | 796 | |
797 | 797 | static void dump_list_command(running_machine &machine, int ref, int params, const char **param) |
798 | 798 | { |
799 | address_space | |
799 | address_space &space=*machine.firstcpu->space(); | |
800 | 800 | UINT64 addr,offs,start,old; |
801 | 801 | offs_t address,offset; |
802 | 802 | |
r17963 | r17964 | |
830 | 830 | else |
831 | 831 | debug_console_printf(machine,"%08X\n",(UINT32)addr); |
832 | 832 | old=addr; |
833 | addr=space | |
833 | addr=space.read_dword_unaligned(address); | |
834 | 834 | if (addr == start) |
835 | 835 | break; |
836 | 836 | if (addr == old) |
r17963 | r17964 | |
---|---|---|
2128 | 2128 | render.count[render.cur]++; |
2129 | 2129 | } |
2130 | 2130 | |
2131 | static void p3d_dma(address_space | |
2131 | static void p3d_dma(address_space &space, UINT32 adr, UINT32 size) | |
2132 | 2132 | { |
2133 | namcos23_state *state = space | |
2133 | namcos23_state *state = space.machine().driver_data<namcos23_state>(); | |
2134 | 2134 | UINT16 buffer[256]; |
2135 | 2135 | adr &= 0x1fffffff; |
2136 | 2136 | int pos = 0; |
2137 | 2137 | while(pos < size) { |
2138 | UINT16 h = space | |
2138 | UINT16 h = space.read_word(adr+pos); | |
2139 | 2139 | |
2140 | 2140 | pos += 2; |
2141 | 2141 | |
r17963 | r17964 | |
2155 | 2155 | } |
2156 | 2156 | |
2157 | 2157 | for(int i=0; i < psize; i++) { |
2158 | buffer[i] = space | |
2158 | buffer[i] = space.read_word(adr+pos); | |
2159 | 2159 | pos += 2; |
2160 | 2160 | } |
2161 | 2161 | |
r17963 | r17964 | |
2199 | 2199 | case 0x8: COMBINE_DATA(&m_p3d_size); return; |
2200 | 2200 | case 0x9: |
2201 | 2201 | if(data & 1) |
2202 | p3d_dma( | |
2202 | p3d_dma(space, m_p3d_address, m_p3d_size); | |
2203 | 2203 | return; |
2204 | 2204 | case 0x17: |
2205 | 2205 | machine().device("maincpu")->execute().set_input_line(MIPS3_IRQ1, CLEAR_LINE); |
r17963 | r17964 | |
---|---|---|
511 | 511 | |
512 | 512 | DRIVER_INIT_MEMBER(commando_state,commando) |
513 | 513 | { |
514 | address_space | |
514 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
515 | 515 | UINT8 *rom = machine().root_device().memregion("maincpu")->base(); |
516 | 516 | UINT8 *decrypt = auto_alloc_array(machine(), UINT8, 0xc000); |
517 | 517 | int A; |
518 | 518 | |
519 | space | |
519 | space.set_decrypted_region(0x0000, 0xbfff, decrypt); | |
520 | 520 | |
521 | 521 | // the first opcode is *not* encrypted |
522 | 522 | decrypt[0] = rom[0]; |
r17963 | r17964 | |
531 | 531 | |
532 | 532 | DRIVER_INIT_MEMBER(commando_state,spaceinv) |
533 | 533 | { |
534 | address_space | |
534 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
535 | 535 | UINT8 *rom = machine().root_device().memregion("maincpu")->base(); |
536 | 536 | UINT8 *decrypt = auto_alloc_array(machine(), UINT8, 0xc000); |
537 | 537 | int A; |
538 | 538 | |
539 | space | |
539 | space.set_decrypted_region(0x0000, 0xbfff, decrypt); | |
540 | 540 | |
541 | 541 | // the first opcode *is* encrypted |
542 | 542 | for (A = 0; A < 0xc000; A++) |
r17963 | r17964 | |
---|---|---|
341 | 341 | |
342 | 342 | static void bankselect_postload(running_machine &machine) |
343 | 343 | { |
344 | address_space | |
344 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
345 | 345 | atarisy2_state *state = machine.driver_data<atarisy2_state>(); |
346 | 346 | |
347 | state->bankselect_w(*space, 0, state->m_bankselect[0], 0xffff); | |
348 | state->bankselect_w(*space, 1, state->m_bankselect[1], 0xffff); | |
347 | state->bankselect_w(space, 0, state->m_bankselect[0], 0xffff); | |
348 | state->bankselect_w(space, 1, state->m_bankselect[1], 0xffff); | |
349 | 349 | } |
350 | 350 | |
351 | 351 | |
r17963 | r17964 | |
725 | 725 | atarigen_update_interrupts(machine()); |
726 | 726 | |
727 | 727 | /* handle it normally otherwise */ |
728 | return atarigen_sound_r( | |
728 | return atarigen_sound_r(space,offset,0xffff); | |
729 | 729 | } |
730 | 730 | |
731 | 731 | |
r17963 | r17964 | |
737 | 737 | atarigen_update_interrupts(machine()); |
738 | 738 | |
739 | 739 | /* handle it normally otherwise */ |
740 | atarigen_6502_sound_w( | |
740 | atarigen_6502_sound_w(space, offset, data); | |
741 | 741 | } |
742 | 742 | |
743 | 743 | |
r17963 | r17964 | |
749 | 749 | atarigen_update_interrupts(machine()); |
750 | 750 | |
751 | 751 | /* handle it normally otherwise */ |
752 | return atarigen_6502_sound_r( | |
752 | return atarigen_6502_sound_r(space, offset); | |
753 | 753 | } |
754 | 754 | |
755 | 755 |
r17963 | r17964 | |
---|---|---|
1469 | 1469 | |
1470 | 1470 | DRIVER_INIT_MEMBER(ninjakd2_state,bootleg) |
1471 | 1471 | { |
1472 | address_space *space = machine().device("soundcpu")->memory().space(AS_PROGRAM); | |
1473 | space->set_decrypted_region(0x0000, 0x7fff, machine().root_device().memregion("soundcpu")->base() + 0x10000); | |
1472 | address_space &space = *machine().device("soundcpu")->memory().space(AS_PROGRAM); | |
1473 | space.set_decrypted_region(0x0000, 0x7fff, machine().root_device().memregion("soundcpu")->base() + 0x10000); | |
1474 | 1474 | |
1475 | 1475 | gfx_unscramble(machine()); |
1476 | 1476 | } |
r17963 | r17964 | |
---|---|---|
180 | 180 | |
181 | 181 | void spacefb_state::machine_reset() |
182 | 182 | { |
183 | address_space | |
183 | address_space &space = *machine().device("maincpu")->memory().space(AS_IO); | |
184 | 184 | /* the 3 output ports are cleared on reset */ |
185 | spacefb_port_0_w(*space, 0, 0); | |
186 | spacefb_port_1_w(*space, 0, 0); | |
187 | spacefb_port_2_w(*space, 0, 0); | |
185 | spacefb_port_0_w(space, 0, 0); | |
186 | spacefb_port_1_w(space, 0, 0); | |
187 | spacefb_port_2_w(space, 0, 0); | |
188 | 188 | |
189 | 189 | start_interrupt_timer(machine()); |
190 | 190 | } |
r17963 | r17964 | |
---|---|---|
1346 | 1346 | |
1347 | 1347 | static void sound_cpu_decrypt(running_machine &machine) |
1348 | 1348 | { |
1349 | address_space | |
1349 | address_space &space = *machine.device("audiocpu")->memory().space(AS_PROGRAM); | |
1350 | 1350 | UINT8 *decrypted = auto_alloc_array(machine, UINT8, 0x4000); |
1351 | 1351 | UINT8 *rom = machine.root_device().memregion("audiocpu")->base(); |
1352 | 1352 | int i; |
r17963 | r17964 | |
1355 | 1355 | for (i = 0xc000; i < 0x10000; i++) |
1356 | 1356 | decrypted[i - 0xc000] = ((rom[i] & 0x20) << 1) | ((rom[i] & 0x40) >> 1) | (rom[i] & 0x9f); |
1357 | 1357 | |
1358 | space | |
1358 | space.set_decrypted_region(0xc000, 0xffff, decrypted); | |
1359 | 1359 | } |
1360 | 1360 | |
1361 | 1361 | DRIVER_INIT_MEMBER(liberate_state,prosport) |
r17963 | r17964 | |
1380 | 1380 | DRIVER_INIT_MEMBER(liberate_state,liberate) |
1381 | 1381 | { |
1382 | 1382 | int A; |
1383 | address_space | |
1383 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
1384 | 1384 | UINT8 *decrypted = auto_alloc_array(machine(), UINT8, 0x10000); |
1385 | 1385 | UINT8 *ROM = machine().root_device().memregion("maincpu")->base(); |
1386 | 1386 | |
1387 | space | |
1387 | space.set_decrypted_region(0x0000, 0xffff, decrypted); | |
1388 | 1388 | |
1389 | 1389 | /* Swap bits for opcodes only, not data */ |
1390 | 1390 | for (A = 0; A < 0x10000; A++) { |
r17963 | r17964 | |
---|---|---|
3177 | 3177 | |
3178 | 3178 | MACHINE_RESET_MEMBER(seta_state,calibr50) |
3179 | 3179 | { |
3180 | address_space *space = machine().device("maincpu")->memory().space(AS_PROGRAM); | |
3181 | sub_bankswitch_w(*space, 0, 0); | |
3180 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
3181 | sub_bankswitch_w(space, 0, 0); | |
3182 | 3182 | } |
3183 | 3183 | |
3184 | 3184 | WRITE8_MEMBER(seta_state::calibr50_soundlatch2_w) |
r17963 | r17964 | |
---|---|---|
1416 | 1416 | |
1417 | 1417 | static READ64_HANDLER( naomi_arm_r ) |
1418 | 1418 | { |
1419 | dc_state *state = space | |
1419 | dc_state *state = space.machine().driver_data<dc_state>(); | |
1420 | 1420 | |
1421 | 1421 | return *(reinterpret_cast<UINT64 *>(state->dc_sound_ram.target())+offset); |
1422 | 1422 | } |
1423 | 1423 | |
1424 | 1424 | static WRITE64_HANDLER( naomi_arm_w ) |
1425 | 1425 | { |
1426 | dc_state *state = space | |
1426 | dc_state *state = space.machine().driver_data<dc_state>(); | |
1427 | 1427 | |
1428 | 1428 | COMBINE_DATA(reinterpret_cast<UINT64 *>(state->dc_sound_ram.target()) + offset); |
1429 | 1429 | } |
r17963 | r17964 | |
1517 | 1517 | // SB_LMMODE0 |
1518 | 1518 | static WRITE64_HANDLER( ta_texture_directpath0_w ) |
1519 | 1519 | { |
1520 | dc_state *state = space | |
1520 | dc_state *state = space.machine().driver_data<dc_state>(); | |
1521 | 1521 | |
1522 | 1522 | int mode = state->pvrctrl_regs[SB_LMMODE0]&1; |
1523 | 1523 | if (mode&1) |
r17963 | r17964 | |
1534 | 1534 | // SB_LMMODE1 |
1535 | 1535 | static WRITE64_HANDLER( ta_texture_directpath1_w ) |
1536 | 1536 | { |
1537 | dc_state *state = space | |
1537 | dc_state *state = space.machine().driver_data<dc_state>(); | |
1538 | 1538 | |
1539 | 1539 | int mode = state->pvrctrl_regs[SB_LMMODE1]&1; |
1540 | 1540 | if (mode&1) |
r17963 | r17964 | |
1724 | 1724 | int reg; |
1725 | 1725 | UINT64 shift; |
1726 | 1726 | |
1727 | reg = decode_reg32_64(space | |
1727 | reg = decode_reg32_64(space.machine(), offset, mem_mask, &shift); | |
1728 | 1728 | |
1729 | 1729 | if (reg == 0x280/4) |
1730 | 1730 | { |
1731 | UINT32 coins = space | |
1731 | UINT32 coins = space.machine().root_device().ioport("COINS")->read(); | |
1732 | 1732 | |
1733 | 1733 | if (coins & 0x01) |
1734 | 1734 | { |
r17963 | r17964 | |
1752 | 1752 | UINT64 shift; |
1753 | 1753 | UINT32 dat; |
1754 | 1754 | |
1755 | reg = decode_reg32_64(space | |
1755 | reg = decode_reg32_64(space.machine(), offset, mem_mask, &shift); | |
1756 | 1756 | dat = (UINT32)(data >> shift); |
1757 | 1757 | mame_printf_verbose("MODEM: [%08x=%x] write %" I64FMT "x to %x, mask %" I64FMT "x\n", 0x600000+reg*4, dat, data, offset, mem_mask); |
1758 | 1758 | } |
r17963 | r17964 | |
---|---|---|
656 | 656 | |
657 | 657 | kbdc8042_init(machine(), &at8042); |
658 | 658 | pc_vga_init(machine(), ::vga_setting, NULL); |
659 | pc_vga_io_init(machine(), machine().device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, machine().device("maincpu")->memory().space(AS_IO), 0x0000); | |
659 | pc_vga_io_init(machine(), *machine().device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, *machine().device("maincpu")->memory().space(AS_IO), 0x0000); | |
660 | 660 | } |
661 | 661 | |
662 | 662 | void queen_state::machine_reset() |
r17963 | r17964 | |
---|---|---|
209 | 209 | /* MEGATECH specific */ |
210 | 210 | static READ8_HANDLER( megatech_cart_select_r ) |
211 | 211 | { |
212 | mtech_state *state = space | |
212 | mtech_state *state = space.machine().driver_data<mtech_state>(); | |
213 | 213 | return state->m_mt_cart_select_reg; |
214 | 214 | } |
215 | 215 | |
r17963 | r17964 | |
292 | 292 | but it stores something in (banked?) ram |
293 | 293 | because it always seems to show the |
294 | 294 | same instructions ... */ |
295 | mtech_state *state = space | |
295 | mtech_state *state = space.machine().driver_data<mtech_state>(); | |
296 | 296 | state->m_mt_cart_select_reg = data; |
297 | 297 | |
298 | megatech_select_game(space | |
298 | megatech_select_game(space.machine(), state->m_mt_cart_select_reg); | |
299 | 299 | } |
300 | 300 | |
301 | 301 | |
302 | 302 | static READ8_HANDLER( bios_ctrl_r ) |
303 | 303 | { |
304 | mtech_state *state = space | |
304 | mtech_state *state = space.machine().driver_data<mtech_state>(); | |
305 | 305 | |
306 | 306 | if (offset == 0) |
307 | 307 | return 0; |
r17963 | r17964 | |
313 | 313 | |
314 | 314 | static WRITE8_HANDLER( bios_ctrl_w ) |
315 | 315 | { |
316 | mtech_state *state = space | |
316 | mtech_state *state = space.machine().driver_data<mtech_state>(); | |
317 | 317 | |
318 | 318 | if (offset == 1) |
319 | 319 | { |
r17963 | r17964 | |
333 | 333 | |
334 | 334 | static READ8_HANDLER( megatech_z80_read_68k_banked_data ) |
335 | 335 | { |
336 | mtech_state *state = space->machine().driver_data<mtech_state>(); | |
337 | address_space *space68k = space->machine().device<legacy_cpu_device>("maincpu")->space(); | |
336 | mtech_state *state = space.machine().driver_data<mtech_state>(); | |
337 | address_space *space68k = space.machine().device<legacy_cpu_device>("maincpu")->space(); | |
338 | 338 | UINT8 ret = space68k->read_byte(state->m_mt_bank_addr + offset); |
339 | 339 | return ret; |
340 | 340 | } |
341 | 341 | |
342 | 342 | static WRITE8_HANDLER( megatech_z80_write_68k_banked_data ) |
343 | 343 | { |
344 | mtech_state *state = space->machine().driver_data<mtech_state>(); | |
345 | address_space *space68k = space->machine().device<legacy_cpu_device>("maincpu")->space(); | |
344 | mtech_state *state = space.machine().driver_data<mtech_state>(); | |
345 | address_space *space68k = space.machine().device<legacy_cpu_device>("maincpu")->space(); | |
346 | 346 | space68k->write_byte(state->m_mt_bank_addr + offset,data); |
347 | 347 | } |
348 | 348 | |
r17963 | r17964 | |
354 | 354 | |
355 | 355 | static WRITE8_HANDLER( mt_z80_bank_w ) |
356 | 356 | { |
357 | megatech_z80_bank_w(space | |
357 | megatech_z80_bank_w(space.machine(), data & 1); | |
358 | 358 | } |
359 | 359 | |
360 | 360 | static READ8_HANDLER( megatech_banked_ram_r ) |
361 | 361 | { |
362 | mtech_state *state = space | |
362 | mtech_state *state = space.machine().driver_data<mtech_state>(); | |
363 | 363 | return state->m_megatech_banked_ram[offset + 0x1000 * (state->m_mt_cart_select_reg & 0x07)]; |
364 | 364 | } |
365 | 365 | |
366 | 366 | static WRITE8_HANDLER( megatech_banked_ram_w ) |
367 | 367 | { |
368 | mtech_state *state = space | |
368 | mtech_state *state = space.machine().driver_data<mtech_state>(); | |
369 | 369 | state->m_megatech_banked_ram[offset + 0x1000 * (state->m_mt_cart_select_reg & 0x07)] = data; |
370 | 370 | } |
371 | 371 | |
r17963 | r17964 | |
391 | 391 | |
392 | 392 | static WRITE8_HANDLER( megatech_bios_port_ctrl_w ) |
393 | 393 | { |
394 | mtech_state *state = space | |
394 | mtech_state *state = space.machine().driver_data<mtech_state>(); | |
395 | 395 | state->m_bios_port_ctrl = data; |
396 | 396 | } |
397 | 397 | |
398 | 398 | static READ8_HANDLER( megatech_bios_joypad_r ) |
399 | 399 | { |
400 | mtech_state *state = space->machine().driver_data<mtech_state>(); | |
401 | return megatech_bios_port_cc_dc_r(space->machine(), offset, state->m_bios_port_ctrl); | |
400 | mtech_state *state = space.machine().driver_data<mtech_state>(); | |
401 | return megatech_bios_port_cc_dc_r(space.machine(), offset, state->m_bios_port_ctrl); | |
402 | 402 | } |
403 | 403 | |
404 | 404 | static WRITE8_HANDLER (megatech_bios_port_7f_w) |
r17963 | r17964 | |
---|---|---|
2207 | 2207 | ROM_COPY( "user2", 0x0e0000, 0x1e0000, 0x020000) |
2208 | 2208 | ROM_END |
2209 | 2209 | |
2210 | static int irq_active(address_space | |
2210 | static int irq_active(address_space &space) | |
2211 | 2211 | { |
2212 | UINT32 FCR = space | |
2212 | UINT32 FCR = space.device().state().state_int(27); | |
2213 | 2213 | if( !(FCR&(1<<29)) ) // int 2 (irq 4) |
2214 | 2214 | return 1; |
2215 | 2215 | else |
r17963 | r17964 | |
2220 | 2220 | { |
2221 | 2221 | if(space.device().safe_pc() == 0x82de) |
2222 | 2222 | { |
2223 | if(irq_active( | |
2223 | if(irq_active(space)) | |
2224 | 2224 | space.device().execute().spin_until_interrupt(); |
2225 | 2225 | else |
2226 | 2226 | space.device().execute().eat_cycles(50); |
r17963 | r17964 | |
2233 | 2233 | { |
2234 | 2234 | if(space.device().safe_pc() == 0x82de) |
2235 | 2235 | { |
2236 | if(irq_active( | |
2236 | if(irq_active(space)) | |
2237 | 2237 | space.device().execute().spin_until_interrupt(); |
2238 | 2238 | else |
2239 | 2239 | space.device().execute().eat_cycles(50); |
r17963 | r17964 | |
2246 | 2246 | { |
2247 | 2247 | if(space.device().safe_pc() == 0xecc8) |
2248 | 2248 | { |
2249 | if(irq_active( | |
2249 | if(irq_active(space)) | |
2250 | 2250 | space.device().execute().spin_until_interrupt(); |
2251 | 2251 | else |
2252 | 2252 | space.device().execute().eat_cycles(50); |
r17963 | r17964 | |
2259 | 2259 | { |
2260 | 2260 | if(space.device().safe_pc() == 0x75f7a) |
2261 | 2261 | { |
2262 | if(irq_active( | |
2262 | if(irq_active(space)) | |
2263 | 2263 | space.device().execute().spin_until_interrupt(); |
2264 | 2264 | else |
2265 | 2265 | space.device().execute().eat_cycles(50); |
r17963 | r17964 | |
2272 | 2272 | { |
2273 | 2273 | if(space.device().safe_pc() == 0xaf18a ) |
2274 | 2274 | { |
2275 | if(irq_active( | |
2275 | if(irq_active(space)) | |
2276 | 2276 | space.device().execute().spin_until_interrupt(); |
2277 | 2277 | else |
2278 | 2278 | space.device().execute().eat_cycles(50); |
r17963 | r17964 | |
2285 | 2285 | { |
2286 | 2286 | if(space.device().safe_pc() == 0xaefac ) |
2287 | 2287 | { |
2288 | if(irq_active( | |
2288 | if(irq_active(space)) | |
2289 | 2289 | space.device().execute().spin_until_interrupt(); |
2290 | 2290 | else |
2291 | 2291 | space.device().execute().eat_cycles(50); |
r17963 | r17964 | |
2298 | 2298 | { |
2299 | 2299 | if(space.device().safe_pc() == 0xae6c0 ) |
2300 | 2300 | { |
2301 | if(irq_active( | |
2301 | if(irq_active(space)) | |
2302 | 2302 | space.device().execute().spin_until_interrupt(); |
2303 | 2303 | else |
2304 | 2304 | space.device().execute().eat_cycles(50); |
r17963 | r17964 | |
2311 | 2311 | { |
2312 | 2312 | if(space.device().safe_pc() == 0xae6d2 ) |
2313 | 2313 | { |
2314 | if(irq_active( | |
2314 | if(irq_active(space)) | |
2315 | 2315 | space.device().execute().spin_until_interrupt(); |
2316 | 2316 | else |
2317 | 2317 | space.device().execute().eat_cycles(50); |
r17963 | r17964 | |
2326 | 2326 | |
2327 | 2327 | if(pc == 0x10758) |
2328 | 2328 | { |
2329 | if(irq_active( | |
2329 | if(irq_active(space)) | |
2330 | 2330 | space.device().execute().spin_until_interrupt(); |
2331 | 2331 | else |
2332 | 2332 | space.device().execute().eat_cycles(50); |
r17963 | r17964 | |
2341 | 2341 | |
2342 | 2342 | if(pc == 0x10758) |
2343 | 2343 | { |
2344 | if(irq_active( | |
2344 | if(irq_active(space)) | |
2345 | 2345 | space.device().execute().spin_until_interrupt(); |
2346 | 2346 | else |
2347 | 2347 | space.device().execute().eat_cycles(50); |
r17963 | r17964 | |
2356 | 2356 | { |
2357 | 2357 | if(space.device().safe_pc() == 0x1c212) |
2358 | 2358 | { |
2359 | if(irq_active( | |
2359 | if(irq_active(space)) | |
2360 | 2360 | space.device().execute().spin_until_interrupt(); |
2361 | 2361 | else |
2362 | 2362 | space.device().execute().eat_cycles(50); |
r17963 | r17964 | |
2370 | 2370 | UINT32 pc = space.device().safe_pc(); |
2371 | 2371 | if(pc == 0x469de || pc == 0x46a36) |
2372 | 2372 | { |
2373 | // if(irq_active( | |
2373 | // if(irq_active(space)) | |
2374 | 2374 | // space.device().execute().spin_until_interrupt(); |
2375 | 2375 | // else |
2376 | 2376 | space.device().execute().eat_cycles(50); |
r17963 | r17964 | |
2384 | 2384 | { |
2385 | 2385 | if(space.device().safe_pc() == 0xaa622) |
2386 | 2386 | { |
2387 | if(irq_active( | |
2387 | if(irq_active(space)) | |
2388 | 2388 | space.device().execute().spin_until_interrupt(); |
2389 | 2389 | else |
2390 | 2390 | space.device().execute().eat_cycles(50); |
r17963 | r17964 | |
2412 | 2412 | { |
2413 | 2413 | if(space.device().safe_pc() == 0x983c) |
2414 | 2414 | { |
2415 | if(irq_active( | |
2415 | if(irq_active(space)) | |
2416 | 2416 | space.device().execute().spin_until_interrupt(); |
2417 | 2417 | else |
2418 | 2418 | space.device().execute().eat_cycles(50); |
r17963 | r17964 | |
2425 | 2425 | { |
2426 | 2426 | if(space.device().safe_pc() == 0x1710) |
2427 | 2427 | { |
2428 | if(irq_active( | |
2428 | if(irq_active(space)) | |
2429 | 2429 | space.device().execute().spin_until_interrupt(); |
2430 | 2430 | else |
2431 | 2431 | space.device().execute().eat_cycles(50); |
r17963 | r17964 | |
2460 | 2460 | { |
2461 | 2461 | if(space.device().safe_pc() == 0x13198) |
2462 | 2462 | { |
2463 | if(irq_active( | |
2463 | if(irq_active(space)) | |
2464 | 2464 | space.device().execute().spin_until_interrupt(); |
2465 | 2465 | } |
2466 | 2466 |
r17963 | r17964 | |
---|---|---|
127 | 127 | |
128 | 128 | READ32_MEMBER(vegaeo_state::vegaeo_custom_read) |
129 | 129 | { |
130 | eolith_speedup_read( | |
130 | eolith_speedup_read(space); | |
131 | 131 | return ioport("SYSTEM")->read(); |
132 | 132 | } |
133 | 133 |
r17963 | r17964 | |
---|---|---|
273 | 273 | switch (offset) |
274 | 274 | { |
275 | 275 | case 0x00: /* SOUNDON */ |
276 | timeplt_sh_irqtrigger_w( | |
276 | timeplt_sh_irqtrigger_w(space,0,bit); | |
277 | 277 | break; |
278 | 278 | |
279 | 279 | case 0x01: /* INTST */ |
r17963 | r17964 | |
---|---|---|
126 | 126 | device_t *device = machine().device("k007232"); |
127 | 127 | int bank_A, bank_B; |
128 | 128 | |
129 | //logerror("CPU #1 PC: %04x bank switch = %02x\n",space | |
129 | //logerror("CPU #1 PC: %04x bank switch = %02x\n",space.device().safe_pc(),data); | |
130 | 130 | |
131 | 131 | /* bits 0-3 select the 007232 banks */ |
132 | 132 | bank_A = (data & 0x3); |
r17963 | r17964 | |
---|---|---|
860 | 860 | |
861 | 861 | /* Decrypt data for z80 program */ |
862 | 862 | { |
863 | address_space | |
863 | address_space &space = *machine().device("audiocpu")->memory().space(AS_PROGRAM); | |
864 | 864 | UINT8 *decrypt = auto_alloc_array(machine(), UINT8, 0x20000); |
865 | 865 | UINT8 *rom = machine().root_device().memregion("audiocpu")->base(); |
866 | 866 | int i; |
867 | 867 | |
868 | 868 | memcpy(decrypt,rom,0x20000); |
869 | 869 | |
870 | space | |
870 | space.set_decrypted_region(0x0000, 0x1fff, decrypt); | |
871 | 871 | |
872 | 872 | for (i = 0;i < 0x2000;i++) |
873 | 873 | { |
r17963 | r17964 | |
---|---|---|
316 | 316 | |
317 | 317 | DRIVER_INIT_MEMBER(renegade_state,kuniokunb) |
318 | 318 | { |
319 | address_space | |
319 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
320 | 320 | |
321 | 321 | /* Remove the MCU handlers */ |
322 | space->unmap_readwrite(0x3804, 0x3804); | |
323 | space->unmap_read(0x3805, 0x3805); | |
322 | space.unmap_readwrite(0x3804, 0x3804); | |
323 | space.unmap_read(0x3805, 0x3805); | |
324 | 324 | } |
325 | 325 | |
326 | 326 |
r17963 | r17964 | |
---|---|---|
153 | 153 | { |
154 | 154 | int source = ( data & 7 ); |
155 | 155 | ppu2c0x_device *ppu = machine().device<ppu2c0x_device>("ppu1"); |
156 | ppu->spriteram_dma( | |
156 | ppu->spriteram_dma( space, source ); | |
157 | 157 | } |
158 | 158 | |
159 | 159 | WRITE8_MEMBER(vsnes_state::sprite_dma_1_w) |
160 | 160 | { |
161 | 161 | int source = ( data & 7 ); |
162 | 162 | ppu2c0x_device *ppu = machine().device<ppu2c0x_device>("ppu2"); |
163 | ppu->spriteram_dma( | |
163 | ppu->spriteram_dma( space, source ); | |
164 | 164 | } |
165 | 165 | |
166 | 166 | WRITE8_MEMBER(vsnes_state::vsnes_coin_counter_w) |
r17963 | r17964 | |
---|---|---|
804 | 804 | return in; |
805 | 805 | } |
806 | 806 | |
807 | void load_ldafile(address_space | |
807 | void load_ldafile(address_space &space, const UINT8 *file) | |
808 | 808 | { |
809 | 809 | #define READ_CHAR() file[i++] |
810 | 810 | int i = 0; |
r17963 | r17964 | |
847 | 847 | { |
848 | 848 | UINT8 data = READ_CHAR(); |
849 | 849 | sum += data; |
850 | space | |
850 | space.write_byte(addr++, data); | |
851 | 851 | } while (--len); |
852 | 852 | |
853 | 853 | sum += READ_CHAR(); |
r17963 | r17964 | |
858 | 858 | } |
859 | 859 | |
860 | 860 | /* Load memory space with data from a Tektronix-Extended HEX file */ |
861 | void load_hexfile(address_space | |
861 | void load_hexfile(address_space &space, const UINT8 *file) | |
862 | 862 | { |
863 | 863 | #define READ_HEX_CHAR() hex_to_ascii(file[i++]) |
864 | 864 | |
r17963 | r17964 | |
942 | 942 | sum += data & 0xf; |
943 | 943 | |
944 | 944 | if (record == 6) |
945 | space | |
945 | space.write_byte(addr++, data); | |
946 | 946 | |
947 | 947 | len -= 2; |
948 | 948 | } |
r17963 | r17964 | |
963 | 963 | |
964 | 964 | DRIVER_INIT_MEMBER(atarisy4_state,laststar) |
965 | 965 | { |
966 | address_space | |
966 | address_space &main = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
967 | 967 | |
968 | 968 | /* Allocate 16kB of shared RAM */ |
969 | 969 | m_shared_ram[0] = auto_alloc_array_clear(machine(), UINT16, 0x2000); |
r17963 | r17964 | |
975 | 975 | /* Set up the DSP */ |
976 | 976 | membank("dsp0_bank0")->set_base(m_shared_ram[0]); |
977 | 977 | membank("dsp0_bank1")->set_base(&m_shared_ram[0][0x800]); |
978 | load_ldafile(machine().device("dsp0")->memory().space(AS_PROGRAM), memregion("dsp")->base()); | |
978 | load_ldafile(*machine().device("dsp0")->memory().space(AS_PROGRAM), memregion("dsp")->base()); | |
979 | 979 | } |
980 | 980 | |
981 | 981 | DRIVER_INIT_MEMBER(atarisy4_state,airrace) |
r17963 | r17964 | |
985 | 985 | m_shared_ram[1] = auto_alloc_array_clear(machine(), UINT16, 0x4000); |
986 | 986 | |
987 | 987 | /* Populate RAM with data from the HEX files */ |
988 | load_hexfile(machine().device("maincpu")->memory().space(AS_PROGRAM), memregion("code")->base()); | |
988 | load_hexfile(*machine().device("maincpu")->memory().space(AS_PROGRAM), memregion("code")->base()); | |
989 | 989 | |
990 | 990 | /* Set up the first DSP */ |
991 | 991 | membank("dsp0_bank0")->set_base(m_shared_ram[0]); |
992 | 992 | membank("dsp0_bank1")->set_base(&m_shared_ram[0][0x800]); |
993 | load_ldafile(machine().device("dsp0")->memory().space(AS_PROGRAM), memregion("dsp")->base()); | |
993 | load_ldafile(*machine().device("dsp0")->memory().space(AS_PROGRAM), memregion("dsp")->base()); | |
994 | 994 | |
995 | 995 | /* Set up the second DSP */ |
996 | 996 | membank("dsp1_bank0")->set_base(m_shared_ram[1]); |
997 | 997 | membank("dsp1_bank1")->set_base(&m_shared_ram[1][0x800]); |
998 | load_ldafile(machine().device("dsp1")->memory().space(AS_PROGRAM), memregion("dsp")->base()); | |
998 | load_ldafile(*machine().device("dsp1")->memory().space(AS_PROGRAM), memregion("dsp")->base()); | |
999 | 999 | } |
1000 | 1000 | |
1001 | 1001 | void atarisy4_state::machine_reset() |
r17963 | r17964 | |
---|---|---|
517 | 517 | m_flipscreen = 0; |
518 | 518 | |
519 | 519 | /* set up an opcode base handler since we use mapped handlers for RAM */ |
520 | address_space *space = m_maincpu->space(AS_PROGRAM); | |
521 | space->set_direct_update_handler(direct_update_delegate(FUNC(missile_state::missile_direct_handler), this)); | |
520 | address_space &space = *m_maincpu->space(AS_PROGRAM); | |
521 | space.set_direct_update_handler(direct_update_delegate(FUNC(missile_state::missile_direct_handler), this)); | |
522 | 522 | |
523 | 523 | /* create a timer to speed/slow the CPU */ |
524 | 524 | m_cpu_timer = machine().scheduler().timer_alloc(FUNC(adjust_cpu_speed)); |
r17963 | r17964 | |
552 | 552 | * |
553 | 553 | *************************************/ |
554 | 554 | |
555 | INLINE int get_madsel(address_space | |
555 | INLINE int get_madsel(address_space &space) | |
556 | 556 | { |
557 | missile_state *state = space->machine().driver_data<missile_state>(); | |
558 | UINT16 pc = space->device().safe_pcbase(); | |
557 | missile_state *state = space.machine().driver_data<missile_state>(); | |
558 | UINT16 pc = space.device().safe_pcbase(); | |
559 | 559 | |
560 | 560 | /* if we're at a different instruction than last time, reset our delay counter */ |
561 | 561 | if (pc != state->m_madsel_lastpc) |
r17963 | r17964 | |
564 | 564 | /* MADSEL signal disables standard address decoding and routes |
565 | 565 | writes to video RAM; it is enabled if the IRQ signal is clear |
566 | 566 | and the low 5 bits of the fetched opcode are 0x01 */ |
567 | if (!state->m_irq_state && (space | |
567 | if (!state->m_irq_state && (space.direct().read_decrypted_byte(pc) & 0x1f) == 0x01) | |
568 | 568 | { |
569 | 569 | /* the MADSEL signal goes high 5 cycles after the opcode is identified; |
570 | 570 | this effectively skips the indirect memory read. Since this is difficult |
r17963 | r17964 | |
590 | 590 | } |
591 | 591 | |
592 | 592 | |
593 | static void write_vram(address_space | |
593 | static void write_vram(address_space &space, offs_t address, UINT8 data) | |
594 | 594 | { |
595 | missile_state *state = space | |
595 | missile_state *state = space.machine().driver_data<missile_state>(); | |
596 | 596 | UINT8 *videoram = state->m_videoram; |
597 | 597 | static const UINT8 data_lookup[4] = { 0x00, 0x0f, 0xf0, 0xff }; |
598 | 598 | offs_t vramaddr; |
r17963 | r17964 | |
617 | 617 | videoram[vramaddr] = (videoram[vramaddr] & vrammask) | (vramdata & ~vrammask); |
618 | 618 | |
619 | 619 | /* account for the extra clock cycle */ |
620 | space | |
620 | space.device().execute().adjust_icount(-1); | |
621 | 621 | } |
622 | 622 | } |
623 | 623 | |
624 | 624 | |
625 | static UINT8 read_vram(address_space | |
625 | static UINT8 read_vram(address_space &space, offs_t address) | |
626 | 626 | { |
627 | missile_state *state = space | |
627 | missile_state *state = space.machine().driver_data<missile_state>(); | |
628 | 628 | UINT8 *videoram = state->m_videoram; |
629 | 629 | offs_t vramaddr; |
630 | 630 | UINT8 vramdata; |
r17963 | r17964 | |
653 | 653 | result &= ~0x20; |
654 | 654 | |
655 | 655 | /* account for the extra clock cycle */ |
656 | space | |
656 | space.device().execute().adjust_icount(-1); | |
657 | 657 | } |
658 | 658 | return result; |
659 | 659 | } |
r17963 | r17964 | |
714 | 714 | UINT8 *videoram = m_videoram; |
715 | 715 | |
716 | 716 | /* if we're in MADSEL mode, write to video RAM */ |
717 | if (get_madsel( | |
717 | if (get_madsel(space)) | |
718 | 718 | { |
719 | write_vram( | |
719 | write_vram(space, offset, data); | |
720 | 720 | return; |
721 | 721 | } |
722 | 722 | |
r17963 | r17964 | |
776 | 776 | UINT8 result = 0xff; |
777 | 777 | |
778 | 778 | /* if we're in MADSEL mode, read from video RAM */ |
779 | if (get_madsel(&space)) | |
780 | return read_vram(&space, offset); | |
779 | if (get_madsel(space)) | |
780 | return read_vram(space, offset); | |
781 | 781 | |
782 | 782 | /* otherwise, strip A15 and handle manually */ |
783 | 783 | offset &= 0x7fff; |
r17963 | r17964 | |
---|---|---|
1290 | 1290 | static void treahunt_decode( running_machine &machine ) |
1291 | 1291 | { |
1292 | 1292 | int A; |
1293 | address_space | |
1293 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
1294 | 1294 | UINT8 *rom = machine.root_device().memregion("maincpu")->base(); |
1295 | 1295 | UINT8 *decrypt = auto_alloc_array(machine, UINT8, 0x4000); |
1296 | 1296 | int data; |
1297 | 1297 | |
1298 | space | |
1298 | space.set_decrypted_region(0x0000, 0x3fff, decrypt); | |
1299 | 1299 | |
1300 | 1300 | /* Thanks to Mike Balfour for helping out with the decryption */ |
1301 | 1301 | for (A = 0; A < 0x4000; A++) |
r17963 | r17964 | |
---|---|---|
92 | 92 | WRITE8_MEMBER(galivan_state::blit_trigger_w) |
93 | 93 | { |
94 | 94 | |
95 | nb_1414m4_exec( | |
95 | nb_1414m4_exec(space,(m_videoram[0] << 8) | (m_videoram[1] & 0xff),m_videoram,m_scrollx,m_scrolly,m_tx_tilemap); | |
96 | 96 | } |
97 | 97 | |
98 | 98 | static ADDRESS_MAP_START( ninjemak_io_map, AS_IO, 8, galivan_state ) |
r17963 | r17964 | |
---|---|---|
210 | 210 | } |
211 | 211 | |
212 | 212 | |
213 | INLINE void ss9601_videoram_w(layer_t *l, vram_t vram, address_space | |
213 | INLINE void ss9601_videoram_w(layer_t *l, vram_t vram, address_space &space, offs_t offset, UINT8 data) | |
214 | 214 | { |
215 | 215 | l->videorams[vram][offset] = data; |
216 | 216 | |
r17963 | r17964 | |
239 | 239 | // Layer 0 |
240 | 240 | WRITE8_MEMBER(subsino2_state::ss9601_videoram_0_hi_w) |
241 | 241 | { |
242 | ss9601_videoram_w(&m_layers[0], VRAM_HI, | |
242 | ss9601_videoram_w(&m_layers[0], VRAM_HI, space, offset, data); | |
243 | 243 | } |
244 | 244 | |
245 | 245 | WRITE8_MEMBER(subsino2_state::ss9601_videoram_0_lo_w) |
246 | 246 | { |
247 | ss9601_videoram_w(&m_layers[0], VRAM_LO, | |
247 | ss9601_videoram_w(&m_layers[0], VRAM_LO, space, offset, data); | |
248 | 248 | } |
249 | 249 | |
250 | 250 | WRITE8_MEMBER(subsino2_state::ss9601_videoram_0_hi_lo_w) |
251 | 251 | { |
252 | ss9601_videoram_w(&m_layers[0], VRAM_HI, &space, offset, data); | |
253 | ss9601_videoram_w(&m_layers[0], VRAM_LO, &space, offset, m_ss9601_byte_lo); | |
252 | ss9601_videoram_w(&m_layers[0], VRAM_HI, space, offset, data); | |
253 | ss9601_videoram_w(&m_layers[0], VRAM_LO, space, offset, m_ss9601_byte_lo); | |
254 | 254 | } |
255 | 255 | |
256 | 256 | WRITE8_MEMBER(subsino2_state::ss9601_videoram_0_hi_lo2_w) |
257 | 257 | { |
258 | ss9601_videoram_w(&m_layers[0], VRAM_HI, &space, offset, data); | |
259 | ss9601_videoram_w(&m_layers[0], VRAM_LO, &space, offset, m_ss9601_byte_lo2); | |
258 | ss9601_videoram_w(&m_layers[0], VRAM_HI, space, offset, data); | |
259 | ss9601_videoram_w(&m_layers[0], VRAM_LO, space, offset, m_ss9601_byte_lo2); | |
260 | 260 | } |
261 | 261 | |
262 | 262 | READ8_MEMBER(subsino2_state::ss9601_videoram_0_hi_r) |
r17963 | r17964 | |
272 | 272 | // Layer 1 |
273 | 273 | WRITE8_MEMBER(subsino2_state::ss9601_videoram_1_hi_w) |
274 | 274 | { |
275 | ss9601_videoram_w(&m_layers[1], VRAM_HI, | |
275 | ss9601_videoram_w(&m_layers[1], VRAM_HI, space, offset, data); | |
276 | 276 | } |
277 | 277 | |
278 | 278 | WRITE8_MEMBER(subsino2_state::ss9601_videoram_1_lo_w) |
279 | 279 | { |
280 | ss9601_videoram_w(&m_layers[1], VRAM_LO, | |
280 | ss9601_videoram_w(&m_layers[1], VRAM_LO, space, offset, data); | |
281 | 281 | } |
282 | 282 | |
283 | 283 | WRITE8_MEMBER(subsino2_state::ss9601_videoram_1_hi_lo_w) |
284 | 284 | { |
285 | ss9601_videoram_w(&m_layers[1], VRAM_HI, &space, offset, data); | |
286 | ss9601_videoram_w(&m_layers[1], VRAM_LO, &space, offset, m_ss9601_byte_lo); | |
285 | ss9601_videoram_w(&m_layers[1], VRAM_HI, space, offset, data); | |
286 | ss9601_videoram_w(&m_layers[1], VRAM_LO, space, offset, m_ss9601_byte_lo); | |
287 | 287 | } |
288 | 288 | |
289 | 289 | WRITE8_MEMBER(subsino2_state::ss9601_videoram_1_hi_lo2_w) |
290 | 290 | { |
291 | ss9601_videoram_w(&m_layers[1], VRAM_HI, &space, offset, data); | |
292 | ss9601_videoram_w(&m_layers[1], VRAM_LO, &space, offset, m_ss9601_byte_lo2); | |
291 | ss9601_videoram_w(&m_layers[1], VRAM_HI, space, offset, data); | |
292 | ss9601_videoram_w(&m_layers[1], VRAM_LO, space, offset, m_ss9601_byte_lo2); | |
293 | 293 | } |
294 | 294 | |
295 | 295 | READ8_MEMBER(subsino2_state::ss9601_videoram_1_hi_r) |
r17963 | r17964 | |
1084 | 1084 | vram_t vram = (m_ss9601_byte_lo & 0x08) ? VRAM_HI : VRAM_LO; |
1085 | 1085 | switch (m_ss9601_byte_lo & (~0x08)) |
1086 | 1086 | { |
1087 | case 0x00: ss9601_videoram_w(&m_layers[1], vram, &space, offset, data); | |
1088 | ss9601_videoram_w(&m_layers[1], vram, &space, offset+0x1000, data); break; | |
1087 | case 0x00: ss9601_videoram_w(&m_layers[1], vram, space, offset, data); | |
1088 | ss9601_videoram_w(&m_layers[1], vram, space, offset+0x1000, data); break; | |
1089 | 1089 | |
1090 | case 0x04: ss9601_videoram_w(&m_layers[0], vram, &space, offset, data); | |
1091 | ss9601_videoram_w(&m_layers[0], vram, &space, offset+0x1000, data); break; | |
1090 | case 0x04: ss9601_videoram_w(&m_layers[0], vram, space, offset, data); | |
1091 | ss9601_videoram_w(&m_layers[0], vram, space, offset+0x1000, data); break; | |
1092 | 1092 | |
1093 | 1093 | case 0x06: m_ss9601_reelrams[vram][offset] = data; break; |
1094 | 1094 | } |
r17963 | r17964 | |
---|---|---|
376 | 376 | |
377 | 377 | static READ8_HANDLER( megaplay_bios_banksel_r ) |
378 | 378 | { |
379 | mplay_state *state = space | |
379 | mplay_state *state = space.machine().driver_data<mplay_state>(); | |
380 | 380 | return state->m_bios_bank; |
381 | 381 | } |
382 | 382 | |
r17963 | r17964 | |
387 | 387 | It should be possible to multiplex different game ROMs at |
388 | 388 | 0x000000-0x3fffff based on these bits. |
389 | 389 | */ |
390 | mplay_state *state = space | |
390 | mplay_state *state = space.machine().driver_data<mplay_state>(); | |
391 | 391 | state->m_bios_bank = data; |
392 | 392 | state->m_bios_mode = MP_ROM; |
393 | 393 | // logerror("BIOS: ROM bank %i selected [0x%02x]\n",bios_bank >> 6, data); |
r17963 | r17964 | |
395 | 395 | |
396 | 396 | static READ8_HANDLER( megaplay_bios_gamesel_r ) |
397 | 397 | { |
398 | mplay_state *state = space | |
398 | mplay_state *state = space.machine().driver_data<mplay_state>(); | |
399 | 399 | return state->m_bios_6403; |
400 | 400 | } |
401 | 401 | |
402 | 402 | static WRITE8_HANDLER( megaplay_bios_gamesel_w ) |
403 | 403 | { |
404 | mplay_state *state = space | |
404 | mplay_state *state = space.machine().driver_data<mplay_state>(); | |
405 | 405 | state->m_bios_6403 = data; |
406 | 406 | |
407 | 407 | // logerror("BIOS: 0x6403 write: 0x%02x\n",data); |
r17963 | r17964 | |
426 | 426 | |
427 | 427 | static READ8_HANDLER( bank_r ) |
428 | 428 | { |
429 | mplay_state *state = space | |
429 | mplay_state *state = space.machine().driver_data<mplay_state>(); | |
430 | 430 | UINT8* bank = state->memregion("mtbios")->base(); |
431 | 431 | UINT32 fulladdress = state->m_mp_bios_bank_addr + offset; |
432 | 432 | |
r17963 | r17964 | |
450 | 450 | } |
451 | 451 | else |
452 | 452 | { |
453 | return space | |
453 | return space.machine().root_device().memregion("maincpu")->base()[fulladdress ^ 1]; | |
454 | 454 | } |
455 | 455 | } |
456 | 456 | else if (fulladdress >= 0xa10000 && fulladdress <= 0xa1001f) // IO Acess |
r17963 | r17964 | |
467 | 467 | |
468 | 468 | static WRITE8_HANDLER( bank_w ) |
469 | 469 | { |
470 | mplay_state *state = space | |
470 | mplay_state *state = space.machine().driver_data<mplay_state>(); | |
471 | 471 | UINT32 fulladdress = state->m_mp_bios_bank_addr + offset; |
472 | 472 | |
473 | 473 | if ((fulladdress >= 0x000000) && (fulladdress <= 0x3fffff)) // ROM / Megaplay Custom Addresses |
r17963 | r17964 | |
516 | 516 | |
517 | 517 | static WRITE8_HANDLER( megaplay_bios_width_w ) |
518 | 518 | { |
519 | mplay_state *state = space | |
519 | mplay_state *state = space.machine().driver_data<mplay_state>(); | |
520 | 520 | state->m_bios_width = data; |
521 | 521 | megadrive_io_data_regs[2] = (megadrive_io_data_regs[2] & 0x07) | ((data & 0xf8)); |
522 | 522 | // logerror("BIOS: 0x6204 - Width write: %02x\n", data); |
r17963 | r17964 | |
524 | 524 | |
525 | 525 | static READ8_HANDLER( megaplay_bios_6404_r ) |
526 | 526 | { |
527 | mplay_state *state = space | |
527 | mplay_state *state = space.machine().driver_data<mplay_state>(); | |
528 | 528 | // logerror("BIOS: 0x6404 read: returned 0x%02x\n",bios_6404 | (bios_6403 & 0x10) >> 4); |
529 | 529 | return (state->m_bios_6404 & 0xfe) | ((state->m_bios_6403 & 0x10) >> 4); |
530 | 530 | // return state->m_bios_6404 | (state->m_bios_6403 & 0x10) >> 4; |
r17963 | r17964 | |
532 | 532 | |
533 | 533 | static WRITE8_HANDLER( megaplay_bios_6404_w ) |
534 | 534 | { |
535 | mplay_state *state = space | |
535 | mplay_state *state = space.machine().driver_data<mplay_state>(); | |
536 | 536 | if(((state->m_bios_6404 & 0x0c) == 0x00) && ((data & 0x0c) == 0x0c)) |
537 | space | |
537 | space.machine().device("maincpu")->execute().set_input_line(INPUT_LINE_RESET, PULSE_LINE); | |
538 | 538 | state->m_bios_6404 = data; |
539 | 539 | |
540 | 540 | // logerror("BIOS: 0x6404 write: 0x%02x\n", data); |
r17963 | r17964 | |
548 | 548 | function to make the BIOS check all 4 slots (3 and 4 will be "not used") |
549 | 549 | return (state->m_bios_6600 & 0xfe) | (state->m_bios_bank & 0x01); |
550 | 550 | */ |
551 | mplay_state *state = space | |
551 | mplay_state *state = space.machine().driver_data<mplay_state>(); | |
552 | 552 | return state->m_bios_6600;// & 0xfe; |
553 | 553 | } |
554 | 554 | |
555 | 555 | static WRITE8_HANDLER( megaplay_bios_6600_w ) |
556 | 556 | { |
557 | mplay_state *state = space | |
557 | mplay_state *state = space.machine().driver_data<mplay_state>(); | |
558 | 558 | state->m_bios_6600 = data; |
559 | 559 | // logerror("BIOS: 0x6600 write: 0x%02x\n",data); |
560 | 560 | } |
561 | 561 | |
562 | 562 | static WRITE8_HANDLER( megaplay_game_w ) |
563 | 563 | { |
564 | mplay_state *state = space | |
564 | mplay_state *state = space.machine().driver_data<mplay_state>(); | |
565 | 565 | if (state->m_readpos == 1) |
566 | 566 | state->m_game_banksel = 0; |
567 | 567 | state->m_game_banksel |= (1 << (state->m_readpos - 1)) * (data & 0x01); |
r17963 | r17964 | |
573 | 573 | state->m_bios_mode = MP_GAME; |
574 | 574 | state->m_readpos = 1; |
575 | 575 | // popmessage("Game bank selected: 0x%03x", state->m_game_banksel); |
576 | logerror("BIOS [0x%04x]: 68K address space bank selected: 0x%03x\n", space | |
576 | logerror("BIOS [0x%04x]: 68K address space bank selected: 0x%03x\n", space.device().safe_pcbase(), state->m_game_banksel); | |
577 | 577 | } |
578 | 578 | |
579 | 579 | state->m_mp_bios_bank_addr = ((state->m_mp_bios_bank_addr >> 1) | (data << 23)) & 0xff8000; |
r17963 | r17964 | |
847 | 847 | |
848 | 848 | static READ16_HANDLER( megadriv_68k_read_z80_extra_ram ) |
849 | 849 | { |
850 | mplay_state *state = space | |
850 | mplay_state *state = space.machine().driver_data<mplay_state>(); | |
851 | 851 | return state->m_ic36_ram[(offset << 1) ^ 1] | (state->m_ic36_ram[(offset << 1)] << 8); |
852 | 852 | } |
853 | 853 | |
854 | 854 | static WRITE16_HANDLER( megadriv_68k_write_z80_extra_ram ) |
855 | 855 | { |
856 | mplay_state *state = space | |
856 | mplay_state *state = space.machine().driver_data<mplay_state>(); | |
857 | 857 | if (!ACCESSING_BITS_0_7) // byte (MSB) access |
858 | 858 | { |
859 | 859 | state->m_ic36_ram[(offset << 1)] = (data & 0xff00) >> 8; |
r17963 | r17964 | |
---|---|---|
206 | 206 | |
207 | 207 | /* sub 6809 */ |
208 | 208 | |
209 | static void unlock_shared_ram(address_space | |
209 | static void unlock_shared_ram(address_space &space) | |
210 | 210 | { |
211 | sothello_state *state = space->machine().driver_data<sothello_state>(); | |
212 | if(!space->machine().device<cpu_device>("sub")->suspended(SUSPEND_REASON_HALT)) | |
211 | sothello_state *state = space.machine().driver_data<sothello_state>(); | |
212 | if(!space.machine().device<cpu_device>("sub")->suspended(SUSPEND_REASON_HALT)) | |
213 | 213 | { |
214 | 214 | state->m_subcpu_status|=1; |
215 | 215 | } |
216 | 216 | else |
217 | 217 | { |
218 | logerror("Sub cpu active! @%x\n",space | |
218 | logerror("Sub cpu active! @%x\n",space.device().safe_pc()); | |
219 | 219 | } |
220 | 220 | } |
221 | 221 | |
222 | 222 | WRITE8_MEMBER(sothello_state::subcpu_status_w) |
223 | 223 | { |
224 | unlock_shared_ram( | |
224 | unlock_shared_ram(space); | |
225 | 225 | } |
226 | 226 | |
227 | 227 | READ8_MEMBER(sothello_state::subcpu_status_r) |
228 | 228 | { |
229 | unlock_shared_ram( | |
229 | unlock_shared_ram(space); | |
230 | 230 | return 0; |
231 | 231 | } |
232 | 232 |
r17963 | r17964 | |
---|---|---|
713 | 713 | |
714 | 714 | static UINT8 *decrypt_code(running_machine &machine) |
715 | 715 | { |
716 | address_space | |
716 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
717 | 717 | UINT8 *decrypted = auto_alloc_array(machine, UINT8, 0x10000); |
718 | 718 | UINT8 *rom = machine.root_device().memregion("maincpu")->base(); |
719 | 719 | int A; |
720 | 720 | |
721 | space | |
721 | space.set_decrypted_region(0x0000, 0xffff, decrypted); | |
722 | 722 | |
723 | 723 | for (A = 0; A < 0x10000; A++) |
724 | 724 | decrypted[A] = (rom[A] & 0x55) | ((rom[A] & 0x88) >> 2) | ((rom[A] & 0x22) << 2); |
r17963 | r17964 | |
---|---|---|
231 | 231 | { |
232 | 232 | static UINT32 src_addr = 0x100000; |
233 | 233 | static int frame; |
234 | address_space | |
234 | address_space &space = *screen.machine().device("maincpu")->memory().space(AS_PROGRAM); | |
235 | 235 | |
236 | 236 | //if(screen.machine().input().code_pressed_once(KEYCODE_A)) |
237 | 237 | // src_addr+=0x800; |
r17963 | r17964 | |
247 | 247 | if(frame == 5) |
248 | 248 | { |
249 | 249 | int i,data; |
250 | static UINT8 *rom = space | |
250 | static UINT8 *rom = space.machine().root_device().memregion("mainprg")->base(); | |
251 | 251 | |
252 | 252 | for(i=0;i<0x800;i+=2) |
253 | 253 | { |
254 | 254 | data = rom[src_addr+i+0]; |
255 | space | |
255 | space.write_byte(i+0xd000+0, data); | |
256 | 256 | data = rom[src_addr+i+1]; |
257 | space | |
257 | space.write_byte(i+0xd000+1, data); | |
258 | 258 | } |
259 | 259 | |
260 | 260 | popmessage("%08x 1",src_addr); |
r17963 | r17964 | |
440 | 440 | { |
441 | 441 | switch(offset+0x780) |
442 | 442 | { |
443 | case (0x788/2): return seibu_main_word_r(&space,2,0xffff); | |
444 | case (0x78c/2): return seibu_main_word_r(&space,3,0xffff); | |
445 | case (0x794/2): return seibu_main_word_r(&space,5,0xffff); | |
443 | case (0x788/2): return seibu_main_word_r(space,2,0xffff); | |
444 | case (0x78c/2): return seibu_main_word_r(space,3,0xffff); | |
445 | case (0x794/2): return seibu_main_word_r(space,5,0xffff); | |
446 | 446 | } |
447 | 447 | |
448 | 448 | return 0xffff; |
r17963 | r17964 | |
453 | 453 | { |
454 | 454 | switch(offset+0x780) |
455 | 455 | { |
456 | case (0x780/2): { seibu_main_word_w(&space,0,data,0x00ff); break; } | |
457 | case (0x784/2): { seibu_main_word_w(&space,1,data,0x00ff); break; } | |
458 | //case (0x790/2): { seibu_main_word_w(&space,4,data,0x00ff); break; } | |
459 | case (0x794/2): { seibu_main_word_w(&space,4,data,0x00ff); break; } | |
460 | case (0x798/2): { seibu_main_word_w(&space,6,data,0x00ff); break; } | |
456 | case (0x780/2): { seibu_main_word_w(space,0,data,0x00ff); break; } | |
457 | case (0x784/2): { seibu_main_word_w(space,1,data,0x00ff); break; } | |
458 | //case (0x790/2): { seibu_main_word_w(space,4,data,0x00ff); break; } | |
459 | case (0x794/2): { seibu_main_word_w(space,4,data,0x00ff); break; } | |
460 | case (0x798/2): { seibu_main_word_w(space,6,data,0x00ff); break; } | |
461 | 461 | } |
462 | 462 | } |
463 | 463 |
r17963 | r17964 | |
---|---|---|
172 | 172 | |
173 | 173 | READ8_MEMBER(superqix_state::in4_mcu_r) |
174 | 174 | { |
175 | // logerror("%04x: in4_mcu_r\n",space | |
175 | // logerror("%04x: in4_mcu_r\n",space.device().safe_pc()); | |
176 | 176 | return ioport("P2")->read() | (m_from_mcu_pending << 6) | (m_from_z80_pending << 7); |
177 | 177 | } |
178 | 178 | |
179 | 179 | READ8_MEMBER(superqix_state::sqix_from_mcu_r) |
180 | 180 | { |
181 | // logerror("%04x: read mcu answer (%02x)\n",space | |
181 | // logerror("%04x: read mcu answer (%02x)\n",space.device().safe_pc(),m_from_mcu); | |
182 | 182 | return m_from_mcu; |
183 | 183 | } |
184 | 184 | |
r17963 | r17964 | |
198 | 198 | |
199 | 199 | WRITE8_MEMBER(superqix_state::sqix_z80_mcu_w) |
200 | 200 | { |
201 | // logerror("%04x: sqix_z80_mcu_w %02x\n",space | |
201 | // logerror("%04x: sqix_z80_mcu_w %02x\n",space.device().safe_pc(),data); | |
202 | 202 | m_portb = data; |
203 | 203 | } |
204 | 204 | |
r17963 | r17964 | |
473 | 473 | |
474 | 474 | READ8_MEMBER(superqix_state::hotsmash_ay_port_a_r) |
475 | 475 | { |
476 | // logerror("%04x: ay_port_a_r and mcu_pending is %d\n",space | |
476 | // logerror("%04x: ay_port_a_r and mcu_pending is %d\n",space.device().safe_pc(),m_from_mcu_pending); | |
477 | 477 | return ioport("SYSTEM")->read() | 0x40 | ((m_from_mcu_pending^1) << 7); |
478 | 478 | } |
479 | 479 | |
r17963 | r17964 | |
515 | 515 | |
516 | 516 | READ8_MEMBER(superqix_state::pbillian_ay_port_a_r) |
517 | 517 | { |
518 | // logerror("%04x: ay_port_a_r\n",space | |
518 | // logerror("%04x: ay_port_a_r\n",space.device().safe_pc()); | |
519 | 519 | /* bits 76------ MCU status bits */ |
520 | 520 | return (machine().rand() & 0xc0) | machine().root_device().ioport("BUTTONS")->read(); |
521 | 521 | } |
r17963 | r17964 | |
---|---|---|
297 | 297 | { |
298 | 298 | /* AY 3-8910 */ |
299 | 299 | ay8910_data_w(m_ay8910, space, 0, offset); |
300 | return 0xff;//mame_rand(space | |
300 | return 0xff;//mame_rand(space.machine); | |
301 | 301 | |
302 | 302 | } |
303 | 303 | break; |
r17963 | r17964 | |
---|---|---|
344 | 344 | break; |
345 | 345 | |
346 | 346 | case 0x1330: |
347 | bfm_sc4_reel4_w( | |
347 | bfm_sc4_reel4_w(space,0,data&0xf); | |
348 | 348 | //m_meterstatus = (m_meterstatus&0x3f) | ((data & 0x30) << 2); |
349 | 349 | sec.write_data_line(~data&0x10); |
350 | 350 | break; |
r17963 | r17964 | |
504 | 504 | } |
505 | 505 | |
506 | 506 | |
507 | void bfm_sc4_68307_porta_w(address_space | |
507 | void bfm_sc4_68307_porta_w(address_space &space, bool dedicated, UINT8 data, UINT8 line_mask) | |
508 | 508 | { |
509 | sc4_state *state = space | |
509 | sc4_state *state = space.machine().driver_data<sc4_state>(); | |
510 | 510 | |
511 | 511 | state->m_reel12_latch = data; |
512 | 512 | |
r17963 | r17964 | |
524 | 524 | |
525 | 525 | static WRITE8_HANDLER( bfm_sc4_reel3_w ) |
526 | 526 | { |
527 | sc4_state *state = space | |
527 | sc4_state *state = space.machine().driver_data<sc4_state>(); | |
528 | 528 | |
529 | 529 | state->m_reel3_latch = data; |
530 | 530 | |
r17963 | r17964 | |
538 | 538 | |
539 | 539 | static WRITE8_HANDLER( bfm_sc4_reel4_w ) |
540 | 540 | { |
541 | sc4_state *state = space | |
541 | sc4_state *state = space.machine().driver_data<sc4_state>(); | |
542 | 542 | |
543 | 543 | state->m_reel4_latch = data; |
544 | 544 | |
r17963 | r17964 | |
550 | 550 | awp_draw_reel(3); |
551 | 551 | } |
552 | 552 | |
553 | void bfm_sc4_68307_portb_w(address_space | |
553 | void bfm_sc4_68307_portb_w(address_space &space, bool dedicated, UINT16 data, UINT16 line_mask) | |
554 | 554 | { |
555 | 555 | // if (dedicated == false) |
556 | 556 | { |
557 | int pc = space->device().safe_pc(); | |
558 | //m68ki_cpu_core *m68k = m68k_get_safe_token(&space->device()); | |
557 | int pc = space.device().safe_pc(); | |
558 | //m68ki_cpu_core *m68k = m68k_get_safe_token(&space.device()); | |
559 | 559 | // serial output to the VFD at least.. |
560 | 560 | logerror("%08x bfm_sc4_68307_portb_w %04x %04x\n", pc, data, line_mask); |
561 | 561 | |
562 | bfm_sc4_write_serial_vfd(space | |
562 | bfm_sc4_write_serial_vfd(space.machine(), (data & 0x4000)?1:0, (data & 0x1000)?1:0, !(data & 0x2000)?1:0); | |
563 | 563 | |
564 | 564 | bfm_sc4_reel3_w(space, 0, (data&0x0f00)>>8); |
565 | 565 | } |
566 | 566 | |
567 | 567 | } |
568 | UINT8 bfm_sc4_68307_porta_r(address_space | |
568 | UINT8 bfm_sc4_68307_porta_r(address_space &space, bool dedicated, UINT8 line_mask) | |
569 | 569 | { |
570 | int pc = space | |
570 | int pc = space.device().safe_pc(); | |
571 | 571 | logerror("%08x bfm_sc4_68307_porta_r\n", pc); |
572 | return space | |
572 | return space.machine().rand(); | |
573 | 573 | } |
574 | 574 | |
575 | UINT16 bfm_sc4_68307_portb_r(address_space | |
575 | UINT16 bfm_sc4_68307_portb_r(address_space &space, bool dedicated, UINT16 line_mask) | |
576 | 576 | { |
577 | 577 | if (dedicated==false) |
578 | 578 | { |
r17963 | r17964 | |
---|---|---|
79 | 79 | 0x0003, 0x0080, 0x0006, 0x0060, 0x0000, 0x00e0, 0x000a, 0x00c0, 0x0003, 0x0080, 0x0006, 0x0060, 0x0000, 0x00e0, 0x000a, 0x00c0, |
80 | 80 | 0x0003, 0x0080, 0x0006, 0x0060, 0x0000, 0x00e0, 0x000a, 0x00c0, 0x0003, 0x0080, 0x0006, 0x0060, 0x0000, 0x00e0, 0x000a, 0x00c0 }; |
81 | 81 | |
82 | static void f1dream_protection_w(address_space | |
82 | static void f1dream_protection_w(address_space &space) | |
83 | 83 | { |
84 | tigeroad_state *state = space | |
84 | tigeroad_state *state = space.machine().driver_data<tigeroad_state>(); | |
85 | 85 | int indx; |
86 | 86 | int value = 255; |
87 | int prevpc = space | |
87 | int prevpc = space.device().safe_pcbase(); | |
88 | 88 | |
89 | 89 | if (prevpc == 0x244c) |
90 | 90 | { |
r17963 | r17964 | |
139 | 139 | else if ((prevpc == 0x27f8) || (prevpc == 0x511a) || (prevpc == 0x5142) || (prevpc == 0x516a)) |
140 | 140 | { |
141 | 141 | /* The main CPU stuffs the byte for the soundlatch into 0xfffffd.*/ |
142 | state->soundlatch_byte_w( | |
142 | state->soundlatch_byte_w(space,2,state->m_ram16[0x3ffc/2]); | |
143 | 143 | } |
144 | 144 | } |
145 | 145 | |
146 | 146 | WRITE16_MEMBER(tigeroad_state::f1dream_control_w) |
147 | 147 | { |
148 | 148 | logerror("protection write, PC: %04x FFE1 Value:%01x\n",space.device().safe_pc(), m_ram16[0x3fe0/2]); |
149 | f1dream_protection_w( | |
149 | f1dream_protection_w(space); | |
150 | 150 | } |
151 | 151 | |
152 | 152 | WRITE16_MEMBER(tigeroad_state::tigeroad_soundcmd_w) |
r17963 | r17964 | |
---|---|---|
446 | 446 | } |
447 | 447 | |
448 | 448 | |
449 | static void int_control_w(address_space | |
449 | static void int_control_w(address_space &space, int offset, UINT8 data) | |
450 | 450 | { |
451 | segas32_state *state = space | |
451 | segas32_state *state = space.machine().driver_data<segas32_state>(); | |
452 | 452 | int duration; |
453 | 453 | |
454 | // logerror("%06X:int_control_w(%X) = %02X\n", space | |
454 | // logerror("%06X:int_control_w(%X) = %02X\n", space.device().safe_pc(), offset, data); | |
455 | 455 | switch (offset) |
456 | 456 | { |
457 | 457 | case 0: |
r17963 | r17964 | |
468 | 468 | |
469 | 469 | case 6: /* mask */ |
470 | 470 | state->m_v60_irq_control[offset] = data; |
471 | update_irq_state(space | |
471 | update_irq_state(space.machine()); | |
472 | 472 | break; |
473 | 473 | |
474 | 474 | case 7: /* acknowledge */ |
475 | 475 | state->m_v60_irq_control[offset] &= data; |
476 | update_irq_state(space | |
476 | update_irq_state(space.machine()); | |
477 | 477 | break; |
478 | 478 | |
479 | 479 | case 8: |
r17963 | r17964 | |
502 | 502 | case 13: |
503 | 503 | case 14: |
504 | 504 | case 15: /* signal IRQ to sound CPU */ |
505 | signal_sound_irq(space | |
505 | signal_sound_irq(space.machine(), SOUND_IRQ_V60); | |
506 | 506 | break; |
507 | 507 | } |
508 | 508 | } |
r17963 | r17964 | |
529 | 529 | WRITE16_MEMBER(segas32_state::interrupt_control_16_w) |
530 | 530 | { |
531 | 531 | if (ACCESSING_BITS_0_7) |
532 | int_control_w( | |
532 | int_control_w(space, offset*2+0, data); | |
533 | 533 | if (ACCESSING_BITS_8_15) |
534 | int_control_w( | |
534 | int_control_w(space, offset*2+1, data >> 8); | |
535 | 535 | } |
536 | 536 | |
537 | 537 | |
r17963 | r17964 | |
552 | 552 | WRITE32_MEMBER(segas32_state::interrupt_control_32_w) |
553 | 553 | { |
554 | 554 | if (ACCESSING_BITS_0_7) |
555 | int_control_w( | |
555 | int_control_w(space, offset*4+0, data); | |
556 | 556 | if (ACCESSING_BITS_8_15) |
557 | int_control_w( | |
557 | int_control_w(space, offset*4+1, data >> 8); | |
558 | 558 | if (ACCESSING_BITS_16_23) |
559 | int_control_w( | |
559 | int_control_w(space, offset*4+2, data >> 16); | |
560 | 560 | if (ACCESSING_BITS_24_31) |
561 | int_control_w( | |
561 | int_control_w(space, offset*4+3, data >> 24); | |
562 | 562 | } |
563 | 563 | |
564 | 564 | |
r17963 | r17964 | |
587 | 587 | * |
588 | 588 | *************************************/ |
589 | 589 | |
590 | static UINT16 common_io_chip_r(address_space | |
590 | static UINT16 common_io_chip_r(address_space &space, int which, offs_t offset, UINT16 mem_mask) | |
591 | 591 | { |
592 | segas32_state *state = space | |
592 | segas32_state *state = space.machine().driver_data<segas32_state>(); | |
593 | 593 | static const char *const portnames[2][8] = |
594 | 594 | { |
595 | 595 | { "P1_A", "P2_A", "PORTC_A", "PORTD_A", "SERVICE12_A", "SERVICE34_A", "PORTG_A", "PORTH_A" }, |
r17963 | r17964 | |
639 | 639 | } |
640 | 640 | |
641 | 641 | |
642 | static void common_io_chip_w(address_space | |
642 | static void common_io_chip_w(address_space &space, int which, offs_t offset, UINT16 data, UINT16 mem_mask) | |
643 | 643 | { |
644 | segas32_state *state = space | |
644 | segas32_state *state = space.machine().driver_data<segas32_state>(); | |
645 | 645 | // UINT8 old; |
646 | 646 | |
647 | 647 | /* only LSB matters */ |
r17963 | r17964 | |
673 | 673 | |
674 | 674 | if (which == 0) |
675 | 675 | { |
676 | eeprom_device *eeprom = space | |
676 | eeprom_device *eeprom = space.machine().device<eeprom_device>("eeprom"); | |
677 | 677 | eeprom->write_bit(data & 0x80); |
678 | 678 | eeprom->set_cs_line((data & 0x20) ? CLEAR_LINE : ASSERT_LINE); |
679 | 679 | eeprom->set_clock_line((data & 0x40) ? ASSERT_LINE : CLEAR_LINE); |
680 | 680 | } |
681 | /* coin_lockout_w(space->machine(), 1 + 2*which, data & 0x08); | |
682 | coin_lockout_w(space->machine(), 0 + 2*which, data & 0x04);*/ | |
683 | coin_counter_w(space->machine(), 1 + 2*which, data & 0x02); | |
684 | coin_counter_w(space->machine(), 0 + 2*which, data & 0x01); | |
681 | /* coin_lockout_w(space.machine(), 1 + 2*which, data & 0x08); | |
682 | coin_lockout_w(space.machine(), 0 + 2*which, data & 0x04);*/ | |
683 | coin_counter_w(space.machine(), 1 + 2*which, data & 0x02); | |
684 | coin_counter_w(space.machine(), 0 + 2*which, data & 0x01); | |
685 | 685 | break; |
686 | 686 | |
687 | 687 | /* tile banking */ |
r17963 | r17964 | |
691 | 691 | else |
692 | 692 | { |
693 | 693 | /* multi-32 EEPROM access */ |
694 | eeprom_device *eeprom = space | |
694 | eeprom_device *eeprom = space.machine().device<eeprom_device>("eeprom"); | |
695 | 695 | eeprom->write_bit(data & 0x80); |
696 | 696 | eeprom->set_cs_line((data & 0x20) ? CLEAR_LINE : ASSERT_LINE); |
697 | 697 | eeprom->set_clock_line((data & 0x40) ? ASSERT_LINE : CLEAR_LINE); |
r17963 | r17964 | |
702 | 702 | case 0x1c/2: |
703 | 703 | state->m_system32_displayenable[which] = (data & 0x02); |
704 | 704 | if (which == 0) |
705 | space | |
705 | space.machine().device("soundcpu")->execute().set_input_line(INPUT_LINE_RESET, (data & 0x04) ? CLEAR_LINE : ASSERT_LINE); | |
706 | 706 | break; |
707 | 707 | } |
708 | 708 | } |
r17963 | r17964 | |
710 | 710 | |
711 | 711 | READ16_MEMBER(segas32_state::io_chip_r) |
712 | 712 | { |
713 | return common_io_chip_r( | |
713 | return common_io_chip_r(space, 0, offset, mem_mask); | |
714 | 714 | } |
715 | 715 | |
716 | 716 | |
717 | 717 | WRITE16_MEMBER(segas32_state::io_chip_w) |
718 | 718 | { |
719 | common_io_chip_w( | |
719 | common_io_chip_w(space, 0, offset, data, mem_mask); | |
720 | 720 | } |
721 | 721 | |
722 | 722 | |
723 | 723 | READ32_MEMBER(segas32_state::io_chip_0_r) |
724 | 724 | { |
725 | return common_io_chip_r(&space, 0, offset*2+0, mem_mask) | | |
726 | (common_io_chip_r(&space, 0, offset*2+1, mem_mask >> 16) << 16); | |
725 | return common_io_chip_r(space, 0, offset*2+0, mem_mask) | | |
726 | (common_io_chip_r(space, 0, offset*2+1, mem_mask >> 16) << 16); | |
727 | 727 | } |
728 | 728 | |
729 | 729 | |
730 | 730 | WRITE32_MEMBER(segas32_state::io_chip_0_w) |
731 | 731 | { |
732 | 732 | if (ACCESSING_BITS_0_15) |
733 | common_io_chip_w( | |
733 | common_io_chip_w(space, 0, offset*2+0, data, mem_mask); | |
734 | 734 | if (ACCESSING_BITS_16_31) |
735 | common_io_chip_w( | |
735 | common_io_chip_w(space, 0, offset*2+1, data >> 16, mem_mask >> 16); | |
736 | 736 | } |
737 | 737 | |
738 | 738 | |
739 | 739 | READ32_MEMBER(segas32_state::io_chip_1_r) |
740 | 740 | { |
741 | return common_io_chip_r(&space, 1, offset*2+0, mem_mask) | | |
742 | (common_io_chip_r(&space, 1, offset*2+1, mem_mask >> 16) << 16); | |
741 | return common_io_chip_r(space, 1, offset*2+0, mem_mask) | | |
742 | (common_io_chip_r(space, 1, offset*2+1, mem_mask >> 16) << 16); | |
743 | 743 | } |
744 | 744 | |
745 | 745 | |
746 | 746 | WRITE32_MEMBER(segas32_state::io_chip_1_w) |
747 | 747 | { |
748 | 748 | if (ACCESSING_BITS_0_15) |
749 | common_io_chip_w( | |
749 | common_io_chip_w(space, 1, offset*2+0, data, mem_mask); | |
750 | 750 | if (ACCESSING_BITS_16_31) |
751 | common_io_chip_w( | |
751 | common_io_chip_w(space, 1, offset*2+1, data >> 16, mem_mask >> 16); | |
752 | 752 | } |
753 | 753 | |
754 | 754 |
r17963 | r17964 | |
---|---|---|
187 | 187 | |
188 | 188 | static void scanline_update(screen_device &screen, int scanline) |
189 | 189 | { |
190 | address_space | |
190 | address_space &space = *screen.machine().device("audiocpu")->memory().space(AS_PROGRAM); | |
191 | 191 | |
192 | 192 | /* sound IRQ is on 32V */ |
193 | 193 | if (scanline & 32) |
r17963 | r17964 | |
290 | 290 | break; |
291 | 291 | |
292 | 292 | case 0x002: /* /RDP */ |
293 | result = atarigen_6502_sound_r( | |
293 | result = atarigen_6502_sound_r(space, offset); | |
294 | 294 | break; |
295 | 295 | |
296 | 296 | case 0x004: /* /RDIO */ |
r17963 | r17964 | |
312 | 312 | break; |
313 | 313 | |
314 | 314 | case 0x006: /* /IRQACK */ |
315 | atarigen_6502_irq_ack_r( | |
315 | atarigen_6502_irq_ack_r(space, 0); | |
316 | 316 | break; |
317 | 317 | |
318 | 318 | case 0x200: /* /VOICE */ |
r17963 | r17964 | |
339 | 339 | break; |
340 | 340 | |
341 | 341 | case 0x006: /* /IRQACK */ |
342 | atarigen_6502_irq_ack_r( | |
342 | atarigen_6502_irq_ack_r(space, 0); | |
343 | 343 | break; |
344 | 344 | |
345 | 345 | case 0x200: /* n/c */ |
r17963 | r17964 | |
347 | 347 | break; |
348 | 348 | |
349 | 349 | case 0x202: /* /WRP */ |
350 | atarigen_6502_sound_w( | |
350 | atarigen_6502_sound_w(space, offset, data); | |
351 | 351 | break; |
352 | 352 | |
353 | 353 | case 0x204: /* WRIO */ |
r17963 | r17964 | |
---|---|---|
287 | 287 | |
288 | 288 | void supertnk_state::machine_reset() |
289 | 289 | { |
290 | address_space *space = machine().device("maincpu")->memory().space(AS_PROGRAM); | |
291 | supertnk_bankswitch_0_w(*space, 0, 0); | |
292 | supertnk_bankswitch_1_w(*space, 0, 0); | |
290 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
291 | supertnk_bankswitch_0_w(space, 0, 0); | |
292 | supertnk_bankswitch_1_w(space, 0, 0); | |
293 | 293 | |
294 | supertnk_bitplane_select_0_w(*space, 0, 0); | |
295 | supertnk_bitplane_select_1_w(*space, 0, 0); | |
294 | supertnk_bitplane_select_0_w(space, 0, 0); | |
295 | supertnk_bitplane_select_1_w(space, 0, 0); | |
296 | 296 | } |
297 | 297 | |
298 | 298 |
r17963 | r17964 | |
---|---|---|
9834 | 9834 | |
9835 | 9835 | static READ16_HANDLER( sbp_lowerrom_r ) |
9836 | 9836 | { |
9837 | UINT16* rom = (UINT16*)space | |
9837 | UINT16* rom = (UINT16*)space.machine().root_device().memregion("maincpu")->base(); | |
9838 | 9838 | UINT16 origdata = rom[(offset+(0x200/2))]; |
9839 | 9839 | UINT16 data = BITSWAP16(origdata, 11,10,9,8,15,14,13,12,3,2,1,0,7,6,5,4); |
9840 | 9840 | int realoffset = 0x200+(offset*2); |
r17963 | r17964 | |
---|---|---|
18 | 18 | static int eolith_vblank = 0; |
19 | 19 | static int eolith_scanline = 0; |
20 | 20 | |
21 | void eolith_speedup_read(address_space | |
21 | void eolith_speedup_read(address_space &space) | |
22 | 22 | { |
23 | 23 | /* for debug */ |
24 | //if ((space->device().safe_pc()!=eolith_speedup_address) && (eolith_vblank!=1) ) | |
25 | // printf("%s:eolith speedup_read data %02x\n",space->machine().describe_context(), eolith_vblank); | |
24 | //if ((space.device().safe_pc()!=eolith_speedup_address) && (eolith_vblank!=1) ) | |
25 | // printf("%s:eolith speedup_read data %02x\n",space.machine().describe_context(), eolith_vblank); | |
26 | 26 | |
27 | 27 | if (eolith_vblank==0 && eolith_scanline < eolith_speedup_resume_scanline) |
28 | 28 | { |
29 | int pc = space | |
29 | int pc = space.device().safe_pc(); | |
30 | 30 | |
31 | 31 | if ((pc==eolith_speedup_address) || (pc==eolith_speedup_address2)) |
32 | 32 | { |
33 | space | |
33 | space.device().execute().spin_until_trigger(1000); | |
34 | 34 | } |
35 | 35 | } |
36 | 36 | } |
r17963 | r17964 | |
---|---|---|
767 | 767 | m_maincpu->set_input_line(4, HOLD_LINE); |
768 | 768 | |
769 | 769 | // X scroll values |
770 | address_space | |
770 | address_space &space = *m_maincpu->space(AS_PROGRAM); | |
771 | 771 | segaic16_textram_0_w(space, 0xff8/2, m_workram[0x0d14/2], 0xffff); |
772 | 772 | segaic16_textram_0_w(space, 0xffa/2, m_workram[0x0d18/2], 0xffff); |
773 | 773 |
r17963 | r17964 | |
---|---|---|
217 | 217 | } |
218 | 218 | |
219 | 219 | |
220 | void neogeo_set_display_counter_msb( address_space | |
220 | void neogeo_set_display_counter_msb( address_space &space, UINT16 data ) | |
221 | 221 | { |
222 | neogeo_state *state = space | |
222 | neogeo_state *state = space.machine().driver_data<neogeo_state>(); | |
223 | 223 | |
224 | 224 | state->m_display_counter = (state->m_display_counter & 0x0000ffff) | ((UINT32)data << 16); |
225 | 225 | |
226 | if (LOG_VIDEO_SYSTEM) logerror("PC %06x: set_display_counter %08x\n", space | |
226 | if (LOG_VIDEO_SYSTEM) logerror("PC %06x: set_display_counter %08x\n", space.device().safe_pc(), state->m_display_counter); | |
227 | 227 | } |
228 | 228 | |
229 | 229 | |
230 | void neogeo_set_display_counter_lsb( address_space | |
230 | void neogeo_set_display_counter_lsb( address_space &space, UINT16 data ) | |
231 | 231 | { |
232 | neogeo_state *state = space | |
232 | neogeo_state *state = space.machine().driver_data<neogeo_state>(); | |
233 | 233 | |
234 | 234 | state->m_display_counter = (state->m_display_counter & 0xffff0000) | data; |
235 | 235 | |
236 | if (LOG_VIDEO_SYSTEM) logerror("PC %06x: set_display_counter %08x\n", space | |
236 | if (LOG_VIDEO_SYSTEM) logerror("PC %06x: set_display_counter %08x\n", space.device().safe_pc(), state->m_display_counter); | |
237 | 237 | |
238 | 238 | if (state->m_display_position_interrupt_control & IRQ2CTRL_LOAD_RELATIVE) |
239 | 239 | { |
240 | 240 | if (LOG_VIDEO_SYSTEM) logerror("AUTOLOAD_RELATIVE "); |
241 | adjust_display_position_interrupt_timer(space | |
241 | adjust_display_position_interrupt_timer(space.machine()); | |
242 | 242 | } |
243 | 243 | } |
244 | 244 | |
r17963 | r17964 | |
649 | 649 | } |
650 | 650 | |
651 | 651 | |
652 | void neogeo_set_main_cpu_bank_address( address_space | |
652 | void neogeo_set_main_cpu_bank_address( address_space &space, UINT32 bank_address ) | |
653 | 653 | { |
654 | neogeo_state *state = space | |
654 | neogeo_state *state = space.machine().driver_data<neogeo_state>(); | |
655 | 655 | |
656 | if (LOG_MAIN_CPU_BANKING) logerror("MAIN CPU PC %06x: neogeo_set_main_cpu_bank_address %06x\n", space | |
656 | if (LOG_MAIN_CPU_BANKING) logerror("MAIN CPU PC %06x: neogeo_set_main_cpu_bank_address %06x\n", space.device().safe_pc(), bank_address); | |
657 | 657 | |
658 | 658 | state->m_main_cpu_bank_address = bank_address; |
659 | 659 | |
660 | _set_main_cpu_bank_address(space | |
660 | _set_main_cpu_bank_address(space.machine()); | |
661 | 661 | } |
662 | 662 | |
663 | 663 | |
r17963 | r17964 | |
678 | 678 | bank_address = 0x100000; |
679 | 679 | } |
680 | 680 | |
681 | neogeo_set_main_cpu_bank_address( | |
681 | neogeo_set_main_cpu_bank_address(space, bank_address); | |
682 | 682 | } |
683 | 683 | } |
684 | 684 | |
685 | 685 | |
686 | 686 | static void main_cpu_banking_init( running_machine &machine ) |
687 | 687 | { |
688 | address_space | |
688 | address_space &mainspace = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
689 | 689 | |
690 | 690 | /* create vector banks */ |
691 | 691 | machine.root_device().membank(NEOGEO_BANK_VECTORS)->configure_entry(0, machine.root_device().memregion("mainbios")->base()); |
r17963 | r17964 | |
716 | 716 | } |
717 | 717 | |
718 | 718 | |
719 | static void audio_cpu_bank_select( address_space | |
719 | static void audio_cpu_bank_select( address_space &space, int region, UINT8 bank ) | |
720 | 720 | { |
721 | neogeo_state *state = space | |
721 | neogeo_state *state = space.machine().driver_data<neogeo_state>(); | |
722 | 722 | |
723 | if (LOG_AUDIO_CPU_BANKING) logerror("Audio CPU PC %03x: audio_cpu_bank_select: Region: %d Bank: %02x\n", space | |
723 | if (LOG_AUDIO_CPU_BANKING) logerror("Audio CPU PC %03x: audio_cpu_bank_select: Region: %d Bank: %02x\n", space.device().safe_pc(), region, bank); | |
724 | 724 | |
725 | 725 | state->m_audio_cpu_banks[region] = bank; |
726 | 726 | |
727 | set_audio_cpu_banking(space | |
727 | set_audio_cpu_banking(space.machine()); | |
728 | 728 | } |
729 | 729 | |
730 | 730 | |
731 | 731 | READ8_MEMBER(neogeo_state::audio_cpu_bank_select_f000_f7ff_r) |
732 | 732 | { |
733 | audio_cpu_bank_select( | |
733 | audio_cpu_bank_select(space, 0, offset >> 8); | |
734 | 734 | |
735 | 735 | return 0; |
736 | 736 | } |
r17963 | r17964 | |
738 | 738 | |
739 | 739 | READ8_MEMBER(neogeo_state::audio_cpu_bank_select_e000_efff_r) |
740 | 740 | { |
741 | audio_cpu_bank_select( | |
741 | audio_cpu_bank_select(space, 1, offset >> 8); | |
742 | 742 | |
743 | 743 | return 0; |
744 | 744 | } |
r17963 | r17964 | |
746 | 746 | |
747 | 747 | READ8_MEMBER(neogeo_state::audio_cpu_bank_select_c000_dfff_r) |
748 | 748 | { |
749 | audio_cpu_bank_select( | |
749 | audio_cpu_bank_select(space, 2, offset >> 8); | |
750 | 750 | |
751 | 751 | return 0; |
752 | 752 | } |
r17963 | r17964 | |
754 | 754 | |
755 | 755 | READ8_MEMBER(neogeo_state::audio_cpu_bank_select_8000_bfff_r) |
756 | 756 | { |
757 | audio_cpu_bank_select( | |
757 | audio_cpu_bank_select(space, 3, offset >> 8); | |
758 | 758 | |
759 | 759 | return 0; |
760 | 760 | } |
761 | 761 | |
762 | 762 | |
763 | static void _set_audio_cpu_rom_source( address_space | |
763 | static void _set_audio_cpu_rom_source( address_space &space ) | |
764 | 764 | { |
765 | neogeo_state *state = space | |
765 | neogeo_state *state = space.machine().driver_data<neogeo_state>(); | |
766 | 766 | |
767 | 767 | /* if (!state->memregion("audiobios")->base()) */ |
768 | 768 | state->m_audio_cpu_rom_source = 1; |
r17963 | r17964 | |
774 | 774 | { |
775 | 775 | state->m_audio_cpu_rom_source_last = state->m_audio_cpu_rom_source; |
776 | 776 | |
777 | space | |
777 | space.machine().device("audiocpu")->execute().set_input_line(INPUT_LINE_RESET, PULSE_LINE); | |
778 | 778 | |
779 | if (LOG_AUDIO_CPU_BANKING) logerror("Audio CPU PC %03x: selectign %s ROM\n", space | |
779 | if (LOG_AUDIO_CPU_BANKING) logerror("Audio CPU PC %03x: selectign %s ROM\n", space.device().safe_pc(), state->m_audio_cpu_rom_source ? "CARTRIDGE" : "BIOS"); | |
780 | 780 | } |
781 | 781 | } |
782 | 782 | |
783 | 783 | |
784 | static void set_audio_cpu_rom_source( address_space | |
784 | static void set_audio_cpu_rom_source( address_space &space, UINT8 data ) | |
785 | 785 | { |
786 | neogeo_state *state = space | |
786 | neogeo_state *state = space.machine().driver_data<neogeo_state>(); | |
787 | 787 | state->m_audio_cpu_rom_source = data; |
788 | 788 | |
789 | 789 | _set_audio_cpu_rom_source(space); |
r17963 | r17964 | |
826 | 826 | set_audio_cpu_banking(machine); |
827 | 827 | |
828 | 828 | state->m_audio_cpu_rom_source_last = 0; |
829 | set_audio_cpu_rom_source(machine.device("maincpu")->memory().space(AS_PROGRAM), 0); | |
829 | set_audio_cpu_rom_source(*machine.device("maincpu")->memory().space(AS_PROGRAM), 0); | |
830 | 830 | } |
831 | 831 | |
832 | 832 | |
r17963 | r17964 | |
848 | 848 | default: |
849 | 849 | case 0x00: neogeo_set_screen_dark(machine(), bit); break; |
850 | 850 | case 0x01: set_main_cpu_vector_table_source(machine(), bit); |
851 | set_audio_cpu_rom_source( | |
851 | set_audio_cpu_rom_source(space, bit); /* this is a guess */ | |
852 | 852 | break; |
853 | 853 | case 0x05: neogeo_set_fixed_layer_source(machine(), bit); break; |
854 | 854 | case 0x06: set_save_ram_unlock(machine(), bit); break; |
r17963 | r17964 | |
982 | 982 | _set_main_cpu_bank_address(machine); |
983 | 983 | _set_main_cpu_vector_table_source(machine); |
984 | 984 | set_audio_cpu_banking(machine); |
985 | _set_audio_cpu_rom_source(machine.device("maincpu")->memory().space(AS_PROGRAM)); | |
985 | _set_audio_cpu_rom_source(*machine.device("maincpu")->memory().space(AS_PROGRAM)); | |
986 | 986 | set_outputs(machine); |
987 | 987 | } |
988 | 988 | |
r17963 | r17964 | |
1050 | 1050 | void neogeo_state::machine_reset() |
1051 | 1051 | { |
1052 | 1052 | offs_t offs; |
1053 | address_space | |
1053 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
1054 | 1054 | |
1055 | 1055 | /* reset system control registers */ |
1056 | 1056 | for (offs = 0; offs < 8; offs++) |
1057 | system_control_w( | |
1057 | system_control_w(space, offs, 0, 0x00ff); | |
1058 | 1058 | |
1059 | 1059 | machine().device("maincpu")->reset(); |
1060 | 1060 |
r17963 | r17964 | |
---|---|---|
1068 | 1068 | /* decode the opcodes */ |
1069 | 1069 | |
1070 | 1070 | offs_t i; |
1071 | address_space | |
1071 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
1072 | 1072 | UINT8 *decrypted = auto_alloc_array(machine(), UINT8, 0x6000); |
1073 | 1073 | UINT8 *rom = machine().root_device().memregion("maincpu")->base(); |
1074 | 1074 | UINT8 *table = machine().root_device().memregion("user1")->base(); |
1075 | 1075 | |
1076 | space | |
1076 | space.set_decrypted_region(0x0000, 0x5fff, decrypted); | |
1077 | 1077 | |
1078 | 1078 | for (i = 0; i < 0x6000; i++) |
1079 | 1079 | decrypted[i] = table[rom[i]]; |
r17963 | r17964 | |
---|---|---|
433 | 433 | return m_cur_rambank[offset]; |
434 | 434 | } |
435 | 435 | |
436 | static void bank_w(address_space | |
436 | static void bank_w(address_space &space, offs_t offset, UINT8 data, int banknum ) | |
437 | 437 | { |
438 | taitol_state *state = space | |
438 | taitol_state *state = space.machine().driver_data<taitol_state>(); | |
439 | 439 | |
440 | 440 | if (state->m_current_base[banknum][offset] != data) |
441 | 441 | { |
442 | 442 | state->m_current_base[banknum][offset] = data; |
443 | 443 | if (state->m_current_notifier[banknum]) |
444 | state->m_current_notifier[banknum](space | |
444 | state->m_current_notifier[banknum](space.machine(), offset); | |
445 | 445 | } |
446 | 446 | } |
447 | 447 | |
448 | 448 | WRITE8_MEMBER(taitol_state::bank0_w) |
449 | 449 | { |
450 | bank_w( | |
450 | bank_w(space, offset, data, 0); | |
451 | 451 | } |
452 | 452 | |
453 | 453 | WRITE8_MEMBER(taitol_state::bank1_w) |
454 | 454 | { |
455 | bank_w( | |
455 | bank_w(space, offset, data, 1); | |
456 | 456 | } |
457 | 457 | |
458 | 458 | WRITE8_MEMBER(taitol_state::bank2_w) |
459 | 459 | { |
460 | bank_w( | |
460 | bank_w(space, offset, data, 2); | |
461 | 461 | } |
462 | 462 | |
463 | 463 | WRITE8_MEMBER(taitol_state::bank3_w) |
464 | 464 | { |
465 | bank_w( | |
465 | bank_w(space, offset, data, 3); | |
466 | 466 | } |
467 | 467 | |
468 | 468 | WRITE8_MEMBER(taitol_state::control2_w) |
r17963 | r17964 | |
1777 | 1777 | m_cur_bank = data & 0x03; |
1778 | 1778 | bankaddress = m_cur_bank * 0x4000; |
1779 | 1779 | membank("bank7")->set_base(&RAM[bankaddress]); |
1780 | //logerror ("YM2203 bank change val=%02x pc=%04x\n", m_cur_bank, space | |
1780 | //logerror ("YM2203 bank change val=%02x pc=%04x\n", m_cur_bank, space.device().safe_pc() ); | |
1781 | 1781 | } |
1782 | 1782 | } |
1783 | 1783 |
r17963 | r17964 | |
---|---|---|
61 | 61 | |
62 | 62 | READ16_MEMBER(eolith16_state::eolith16_custom_r) |
63 | 63 | { |
64 | eolith_speedup_read( | |
64 | eolith_speedup_read(space); | |
65 | 65 | return ioport("SPECIAL")->read(); |
66 | 66 | } |
67 | 67 |
r17963 | r17964 | |
---|---|---|
250 | 250 | } |
251 | 251 | |
252 | 252 | |
253 | static void rapidfir_to_shiftreg(address_space | |
253 | static void rapidfir_to_shiftreg(address_space &space, UINT32 address, UINT16 *shiftreg) | |
254 | 254 | { |
255 | tickee_state *state = space | |
255 | tickee_state *state = space.machine().driver_data<tickee_state>(); | |
256 | 256 | if (address < 0x800000) |
257 | 257 | memcpy(shiftreg, &state->m_vram[TOWORD(address)], TOBYTE(0x2000)); |
258 | 258 | } |
259 | 259 | |
260 | 260 | |
261 | static void rapidfir_from_shiftreg(address_space | |
261 | static void rapidfir_from_shiftreg(address_space &space, UINT32 address, UINT16 *shiftreg) | |
262 | 262 | { |
263 | tickee_state *state = space | |
263 | tickee_state *state = space.machine().driver_data<tickee_state>(); | |
264 | 264 | if (address < 0x800000) |
265 | 265 | memcpy(&state->m_vram[TOWORD(address)], shiftreg, TOBYTE(0x2000)); |
266 | 266 | } |
r17963 | r17964 | |
---|---|---|
236 | 236 | { |
237 | 237 | int source = (data & 7); |
238 | 238 | ppu2c0x_device *ppu = machine().device<ppu2c0x_device>("ppu"); |
239 | ppu->spriteram_dma( | |
239 | ppu->spriteram_dma(space, source); | |
240 | 240 | } |
241 | 241 | |
242 | 242 | READ8_MEMBER(multigam_state::psg_4015_r) |
r17963 | r17964 | |
1138 | 1138 | |
1139 | 1139 | MACHINE_RESET_MEMBER(multigam_state,multigm3) |
1140 | 1140 | { |
1141 | address_space | |
1141 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
1142 | 1142 | /* reset the ppu */ |
1143 | multigm3_switch_prg_rom( | |
1143 | multigm3_switch_prg_rom(space, 0, 0x01 ); | |
1144 | 1144 | }; |
1145 | 1145 | |
1146 | 1146 | void multigam_state::machine_start() |
r17963 | r17964 | |
1360 | 1360 | |
1361 | 1361 | DRIVER_INIT_MEMBER(multigam_state,multigam) |
1362 | 1362 | { |
1363 | address_space *space = machine().device("maincpu")->memory().space(AS_PROGRAM); | |
1364 | multigam_switch_prg_rom(*space, 0x0, 0x01); | |
1363 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
1364 | multigam_switch_prg_rom(space, 0x0, 0x01); | |
1365 | 1365 | } |
1366 | 1366 | |
1367 | 1367 | static void multigm3_decrypt(UINT8* mem, int memsize, const UINT8* decode_nibble) |
r17963 | r17964 | |
1375 | 1375 | |
1376 | 1376 | DRIVER_INIT_MEMBER(multigam_state,multigm3) |
1377 | 1377 | { |
1378 | address_space | |
1378 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
1379 | 1379 | |
1380 | 1380 | const UINT8 decode[16] = { 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a }; |
1381 | 1381 | |
r17963 | r17964 | |
1384 | 1384 | |
1385 | 1385 | m_multigmc_mmc3_6000_ram = auto_alloc_array(machine(), UINT8, 0x2000); |
1386 | 1386 | |
1387 | multigam_switch_prg_rom( | |
1387 | multigam_switch_prg_rom(space, 0x0, 0x01); | |
1388 | 1388 | } |
1389 | 1389 | |
1390 | 1390 | DRIVER_INIT_MEMBER(multigam_state,multigmt) |
1391 | 1391 | { |
1392 | address_space | |
1392 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
1393 | 1393 | |
1394 | 1394 | UINT8* buf = auto_alloc_array(machine(), UINT8, 0x80000); |
1395 | 1395 | UINT8 *rom; |
r17963 | r17964 | |
1425 | 1425 | } |
1426 | 1426 | |
1427 | 1427 | auto_free(machine(), buf); |
1428 | multigam_switch_prg_rom( | |
1428 | multigam_switch_prg_rom(space, 0x0, 0x01); | |
1429 | 1429 | }; |
1430 | 1430 | |
1431 | 1431 | GAME( 1992, multigam, 0, multigam, multigam, multigam_state, multigam, ROT0, "<unknown>", "Multi Game (set 1)", 0 ) |
r17963 | r17964 | |
---|---|---|
446 | 446 | UINT8 *ROM = memregion("maincpu")->base(); |
447 | 447 | |
448 | 448 | /* The two i860s execute out of RAM */ |
449 | address_space *space = machine().device<i860_device>("vid_0")->space(AS_PROGRAM); | |
450 | space->set_direct_update_handler(direct_update_delegate(FUNC(vcombat_state::vcombat_vid_0_direct_handler), this)); | |
449 | address_space &v0space = *machine().device<i860_device>("vid_0")->space(AS_PROGRAM); | |
450 | v0space.set_direct_update_handler(direct_update_delegate(FUNC(vcombat_state::vcombat_vid_0_direct_handler), this)); | |
451 | 451 | |
452 | space = machine().device<i860_device>("vid_1")->space(AS_PROGRAM); | |
453 | space->set_direct_update_handler(direct_update_delegate(FUNC(vcombat_state::vcombat_vid_1_direct_handler), this)); | |
452 | address_space &v1space = *machine().device<i860_device>("vid_1")->space(AS_PROGRAM); | |
453 | v1space.set_direct_update_handler(direct_update_delegate(FUNC(vcombat_state::vcombat_vid_1_direct_handler), this)); | |
454 | 454 | |
455 | 455 | /* Allocate the 68000 framebuffers */ |
456 | 456 | m_m68k_framebuffer[0] = auto_alloc_array(machine(), UINT16, 0x8000); |
r17963 | r17964 | |
493 | 493 | m_i860_framebuffer[1][1] = NULL; |
494 | 494 | |
495 | 495 | /* The i860 executes out of RAM */ |
496 | address_space *space = machine().device<i860_device>("vid_0")->space(AS_PROGRAM); | |
497 | space->set_direct_update_handler(direct_update_delegate(FUNC(vcombat_state::vcombat_vid_0_direct_handler), this)); | |
496 | address_space &space = *machine().device<i860_device>("vid_0")->space(AS_PROGRAM); | |
497 | space.set_direct_update_handler(direct_update_delegate(FUNC(vcombat_state::vcombat_vid_0_direct_handler), this)); | |
498 | 498 | } |
499 | 499 | |
500 | 500 |
r17963 | r17964 | |
---|---|---|
97 | 97 | |
98 | 98 | |
99 | 99 | |
100 | static void pxa255_lcd_load_dma_descriptor(address_space | |
100 | static void pxa255_lcd_load_dma_descriptor(address_space & space, UINT32 address, int channel); | |
101 | 101 | static void pxa255_lcd_irq_check(running_machine& machine); |
102 | 102 | static void pxa255_lcd_dma_kickoff(running_machine& machine, int channel); |
103 | 103 | static void pxa255_lcd_check_load_next_branch(running_machine& machine, int channel); |
r17963 | r17964 | |
278 | 278 | |
279 | 279 | // Load the next descriptor |
280 | 280 | |
281 | address_space *space = machine.device<pxa255_device>("maincpu")->space(AS_PROGRAM); | |
282 | dma_regs->dsadr[channel] = space->read_dword(dma_regs->ddadr[channel] + 0x4); | |
283 | dma_regs->dtadr[channel] = space->read_dword(dma_regs->ddadr[channel] + 0x8); | |
284 | dma_regs->dcmd[channel] = space->read_dword(dma_regs->ddadr[channel] + 0xc); | |
285 | dma_regs->ddadr[channel] = space->read_dword(dma_regs->ddadr[channel]); | |
281 | address_space &space = *machine.device<pxa255_device>("maincpu")->space(AS_PROGRAM); | |
282 | dma_regs->dsadr[channel] = space.read_dword(dma_regs->ddadr[channel] + 0x4); | |
283 | dma_regs->dtadr[channel] = space.read_dword(dma_regs->ddadr[channel] + 0x8); | |
284 | dma_regs->dcmd[channel] = space.read_dword(dma_regs->ddadr[channel] + 0xc); | |
285 | dma_regs->ddadr[channel] = space.read_dword(dma_regs->ddadr[channel]); | |
286 | 286 | |
287 | 287 | // Start our end-of-transfer timer |
288 | 288 | switch(channel) |
r17963 | r17964 | |
318 | 318 | UINT16 temp16; |
319 | 319 | UINT32 temp32; |
320 | 320 | |
321 | address_space | |
321 | address_space &space = *machine.device<pxa255_device>("maincpu")->space(AS_PROGRAM); | |
322 | 322 | switch(param) |
323 | 323 | { |
324 | 324 | case 3: |
325 | 325 | for(index = 0; index < count; index += 4) |
326 | 326 | { |
327 | state->m_words[index >> 2] = space | |
327 | state->m_words[index >> 2] = space.read_dword(sadr); | |
328 | 328 | state->m_samples[(index >> 1) + 0] = (INT16)(state->m_words[index >> 2] >> 16); |
329 | 329 | state->m_samples[(index >> 1) + 1] = (INT16)(state->m_words[index >> 2] & 0xffff); |
330 | 330 | sadr += 4; |
r17963 | r17964 | |
337 | 337 | switch(dma_regs->dcmd[param] & PXA255_DCMD_SIZE) |
338 | 338 | { |
339 | 339 | case PXA255_DCMD_SIZE_8: |
340 | temp8 = space->read_byte(sadr); | |
341 | space->write_byte(tadr, temp8); | |
340 | temp8 = space.read_byte(sadr); | |
341 | space.write_byte(tadr, temp8); | |
342 | 342 | index++; |
343 | 343 | break; |
344 | 344 | case PXA255_DCMD_SIZE_16: |
345 | temp16 = space->read_word(sadr); | |
346 | space->write_word(tadr, temp16); | |
345 | temp16 = space.read_word(sadr); | |
346 | space.write_word(tadr, temp16); | |
347 | 347 | index += 2; |
348 | 348 | break; |
349 | 349 | case PXA255_DCMD_SIZE_32: |
350 | temp32 = space->read_dword(sadr); | |
351 | space->write_dword(tadr, temp32); | |
350 | temp32 = space.read_dword(sadr); | |
351 | space.write_dword(tadr, temp32); | |
352 | 352 | index += 4; |
353 | 353 | break; |
354 | 354 | default: |
r17963 | r17964 | |
1058 | 1058 | |
1059 | 1059 | */ |
1060 | 1060 | |
1061 | static void pxa255_lcd_load_dma_descriptor(address_space | |
1061 | static void pxa255_lcd_load_dma_descriptor(address_space & space, UINT32 address, int channel) | |
1062 | 1062 | { |
1063 | _39in1_state *state = space | |
1063 | _39in1_state *state = space.machine().driver_data<_39in1_state>(); | |
1064 | 1064 | PXA255_LCD_Regs *lcd_regs = &state->m_lcd_regs; |
1065 | 1065 | |
1066 | lcd_regs->dma[channel].fdadr = space->read_dword(address); | |
1067 | lcd_regs->dma[channel].fsadr = space->read_dword(address + 0x04); | |
1068 | lcd_regs->dma[channel].fidr = space->read_dword(address + 0x08); | |
1069 | lcd_regs->dma[channel].ldcmd = space->read_dword(address + 0x0c); | |
1070 | verboselog( space->machine(), 4, "pxa255_lcd_load_dma_descriptor, address = %08x, channel = %d\n", address, channel); | |
1071 | verboselog( space->machine(), 4, " DMA Frame Descriptor: %08x\n", lcd_regs->dma[channel].fdadr ); | |
1072 | verboselog( space->machine(), 4, " DMA Frame Source Address: %08x\n", lcd_regs->dma[channel].fsadr ); | |
1073 | verboselog( space->machine(), 4, " DMA Frame ID: %08x\n", lcd_regs->dma[channel].fidr ); | |
1074 | verboselog( space->machine(), 4, " DMA Command: %08x\n", lcd_regs->dma[channel].ldcmd ); | |
1066 | lcd_regs->dma[channel].fdadr = space.read_dword(address); | |
1067 | lcd_regs->dma[channel].fsadr = space.read_dword(address + 0x04); | |
1068 | lcd_regs->dma[channel].fidr = space.read_dword(address + 0x08); | |
1069 | lcd_regs->dma[channel].ldcmd = space.read_dword(address + 0x0c); | |
1070 | verboselog( space.machine(), 4, "pxa255_lcd_load_dma_descriptor, address = %08x, channel = %d\n", address, channel); | |
1071 | verboselog( space.machine(), 4, " DMA Frame Descriptor: %08x\n", lcd_regs->dma[channel].fdadr ); | |
1072 | verboselog( space.machine(), 4, " DMA Frame Source Address: %08x\n", lcd_regs->dma[channel].fsadr ); | |
1073 | verboselog( space.machine(), 4, " DMA Frame ID: %08x\n", lcd_regs->dma[channel].fidr ); | |
1074 | verboselog( space.machine(), 4, " DMA Command: %08x\n", lcd_regs->dma[channel].ldcmd ); | |
1075 | 1075 | } |
1076 | 1076 | |
1077 | 1077 | static void pxa255_lcd_irq_check(running_machine& machine) |
r17963 | r17964 | |
1111 | 1111 | |
1112 | 1112 | if(lcd_regs->dma[channel].ldcmd & PXA255_LDCMD_PAL) |
1113 | 1113 | { |
1114 | address_space | |
1114 | address_space &space = *machine.device<pxa255_device>("maincpu")->space(AS_PROGRAM); | |
1115 | 1115 | int length = lcd_regs->dma[channel].ldcmd & 0x000fffff; |
1116 | 1116 | int index = 0; |
1117 | 1117 | for(index = 0; index < length; index += 2) |
1118 | 1118 | { |
1119 | UINT16 color = space | |
1119 | UINT16 color = space.read_word((lcd_regs->dma[channel].fsadr &~ 1) + index); | |
1120 | 1120 | state->m_pxa255_lcd_palette[index >> 1] = (((((color >> 11) & 0x1f) << 3) | (color >> 13)) << 16) | (((((color >> 5) & 0x3f) << 2) | ((color >> 9) & 0x3)) << 8) | (((color & 0x1f) << 3) | ((color >> 2) & 0x7)); |
1121 | 1121 | palette_set_color_rgb(machine, index >> 1, (((color >> 11) & 0x1f) << 3) | (color >> 13), (((color >> 5) & 0x3f) << 2) | ((color >> 9) & 0x3), ((color & 0x1f) << 3) | ((color >> 2) & 0x7)); |
1122 | 1122 | } |
1123 | 1123 | } |
1124 | 1124 | else |
1125 | 1125 | { |
1126 | address_space | |
1126 | address_space &space = *machine.device<pxa255_device>("maincpu")->space(AS_PROGRAM); | |
1127 | 1127 | int length = lcd_regs->dma[channel].ldcmd & 0x000fffff; |
1128 | 1128 | int index = 0; |
1129 | 1129 | for(index = 0; index < length; index++) |
1130 | 1130 | { |
1131 | state->m_pxa255_lcd_framebuffer[index] = space | |
1131 | state->m_pxa255_lcd_framebuffer[index] = space.read_byte(lcd_regs->dma[channel].fsadr + index); | |
1132 | 1132 | } |
1133 | 1133 | } |
1134 | 1134 | } |
r17963 | r17964 | |
1143 | 1143 | { |
1144 | 1144 | verboselog( machine, 4, "pxa255_lcd_check_load_next_branch: Taking branch\n" ); |
1145 | 1145 | lcd_regs->fbr[channel] &= ~1; |
1146 | address_space *space = machine.device<pxa255_device>("maincpu")->space(AS_PROGRAM); | |
1147 | //lcd_regs->fbr[channel] = (space->read_dword(lcd_regs->fbr[channel] & 0xfffffff0) & 0xfffffff0) | (lcd_regs->fbr[channel] & 0x00000003); | |
1146 | address_space &space = *machine.device<pxa255_device>("maincpu")->space(AS_PROGRAM); | |
1147 | //lcd_regs->fbr[channel] = (space.read_dword(lcd_regs->fbr[channel] & 0xfffffff0) & 0xfffffff0) | (lcd_regs->fbr[channel] & 0x00000003); | |
1148 | 1148 | //printf( "%08x\n", lcd_regs->fbr[channel] ); |
1149 | 1149 | pxa255_lcd_load_dma_descriptor(space, lcd_regs->fbr[channel] & 0xfffffff0, 0); |
1150 | lcd_regs->fbr[channel] = (space | |
1150 | lcd_regs->fbr[channel] = (space.read_dword(lcd_regs->fbr[channel] & 0xfffffff0) & 0xfffffff0) | (lcd_regs->fbr[channel] & 0x00000003); | |
1151 | 1151 | pxa255_lcd_dma_kickoff(machine, 0); |
1152 | 1152 | if(lcd_regs->fbr[channel] & 2) |
1153 | 1153 | { |
r17963 | r17964 | |
1308 | 1308 | verboselog( machine(), 4, "pxa255_lcd_w: LCD DMA Frame Descriptor Address Register 0: %08x & %08x\n", data, mem_mask ); |
1309 | 1309 | if(!lcd_regs->dma[0].eof->enabled()) |
1310 | 1310 | { |
1311 | pxa255_lcd_load_dma_descriptor( | |
1311 | pxa255_lcd_load_dma_descriptor(space, data & 0xfffffff0, 0); | |
1312 | 1312 | } |
1313 | 1313 | else |
1314 | 1314 | { |
r17963 | r17964 | |
1329 | 1329 | verboselog( machine(), 4, "pxa255_lcd_w: LCD DMA Frame Descriptor Address Register 1: %08x & %08x\n", data, mem_mask ); |
1330 | 1330 | if(!lcd_regs->dma[1].eof->enabled()) |
1331 | 1331 | { |
1332 | pxa255_lcd_load_dma_descriptor( | |
1332 | pxa255_lcd_load_dma_descriptor(space, data & 0xfffffff0, 1); | |
1333 | 1333 | } |
1334 | 1334 | else |
1335 | 1335 | { |
r17963 | r17964 | |
1464 | 1464 | m_dmadac[1] = machine().device<dmadac_sound_device>("dac2"); |
1465 | 1465 | m_eeprom = machine().device<eeprom_device>("eeprom"); |
1466 | 1466 | |
1467 | address_space *space = machine().device<pxa255_device>("maincpu")->space(AS_PROGRAM); | |
1468 | space->install_read_handler (0xa0151648, 0xa015164b, read32_delegate(FUNC(_39in1_state::prot_cheater_r), this)); | |
1467 | address_space &space = *machine().device<pxa255_device>("maincpu")->space(AS_PROGRAM); | |
1468 | space.install_read_handler (0xa0151648, 0xa015164b, read32_delegate(FUNC(_39in1_state::prot_cheater_r), this)); | |
1469 | 1469 | } |
1470 | 1470 | |
1471 | 1471 | static ADDRESS_MAP_START( 39in1_map, AS_PROGRAM, 32, _39in1_state ) |
r17963 | r17964 | |
---|---|---|
157 | 157 | col = offset <<= 1; |
158 | 158 | |
159 | 159 | if (ACCESSING_BITS_8_15) |
160 | tms34061_w( | |
160 | tms34061_w(space, col, row, func, data >> 8); | |
161 | 161 | |
162 | 162 | if (ACCESSING_BITS_0_7) |
163 | tms34061_w( | |
163 | tms34061_w(space, col | 1, row, func, data & 0xff); | |
164 | 164 | } |
165 | 165 | |
166 | 166 | |
r17963 | r17964 | |
177 | 177 | col = offset <<= 1; |
178 | 178 | |
179 | 179 | if (ACCESSING_BITS_8_15) |
180 | data |= tms34061_r( | |
180 | data |= tms34061_r(space, col, row, func) << 8; | |
181 | 181 | |
182 | 182 | if (ACCESSING_BITS_0_7) |
183 | data |= tms34061_r( | |
183 | data |= tms34061_r(space, col | 1, row, func); | |
184 | 184 | |
185 | 185 | return data; |
186 | 186 | } |
r17963 | r17964 | |
607 | 607 | if (newval == 0) |
608 | 608 | { |
609 | 609 | UINT32 credit; |
610 | address_space | |
610 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
611 | 611 | |
612 | 612 | /* Get the current credit value and add the new coin value */ |
613 | credit = space->read_dword(0x8002c) + (UINT32)(FPTR)param; | |
614 | space->write_dword(0x8002c, credit); | |
613 | credit = space.read_dword(0x8002c) + (UINT32)(FPTR)param; | |
614 | space.write_dword(0x8002c, credit); | |
615 | 615 | } |
616 | 616 | } |
617 | 617 |
r17963 | r17964 | |
---|---|---|
525 | 525 | |
526 | 526 | static READ16_HANDLER( mpu4_vid_vidram_r ) |
527 | 527 | { |
528 | mpu4vid_state *state = space | |
528 | mpu4vid_state *state = space.machine().driver_data<mpu4vid_state>(); | |
529 | 529 | return state->m_vid_vidram[offset]; |
530 | 530 | } |
531 | 531 | |
532 | 532 | |
533 | 533 | static WRITE16_HANDLER( mpu4_vid_vidram_w ) |
534 | 534 | { |
535 | mpu4vid_state *state = space | |
535 | mpu4vid_state *state = space.machine().driver_data<mpu4vid_state>(); | |
536 | 536 | COMBINE_DATA(&state->m_vid_vidram[offset]); |
537 | 537 | offset <<= 1; |
538 | space->machine().gfx[state->m_gfx_index+0]->mark_dirty(offset/0x20); | |
539 | space->machine().gfx[state->m_gfx_index+1]->mark_dirty(offset/0x20); | |
540 | space->machine().gfx[state->m_gfx_index+2]->mark_dirty(offset/0x20); | |
541 | space->machine().gfx[state->m_gfx_index+3]->mark_dirty(offset/0x20); | |
538 | space.machine().gfx[state->m_gfx_index+0]->mark_dirty(offset/0x20); | |
539 | space.machine().gfx[state->m_gfx_index+1]->mark_dirty(offset/0x20); | |
540 | space.machine().gfx[state->m_gfx_index+2]->mark_dirty(offset/0x20); | |
541 | space.machine().gfx[state->m_gfx_index+3]->mark_dirty(offset/0x20); | |
542 | 542 | } |
543 | 543 | |
544 | 544 | |
r17963 | r17964 | |
581 | 581 | |
582 | 582 | static WRITE16_HANDLER( ef9369_w ) |
583 | 583 | { |
584 | mpu4vid_state *state = space | |
584 | mpu4vid_state *state = space.machine().driver_data<mpu4vid_state>(); | |
585 | 585 | struct ef9369_t &pal = state->m_pal; |
586 | 586 | data &= 0x00ff; |
587 | 587 | |
r17963 | r17964 | |
611 | 611 | col = pal.clut[entry] & 0xfff; |
612 | 612 | |
613 | 613 | /* Update the MAME palette */ |
614 | palette_set_color_rgb(space | |
614 | palette_set_color_rgb(space.machine(), entry, pal4bit(col >> 8), pal4bit(col >> 4), pal4bit(col >> 0)); | |
615 | 615 | } |
616 | 616 | |
617 | 617 | /* Address register auto-increment */ |
r17963 | r17964 | |
623 | 623 | |
624 | 624 | static READ16_HANDLER( ef9369_r ) |
625 | 625 | { |
626 | mpu4vid_state *state = space | |
626 | mpu4vid_state *state = space.machine().driver_data<mpu4vid_state>(); | |
627 | 627 | struct ef9369_t &pal = state->m_pal; |
628 | 628 | if ((offset & 1) == 0) |
629 | 629 | { |
r17963 | r17964 | |
660 | 660 | |
661 | 661 | WRITE16_HANDLER( bt471_w ) |
662 | 662 | { |
663 | mpu4vid_state *state = space | |
663 | mpu4vid_state *state = space.machine().driver_data<mpu4vid_state>(); | |
664 | 664 | struct bt471_t &bt471 = state->m_bt471; |
665 | 665 | UINT8 val = data & 0xff; |
666 | 666 | { |
r17963 | r17964 | |
684 | 684 | |
685 | 685 | if (++*addr_cnt == 3) |
686 | 686 | { |
687 | palette_set_color(space | |
687 | palette_set_color(space.machine(), bt471.address, MAKE_RGB(color[0], color[1], color[2])); | |
688 | 688 | *addr_cnt = 0; |
689 | 689 | |
690 | 690 | /* Address register increments */ |
r17963 | r17964 | |
1597 | 1597 | |
1598 | 1598 | static WRITE16_HANDLER( characteriser16_w ) |
1599 | 1599 | { |
1600 | mpu4_state *state = space | |
1600 | mpu4_state *state = space.machine().driver_data<mpu4_state>(); | |
1601 | 1601 | int x; |
1602 | 1602 | int call=data; |
1603 | LOG_CHR_FULL(("%04x Characteriser write offset %02X data %02X", space | |
1603 | LOG_CHR_FULL(("%04x Characteriser write offset %02X data %02X", space.device().safe_pcbase(),offset,data)); | |
1604 | 1604 | |
1605 | 1605 | if (!state->m_current_chr_table) |
1606 | 1606 | { |
1607 | logerror("No Characteriser Table @ %04x\n", space | |
1607 | logerror("No Characteriser Table @ %04x\n", space.device().safe_pcbase()); | |
1608 | 1608 | return; |
1609 | 1609 | } |
1610 | 1610 | |
r17963 | r17964 | |
1629 | 1629 | |
1630 | 1630 | static READ16_HANDLER( characteriser16_r ) |
1631 | 1631 | { |
1632 | mpu4_state *state = space->machine().driver_data<mpu4_state>(); | |
1633 | LOG_CHR_FULL(("%04x Characteriser read offset %02X,data %02X", space->device().safe_pcbase(),offset,state->m_current_chr_table[state->m_prot_col].response)); | |
1632 | mpu4_state *state = space.machine().driver_data<mpu4_state>(); | |
1633 | LOG_CHR_FULL(("%04x Characteriser read offset %02X,data %02X", space.device().safe_pcbase(),offset,state->m_current_chr_table[state->m_prot_col].response)); | |
1634 | 1634 | LOG_CHR(("Characteriser read offset %02X \n",offset)); |
1635 | 1635 | LOG_CHR(("Characteriser read data %02X \n",state->m_current_chr_table[state->m_prot_col].response)); |
1636 | 1636 | |
1637 | 1637 | if (!state->m_current_chr_table) |
1638 | 1638 | { |
1639 | logerror("No Characteriser Table @ %04x\n", space | |
1639 | logerror("No Characteriser Table @ %04x\n", space.device().safe_pcbase()); | |
1640 | 1640 | return 0x00; |
1641 | 1641 | } |
1642 | 1642 | |
1643 | 1643 | |
1644 | 1644 | /* hack for 'invalid questions' error on time machine.. I guess it wants them to decode properly for startup check? */ |
1645 | if (space | |
1645 | if (space.device().safe_pcbase()==0x283a) | |
1646 | 1646 | { |
1647 | 1647 | return 0x00; |
1648 | 1648 | } |
r17963 | r17964 | |
1669 | 1669 | |
1670 | 1670 | static WRITE16_HANDLER( bwb_characteriser16_w ) |
1671 | 1671 | { |
1672 | mpu4_state *state = space | |
1672 | mpu4_state *state = space.machine().driver_data<mpu4_state>(); | |
1673 | 1673 | int x; |
1674 | 1674 | int call=data &0xff; |
1675 | LOG_CHR_FULL(("%04x Characteriser write offset %02X data %02X \n", space | |
1675 | LOG_CHR_FULL(("%04x Characteriser write offset %02X data %02X \n", space.device().safe_pcbase(),offset,data)); | |
1676 | 1676 | if (!state->m_current_chr_table) |
1677 | 1677 | { |
1678 | logerror("No Characteriser Table @ %04x\n", space | |
1678 | logerror("No Characteriser Table @ %04x\n", space.device().safe_pcbase()); | |
1679 | 1679 | return; |
1680 | 1680 | } |
1681 | 1681 | |
r17963 | r17964 | |
1695 | 1695 | state->m_init_col =0; |
1696 | 1696 | } |
1697 | 1697 | } |
1698 | state->m_chr_value = space | |
1698 | state->m_chr_value = space.machine().rand(); | |
1699 | 1699 | for (x = 0; x < 4; x++) |
1700 | 1700 | { |
1701 | 1701 | if (state->m_current_chr_table[(x)].call == call) |
r17963 | r17964 | |
1713 | 1713 | |
1714 | 1714 | static READ16_HANDLER( bwb_characteriser16_r ) |
1715 | 1715 | { |
1716 | mpu4_state *state = space | |
1716 | mpu4_state *state = space.machine().driver_data<mpu4_state>(); | |
1717 | 1717 | |
1718 | 1718 | LOG_CHR(("Characteriser read offset %02X \n",offset)); |
1719 | 1719 |
r17963 | r17964 | |
---|---|---|
142 | 142 | { |
143 | 143 | int source = (data & 7); |
144 | 144 | ppu2c0x_device *ppu = machine().device<ppu2c0x_device>("ppu"); |
145 | ppu->spriteram_dma( | |
145 | ppu->spriteram_dma(space, source); | |
146 | 146 | } |
147 | 147 | |
148 | 148 | READ8_MEMBER(cham24_state::psg_4015_r) |
r17963 | r17964 | |
---|---|---|
48 | 48 | /* ESB-specific */ |
49 | 49 | if (m_is_esb) |
50 | 50 | { |
51 | address_space | |
51 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
52 | 52 | |
53 | 53 | /* reset the slapstic */ |
54 | 54 | slapstic_reset(); |
r17963 | r17964 | |
56 | 56 | memcpy(m_slapstic_base, &m_slapstic_source[m_slapstic_current_bank * 0x2000], 0x2000); |
57 | 57 | |
58 | 58 | /* reset all the banks */ |
59 | starwars_out_w( | |
59 | starwars_out_w(space, 4, 0); | |
60 | 60 | } |
61 | 61 | |
62 | 62 | /* reset the matrix processor */ |
r17963 | r17964 | |
84 | 84 | * |
85 | 85 | *************************************/ |
86 | 86 | |
87 | static void esb_slapstic_tweak(address_space | |
87 | static void esb_slapstic_tweak(address_space &space, offs_t offset) | |
88 | 88 | { |
89 | starwars_state *state = space | |
89 | starwars_state *state = space.machine().driver_data<starwars_state>(); | |
90 | 90 | int new_bank = slapstic_tweak(space, offset); |
91 | 91 | |
92 | 92 | /* update for the new bank */ |
r17963 | r17964 | |
101 | 101 | READ8_MEMBER(starwars_state::esb_slapstic_r) |
102 | 102 | { |
103 | 103 | int result = m_slapstic_base[offset]; |
104 | esb_slapstic_tweak( | |
104 | esb_slapstic_tweak(space, offset); | |
105 | 105 | return result; |
106 | 106 | } |
107 | 107 | |
108 | 108 | |
109 | 109 | WRITE8_MEMBER(starwars_state::esb_slapstic_w) |
110 | 110 | { |
111 | esb_slapstic_tweak( | |
111 | esb_slapstic_tweak(space, offset); | |
112 | 112 | } |
113 | 113 | |
114 | 114 | |
r17963 | r17964 | |
135 | 135 | { |
136 | 136 | m_slapstic_last_pc = pc; |
137 | 137 | m_slapstic_last_address = address; |
138 | esb_slapstic_tweak( | |
138 | esb_slapstic_tweak(direct.space(), address & 0x1fff); | |
139 | 139 | } |
140 | 140 | return ~0; |
141 | 141 | } |
r17963 | r17964 | |
514 | 514 | m_slapstic_base = &rom[0x08000]; |
515 | 515 | |
516 | 516 | /* install an opcode base handler */ |
517 | address_space *space = machine().device<m6809_device>("maincpu")->space(AS_PROGRAM); | |
518 | space->set_direct_update_handler(direct_update_delegate(FUNC(starwars_state::esb_setdirect), this)); | |
517 | address_space &space = *machine().device<m6809_device>("maincpu")->space(AS_PROGRAM); | |
518 | space.set_direct_update_handler(direct_update_delegate(FUNC(starwars_state::esb_setdirect), this)); | |
519 | 519 | |
520 | 520 | /* install read/write handlers for it */ |
521 | 521 | machine().device("maincpu")->memory().space(AS_PROGRAM)->install_readwrite_handler(0x8000, 0x9fff, read8_delegate(FUNC(starwars_state::esb_slapstic_r),this), write8_delegate(FUNC(starwars_state::esb_slapstic_w),this)); |
r17963 | r17964 | |
---|---|---|
529 | 529 | |
530 | 530 | kbdc8042_init(machine(), &at8042); |
531 | 531 | pc_vga_init(machine(), vga_setting, NULL); |
532 | pc_vga_io_init(machine(), machine().device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, machine().device("maincpu")->memory().space(AS_IO), 0x0000); | |
532 | pc_vga_io_init(machine(), *machine().device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, *machine().device("maincpu")->memory().space(AS_IO), 0x0000); | |
533 | 533 | } |
534 | 534 | |
535 | 535 | void savquest_state::machine_reset() |
r17963 | r17964 | |
---|---|---|
192 | 192 | { |
193 | 193 | okim6295_device *oki = downcast<okim6295_device *>(device); |
194 | 194 | oki->set_bank_base(0x40000 * ((data >> 8) & 1)); |
195 | // logerror("CPU #0 PC %06X: OKI bank %08X\n", space | |
195 | // logerror("CPU #0 PC %06X: OKI bank %08X\n", space.device().safe_pc(), data); | |
196 | 196 | } |
197 | 197 | } |
198 | 198 | |
r17963 | r17964 | |
203 | 203 | { |
204 | 204 | okim6295_device *oki = downcast<okim6295_device *>(device); |
205 | 205 | oki->set_bank_base(0x40000 * (data & 1)); |
206 | // logerror("CPU #0 PC %06X: OKI bank %08X\n", space | |
206 | // logerror("CPU #0 PC %06X: OKI bank %08X\n", space.device().safe_pc(), data); | |
207 | 207 | } |
208 | 208 | } |
209 | 209 |
r17963 | r17964 | |
---|---|---|
593 | 593 | |
594 | 594 | |
595 | 595 | /* FIXME: this seems to do a hell lot of stuff, it's not ST-V SCU but still somewhat complex :/ */ |
596 | static void sysh1_dma_transfer( address_space | |
596 | static void sysh1_dma_transfer( address_space &space, UINT16 dma_index ) | |
597 | 597 | { |
598 | coolridr_state *state = space | |
598 | coolridr_state *state = space.machine().driver_data<coolridr_state>(); | |
599 | 599 | UINT32 src,dst,size,type,s_i; |
600 | 600 | UINT8 end_dma_mark; |
601 | 601 | |
r17963 | r17964 | |
644 | 644 | //size/=2; |
645 | 645 | if((src & 0xff00000) == 0x3e00000) |
646 | 646 | return; //FIXME: kludge to avoid palette corruption |
647 | //debugger_break(space | |
647 | //debugger_break(space.machine()); | |
648 | 648 | } |
649 | 649 | |
650 | 650 | if(type == 0xc || type == 0xd || type == 0xe) |
651 | 651 | { |
652 | 652 | for(s_i=0;s_i<size;s_i+=4) |
653 | 653 | { |
654 | space | |
654 | space.write_dword(dst,space.read_dword(src)); | |
655 | 655 | dst+=4; |
656 | 656 | src+=4; |
657 | 657 | } |
r17963 | r17964 | |
676 | 676 | if(offset*4 == 0x000) |
677 | 677 | { |
678 | 678 | if((m_framebuffer_vram[offset] & 0xff00000) == 0xfe00000) |
679 | sysh1_dma_transfer( | |
679 | sysh1_dma_transfer(space, m_framebuffer_vram[offset] & 0xffff); | |
680 | 680 | } |
681 | 681 | } |
682 | 682 |
r17963 | r17964 | |
---|---|---|
2303 | 2303 | } |
2304 | 2304 | |
2305 | 2305 | |
2306 | void mpu4_install_mod4yam_space(address_space | |
2306 | void mpu4_install_mod4yam_space(address_space &space) | |
2307 | 2307 | { |
2308 | mpu4_state *state = space->machine().driver_data<mpu4_state>(); | |
2309 | space->install_read_handler(0x0880, 0x0882, read8_delegate(FUNC(mpu4_state::mpu4_ym2413_r),state)); | |
2310 | space->install_write_handler(0x0880, 0x0881, write8_delegate(FUNC(mpu4_state::mpu4_ym2413_w),state)); | |
2308 | mpu4_state *state = space.machine().driver_data<mpu4_state>(); | |
2309 | space.install_read_handler(0x0880, 0x0882, read8_delegate(FUNC(mpu4_state::mpu4_ym2413_r),state)); | |
2310 | space.install_write_handler(0x0880, 0x0881, write8_delegate(FUNC(mpu4_state::mpu4_ym2413_w),state)); | |
2311 | 2311 | } |
2312 | 2312 | |
2313 | void mpu4_install_mod4oki_space(address_space | |
2313 | void mpu4_install_mod4oki_space(address_space &space) | |
2314 | 2314 | { |
2315 | mpu4_state *state = space->machine().driver_data<mpu4_state>(); | |
2316 | pia6821_device *pia_ic4ss = space->machine().device<pia6821_device>("pia_ic4ss"); | |
2317 | ptm6840_device *ptm_ic3ss = space->machine().device<ptm6840_device>("ptm_ic3ss"); | |
2315 | mpu4_state *state = space.machine().driver_data<mpu4_state>(); | |
2316 | pia6821_device *pia_ic4ss = space.machine().device<pia6821_device>("pia_ic4ss"); | |
2317 | ptm6840_device *ptm_ic3ss = space.machine().device<ptm6840_device>("ptm_ic3ss"); | |
2318 | 2318 | |
2319 | space->install_readwrite_handler(0x0880, 0x0883, 0, 0, read8_delegate(FUNC(pia6821_device::read), pia_ic4ss), write8_delegate(FUNC(pia6821_device::write), pia_ic4ss)); | |
2320 | space->install_read_handler(0x08c0, 0x08c7, 0, 0, read8_delegate(FUNC(ptm6840_device::read), ptm_ic3ss)); | |
2321 | space->install_write_handler(0x08c0, 0x08c7, 0, 0, write8_delegate(FUNC(mpu4_state::ic3ss_w),state)); | |
2319 | space.install_readwrite_handler(0x0880, 0x0883, 0, 0, read8_delegate(FUNC(pia6821_device::read), pia_ic4ss), write8_delegate(FUNC(pia6821_device::write), pia_ic4ss)); | |
2320 | space.install_read_handler(0x08c0, 0x08c7, 0, 0, read8_delegate(FUNC(ptm6840_device::read), ptm_ic3ss)); | |
2321 | space.install_write_handler(0x08c0, 0x08c7, 0, 0, write8_delegate(FUNC(mpu4_state::ic3ss_w),state)); | |
2322 | 2322 | } |
2323 | 2323 | |
2324 | void mpu4_install_mod4bwb_space(address_space | |
2324 | void mpu4_install_mod4bwb_space(address_space &space) | |
2325 | 2325 | { |
2326 | mpu4_state *state = space->machine().driver_data<mpu4_state>(); | |
2327 | space->install_readwrite_handler(0x0810, 0x0810, 0, 0, read8_delegate(FUNC(mpu4_state::bwb_characteriser_r),state),write8_delegate(FUNC(mpu4_state::bwb_characteriser_w),state)); | |
2326 | mpu4_state *state = space.machine().driver_data<mpu4_state>(); | |
2327 | space.install_readwrite_handler(0x0810, 0x0810, 0, 0, read8_delegate(FUNC(mpu4_state::bwb_characteriser_r),state),write8_delegate(FUNC(mpu4_state::bwb_characteriser_w),state)); | |
2328 | 2328 | mpu4_install_mod4oki_space(space); |
2329 | 2329 | } |
2330 | 2330 | |
r17963 | r17964 | |
2359 | 2359 | |
2360 | 2360 | MACHINE_START_MEMBER(mpu4_state,mpu4yam) |
2361 | 2361 | { |
2362 | address_space | |
2362 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2363 | 2363 | mpu4_config_common(machine()); |
2364 | 2364 | |
2365 | 2365 | m_link7a_connected=0; |
r17963 | r17964 | |
2369 | 2369 | |
2370 | 2370 | MACHINE_START_MEMBER(mpu4_state,mpu4oki) |
2371 | 2371 | { |
2372 | address_space | |
2372 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2373 | 2373 | mpu4_config_common(machine()); |
2374 | 2374 | |
2375 | 2375 | m_link7a_connected=0; |
r17963 | r17964 | |
2379 | 2379 | |
2380 | 2380 | MACHINE_START_MEMBER(mpu4_state,mpu4bwb) |
2381 | 2381 | { |
2382 | address_space | |
2382 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2383 | 2383 | mpu4_config_common(machine()); |
2384 | 2384 | |
2385 | 2385 | m_link7a_connected=0; |
r17963 | r17964 | |
2588 | 2588 | |
2589 | 2589 | DRIVER_INIT_MEMBER(mpu4_state,m4default_big) |
2590 | 2590 | { |
2591 | address_space | |
2591 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2592 | 2592 | DRIVER_INIT_CALL(m4default); |
2593 | 2593 | |
2594 | 2594 | int size = machine().root_device().memregion( "maincpu" )->bytes(); |
r17963 | r17964 | |
2599 | 2599 | else |
2600 | 2600 | { |
2601 | 2601 | m_bwb_bank=1; |
2602 | space->install_write_handler(0x0858, 0x0858, 0, 0, write8_delegate(FUNC(mpu4_state::bankswitch_w),this)); | |
2603 | space->install_write_handler(0x0878, 0x0878, 0, 0, write8_delegate(FUNC(mpu4_state::bankset_w),this)); | |
2602 | space.install_write_handler(0x0858, 0x0858, 0, 0, write8_delegate(FUNC(mpu4_state::bankswitch_w),this)); | |
2603 | space.install_write_handler(0x0878, 0x0878, 0, 0, write8_delegate(FUNC(mpu4_state::bankset_w),this)); | |
2604 | 2604 | } |
2605 | 2605 | } |
2606 | 2606 | |
r17963 | r17964 | |
2620 | 2620 | |
2621 | 2621 | DRIVER_INIT_MEMBER(mpu4_state,m_frkstn) |
2622 | 2622 | { |
2623 | address_space | |
2623 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2624 | 2624 | DRIVER_INIT_CALL(m4default_big); |
2625 | space->install_read_handler(0x0880, 0x0880, 0, 0, read8_delegate(FUNC(mpu4_state::crystal_sound_r),this)); | |
2626 | space->install_write_handler(0x0881, 0x0881, 0, 0, write8_delegate(FUNC(mpu4_state::crystal_sound_w),this)); | |
2625 | space.install_read_handler(0x0880, 0x0880, 0, 0, read8_delegate(FUNC(mpu4_state::crystal_sound_r),this)); | |
2626 | space.install_write_handler(0x0881, 0x0881, 0, 0, write8_delegate(FUNC(mpu4_state::crystal_sound_w),this)); | |
2627 | 2627 | } |
2628 | 2628 | |
2629 | 2629 | // thanks to Project Amber for descramble information |
r17963 | r17964 | |
---|---|---|
1254 | 1254 | DRIVER_INIT_MEMBER(gaminator_state,gaminator) |
1255 | 1255 | { |
1256 | 1256 | pc_vga_init(machine(), vga_setting, NULL); |
1257 | pc_vga_gamtor_io_init(machine(), machine().device("maincpu")->memory().space(AS_PROGRAM), 0x44000000, machine().device("maincpu")->memory().space(AS_PROGRAM), 0x40000000); | |
1257 | pc_vga_gamtor_io_init(machine(), *machine().device("maincpu")->memory().space(AS_PROGRAM), 0x44000000, *machine().device("maincpu")->memory().space(AS_PROGRAM), 0x40000000); | |
1258 | 1258 | } |
1259 | 1259 | |
1260 | 1260 |
r17963 | r17964 | |
---|---|---|
378 | 378 | DRIVER_INIT_MEMBER(photoply_state,photoply) |
379 | 379 | { |
380 | 380 | pc_vga_init(machine(), vga_setting, NULL); |
381 | pc_vga_io_init(machine(), machine().device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, machine().device("maincpu")->memory().space(AS_IO), 0x0000); | |
381 | pc_vga_io_init(machine(), *machine().device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, *machine().device("maincpu")->memory().space(AS_IO), 0x0000); | |
382 | 382 | } |
383 | 383 | |
384 | 384 | GAME( 199?, photoply, 0, photoply, photoply, photoply_state, photoply, ROT0, "Funworld", "Photo Play 2000 (v2.01)", GAME_NOT_WORKING|GAME_NO_SOUND ) |
r17963 | r17964 | |
---|---|---|
195 | 195 | static void IntReq( running_machine &machine, int num ) |
196 | 196 | { |
197 | 197 | crystal_state *state = machine.driver_data<crystal_state>(); |
198 | address_space *space = state->m_maincpu->space(AS_PROGRAM); | |
199 | UINT32 IntEn = space->read_dword(0x01800c08); | |
200 | UINT32 IntPend = space->read_dword(0x01800c0c); | |
198 | address_space &space = *state->m_maincpu->space(AS_PROGRAM); | |
199 | UINT32 IntEn = space.read_dword(0x01800c08); | |
200 | UINT32 IntPend = space.read_dword(0x01800c0c); | |
201 | 201 | if (IntEn & (1 << num)) |
202 | 202 | { |
203 | 203 | IntPend |= (1 << num); |
204 | space | |
204 | space.write_dword(0x01800c0c, IntPend); | |
205 | 205 | state->m_maincpu->set_input_line(SE3208_INT, ASSERT_LINE); |
206 | 206 | } |
207 | 207 | #ifdef IDLE_LOOP_SPEEDUP |
r17963 | r17964 | |
273 | 273 | static IRQ_CALLBACK( icallback ) |
274 | 274 | { |
275 | 275 | crystal_state *state = device->machine().driver_data<crystal_state>(); |
276 | address_space *space = device->memory().space(AS_PROGRAM); | |
277 | UINT32 IntPend = space->read_dword(0x01800c0c); | |
276 | address_space &space = *device->memory().space(AS_PROGRAM); | |
277 | UINT32 IntPend = space.read_dword(0x01800c0c); | |
278 | 278 | int i; |
279 | 279 | |
280 | 280 | for (i = 0; i < 32; ++i) |
r17963 | r17964 | |
309 | 309 | IntReq(machine, num[which]); |
310 | 310 | } |
311 | 311 | |
312 | INLINE void Timer_w( address_space | |
312 | INLINE void Timer_w( address_space &space, int which, UINT32 data, UINT32 mem_mask ) | |
313 | 313 | { |
314 | crystal_state *state = space | |
314 | crystal_state *state = space.machine().driver_data<crystal_state>(); | |
315 | 315 | |
316 | 316 | if (((data ^ state->m_Timerctrl[which]) & 1) && (data & 1)) //Timer activate |
317 | 317 | { |
318 | 318 | int PD = (data >> 8) & 0xff; |
319 | int TCV = space | |
319 | int TCV = space.read_dword(0x01801404 + which * 8); | |
320 | 320 | attotime period = attotime::from_hz(43000000) * ((PD + 1) * (TCV + 1)); |
321 | 321 | |
322 | 322 | if (state->m_Timerctrl[which] & 2) |
r17963 | r17964 | |
329 | 329 | |
330 | 330 | WRITE32_MEMBER(crystal_state::Timer0_w) |
331 | 331 | { |
332 | Timer_w( | |
332 | Timer_w(space, 0, data, mem_mask); | |
333 | 333 | } |
334 | 334 | |
335 | 335 | READ32_MEMBER(crystal_state::Timer0_r) |
r17963 | r17964 | |
339 | 339 | |
340 | 340 | WRITE32_MEMBER(crystal_state::Timer1_w) |
341 | 341 | { |
342 | Timer_w( | |
342 | Timer_w(space, 1, data, mem_mask); | |
343 | 343 | } |
344 | 344 | |
345 | 345 | READ32_MEMBER(crystal_state::Timer1_r) |
r17963 | r17964 | |
349 | 349 | |
350 | 350 | WRITE32_MEMBER(crystal_state::Timer2_w) |
351 | 351 | { |
352 | Timer_w( | |
352 | Timer_w(space, 2, data, mem_mask); | |
353 | 353 | } |
354 | 354 | |
355 | 355 | READ32_MEMBER(crystal_state::Timer2_r) |
r17963 | r17964 | |
359 | 359 | |
360 | 360 | WRITE32_MEMBER(crystal_state::Timer3_w) |
361 | 361 | { |
362 | Timer_w( | |
362 | Timer_w(space, 3, data, mem_mask); | |
363 | 363 | } |
364 | 364 | |
365 | 365 | READ32_MEMBER(crystal_state::Timer3_r) |
r17963 | r17964 | |
418 | 418 | COMBINE_DATA(&m_PIO); |
419 | 419 | } |
420 | 420 | |
421 | INLINE void DMA_w( address_space | |
421 | INLINE void DMA_w( address_space &space, int which, UINT32 data, UINT32 mem_mask ) | |
422 | 422 | { |
423 | crystal_state *state = space | |
423 | crystal_state *state = space.machine().driver_data<crystal_state>(); | |
424 | 424 | |
425 | 425 | if (((data ^ state->m_DMActrl[which]) & (1 << 10)) && (data & (1 << 10))) //DMAOn |
426 | 426 | { |
427 | 427 | UINT32 CTR = data; |
428 | UINT32 SRC = space->read_dword(0x01800804 + which * 0x10); | |
429 | UINT32 DST = space->read_dword(0x01800808 + which * 0x10); | |
430 | UINT32 CNT = space->read_dword(0x0180080C + which * 0x10); | |
428 | UINT32 SRC = space.read_dword(0x01800804 + which * 0x10); | |
429 | UINT32 DST = space.read_dword(0x01800808 + which * 0x10); | |
430 | UINT32 CNT = space.read_dword(0x0180080C + which * 0x10); | |
431 | 431 | int i; |
432 | 432 | |
433 | 433 | if (CTR & 0x2) //32 bits |
434 | 434 | { |
435 | 435 | for (i = 0; i < CNT; ++i) |
436 | 436 | { |
437 | UINT32 v = space->read_dword(SRC + i * 4); | |
438 | space->write_dword(DST + i * 4, v); | |
437 | UINT32 v = space.read_dword(SRC + i * 4); | |
438 | space.write_dword(DST + i * 4, v); | |
439 | 439 | } |
440 | 440 | } |
441 | 441 | else if (CTR & 0x1) //16 bits |
442 | 442 | { |
443 | 443 | for (i = 0; i < CNT; ++i) |
444 | 444 | { |
445 | UINT16 v = space->read_word(SRC + i * 2); | |
446 | space->write_word(DST + i * 2, v); | |
445 | UINT16 v = space.read_word(SRC + i * 2); | |
446 | space.write_word(DST + i * 2, v); | |
447 | 447 | } |
448 | 448 | } |
449 | 449 | else //8 bits |
450 | 450 | { |
451 | 451 | for (i = 0; i < CNT; ++i) |
452 | 452 | { |
453 | UINT8 v = space->read_byte(SRC + i); | |
454 | space->write_byte(DST + i, v); | |
453 | UINT8 v = space.read_byte(SRC + i); | |
454 | space.write_byte(DST + i, v); | |
455 | 455 | } |
456 | 456 | } |
457 | 457 | data &= ~(1 << 10); |
458 | space->write_dword(0x0180080C + which * 0x10, 0); | |
459 | IntReq(space->machine(), 7 + which); | |
458 | space.write_dword(0x0180080C + which * 0x10, 0); | |
459 | IntReq(space.machine(), 7 + which); | |
460 | 460 | } |
461 | 461 | COMBINE_DATA(&state->m_DMActrl[which]); |
462 | 462 | } |
r17963 | r17964 | |
468 | 468 | |
469 | 469 | WRITE32_MEMBER(crystal_state::DMA0_w) |
470 | 470 | { |
471 | DMA_w( | |
471 | DMA_w(space, 0, data, mem_mask); | |
472 | 472 | } |
473 | 473 | |
474 | 474 | READ32_MEMBER(crystal_state::DMA1_r) |
r17963 | r17964 | |
478 | 478 | |
479 | 479 | WRITE32_MEMBER(crystal_state::DMA1_w) |
480 | 480 | { |
481 | DMA_w( | |
481 | DMA_w(space, 1, data, mem_mask); | |
482 | 482 | } |
483 | 483 | |
484 | 484 | |
r17963 | r17964 | |
636 | 636 | PatchReset(machine()); |
637 | 637 | } |
638 | 638 | |
639 | static UINT16 GetVidReg( address_space | |
639 | static UINT16 GetVidReg( address_space &space, UINT16 reg ) | |
640 | 640 | { |
641 | return space | |
641 | return space.read_word(0x03000000 + reg); | |
642 | 642 | } |
643 | 643 | |
644 | static void SetVidReg( address_space | |
644 | static void SetVidReg( address_space &space, UINT16 reg, UINT16 val ) | |
645 | 645 | { |
646 | space | |
646 | space.write_word(0x03000000 + reg, val); | |
647 | 647 | } |
648 | 648 | |
649 | 649 | |
650 | 650 | static SCREEN_UPDATE_IND16( crystal ) |
651 | 651 | { |
652 | 652 | crystal_state *state = screen.machine().driver_data<crystal_state>(); |
653 | address_space | |
653 | address_space &space = *screen.machine().device("maincpu")->memory().space(AS_PROGRAM); | |
654 | 654 | int DoFlip; |
655 | 655 | |
656 | 656 | UINT32 B0 = 0x0; |
r17963 | r17964 | |
716 | 716 | if (vblank_on) |
717 | 717 | { |
718 | 718 | crystal_state *state = screen.machine().driver_data<crystal_state>(); |
719 | address_space | |
719 | address_space &space = *screen.machine().device("maincpu")->memory().space(AS_PROGRAM); | |
720 | 720 | UINT16 head, tail; |
721 | 721 | int DoFlip = 0; |
722 | 722 | |
r17963 | r17964 | |
724 | 724 | tail = GetVidReg(space, 0x80); |
725 | 725 | while ((head & 0x7ff) != (tail & 0x7ff)) |
726 | 726 | { |
727 | UINT16 Packet0 = space | |
727 | UINT16 Packet0 = space.read_word(0x03800000 + head * 64); | |
728 | 728 | if (Packet0 & 0x81) |
729 | 729 | DoFlip = 1; |
730 | 730 | head++; |
r17963 | r17964 | |
---|---|---|
174 | 174 | { |
175 | 175 | ppu2c0x_device *ppu = machine().device<ppu2c0x_device>("ppu"); |
176 | 176 | int source = (data & 7); |
177 | ppu->spriteram_dma( | |
177 | ppu->spriteram_dma(space, source); | |
178 | 178 | } |
179 | 179 | |
180 | 180 | READ8_MEMBER(famibox_state::psg_4015_r) |
r17963 | r17964 | |
---|---|---|
287 | 287 | |
288 | 288 | READ8_MEMBER(cshooter_state::seibu_sound_comms_r) |
289 | 289 | { |
290 | return seibu_main_word_r( | |
290 | return seibu_main_word_r(space,offset,0x00ff); | |
291 | 291 | } |
292 | 292 | |
293 | 293 | WRITE8_MEMBER(cshooter_state::seibu_sound_comms_w) |
294 | 294 | { |
295 | seibu_main_word_w( | |
295 | seibu_main_word_w(space,offset,data,0x00ff); | |
296 | 296 | } |
297 | 297 | |
298 | 298 | static ADDRESS_MAP_START( airraid_map, AS_PROGRAM, 8, cshooter_state ) |
r17963 | r17964 | |
676 | 676 | |
677 | 677 | DRIVER_INIT_MEMBER(cshooter_state,cshootere) |
678 | 678 | { |
679 | address_space | |
679 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
680 | 680 | int A; |
681 | 681 | UINT8 *rom = machine().root_device().memregion("maincpu")->base(); |
682 | 682 | UINT8 *decrypt = auto_alloc_array(machine(), UINT8, 0x8000); |
683 | 683 | |
684 | space | |
684 | space.set_decrypted_region(0x0000, 0x7fff, decrypt); | |
685 | 685 | |
686 | 686 | for (A = 0x0000;A < 0x8000;A++) |
687 | 687 | { |
r17963 | r17964 | |
---|---|---|
876 | 876 | |
877 | 877 | DRIVER_INIT_MEMBER(bzone_state,bradley) |
878 | 878 | { |
879 | address_space *space = machine().device("maincpu")->memory().space(AS_PROGRAM); | |
880 | space->install_ram(0x400, 0x7ff); | |
881 | space->install_read_port(0x1808, 0x1808, "1808"); | |
882 | space->install_read_port(0x1809, 0x1809, "1809"); | |
883 | space->install_read_handler(0x180a, 0x180a, read8_delegate(FUNC(bzone_state::analog_data_r),this)); | |
884 | space->install_write_handler(0x1848, 0x1850, write8_delegate(FUNC(bzone_state::analog_select_w),this)); | |
879 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
880 | space.install_ram(0x400, 0x7ff); | |
881 | space.install_read_port(0x1808, 0x1808, "1808"); | |
882 | space.install_read_port(0x1809, 0x1809, "1809"); | |
883 | space.install_read_handler(0x180a, 0x180a, read8_delegate(FUNC(bzone_state::analog_data_r),this)); | |
884 | space.install_write_handler(0x1848, 0x1850, write8_delegate(FUNC(bzone_state::analog_select_w),this)); | |
885 | 885 | } |
886 | 886 | |
887 | 887 |
r17963 | r17964 | |
---|---|---|
253 | 253 | |
254 | 254 | static UINT8 piix4_config_r(device_t *busdevice, device_t *device, int function, int reg) |
255 | 255 | { |
256 | address_space | |
256 | address_space &space = *busdevice->machine().firstcpu->space( AS_PROGRAM ); | |
257 | 257 | midqslvr_state *state = busdevice->machine().driver_data<midqslvr_state>(); |
258 | 258 | |
259 | 259 | function &= 3; |
r17963 | r17964 | |
275 | 275 | return (((class_code_val[function]) >> (reg & 3)*8) & 0xff); |
276 | 276 | } |
277 | 277 | |
278 | printf("%08x PIIX4: read %d, %02X\n", space | |
278 | printf("%08x PIIX4: read %d, %02X\n", space.device().safe_pc(), function, reg); | |
279 | 279 | |
280 | 280 | return state->m_piix4_config_reg[function][reg]; |
281 | 281 | } |
r17963 | r17964 | |
672 | 672 | |
673 | 673 | kbdc8042_init(machine(), &at8042); |
674 | 674 | pc_vga_init(machine(), vga_setting, NULL); |
675 | pc_vga_io_init(machine(), machine().device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, machine().device("maincpu")->memory().space(AS_IO), 0x0000); | |
675 | pc_vga_io_init(machine(), *machine().device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, *machine().device("maincpu")->memory().space(AS_IO), 0x0000); | |
676 | 676 | } |
677 | 677 | |
678 | 678 | void midqslvr_state::machine_reset() |
r17963 | r17964 | |
---|---|---|
95 | 95 | * |
96 | 96 | *************************************/ |
97 | 97 | |
98 | static UINT16 exterm_trackball_port_r(address_space | |
98 | static UINT16 exterm_trackball_port_r(address_space &space, int which, UINT16 mem_mask) | |
99 | 99 | { |
100 | exterm_state *state = space | |
100 | exterm_state *state = space.machine().driver_data<exterm_state>(); | |
101 | 101 | UINT16 port; |
102 | 102 | |
103 | 103 | /* Read the fake input port */ |
r17963 | r17964 | |
125 | 125 | |
126 | 126 | READ16_MEMBER(exterm_state::exterm_input_port_0_r) |
127 | 127 | { |
128 | return exterm_trackball_port_r( | |
128 | return exterm_trackball_port_r(space, 0, mem_mask); | |
129 | 129 | } |
130 | 130 | |
131 | 131 | |
132 | 132 | READ16_MEMBER(exterm_state::exterm_input_port_1_r) |
133 | 133 | { |
134 | return exterm_trackball_port_r( | |
134 | return exterm_trackball_port_r(space, 1, mem_mask); | |
135 | 135 | } |
136 | 136 | |
137 | 137 |
r17963 | r17964 | |
---|---|---|
741 | 741 | |
742 | 742 | /********************************************************************/ |
743 | 743 | |
744 | static UINT8 z80_fifoout_pop(address_space | |
744 | static UINT8 z80_fifoout_pop(address_space &space) | |
745 | 745 | { |
746 | seibuspi_state *state = space | |
746 | seibuspi_state *state = space.machine().driver_data<seibuspi_state>(); | |
747 | 747 | UINT8 r; |
748 | 748 | if (state->m_fifoout_wpos == state->m_fifoout_rpos) |
749 | 749 | { |
750 | logerror("Sound FIFOOUT underflow at %08X\n", space | |
750 | logerror("Sound FIFOOUT underflow at %08X\n", space.device().safe_pc()); | |
751 | 751 | } |
752 | 752 | r = state->m_fifoout_data[state->m_fifoout_rpos++]; |
753 | 753 | if(state->m_fifoout_rpos == FIFO_SIZE) |
r17963 | r17964 | |
763 | 763 | return r; |
764 | 764 | } |
765 | 765 | |
766 | static void z80_fifoout_push(address_space | |
766 | static void z80_fifoout_push(address_space &space, UINT8 data) | |
767 | 767 | { |
768 | seibuspi_state *state = space | |
768 | seibuspi_state *state = space.machine().driver_data<seibuspi_state>(); | |
769 | 769 | state->m_fifoout_data[state->m_fifoout_wpos++] = data; |
770 | 770 | if (state->m_fifoout_wpos == FIFO_SIZE) |
771 | 771 | { |
r17963 | r17964 | |
773 | 773 | } |
774 | 774 | if(state->m_fifoout_wpos == state->m_fifoout_rpos) |
775 | 775 | { |
776 | fatalerror("Sound FIFOOUT overflow at %08X\n", space | |
776 | fatalerror("Sound FIFOOUT overflow at %08X\n", space.device().safe_pc()); | |
777 | 777 | } |
778 | 778 | |
779 | 779 | state->m_fifoout_read_request = 1; |
780 | 780 | } |
781 | 781 | |
782 | static UINT8 z80_fifoin_pop(address_space | |
782 | static UINT8 z80_fifoin_pop(address_space &space) | |
783 | 783 | { |
784 | seibuspi_state *state = space | |
784 | seibuspi_state *state = space.machine().driver_data<seibuspi_state>(); | |
785 | 785 | UINT8 r; |
786 | 786 | if (state->m_fifoin_wpos == state->m_fifoin_rpos) |
787 | 787 | { |
788 | fatalerror("Sound FIFOIN underflow at %08X\n", space | |
788 | fatalerror("Sound FIFOIN underflow at %08X\n", space.device().safe_pc()); | |
789 | 789 | } |
790 | 790 | r = state->m_fifoin_data[state->m_fifoin_rpos++]; |
791 | 791 | if(state->m_fifoin_rpos == FIFO_SIZE) |
r17963 | r17964 | |
801 | 801 | return r; |
802 | 802 | } |
803 | 803 | |
804 | static void z80_fifoin_push(address_space | |
804 | static void z80_fifoin_push(address_space &space, UINT8 data) | |
805 | 805 | { |
806 | seibuspi_state *state = space | |
806 | seibuspi_state *state = space.machine().driver_data<seibuspi_state>(); | |
807 | 807 | state->m_fifoin_data[state->m_fifoin_wpos++] = data; |
808 | 808 | if(state->m_fifoin_wpos == FIFO_SIZE) |
809 | 809 | { |
r17963 | r17964 | |
811 | 811 | } |
812 | 812 | if(state->m_fifoin_wpos == state->m_fifoin_rpos) |
813 | 813 | { |
814 | fatalerror("Sound FIFOIN overflow at %08X\n", space | |
814 | fatalerror("Sound FIFOIN overflow at %08X\n", space.device().safe_pc()); | |
815 | 815 | } |
816 | 816 | |
817 | 817 | state->m_fifoin_read_request = 1; |
r17963 | r17964 | |
835 | 835 | |
836 | 836 | READ32_MEMBER(seibuspi_state::sound_fifo_r) |
837 | 837 | { |
838 | UINT8 r = z80_fifoout_pop( | |
838 | UINT8 r = z80_fifoout_pop(space); | |
839 | 839 | |
840 | 840 | return r; |
841 | 841 | } |
r17963 | r17964 | |
843 | 843 | WRITE32_MEMBER(seibuspi_state::sound_fifo_w) |
844 | 844 | { |
845 | 845 | if( ACCESSING_BITS_0_7 ) { |
846 | z80_fifoin_push( | |
846 | z80_fifoin_push(space, data & 0xff); | |
847 | 847 | } |
848 | 848 | } |
849 | 849 | |
r17963 | r17964 | |
955 | 955 | |
956 | 956 | READ8_MEMBER(seibuspi_state::z80_soundfifo_r) |
957 | 957 | { |
958 | UINT8 r = z80_fifoin_pop( | |
958 | UINT8 r = z80_fifoin_pop(space); | |
959 | 959 | |
960 | 960 | return r; |
961 | 961 | } |
962 | 962 | |
963 | 963 | WRITE8_MEMBER(seibuspi_state::z80_soundfifo_w) |
964 | 964 | { |
965 | z80_fifoout_push( | |
965 | z80_fifoout_push(space, data); | |
966 | 966 | } |
967 | 967 | |
968 | 968 | READ8_MEMBER(seibuspi_state::z80_soundfifo_status_r) |
r17963 | r17964 | |
---|---|---|
109 | 109 | * |
110 | 110 | *************************************/ |
111 | 111 | |
112 | static void coolpool_to_shiftreg(address_space | |
112 | static void coolpool_to_shiftreg(address_space &space, UINT32 address, UINT16 *shiftreg) | |
113 | 113 | { |
114 | coolpool_state *state = space | |
114 | coolpool_state *state = space.machine().driver_data<coolpool_state>(); | |
115 | 115 | |
116 | 116 | memcpy(shiftreg, &state->m_vram_base[TOWORD(address) & ~TOWORD(0xfff)], TOBYTE(0x1000)); |
117 | 117 | } |
118 | 118 | |
119 | 119 | |
120 | static void coolpool_from_shiftreg(address_space | |
120 | static void coolpool_from_shiftreg(address_space &space, UINT32 address, UINT16 *shiftreg) | |
121 | 121 | { |
122 | coolpool_state *state = space | |
122 | coolpool_state *state = space.machine().driver_data<coolpool_state>(); | |
123 | 123 | |
124 | 124 | memcpy(&state->m_vram_base[TOWORD(address) & ~TOWORD(0xfff)], shiftreg, TOBYTE(0x1000)); |
125 | 125 | } |
r17963 | r17964 | |
308 | 308 | return data; |
309 | 309 | } |
310 | 310 | |
311 | static int amerdart_trackball_direction(address_space | |
311 | static int amerdart_trackball_direction(address_space &space, int num, int data) | |
312 | 312 | { |
313 | coolpool_state *state = space | |
313 | coolpool_state *state = space.machine().driver_data<coolpool_state>(); | |
314 | 314 | |
315 | 315 | UINT16 result_x = (data & 0x0c) >> 2; |
316 | 316 | UINT16 result_y = (data & 0x03) >> 0; |
r17963 | r17964 | |
415 | 415 | m_dy[2] = (INT8)(m_newy[2] - m_oldy[2]); |
416 | 416 | |
417 | 417 | /* Determine Trackball 1 direction state */ |
418 | m_result = (m_result & 0xf0ff) | (amerdart_trackball_direction( | |
418 | m_result = (m_result & 0xf0ff) | (amerdart_trackball_direction(space, 1, ((m_result >> 8) & 0xf)) << 8); | |
419 | 419 | |
420 | 420 | /* Determine Trackball 2 direction state */ |
421 | m_result = (m_result & 0x0fff) | (amerdart_trackball_direction( | |
421 | m_result = (m_result & 0x0fff) | (amerdart_trackball_direction(space, 2, ((m_result >> 12) & 0xf)) << 12); | |
422 | 422 | |
423 | 423 | |
424 | 424 | // logerror("%08X:read port 6 (X=%02X Y=%02X oldX=%02X oldY=%02X oldRes=%04X Res=%04X)\n", space.device().safe_pc(), m_newx, m_newy, m_oldx, m_oldy, m_lastresult, m_result); |
r17963 | r17964 | |
---|---|---|
4704 | 4704 | |
4705 | 4705 | DRIVER_INIT_MEMBER(system1_state,nob) |
4706 | 4706 | { |
4707 | address_space | |
4707 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
4708 | 4708 | address_space *iospace = machine().device("maincpu")->memory().space(AS_IO); |
4709 | 4709 | |
4710 | 4710 | DRIVER_INIT_CALL(bank44); |
r17963 | r17964 | |
4712 | 4712 | /* hack to fix incorrect JMP at start, which should obviously be to $0080 */ |
4713 | 4713 | /* patching the ROM causes errors in the self-test */ |
4714 | 4714 | /* in real-life, it could be some behavior dependent upon M1 */ |
4715 | space | |
4715 | space.install_read_handler(0x0001, 0x0001, read8_delegate(FUNC(system1_state::nob_start_r),this)); | |
4716 | 4716 | |
4717 | 4717 | /* install MCU communications */ |
4718 | 4718 | iospace->install_readwrite_handler(0x18, 0x18, 0x00, 0x00, read8_delegate(FUNC(system1_state::nob_maincpu_latch_r),this), write8_delegate(FUNC(system1_state::nob_maincpu_latch_w),this)); |
r17963 | r17964 | |
4752 | 4752 | |
4753 | 4753 | DRIVER_INIT_MEMBER(system1_state,bootleg) |
4754 | 4754 | { |
4755 | address_space *space = machine().device("maincpu")->memory().space(AS_PROGRAM); | |
4756 | space->set_decrypted_region(0x0000, 0x7fff, machine().root_device().memregion("maincpu")->base() + 0x10000); | |
4755 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
4756 | space.set_decrypted_region(0x0000, 0x7fff, machine().root_device().memregion("maincpu")->base() + 0x10000); | |
4757 | 4757 | DRIVER_INIT_CALL(bank00); |
4758 | 4758 | } |
4759 | 4759 | |
4760 | 4760 | |
4761 | 4761 | DRIVER_INIT_MEMBER(system1_state,bootsys2) |
4762 | 4762 | { |
4763 | address_space *space = machine().device("maincpu")->memory().space(AS_PROGRAM); | |
4764 | space->set_decrypted_region(0x0000, 0x7fff, machine().root_device().memregion("maincpu")->base() + 0x20000); | |
4763 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
4764 | space.set_decrypted_region(0x0000, 0x7fff, machine().root_device().memregion("maincpu")->base() + 0x20000); | |
4765 | 4765 | machine().root_device().membank("bank1")->configure_decrypted_entries(0, 4, machine().root_device().memregion("maincpu")->base() + 0x30000, 0x4000); |
4766 | 4766 | DRIVER_INIT_CALL(bank0c); |
4767 | 4767 | } |
r17963 | r17964 | |
---|---|---|
245 | 245 | |
246 | 246 | void niyanpai_state::machine_reset() |
247 | 247 | { |
248 | address_space | |
248 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
249 | 249 | int i; |
250 | 250 | |
251 | 251 | // initialize TMPZ84C011 PIO |
252 | 252 | for (i = 0; i < 5; i++) |
253 | 253 | { |
254 | 254 | m_pio_dir[i] = m_pio_latch[i] = 0; |
255 | tmpz84c011_pio_w( | |
255 | tmpz84c011_pio_w(space, i, 0); | |
256 | 256 | } |
257 | 257 | } |
258 | 258 | |
r17963 | r17964 | |
308 | 308 | |
309 | 309 | CUSTOM_INPUT_MEMBER(niyanpai_state::musobana_outcoin_flag_r) |
310 | 310 | { |
311 | address_space | |
311 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
312 | 312 | // tmp68301_parallel_interface[0x05] |
313 | 313 | // bit 0 coin counter |
314 | 314 | // bit 2 motor on |
r17963 | r17964 | |
---|---|---|
3694 | 3694 | MACHINE_START_MEMBER(bfm_sc2_state,sc2dmd) |
3695 | 3695 | { |
3696 | 3696 | |
3697 | address_space *space = machine().device("maincpu")->memory().space(AS_PROGRAM); | |
3698 | space->install_write_handler(0x2800, 0x2800, 0, 0, write8_delegate(FUNC(bfm_sc2_state::vfd1_dmd_w),this)); | |
3699 | space->install_write_handler(0x2900, 0x2900, 0, 0, write8_delegate(FUNC(bfm_sc2_state::dmd_reset_w),this)); | |
3697 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
3698 | space.install_write_handler(0x2800, 0x2800, 0, 0, write8_delegate(FUNC(bfm_sc2_state::vfd1_dmd_w),this)); | |
3699 | space.install_write_handler(0x2900, 0x2900, 0, 0, write8_delegate(FUNC(bfm_sc2_state::dmd_reset_w),this)); | |
3700 | 3700 | } |
3701 | 3701 | |
3702 | 3702 | /* machine driver for scorpion2 board */ |
r17963 | r17964 | |
---|---|---|
404 | 404 | |
405 | 405 | DRIVER_INIT_MEMBER(shootout_state,shootout) |
406 | 406 | { |
407 | address_space | |
407 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
408 | 408 | int length = machine().root_device().memregion("maincpu")->bytes(); |
409 | 409 | UINT8 *decrypt = auto_alloc_array(machine(), UINT8, length - 0x8000); |
410 | 410 | UINT8 *rom = machine().root_device().memregion("maincpu")->base(); |
411 | 411 | int A; |
412 | 412 | |
413 | space | |
413 | space.set_decrypted_region(0x8000, 0xffff, decrypt); | |
414 | 414 | |
415 | 415 | for (A = 0x8000;A < length;A++) |
416 | 416 | decrypt[A-0x8000] = (rom[A] & 0x9f) | ((rom[A] & 0x40) >> 1) | ((rom[A] & 0x20) << 1); |
r17963 | r17964 | |
---|---|---|
977 | 977 | m_bios_ram = auto_alloc_array(machine(), UINT32, 0x20000/4); |
978 | 978 | |
979 | 979 | pc_vga_init(machine(), vga_setting, NULL); |
980 | pc_svga_trident_io_init(machine(), machine().device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, machine().device("maincpu")->memory().space(AS_IO), 0x0000); | |
980 | pc_svga_trident_io_init(machine(), *machine().device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, *machine().device("maincpu")->memory().space(AS_IO), 0x0000); | |
981 | 981 | init_pc_common(machine(), PCCOMMON_KEYBOARD_AT, calchase_set_keyb_int); |
982 | 982 | |
983 | 983 | intel82439tx_init(machine()); |
r17963 | r17964 | |
---|---|---|
289 | 289 | /* Decode the opcodes */ |
290 | 290 | |
291 | 291 | offs_t i; |
292 | address_space | |
292 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
293 | 293 | UINT8 *rom = machine().root_device().memregion("maincpu")->base(); |
294 | 294 | UINT8 *decrypted = auto_alloc_array(machine(), UINT8, 0x6000); |
295 | 295 | UINT8 *table = machine().root_device().memregion("user1")->base(); |
296 | 296 | |
297 | space | |
297 | space.set_decrypted_region(0x0000, 0x5fff, decrypted); | |
298 | 298 | |
299 | 299 | for (i = 0; i < 0x6000; i++) |
300 | 300 | { |
r17963 | r17964 | |
---|---|---|
933 | 933 | |
934 | 934 | DRIVER_INIT_MEMBER(mpu3_state,m3hprvpr) |
935 | 935 | { |
936 | address_space | |
936 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
937 | 937 | |
938 | 938 | m_disp_func=METER_PORT; |
939 | 939 | m_current_chr_table = hprvpr_data; |
940 | space | |
940 | space.install_readwrite_handler(0xc000, 0xc000 , read8_delegate(FUNC(mpu3_state::characteriser_r), this),write8_delegate(FUNC(mpu3_state::characteriser_w), this)); | |
941 | 941 | |
942 | 942 | } |
943 | 943 |
r17963 | r17964 | |
---|---|---|
188 | 188 | break; |
189 | 189 | |
190 | 190 | default: |
191 | logerror("Unknown aleck_dips_w(0x%08x, 0x%08x, %08x) @ 0x%08x PC=%08x\n", offset, data, mem_mask, 0xc0800000 + offset*4, space | |
191 | logerror("Unknown aleck_dips_w(0x%08x, 0x%08x, %08x) @ 0x%08x PC=%08x\n", offset, data, mem_mask, 0xc0800000 + offset*4, space.device().safe_pc()); | |
192 | 192 | } |
193 | 193 | } |
194 | 194 | |
r17963 | r17964 | |
199 | 199 | switch( offset ) |
200 | 200 | { |
201 | 201 | case 0: |
202 | return (space | |
202 | return (space.machine().root_device().ioport("IN0")->read()); /* mtetrisc has regular inputs here */ | |
203 | 203 | case 1: |
204 | return (space | |
204 | return (space.machine().root_device().ioport("IN1")->read()); | |
205 | 205 | case 2: |
206 | 206 | { |
207 | UINT32 val = space | |
207 | UINT32 val = space.machine().root_device().ioport("INMJ")->read(); | |
208 | 208 | |
209 | 209 | switch( dip_read_offset >> 8 & 0xff ) |
210 | 210 | { |
r17963 | r17964 | |
227 | 227 | } |
228 | 228 | default: |
229 | 229 | { |
230 | logerror("Unknown aleck_dips_r(0x%08x, 0x%08x) @ 0x%08x PC=%08x\n", offset, 0xc0800000 + offset*4, mem_mask, space | |
230 | logerror("Unknown aleck_dips_r(0x%08x, 0x%08x) @ 0x%08x PC=%08x\n", offset, 0xc0800000 + offset*4, mem_mask, space.device().safe_pc()); | |
231 | 231 | return 0; |
232 | 232 | } |
233 | 233 | } |
r17963 | r17964 | |
---|---|---|
1447 | 1447 | |
1448 | 1448 | DRIVER_INIT_MEMBER(trackfld_state,atlantol) |
1449 | 1449 | { |
1450 | address_space | |
1450 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
1451 | 1451 | UINT8 *rom = machine().root_device().memregion("maincpu")->base(); |
1452 | 1452 | UINT8 *decrypt; |
1453 | 1453 | int A; |
r17963 | r17964 | |
1459 | 1459 | for (A = 0; A < 0x6000; A++) |
1460 | 1460 | decrypt[A] = rom[A]; |
1461 | 1461 | |
1462 | space | |
1462 | space.set_decrypted_region(0x0000, 0xffff, decrypt); | |
1463 | 1463 | |
1464 | space->install_write_handler(0x0800, 0x0800, write8_delegate(FUNC(trackfld_state::atlantol_gfxbank_w),this)); | |
1465 | space->nop_write(0x1000, 0x1000); | |
1464 | space.install_write_handler(0x0800, 0x0800, write8_delegate(FUNC(trackfld_state::atlantol_gfxbank_w),this)); | |
1465 | space.nop_write(0x1000, 0x1000); | |
1466 | 1466 | |
1467 | 1467 | /* unmapped areas read as ROM */ |
1468 | space->install_read_bank(0x0000, 0x11ff, "bank10"); | |
1469 | space->install_read_bank(0x1380, 0x17ff, "bank11"); | |
1470 | space->install_read_bank(0x2000, 0x27ff, "bank12"); | |
1471 | space->install_read_bank(0x4000, 0x5fff, "bank13"); | |
1468 | space.install_read_bank(0x0000, 0x11ff, "bank10"); | |
1469 | space.install_read_bank(0x1380, 0x17ff, "bank11"); | |
1470 | space.install_read_bank(0x2000, 0x27ff, "bank12"); | |
1471 | space.install_read_bank(0x4000, 0x5fff, "bank13"); | |
1472 | 1472 | membank("bank10")->set_base(&rom[0x0000]); |
1473 | 1473 | membank("bank11")->set_base(&rom[0x1380]); |
1474 | 1474 | membank("bank12")->set_base(&rom[0x2000]); |
r17963 | r17964 | |
---|---|---|
608 | 608 | |
609 | 609 | static WRITE32_HANDLER( cmos_unlock_w ) |
610 | 610 | { |
611 | vegas_state *state = space | |
611 | vegas_state *state = space.machine().driver_data<vegas_state>(); | |
612 | 612 | state->m_cmos_unlocked = 1; |
613 | 613 | } |
614 | 614 | |
615 | 615 | |
616 | 616 | static WRITE32_HANDLER( timekeeper_w ) |
617 | 617 | { |
618 | vegas_state *state = space | |
618 | vegas_state *state = space.machine().driver_data<vegas_state>(); | |
619 | 619 | if (state->m_cmos_unlocked) |
620 | 620 | { |
621 | 621 | if ((mem_mask & 0x000000ff) != 0) |
r17963 | r17964 | |
631 | 631 | state->m_cmos_unlocked = 0; |
632 | 632 | } |
633 | 633 | else |
634 | logerror("%08X:timekeeper_w(%04X,%08X & %08X) without CMOS unlocked\n", space | |
634 | logerror("%08X:timekeeper_w(%04X,%08X & %08X) without CMOS unlocked\n", space.device().safe_pc(), offset, data, mem_mask); | |
635 | 635 | } |
636 | 636 | |
637 | 637 | |
638 | 638 | static READ32_HANDLER( timekeeper_r ) |
639 | 639 | { |
640 | vegas_state *state = space | |
640 | vegas_state *state = space.machine().driver_data<vegas_state>(); | |
641 | 641 | UINT32 result = 0xffffffff; |
642 | 642 | if ((mem_mask & 0x000000ff) != 0) |
643 | 643 | result = (result & ~0x000000ff) | (state->m_timekeeper->read(offset * 4 + 0) << 0); |
r17963 | r17964 | |
662 | 662 | |
663 | 663 | static READ32_HANDLER( pci_bridge_r ) |
664 | 664 | { |
665 | vegas_state *state = space | |
665 | vegas_state *state = space.machine().driver_data<vegas_state>(); | |
666 | 666 | UINT32 result = state->m_pci_bridge_regs[offset]; |
667 | 667 | |
668 | 668 | switch (offset) |
r17963 | r17964 | |
677 | 677 | } |
678 | 678 | |
679 | 679 | if (LOG_PCI) |
680 | logerror("%06X:PCI bridge read: reg %d = %08X\n", space | |
680 | logerror("%06X:PCI bridge read: reg %d = %08X\n", space.device().safe_pc(), offset, result); | |
681 | 681 | return result; |
682 | 682 | } |
683 | 683 | |
684 | 684 | |
685 | 685 | static WRITE32_HANDLER( pci_bridge_w ) |
686 | 686 | { |
687 | vegas_state *state = space | |
687 | vegas_state *state = space.machine().driver_data<vegas_state>(); | |
688 | 688 | state->m_pci_bridge_regs[offset] = data; |
689 | 689 | if (LOG_PCI) |
690 | logerror("%06X:PCI bridge write: reg %d = %08X\n", space | |
690 | logerror("%06X:PCI bridge write: reg %d = %08X\n", space.device().safe_pc(), offset, data); | |
691 | 691 | } |
692 | 692 | |
693 | 693 | |
r17963 | r17964 | |
700 | 700 | |
701 | 701 | static READ32_HANDLER( pci_ide_r ) |
702 | 702 | { |
703 | vegas_state *state = space | |
703 | vegas_state *state = space.machine().driver_data<vegas_state>(); | |
704 | 704 | UINT32 result = state->m_pci_ide_regs[offset]; |
705 | 705 | |
706 | 706 | switch (offset) |
r17963 | r17964 | |
717 | 717 | } |
718 | 718 | |
719 | 719 | if (LOG_PCI) |
720 | logerror("%06X:PCI IDE read: reg %d = %08X\n", space | |
720 | logerror("%06X:PCI IDE read: reg %d = %08X\n", space.device().safe_pc(), offset, result); | |
721 | 721 | return result; |
722 | 722 | } |
723 | 723 | |
724 | 724 | |
725 | 725 | static WRITE32_HANDLER( pci_ide_w ) |
726 | 726 | { |
727 | vegas_state *state = space | |
727 | vegas_state *state = space.machine().driver_data<vegas_state>(); | |
728 | 728 | state->m_pci_ide_regs[offset] = data; |
729 | 729 | |
730 | 730 | switch (offset) |
731 | 731 | { |
732 | 732 | case 0x04: /* address register */ |
733 | 733 | state->m_pci_ide_regs[offset] &= 0xfffffff0; |
734 | remap_dynamic_addresses(space | |
734 | remap_dynamic_addresses(space.machine()); | |
735 | 735 | break; |
736 | 736 | |
737 | 737 | case 0x05: /* address register */ |
738 | 738 | state->m_pci_ide_regs[offset] &= 0xfffffffc; |
739 | remap_dynamic_addresses(space | |
739 | remap_dynamic_addresses(space.machine()); | |
740 | 740 | break; |
741 | 741 | |
742 | 742 | case 0x08: /* address register */ |
743 | 743 | state->m_pci_ide_regs[offset] &= 0xfffffff0; |
744 | remap_dynamic_addresses(space | |
744 | remap_dynamic_addresses(space.machine()); | |
745 | 745 | break; |
746 | 746 | |
747 | 747 | case 0x14: /* interrupt pending */ |
748 | 748 | if (data & 4) |
749 | ide_interrupt(space | |
749 | ide_interrupt(space.machine().device("ide"), 0); | |
750 | 750 | break; |
751 | 751 | } |
752 | 752 | if (LOG_PCI) |
753 | logerror("%06X:PCI IDE write: reg %d = %08X\n", space | |
753 | logerror("%06X:PCI IDE write: reg %d = %08X\n", space.device().safe_pc(), offset, data); | |
754 | 754 | } |
755 | 755 | |
756 | 756 | |
r17963 | r17964 | |
763 | 763 | |
764 | 764 | static READ32_HANDLER( pci_3dfx_r ) |
765 | 765 | { |
766 | vegas_state *state = space | |
766 | vegas_state *state = space.machine().driver_data<vegas_state>(); | |
767 | 767 | int voodoo_type = voodoo_get_type(state->m_voodoo); |
768 | 768 | UINT32 result = state->m_pci_3dfx_regs[offset]; |
769 | 769 | |
r17963 | r17964 | |
790 | 790 | } |
791 | 791 | |
792 | 792 | if (LOG_PCI) |
793 | logerror("%06X:PCI 3dfx read: reg %d = %08X\n", space | |
793 | logerror("%06X:PCI 3dfx read: reg %d = %08X\n", space.device().safe_pc(), offset, result); | |
794 | 794 | return result; |
795 | 795 | } |
796 | 796 | |
797 | 797 | |
798 | 798 | static WRITE32_HANDLER( pci_3dfx_w ) |
799 | 799 | { |
800 | vegas_state *state = space | |
800 | vegas_state *state = space.machine().driver_data<vegas_state>(); | |
801 | 801 | int voodoo_type = voodoo_get_type(state->m_voodoo); |
802 | 802 | |
803 | 803 | state->m_pci_3dfx_regs[offset] = data; |
r17963 | r17964 | |
809 | 809 | state->m_pci_3dfx_regs[offset] &= 0xff000000; |
810 | 810 | else |
811 | 811 | state->m_pci_3dfx_regs[offset] &= 0xfe000000; |
812 | remap_dynamic_addresses(space | |
812 | remap_dynamic_addresses(space.machine()); | |
813 | 813 | break; |
814 | 814 | |
815 | 815 | case 0x05: /* address register */ |
816 | 816 | if (voodoo_type >= TYPE_VOODOO_BANSHEE) |
817 | 817 | { |
818 | 818 | state->m_pci_3dfx_regs[offset] &= 0xfe000000; |
819 | remap_dynamic_addresses(space | |
819 | remap_dynamic_addresses(space.machine()); | |
820 | 820 | } |
821 | 821 | break; |
822 | 822 | |
r17963 | r17964 | |
824 | 824 | if (voodoo_type >= TYPE_VOODOO_BANSHEE) |
825 | 825 | { |
826 | 826 | state->m_pci_3dfx_regs[offset] &= 0xffffff00; |
827 | remap_dynamic_addresses(space | |
827 | remap_dynamic_addresses(space.machine()); | |
828 | 828 | } |
829 | 829 | break; |
830 | 830 | |
r17963 | r17964 | |
832 | 832 | if (voodoo_type >= TYPE_VOODOO_BANSHEE) |
833 | 833 | { |
834 | 834 | state->m_pci_3dfx_regs[offset] &= 0xffff0000; |
835 | remap_dynamic_addresses(space | |
835 | remap_dynamic_addresses(space.machine()); | |
836 | 836 | } |
837 | 837 | break; |
838 | 838 | |
r17963 | r17964 | |
842 | 842 | |
843 | 843 | } |
844 | 844 | if (LOG_PCI) |
845 | logerror("%06X:PCI 3dfx write: reg %d = %08X\n", space | |
845 | logerror("%06X:PCI 3dfx write: reg %d = %08X\n", space.device().safe_pc(), offset, data); | |
846 | 846 | } |
847 | 847 | |
848 | 848 | |
r17963 | r17964 | |
953 | 953 | |
954 | 954 | static READ32_HANDLER( nile_r ) |
955 | 955 | { |
956 | vegas_state *state = space | |
956 | vegas_state *state = space.machine().driver_data<vegas_state>(); | |
957 | 957 | UINT32 result = state->m_nile_regs[offset]; |
958 | 958 | int logit = 1, which; |
959 | 959 | |
r17963 | r17964 | |
961 | 961 | { |
962 | 962 | case NREG_CPUSTAT+0: /* CPU status */ |
963 | 963 | case NREG_CPUSTAT+1: /* CPU status */ |
964 | if (LOG_NILE) logerror("%08X:NILE READ: CPU status(%03X) = %08X\n", space | |
964 | if (LOG_NILE) logerror("%08X:NILE READ: CPU status(%03X) = %08X\n", space.device().safe_pc(), offset*4, result); | |
965 | 965 | logit = 0; |
966 | 966 | break; |
967 | 967 | |
968 | 968 | case NREG_INTCTRL+0: /* Interrupt control */ |
969 | 969 | case NREG_INTCTRL+1: /* Interrupt control */ |
970 | if (LOG_NILE) logerror("%08X:NILE READ: interrupt control(%03X) = %08X\n", space | |
970 | if (LOG_NILE) logerror("%08X:NILE READ: interrupt control(%03X) = %08X\n", space.device().safe_pc(), offset*4, result); | |
971 | 971 | logit = 0; |
972 | 972 | break; |
973 | 973 | |
974 | 974 | case NREG_INTSTAT0+0: /* Interrupt status 0 */ |
975 | 975 | case NREG_INTSTAT0+1: /* Interrupt status 0 */ |
976 | if (LOG_NILE) logerror("%08X:NILE READ: interrupt status 0(%03X) = %08X\n", space | |
976 | if (LOG_NILE) logerror("%08X:NILE READ: interrupt status 0(%03X) = %08X\n", space.device().safe_pc(), offset*4, result); | |
977 | 977 | logit = 0; |
978 | 978 | break; |
979 | 979 | |
980 | 980 | case NREG_INTSTAT1+0: /* Interrupt status 1 */ |
981 | 981 | case NREG_INTSTAT1+1: /* Interrupt status 1 */ |
982 | if (LOG_NILE) logerror("%08X:NILE READ: interrupt status 1/enable(%03X) = %08X\n", space | |
982 | if (LOG_NILE) logerror("%08X:NILE READ: interrupt status 1/enable(%03X) = %08X\n", space.device().safe_pc(), offset*4, result); | |
983 | 983 | logit = 0; |
984 | 984 | break; |
985 | 985 | |
986 | 986 | case NREG_INTCLR+0: /* Interrupt clear */ |
987 | 987 | case NREG_INTCLR+1: /* Interrupt clear */ |
988 | if (LOG_NILE) logerror("%08X:NILE READ: interrupt clear(%03X) = %08X\n", space | |
988 | if (LOG_NILE) logerror("%08X:NILE READ: interrupt clear(%03X) = %08X\n", space.device().safe_pc(), offset*4, result); | |
989 | 989 | logit = 0; |
990 | 990 | break; |
991 | 991 | |
992 | 992 | case NREG_INTPPES+0: /* PCI Interrupt control */ |
993 | 993 | case NREG_INTPPES+1: /* PCI Interrupt control */ |
994 | if (LOG_NILE) logerror("%08X:NILE READ: PCI interrupt control(%03X) = %08X\n", space | |
994 | if (LOG_NILE) logerror("%08X:NILE READ: PCI interrupt control(%03X) = %08X\n", space.device().safe_pc(), offset*4, result); | |
995 | 995 | logit = 0; |
996 | 996 | break; |
997 | 997 | |
r17963 | r17964 | |
1018 | 1018 | result = state->m_nile_regs[offset + 1] = state->m_timer[which]->remaining().as_double() * (double)SYSTEM_CLOCK; |
1019 | 1019 | } |
1020 | 1020 | |
1021 | if (LOG_TIMERS) logerror("%08X:NILE READ: timer %d counter(%03X) = %08X\n", space | |
1021 | if (LOG_TIMERS) logerror("%08X:NILE READ: timer %d counter(%03X) = %08X\n", space.device().safe_pc(), which, offset*4, result); | |
1022 | 1022 | logit = 0; |
1023 | 1023 | break; |
1024 | 1024 | |
r17963 | r17964 | |
1059 | 1059 | } |
1060 | 1060 | |
1061 | 1061 | if (LOG_NILE && logit) |
1062 | logerror("%06X:nile read from offset %03X = %08X\n", space | |
1062 | logerror("%06X:nile read from offset %03X = %08X\n", space.device().safe_pc(), offset*4, result); | |
1063 | 1063 | return result; |
1064 | 1064 | } |
1065 | 1065 | |
1066 | 1066 | |
1067 | 1067 | static WRITE32_HANDLER( nile_w ) |
1068 | 1068 | { |
1069 | vegas_state *state = space | |
1069 | vegas_state *state = space.machine().driver_data<vegas_state>(); | |
1070 | 1070 | UINT32 olddata = state->m_nile_regs[offset]; |
1071 | 1071 | int logit = 1, which; |
1072 | 1072 | |
r17963 | r17964 | |
1076 | 1076 | { |
1077 | 1077 | case NREG_CPUSTAT+0: /* CPU status */ |
1078 | 1078 | case NREG_CPUSTAT+1: /* CPU status */ |
1079 | if (LOG_NILE) logerror("%08X:NILE WRITE: CPU status(%03X) = %08X & %08X\n", space | |
1079 | if (LOG_NILE) logerror("%08X:NILE WRITE: CPU status(%03X) = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); | |
1080 | 1080 | logit = 0; |
1081 | 1081 | break; |
1082 | 1082 | |
1083 | 1083 | case NREG_INTCTRL+0: /* Interrupt control */ |
1084 | 1084 | case NREG_INTCTRL+1: /* Interrupt control */ |
1085 | if (LOG_NILE) logerror("%08X:NILE WRITE: interrupt control(%03X) = %08X & %08X\n", space | |
1085 | if (LOG_NILE) logerror("%08X:NILE WRITE: interrupt control(%03X) = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); | |
1086 | 1086 | logit = 0; |
1087 | update_nile_irqs(space | |
1087 | update_nile_irqs(space.machine()); | |
1088 | 1088 | break; |
1089 | 1089 | |
1090 | 1090 | case NREG_INTSTAT0+0: /* Interrupt status 0 */ |
1091 | 1091 | case NREG_INTSTAT0+1: /* Interrupt status 0 */ |
1092 | if (LOG_NILE) logerror("%08X:NILE WRITE: interrupt status 0(%03X) = %08X & %08X\n", space | |
1092 | if (LOG_NILE) logerror("%08X:NILE WRITE: interrupt status 0(%03X) = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); | |
1093 | 1093 | logit = 0; |
1094 | update_nile_irqs(space | |
1094 | update_nile_irqs(space.machine()); | |
1095 | 1095 | break; |
1096 | 1096 | |
1097 | 1097 | case NREG_INTSTAT1+0: /* Interrupt status 1 */ |
1098 | 1098 | case NREG_INTSTAT1+1: /* Interrupt status 1 */ |
1099 | if (LOG_NILE) logerror("%08X:NILE WRITE: interrupt status 1/enable(%03X) = %08X & %08X\n", space | |
1099 | if (LOG_NILE) logerror("%08X:NILE WRITE: interrupt status 1/enable(%03X) = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); | |
1100 | 1100 | logit = 0; |
1101 | update_nile_irqs(space | |
1101 | update_nile_irqs(space.machine()); | |
1102 | 1102 | break; |
1103 | 1103 | |
1104 | 1104 | case NREG_INTCLR+0: /* Interrupt clear */ |
1105 | 1105 | case NREG_INTCLR+1: /* Interrupt clear */ |
1106 | if (LOG_NILE) logerror("%08X:NILE WRITE: interrupt clear(%03X) = %08X & %08X\n", space | |
1106 | if (LOG_NILE) logerror("%08X:NILE WRITE: interrupt clear(%03X) = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); | |
1107 | 1107 | logit = 0; |
1108 | 1108 | state->m_nile_irq_state &= ~(state->m_nile_regs[offset] & ~0xf00); |
1109 | update_nile_irqs(space | |
1109 | update_nile_irqs(space.machine()); | |
1110 | 1110 | break; |
1111 | 1111 | |
1112 | 1112 | case NREG_INTPPES+0: /* PCI Interrupt control */ |
1113 | 1113 | case NREG_INTPPES+1: /* PCI Interrupt control */ |
1114 | if (LOG_NILE) logerror("%08X:NILE WRITE: PCI interrupt control(%03X) = %08X & %08X\n", space | |
1114 | if (LOG_NILE) logerror("%08X:NILE WRITE: PCI interrupt control(%03X) = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); | |
1115 | 1115 | logit = 0; |
1116 | 1116 | break; |
1117 | 1117 | |
r17963 | r17964 | |
1127 | 1127 | |
1128 | 1128 | case NREG_PCIINIT1+0: /* PCI master */ |
1129 | 1129 | if (((olddata & 0xe) == 0xa) != ((state->m_nile_regs[offset] & 0xe) == 0xa)) |
1130 | remap_dynamic_addresses(space | |
1130 | remap_dynamic_addresses(space.machine()); | |
1131 | 1131 | logit = 0; |
1132 | 1132 | break; |
1133 | 1133 | |
r17963 | r17964 | |
1136 | 1136 | case NREG_T2CTRL+1: /* general purpose timer control (control bits) */ |
1137 | 1137 | case NREG_T3CTRL+1: /* watchdog timer control (control bits) */ |
1138 | 1138 | which = (offset - NREG_T0CTRL) / 4; |
1139 | if (LOG_NILE) logerror("%08X:NILE WRITE: timer %d control(%03X) = %08X & %08X\n", space | |
1139 | if (LOG_NILE) logerror("%08X:NILE WRITE: timer %d control(%03X) = %08X & %08X\n", space.device().safe_pc(), which, offset*4, data, mem_mask); | |
1140 | 1140 | logit = 0; |
1141 | 1141 | |
1142 | 1142 | /* timer just enabled? */ |
r17963 | r17964 | |
1165 | 1165 | case NREG_T2CNTR: /* general purpose timer control (counter) */ |
1166 | 1166 | case NREG_T3CNTR: /* watchdog timer control (counter) */ |
1167 | 1167 | which = (offset - NREG_T0CTRL) / 4; |
1168 | if (LOG_TIMERS) logerror("%08X:NILE WRITE: timer %d counter(%03X) = %08X & %08X\n", space | |
1168 | if (LOG_TIMERS) logerror("%08X:NILE WRITE: timer %d counter(%03X) = %08X & %08X\n", space.device().safe_pc(), which, offset*4, data, mem_mask); | |
1169 | 1169 | logit = 0; |
1170 | 1170 | |
1171 | 1171 | if (state->m_nile_regs[offset - 1] & 1) |
r17963 | r17964 | |
1181 | 1181 | logit = 0; |
1182 | 1182 | break; |
1183 | 1183 | case NREG_UARTIER: /* serial interrupt enable */ |
1184 | update_nile_irqs(space | |
1184 | update_nile_irqs(space.machine()); | |
1185 | 1185 | break; |
1186 | 1186 | |
1187 | 1187 | case NREG_VID: |
r17963 | r17964 | |
1215 | 1215 | case NREG_DCS8: |
1216 | 1216 | case NREG_PCIW0: |
1217 | 1217 | case NREG_PCIW1: |
1218 | remap_dynamic_addresses(space | |
1218 | remap_dynamic_addresses(space.machine()); | |
1219 | 1219 | break; |
1220 | 1220 | } |
1221 | 1221 | |
1222 | 1222 | if (LOG_NILE && logit) |
1223 | logerror("%06X:nile write to offset %03X = %08X & %08X\n", space | |
1223 | logerror("%06X:nile write to offset %03X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); | |
1224 | 1224 | } |
1225 | 1225 | |
1226 | 1226 | |
r17963 | r17964 | |
1303 | 1303 | |
1304 | 1304 | static READ32_HANDLER( sio_irq_clear_r ) |
1305 | 1305 | { |
1306 | vegas_state *state = space | |
1306 | vegas_state *state = space.machine().driver_data<vegas_state>(); | |
1307 | 1307 | return state->m_sio_irq_clear; |
1308 | 1308 | } |
1309 | 1309 | |
1310 | 1310 | |
1311 | 1311 | static WRITE32_HANDLER( sio_irq_clear_w ) |
1312 | 1312 | { |
1313 | vegas_state *state = space | |
1313 | vegas_state *state = space.machine().driver_data<vegas_state>(); | |
1314 | 1314 | if (ACCESSING_BITS_0_7) |
1315 | 1315 | { |
1316 | 1316 | state->m_sio_irq_clear = data; |
r17963 | r17964 | |
1318 | 1318 | /* bit 0x01 seems to be used to reset the IOASIC */ |
1319 | 1319 | if (!(data & 0x01)) |
1320 | 1320 | { |
1321 | midway_ioasic_reset(space->machine()); | |
1322 | dcs_reset_w(space->machine(), data & 0x01); | |
1321 | midway_ioasic_reset(space.machine()); | |
1322 | dcs_reset_w(space.machine(), data & 0x01); | |
1323 | 1323 | } |
1324 | 1324 | |
1325 | 1325 | /* they toggle bit 0x08 low to reset the VBLANK */ |
1326 | 1326 | if (!(data & 0x08)) |
1327 | 1327 | { |
1328 | 1328 | state->m_sio_irq_state &= ~0x20; |
1329 | update_sio_irqs(space | |
1329 | update_sio_irqs(space.machine()); | |
1330 | 1330 | } |
1331 | 1331 | } |
1332 | 1332 | } |
r17963 | r17964 | |
1334 | 1334 | |
1335 | 1335 | static READ32_HANDLER( sio_irq_enable_r ) |
1336 | 1336 | { |
1337 | vegas_state *state = space | |
1337 | vegas_state *state = space.machine().driver_data<vegas_state>(); | |
1338 | 1338 | return state->m_sio_irq_enable; |
1339 | 1339 | } |
1340 | 1340 | |
1341 | 1341 | |
1342 | 1342 | static WRITE32_HANDLER( sio_irq_enable_w ) |
1343 | 1343 | { |
1344 | vegas_state *state = space | |
1344 | vegas_state *state = space.machine().driver_data<vegas_state>(); | |
1345 | 1345 | if (ACCESSING_BITS_0_7) |
1346 | 1346 | { |
1347 | 1347 | state->m_sio_irq_enable = data; |
1348 | update_sio_irqs(space | |
1348 | update_sio_irqs(space.machine()); | |
1349 | 1349 | } |
1350 | 1350 | } |
1351 | 1351 | |
1352 | 1352 | |
1353 | 1353 | static READ32_HANDLER( sio_irq_cause_r ) |
1354 | 1354 | { |
1355 | vegas_state *state = space | |
1355 | vegas_state *state = space.machine().driver_data<vegas_state>(); | |
1356 | 1356 | return state->m_sio_irq_state & state->m_sio_irq_enable; |
1357 | 1357 | } |
1358 | 1358 | |
1359 | 1359 | |
1360 | 1360 | static READ32_HANDLER( sio_irq_status_r ) |
1361 | 1361 | { |
1362 | vegas_state *state = space | |
1362 | vegas_state *state = space.machine().driver_data<vegas_state>(); | |
1363 | 1363 | return state->m_sio_irq_state; |
1364 | 1364 | } |
1365 | 1365 | |
1366 | 1366 | |
1367 | 1367 | static WRITE32_HANDLER( sio_led_w ) |
1368 | 1368 | { |
1369 | vegas_state *state = space | |
1369 | vegas_state *state = space.machine().driver_data<vegas_state>(); | |
1370 | 1370 | if (ACCESSING_BITS_0_7) |
1371 | 1371 | state->m_sio_led_state = data; |
1372 | 1372 | } |
r17963 | r17964 | |
1374 | 1374 | |
1375 | 1375 | static READ32_HANDLER( sio_led_r ) |
1376 | 1376 | { |
1377 | vegas_state *state = space | |
1377 | vegas_state *state = space.machine().driver_data<vegas_state>(); | |
1378 | 1378 | return state->m_sio_led_state; |
1379 | 1379 | } |
1380 | 1380 | |
r17963 | r17964 | |
1388 | 1388 | |
1389 | 1389 | static WRITE32_HANDLER( sio_w ) |
1390 | 1390 | { |
1391 | vegas_state *state = space | |
1391 | vegas_state *state = space.machine().driver_data<vegas_state>(); | |
1392 | 1392 | if (ACCESSING_BITS_0_7) offset += 0; |
1393 | 1393 | if (ACCESSING_BITS_8_15) offset += 1; |
1394 | 1394 | if (ACCESSING_BITS_16_23) offset += 2; |
1395 | 1395 | if (ACCESSING_BITS_24_31) offset += 3; |
1396 | 1396 | if (LOG_SIO && offset != 0) |
1397 | logerror("%08X:sio write to offset %X = %02X\n", space | |
1397 | logerror("%08X:sio write to offset %X = %02X\n", space.device().safe_pc(), offset, data >> (offset*8)); | |
1398 | 1398 | if (offset < 4) |
1399 | 1399 | state->m_sio_data[offset] = data >> (offset*8); |
1400 | 1400 | if (offset == 1) |
r17963 | r17964 | |
1404 | 1404 | |
1405 | 1405 | static READ32_HANDLER( sio_r ) |
1406 | 1406 | { |
1407 | vegas_state *state = space | |
1407 | vegas_state *state = space.machine().driver_data<vegas_state>(); | |
1408 | 1408 | UINT32 result = 0; |
1409 | 1409 | if (ACCESSING_BITS_0_7) offset += 0; |
1410 | 1410 | if (ACCESSING_BITS_8_15) offset += 1; |
r17963 | r17964 | |
1413 | 1413 | if (offset < 4) |
1414 | 1414 | result = state->m_sio_data[0] | (state->m_sio_data[1] << 8) | (state->m_sio_data[2] << 16) | (state->m_sio_data[3] << 24); |
1415 | 1415 | if (LOG_SIO && offset != 2) |
1416 | logerror("%08X:sio read from offset %X = %02X\n", space | |
1416 | logerror("%08X:sio read from offset %X = %02X\n", space.device().safe_pc(), offset, result >> (offset*8)); | |
1417 | 1417 | return result; |
1418 | 1418 | } |
1419 | 1419 | |
r17963 | r17964 | |
1427 | 1427 | |
1428 | 1428 | static READ32_HANDLER( analog_port_r ) |
1429 | 1429 | { |
1430 | vegas_state *state = space | |
1430 | vegas_state *state = space.machine().driver_data<vegas_state>(); | |
1431 | 1431 | return state->m_pending_analog_read; |
1432 | 1432 | } |
1433 | 1433 | |
1434 | 1434 | |
1435 | 1435 | static WRITE32_HANDLER( analog_port_w ) |
1436 | 1436 | { |
1437 | vegas_state *state = space | |
1437 | vegas_state *state = space.machine().driver_data<vegas_state>(); | |
1438 | 1438 | static const char *const portnames[] = { "AN0", "AN1", "AN2", "AN3", "AN4", "AN5", "AN6", "AN7" }; |
1439 | 1439 | |
1440 | 1440 | if (data < 8 || data > 15) |
1441 | logerror("%08X:Unexpected analog port select = %08X\n", space | |
1441 | logerror("%08X:Unexpected analog port select = %08X\n", space.device().safe_pc(), data); | |
1442 | 1442 | state->m_pending_analog_read = state->ioport(portnames[data & 7])->read_safe(0); |
1443 | 1443 | } |
1444 | 1444 | |
r17963 | r17964 | |
1452 | 1452 | |
1453 | 1453 | static WRITE32_HANDLER( vegas_watchdog_w ) |
1454 | 1454 | { |
1455 | space | |
1455 | space.device().execute().eat_cycles(100); | |
1456 | 1456 | } |
1457 | 1457 | |
1458 | 1458 | |
1459 | 1459 | static WRITE32_HANDLER( asic_fifo_w ) |
1460 | 1460 | { |
1461 | midway_ioasic_fifo_w(space | |
1461 | midway_ioasic_fifo_w(space.machine(), data); | |
1462 | 1462 | } |
1463 | 1463 | |
1464 | 1464 | |
r17963 | r17964 | |
1508 | 1508 | |
1509 | 1509 | static WRITE32_HANDLER( dcs3_fifo_full_w ) |
1510 | 1510 | { |
1511 | midway_ioasic_fifo_full_w(space | |
1511 | midway_ioasic_fifo_full_w(space.machine(), data); | |
1512 | 1512 | } |
1513 | 1513 | |
1514 | 1514 | |
r17963 | r17964 | |
1681 | 1681 | |
1682 | 1682 | /* now remap everything */ |
1683 | 1683 | if (LOG_DYNAMIC) logerror("remap_dynamic_addresses:\n"); |
1684 | address_space *space = const_cast<address_space *>(machine.device<cpu_device>("maincpu")->space(AS_PROGRAM)); | |
1685 | assert(space != NULL); | |
1684 | address_space &space = *machine.device<cpu_device>("maincpu")->space(AS_PROGRAM); | |
1686 | 1685 | for (addr = 0; addr < state->m_dynamic_count; addr++) |
1687 | 1686 | { |
1688 | 1687 | if (LOG_DYNAMIC) logerror(" installing: %08X-%08X %s,%s\n", dynamic[addr].start, dynamic[addr].end, dynamic[addr].rdname, dynamic[addr].wrname); |
1689 | 1688 | |
1690 | 1689 | if (dynamic[addr].mread == NOP_HANDLER) |
1691 | | |
1690 | space.nop_read(dynamic[addr].start, dynamic[addr].end); | |
1692 | 1691 | else if (dynamic[addr].mread != NULL) |
1693 | space | |
1692 | space.install_legacy_read_handler(dynamic[addr].start, dynamic[addr].end, 0, 0, dynamic[addr].mread, dynamic[addr].rdname); | |
1694 | 1693 | if (dynamic[addr].mwrite != NULL) |
1695 | space | |
1694 | space.install_legacy_write_handler(dynamic[addr].start, dynamic[addr].end, 0, 0, dynamic[addr].mwrite, dynamic[addr].wrname); | |
1696 | 1695 | |
1697 | 1696 | if (dynamic[addr].dread != NULL || dynamic[addr].dwrite != NULL) |
1698 | space | |
1697 | space.install_legacy_readwrite_handler(*dynamic[addr].device, dynamic[addr].start, dynamic[addr].end, 0, 0, dynamic[addr].dread, dynamic[addr].rdname, dynamic[addr].dwrite, dynamic[addr].wrname); | |
1699 | 1698 | } |
1700 | 1699 | |
1701 | 1700 | if (LOG_DYNAMIC) |
r17963 | r17964 | |
---|---|---|
334 | 334 | #if defined(USE_TWO_3DFX) |
335 | 335 | static UINT32 voodoo_1_pci_r(device_t *busdevice, device_t *device, int function, int reg, UINT32 mem_mask) |
336 | 336 | { |
337 | magictg_state* state = space | |
337 | magictg_state* state = space.machine().driver_data<magictg_state>(); | |
338 | 338 | UINT32 val = 0; |
339 | 339 | |
340 | 340 | switch (reg) |
r17963 | r17964 | |
356 | 356 | |
357 | 357 | static void voodoo_1_pci_w(device_t *busdevice, device_t *device, int function, int reg, UINT32 data, UINT32 mem_mask) |
358 | 358 | { |
359 | magictg_state* state = space | |
359 | magictg_state* state = space.machine().driver_data<magictg_state>(); | |
360 | 360 | |
361 | 361 | switch (reg) |
362 | 362 | { |
r17963 | r17964 | |
473 | 473 | else |
474 | 474 | { |
475 | 475 | /* Post office */ |
476 | res = 0;//mame_rand(space | |
476 | res = 0;//mame_rand(space.machine);//m_zr36120.as_regs[0x48/4]; | |
477 | 477 | } |
478 | 478 | mame_printf_debug("PINKEYE_R[%x]\n", offset); |
479 | 479 | return res; |
r17963 | r17964 | |
---|---|---|
207 | 207 | for(i = 0; i < 8; i++) |
208 | 208 | { |
209 | 209 | // or offset + i * 0x2000 ? |
210 | galpanic_bgvideoram_w( | |
210 | galpanic_bgvideoram_w(space, offset * 8 + i, data, mem_mask); | |
211 | 211 | } |
212 | 212 | } |
213 | 213 |
r17963 | r17964 | |
---|---|---|
664 | 664 | |
665 | 665 | kbdc8042_init(machine(), &at8042); |
666 | 666 | pc_vga_init(machine(), vga_setting, NULL); |
667 | pc_vga_io_init(machine(), machine().device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, machine().device("maincpu")->memory().space(AS_IO), 0x0000); | |
667 | pc_vga_io_init(machine(), *machine().device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, *machine().device("maincpu")->memory().space(AS_IO), 0x0000); | |
668 | 668 | } |
669 | 669 | |
670 | 670 | void xtom3d_state::machine_reset() |
r17963 | r17964 | |
---|---|---|
495 | 495 | { |
496 | 496 | namcona1_state *state = machine.driver_data<namcona1_state>(); |
497 | 497 | UINT16 data; |
498 | address_space | |
498 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
499 | 499 | |
500 | 500 | if( source>=0x400000 && source<0xc00000 ) |
501 | 501 | { |
r17963 | r17964 | |
516 | 516 | } |
517 | 517 | if( dest>=0xf00000 && dest<0xf02000 ) |
518 | 518 | { |
519 | state->namcona1_paletteram_w( | |
519 | state->namcona1_paletteram_w(space, (dest-0xf00000)/2, data, 0xffff ); | |
520 | 520 | } |
521 | 521 | else if( dest>=0xf40000 && dest<0xf80000 ) |
522 | 522 | { |
523 | state->namcona1_gfxram_w( | |
523 | state->namcona1_gfxram_w(space, (dest-0xf40000)/2, data, 0xffff ); | |
524 | 524 | } |
525 | 525 | else if( dest>=0xff0000 && dest<0xffc000 ) |
526 | 526 | { |
527 | state->namcona1_videoram_w( | |
527 | state->namcona1_videoram_w(space, (dest-0xff0000)/2, data, 0xffff ); | |
528 | 528 | } |
529 | 529 | else if( dest>=0xfff000 && dest<0x1000000 ) |
530 | 530 | { |
r17963 | r17964 | |
---|---|---|
317 | 317 | { |
318 | 318 | |
319 | 319 | if(data & 0x4000 && ((m_vreg & 0x4000) == 0)) //0 -> 1 transition |
320 | nb_1414m4_exec( | |
320 | nb_1414m4_exec(space,(m_text_videoram[0] << 8) | (m_text_videoram[1] & 0xff),m_text_videoram,m_fg_scrollx,m_fg_scrolly,m_tx_tilemap); | |
321 | 321 | |
322 | 322 | |
323 | 323 | COMBINE_DATA(&m_vreg); |
r17963 | r17964 | |
---|---|---|
197 | 197 | DRIVER_INIT_MEMBER(pcat_dyn_state,pcat_dyn) |
198 | 198 | { |
199 | 199 | pc_vga_init(machine(), vga_setting, NULL); |
200 | pc_vga_io_init(machine(), machine().device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, machine().device("maincpu")->memory().space(AS_IO), 0x0000); | |
200 | pc_vga_io_init(machine(), *machine().device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, *machine().device("maincpu")->memory().space(AS_IO), 0x0000); | |
201 | 201 | } |
202 | 202 | |
203 | 203 | GAME( 1995, toursol, 0, pcat_dyn, pcat_dyn, pcat_dyn_state, pcat_dyn, ROT0, "Dynamo", "Tournament Solitaire (V1.06, 08/03/95)", GAME_NOT_WORKING|GAME_NO_SOUND ) |
r17963 | r17964 | |
---|---|---|
347 | 347 | * |
348 | 348 | *************************************/ |
349 | 349 | |
350 | static UINT8 memory_read_byte(address_space *space, offs_t address) { return space->read_byte(address); } | |
351 | static void memory_write_byte(address_space *space, offs_t address, UINT8 data) { space->write_byte(address, data); } | |
350 | static UINT8 memory_read_byte(address_space &space, offs_t address) { return space.read_byte(address); } | |
351 | static void memory_write_byte(address_space &space, offs_t address, UINT8 data) { space.write_byte(address, data); } | |
352 | 352 | |
353 | 353 | static Z80DMA_INTERFACE( dk3_dma ) |
354 | 354 | { |
r17963 | r17964 | |
3139 | 3139 | DRIVER_INIT_MEMBER(dkong_state,dkongx) |
3140 | 3140 | { |
3141 | 3141 | UINT8 *decrypted; |
3142 | address_space | |
3142 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
3143 | 3143 | |
3144 | 3144 | decrypted = auto_alloc_array(machine(), UINT8, 0x10000); |
3145 | 3145 | |
3146 | 3146 | machine().device("maincpu")->memory().space(AS_PROGRAM)->install_read_bank(0x0000, 0x5fff, "bank1" ); |
3147 | 3147 | machine().device("maincpu")->memory().space(AS_PROGRAM)->install_read_bank(0x8000, 0xffff, "bank2" ); |
3148 | 3148 | |
3149 | space | |
3149 | space.install_write_handler(0xe000, 0xe000, write8_delegate(FUNC(dkong_state::braze_a15_w),this)); | |
3150 | 3150 | |
3151 | space->install_read_handler(0xc800, 0xc800, read8_delegate(FUNC(dkong_state::braze_eeprom_r),this)); | |
3152 | space->install_write_handler(0xc800, 0xc800, write8_delegate(FUNC(dkong_state::braze_eeprom_w),this)); | |
3151 | space.install_read_handler(0xc800, 0xc800, read8_delegate(FUNC(dkong_state::braze_eeprom_r),this)); | |
3152 | space.install_write_handler(0xc800, 0xc800, write8_delegate(FUNC(dkong_state::braze_eeprom_w),this)); | |
3153 | 3153 | |
3154 | 3154 | braze_decrypt_rom(machine(), decrypted); |
3155 | 3155 |
r17963 | r17964 | |
---|---|---|
613 | 613 | |
614 | 614 | DRIVER_INIT_MEMBER(appoooh_state,robowresb) |
615 | 615 | { |
616 | address_space *space = machine().device("maincpu")->memory().space(AS_PROGRAM); | |
617 | space->set_decrypted_region(0x0000, 0x7fff, machine().root_device().memregion("maincpu")->base() + 0x1c000); | |
616 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
617 | space.set_decrypted_region(0x0000, 0x7fff, machine().root_device().memregion("maincpu")->base() + 0x1c000); | |
618 | 618 | } |
619 | 619 | |
620 | 620 |
r17963 | r17964 | |
---|---|---|
90 | 90 | WRITE8_MEMBER(seicross_state::friskyt_portB_w) |
91 | 91 | { |
92 | 92 | |
93 | //logerror("PC %04x: 8910 port B = %02x\n", space | |
93 | //logerror("PC %04x: 8910 port B = %02x\n", space.device().safe_pc(), data); | |
94 | 94 | /* bit 0 is IRQ enable */ |
95 | 95 | m_irq_mask = data & 1; |
96 | 96 |
r17963 | r17964 | |
---|---|---|
3294 | 3294 | int i; |
3295 | 3295 | UINT8 *ROM = memregion("maincpu")->base(); |
3296 | 3296 | UINT8 *KEY = memregion("decryption")->base(); |
3297 | address_space | |
3297 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
3298 | 3298 | UINT8 data[0x1000]; |
3299 | 3299 | |
3300 | 3300 | // the decryption key is in a rom (part of an MSDOS executable...) |
r17963 | r17964 | |
3313 | 3313 | m_decrypted_region[i] = ROM[i] ^ data[(i & 0xfff) ^ 1]; |
3314 | 3314 | } |
3315 | 3315 | |
3316 | space | |
3316 | space.set_decrypted_region(0x00000, 0xbffff, m_decrypted_region); | |
3317 | 3317 | |
3318 | 3318 | DRIVER_INIT_CALL(common); |
3319 | 3319 |
r17963 | r17964 | |
---|---|---|
466 | 466 | { |
467 | 467 | /* not sure what this does */ |
468 | 468 | |
469 | /*logerror("%x PORT A write %x at Y=%x X=%x\n", space | |
469 | /*logerror("%x PORT A write %x at Y=%x X=%x\n", space.device().safe_pc(), data, space.machine().primary_screen->vpos(), space.machine().primary_screen->hpos());*/ | |
470 | 470 | } |
471 | 471 | |
472 | 472 |
r17963 | r17964 | |
---|---|---|
692 | 692 | { 0x88,0x0a,0x82,0x00,0xa0,0x22,0xaa,0x28 }, /* ...1...1...0.... */ |
693 | 693 | { 0x88,0x0a,0x82,0x00,0xa0,0x22,0xaa,0x28 } /* ...1...1...1.... */ |
694 | 694 | }; |
695 | address_space | |
695 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
696 | 696 | UINT8 *decrypt = auto_alloc_array(machine(), UINT8, 0x8000); |
697 | 697 | UINT8 *rom = machine().root_device().memregion("maincpu")->base(); |
698 | 698 | int A; |
699 | 699 | |
700 | space | |
700 | space.set_decrypted_region(0x0000, 0x7fff, decrypt); | |
701 | 701 | |
702 | 702 | for (A = 0x0000;A < 0x8000;A++) |
703 | 703 | { |
r17963 | r17964 | |
---|---|---|
463 | 463 | |
464 | 464 | MACHINE_RESET_MEMBER(polepos_state,polepos) |
465 | 465 | { |
466 | address_space | |
466 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
467 | 467 | int i; |
468 | 468 | |
469 | 469 | /* Reset all latches */ |
470 | 470 | for (i = 0; i < 8; i++) |
471 | polepos_latch_w( | |
471 | polepos_latch_w(space, i, 0); | |
472 | 472 | |
473 | 473 | /* set the interrupt vectors (this shouldn't be needed) */ |
474 | 474 | machine().device("sub")->execute().set_input_line_vector(0, Z8000_NVI); |
r17963 | r17964 | |
---|---|---|
1059 | 1059 | { 5,3,7, 0x80 }, |
1060 | 1060 | { 5,7,3, 0x28 } |
1061 | 1061 | }; |
1062 | address_space | |
1062 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
1063 | 1063 | UINT8 *rom = machine().root_device().memregion("maincpu")->base(); |
1064 | 1064 | int size = machine().root_device().memregion("maincpu")->bytes(); |
1065 | 1065 | UINT8 *decrypt = auto_alloc_array(machine(), UINT8, size); |
1066 | 1066 | int A; |
1067 | 1067 | const UINT8 *tbl; |
1068 | 1068 | |
1069 | space | |
1069 | space.set_decrypted_region(0x0000, 0xffff, decrypt); | |
1070 | 1070 | |
1071 | 1071 | for (A = 0x0000;A < 0x10000;A++) |
1072 | 1072 | { |
r17963 | r17964 | |
---|---|---|
554 | 554 | |
555 | 555 | DRIVER_INIT_MEMBER(calorie_state,calorieb) |
556 | 556 | { |
557 | address_space *space = machine().device("maincpu")->memory().space(AS_PROGRAM); | |
558 | space->set_decrypted_region(0x0000, 0x7fff, machine().root_device().memregion("maincpu")->base() + 0x10000); | |
557 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
558 | space.set_decrypted_region(0x0000, 0x7fff, machine().root_device().memregion("maincpu")->base() + 0x10000); | |
559 | 559 | } |
560 | 560 | |
561 | 561 |
r17963 | r17964 | |
---|---|---|
628 | 628 | return data; |
629 | 629 | } |
630 | 630 | |
631 | INLINE void bankswitch_rom8( address_space | |
631 | INLINE void bankswitch_rom8( address_space &space, const char *bank, int n_data ) | |
632 | 632 | { |
633 | space | |
633 | space.machine().root_device().membank( bank )->set_entry( ( ( n_data & 0xc0 ) >> 4 ) + ( n_data & 0x03 ) ); | |
634 | 634 | } |
635 | 635 | |
636 | 636 | static const char * const bankname[] = { "bank1", "bank2", "bank3", "bank4", "bank5", "bank6", "bank7", "bank8" }; |
r17963 | r17964 | |
641 | 641 | |
642 | 642 | if( ACCESSING_BITS_0_15 ) |
643 | 643 | { |
644 | bankswitch_rom8( | |
644 | bankswitch_rom8( space, bankname[offset * 2], data & 0xffff ); | |
645 | 645 | } |
646 | 646 | if( ACCESSING_BITS_16_31 ) |
647 | 647 | { |
648 | bankswitch_rom8( | |
648 | bankswitch_rom8( space, bankname[offset * 2 + 1], data >> 16 ); | |
649 | 649 | } |
650 | 650 | } |
651 | 651 | |
r17963 | r17964 | |
664 | 664 | } |
665 | 665 | } |
666 | 666 | |
667 | INLINE void bankswitch_rom64( address_space | |
667 | INLINE void bankswitch_rom64( address_space &space, const char *bank, int n_data ) | |
668 | 668 | { |
669 | namcos11_state *state = space | |
669 | namcos11_state *state = space.machine().driver_data<namcos11_state>(); | |
670 | 670 | |
671 | 671 | /* todo: verify behaviour */ |
672 | 672 | state->membank( bank )->set_entry( ( ( ( ( n_data & 0xc0 ) >> 3 ) + ( n_data & 0x07 ) ) ^ state->m_n_bankoffset ) ); |
r17963 | r17964 | |
678 | 678 | |
679 | 679 | if( ACCESSING_BITS_0_15 ) |
680 | 680 | { |
681 | bankswitch_rom64( | |
681 | bankswitch_rom64( space, bankname[offset * 2], data & 0xffff ); | |
682 | 682 | } |
683 | 683 | if( ACCESSING_BITS_16_31 ) |
684 | 684 | { |
685 | bankswitch_rom64( | |
685 | bankswitch_rom64( space, bankname[offset * 2 + 1], data >> 16 ); | |
686 | 686 | } |
687 | 687 | } |
688 | 688 |
r17963 | r17964 | |
---|---|---|
155 | 155 | okim6295_device *oki = downcast<okim6295_device *>(device); |
156 | 156 | if (ACCESSING_BITS_0_7) |
157 | 157 | { |
158 | logerror("PC:%06x Writing %04x to Sound CPU\n",space | |
158 | logerror("PC:%06x Writing %04x to Sound CPU\n",space.device().safe_pcbase(),data); | |
159 | 159 | if (data >= 0x40) { |
160 | 160 | if (data == 0xfe) { |
161 | 161 | oki->write(0,0x40); /* Stop playing the melody */ |
r17963 | r17964 | |
---|---|---|
1066 | 1066 | |
1067 | 1067 | INPUT_CHANGED_MEMBER(galaxian_state::gmgalax_game_changed) |
1068 | 1068 | { |
1069 | address_space | |
1069 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
1070 | 1070 | |
1071 | 1071 | /* new value is the selected game */ |
1072 | 1072 | m_gmgalax_selected_game = newval; |
1073 | 1073 | |
1074 | 1074 | /* select the bank and graphics bank based on it */ |
1075 | 1075 | membank("bank1")->set_entry(m_gmgalax_selected_game); |
1076 | galaxian_gfxbank_w( | |
1076 | galaxian_gfxbank_w(space, 0, m_gmgalax_selected_game); | |
1077 | 1077 | |
1078 | 1078 | /* reset the stars */ |
1079 | galaxian_stars_enable_w( | |
1079 | galaxian_stars_enable_w(space, 0, 0); | |
1080 | 1080 | |
1081 | 1081 | /* reset the CPU */ |
1082 | 1082 | machine().device("maincpu")->execute().set_input_line(INPUT_LINE_RESET, PULSE_LINE); |
r17963 | r17964 | |
2742 | 2742 | |
2743 | 2743 | static void unmap_galaxian_sound(running_machine &machine, offs_t base) |
2744 | 2744 | { |
2745 | address_space | |
2745 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
2746 | 2746 | |
2747 | space->unmap_write(base + 0x0004, base + 0x0007, 0, 0x07f8); | |
2748 | space->unmap_write(base + 0x0800, base + 0x0807, 0, 0x07f8); | |
2749 | space->unmap_write(base + 0x1800, base + 0x1800, 0, 0x07ff); | |
2747 | space.unmap_write(base + 0x0004, base + 0x0007, 0, 0x07f8); | |
2748 | space.unmap_write(base + 0x0800, base + 0x0807, 0, 0x07f8); | |
2749 | space.unmap_write(base + 0x1800, base + 0x1800, 0, 0x07ff); | |
2750 | 2750 | } |
2751 | 2751 | |
2752 | 2752 | |
r17963 | r17964 | |
2765 | 2765 | |
2766 | 2766 | DRIVER_INIT_MEMBER(galaxian_state,nolock) |
2767 | 2767 | { |
2768 | address_space | |
2768 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2769 | 2769 | |
2770 | 2770 | /* same as galaxian... */ |
2771 | 2771 | DRIVER_INIT_CALL(galaxian); |
2772 | 2772 | |
2773 | 2773 | /* ...but coin lockout disabled/disconnected */ |
2774 | space | |
2774 | space.unmap_write(0x6002, 0x6002, 0, 0x7f8); | |
2775 | 2775 | } |
2776 | 2776 | |
2777 | 2777 | |
2778 | 2778 | DRIVER_INIT_MEMBER(galaxian_state,azurian) |
2779 | 2779 | { |
2780 | address_space | |
2780 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2781 | 2781 | |
2782 | 2782 | /* yellow bullets instead of white ones */ |
2783 | 2783 | common_init(machine(), scramble_draw_bullet, galaxian_draw_background, NULL, NULL); |
2784 | 2784 | |
2785 | 2785 | /* coin lockout disabled */ |
2786 | space | |
2786 | space.unmap_write(0x6002, 0x6002, 0, 0x7f8); | |
2787 | 2787 | } |
2788 | 2788 | |
2789 | 2789 | |
2790 | 2790 | DRIVER_INIT_MEMBER(galaxian_state,gmgalax) |
2791 | 2791 | { |
2792 | address_space | |
2792 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2793 | 2793 | |
2794 | 2794 | /* video extensions */ |
2795 | 2795 | common_init(machine(), galaxian_draw_bullet, galaxian_draw_background, gmgalax_extend_tile_info, gmgalax_extend_sprite_info); |
2796 | 2796 | |
2797 | 2797 | /* ROM is banked */ |
2798 | space | |
2798 | space.install_read_bank(0x0000, 0x3fff, "bank1"); | |
2799 | 2799 | membank("bank1")->configure_entries(0, 2, memregion("maincpu")->base() + 0x10000, 0x4000); |
2800 | 2800 | |
2801 | 2801 | /* callback when the game select is toggled */ |
r17963 | r17964 | |
2806 | 2806 | |
2807 | 2807 | DRIVER_INIT_MEMBER(galaxian_state,pisces) |
2808 | 2808 | { |
2809 | address_space | |
2809 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2810 | 2810 | |
2811 | 2811 | /* video extensions */ |
2812 | 2812 | common_init(machine(), galaxian_draw_bullet, galaxian_draw_background, pisces_extend_tile_info, pisces_extend_sprite_info); |
2813 | 2813 | |
2814 | 2814 | /* coin lockout replaced by graphics bank */ |
2815 | space | |
2815 | space.install_write_handler(0x6002, 0x6002, 0, 0x7f8, write8_delegate(FUNC(galaxian_state::galaxian_gfxbank_w),this)); | |
2816 | 2816 | } |
2817 | 2817 | |
2818 | 2818 | |
2819 | 2819 | DRIVER_INIT_MEMBER(galaxian_state,batman2) |
2820 | 2820 | { |
2821 | address_space | |
2821 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2822 | 2822 | |
2823 | 2823 | /* video extensions */ |
2824 | 2824 | common_init(machine(), galaxian_draw_bullet, galaxian_draw_background, batman2_extend_tile_info, upper_extend_sprite_info); |
2825 | 2825 | |
2826 | 2826 | /* coin lockout replaced by graphics bank */ |
2827 | space | |
2827 | space.install_write_handler(0x6002, 0x6002, 0, 0x7f8, write8_delegate(FUNC(galaxian_state::galaxian_gfxbank_w),this)); | |
2828 | 2828 | } |
2829 | 2829 | |
2830 | 2830 | |
2831 | 2831 | DRIVER_INIT_MEMBER(galaxian_state,frogg) |
2832 | 2832 | { |
2833 | address_space | |
2833 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2834 | 2834 | |
2835 | 2835 | /* same as galaxian... */ |
2836 | 2836 | common_init(machine(), galaxian_draw_bullet, frogger_draw_background, frogger_extend_tile_info, frogger_extend_sprite_info); |
2837 | 2837 | |
2838 | 2838 | /* ...but needs a full 2k of RAM */ |
2839 | space | |
2839 | space.install_ram(0x4000, 0x47ff); | |
2840 | 2840 | } |
2841 | 2841 | |
2842 | 2842 | |
r17963 | r17964 | |
2866 | 2866 | |
2867 | 2867 | DRIVER_INIT_MEMBER(galaxian_state,mooncrgx) |
2868 | 2868 | { |
2869 | address_space | |
2869 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2870 | 2870 | |
2871 | 2871 | /* video extensions */ |
2872 | 2872 | common_init(machine(), galaxian_draw_bullet, galaxian_draw_background, mooncrst_extend_tile_info, mooncrst_extend_sprite_info); |
2873 | 2873 | |
2874 | 2874 | /* LEDs and coin lockout replaced by graphics banking */ |
2875 | space | |
2875 | space.install_write_handler(0x6000, 0x6002, 0, 0x7f8, write8_delegate(FUNC(galaxian_state::galaxian_gfxbank_w),this)); | |
2876 | 2876 | } |
2877 | 2877 | |
2878 | 2878 | |
2879 | 2879 | DRIVER_INIT_MEMBER(galaxian_state,moonqsr) |
2880 | 2880 | { |
2881 | address_space | |
2881 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2882 | 2882 | UINT8 *decrypt = auto_alloc_array(machine(), UINT8, 0x8000); |
2883 | 2883 | |
2884 | 2884 | /* video extensions */ |
r17963 | r17964 | |
2886 | 2886 | |
2887 | 2887 | /* decrypt program code */ |
2888 | 2888 | decode_mooncrst(machine(), 0x8000, decrypt); |
2889 | space | |
2889 | space.set_decrypted_region(0x0000, 0x7fff, decrypt); | |
2890 | 2890 | } |
2891 | 2891 | |
2892 | 2892 | WRITE8_MEMBER(galaxian_state::artic_gfxbank_w) |
r17963 | r17964 | |
2896 | 2896 | |
2897 | 2897 | DRIVER_INIT_MEMBER(galaxian_state,pacmanbl) |
2898 | 2898 | { |
2899 | address_space | |
2899 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2900 | 2900 | |
2901 | 2901 | /* same as galaxian... */ |
2902 | 2902 | DRIVER_INIT_CALL(galaxian); |
2903 | 2903 | |
2904 | 2904 | /* ...but coin lockout disabled/disconnected */ |
2905 | space | |
2905 | space.install_write_handler(0x6002, 0x6002, 0, 0x7f8, write8_delegate(FUNC(galaxian_state::artic_gfxbank_w),this)); | |
2906 | 2906 | } |
2907 | 2907 | |
2908 | 2908 | READ8_MEMBER(galaxian_state::tenspot_dsw_read) |
r17963 | r17964 | |
2956 | 2956 | |
2957 | 2957 | DRIVER_INIT_MEMBER(galaxian_state,tenspot) |
2958 | 2958 | { |
2959 | address_space | |
2959 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2960 | 2960 | |
2961 | 2961 | /* these are needed for batman part 2 to work properly, this banking is probably a property of the artic board, |
2962 | 2962 | which tenspot appears to have copied */ |
r17963 | r17964 | |
2965 | 2965 | //common_init(machine(), galaxian_draw_bullet, galaxian_draw_background, batman2_extend_tile_info, upper_extend_sprite_info); |
2966 | 2966 | |
2967 | 2967 | /* coin lockout replaced by graphics bank */ |
2968 | //space | |
2968 | //space.install_legacy_write_handler(0x6002, 0x6002, 0, 0x7f8, FUNC(galaxian_gfxbank_w)); | |
2969 | 2969 | |
2970 | 2970 | |
2971 | 2971 | DRIVER_INIT_CALL(galaxian); |
2972 | 2972 | |
2973 | space | |
2973 | space.install_write_handler(0x6002, 0x6002, 0, 0x7f8, write8_delegate(FUNC(galaxian_state::artic_gfxbank_w),this)); | |
2974 | 2974 | |
2975 | 2975 | m_tenspot_current_game = 0; |
2976 | 2976 | |
2977 | 2977 | tenspot_set_game_bank(machine(), m_tenspot_current_game, 0); |
2978 | 2978 | |
2979 | space | |
2979 | space.install_read_handler(0x7000, 0x7000, read8_delegate(FUNC(galaxian_state::tenspot_dsw_read),this)); | |
2980 | 2980 | } |
2981 | 2981 | |
2982 | 2982 | |
r17963 | r17964 | |
2993 | 2993 | |
2994 | 2994 | DRIVER_INIT_MEMBER(galaxian_state,zigzag) |
2995 | 2995 | { |
2996 | address_space | |
2996 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2997 | 2997 | |
2998 | 2998 | /* video extensions */ |
2999 | 2999 | common_init(machine(), NULL, galaxian_draw_background, NULL, NULL); |
r17963 | r17964 | |
3003 | 3003 | m_numspritegens = 2; |
3004 | 3004 | |
3005 | 3005 | /* make ROMs 2 & 3 swappable */ |
3006 | space->install_read_bank(0x2000, 0x2fff, "bank1"); | |
3007 | space->install_read_bank(0x3000, 0x3fff, "bank2"); | |
3006 | space.install_read_bank(0x2000, 0x2fff, "bank1"); | |
3007 | space.install_read_bank(0x3000, 0x3fff, "bank2"); | |
3008 | 3008 | membank("bank1")->configure_entries(0, 2, memregion("maincpu")->base() + 0x2000, 0x1000); |
3009 | 3009 | membank("bank2")->configure_entries(0, 2, memregion("maincpu")->base() + 0x2000, 0x1000); |
3010 | 3010 | |
3011 | 3011 | /* also re-install the fixed ROM area as a bank in order to inform the memory system that |
3012 | 3012 | the fixed area only extends to 0x1fff */ |
3013 | space | |
3013 | space.install_read_bank(0x0000, 0x1fff, "bank3"); | |
3014 | 3014 | membank("bank3")->set_base(memregion("maincpu")->base() + 0x0000); |
3015 | 3015 | |
3016 | 3016 | /* handler for doing the swaps */ |
3017 | space->install_write_handler(0x7002, 0x7002, 0, 0x07f8, write8_delegate(FUNC(galaxian_state::zigzag_bankswap_w),this)); | |
3018 | zigzag_bankswap_w(*space, 0, 0); | |
3017 | space.install_write_handler(0x7002, 0x7002, 0, 0x07f8, write8_delegate(FUNC(galaxian_state::zigzag_bankswap_w),this)); | |
3018 | zigzag_bankswap_w(space, 0, 0); | |
3019 | 3019 | |
3020 | 3020 | /* coin lockout disabled */ |
3021 | space | |
3021 | space.unmap_write(0x6002, 0x6002, 0, 0x7f8); | |
3022 | 3022 | |
3023 | 3023 | /* remove the galaxian sound hardware */ |
3024 | 3024 | unmap_galaxian_sound(machine(), 0x6000); |
3025 | 3025 | |
3026 | 3026 | /* install our AY-8910 handler */ |
3027 | space | |
3027 | space.install_write_handler(0x4800, 0x4fff, write8_delegate(FUNC(galaxian_state::zigzag_ay8910_w),this)); | |
3028 | 3028 | } |
3029 | 3029 | |
3030 | 3030 | |
r17963 | r17964 | |
3037 | 3037 | |
3038 | 3038 | DRIVER_INIT_MEMBER(galaxian_state,checkman) |
3039 | 3039 | { |
3040 | address_space | |
3040 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
3041 | 3041 | address_space *iospace = machine().device("maincpu")->memory().space(AS_IO); |
3042 | 3042 | |
3043 | 3043 | /* video extensions */ |
3044 | 3044 | common_init(machine(), galaxian_draw_bullet, galaxian_draw_background, mooncrst_extend_tile_info, mooncrst_extend_sprite_info); |
3045 | 3045 | |
3046 | 3046 | /* move the interrupt enable from $b000 to $b001 */ |
3047 | space->unmap_write(0xb000, 0xb000, 0, 0x7f8); | |
3048 | space->install_write_handler(0xb001, 0xb001, 0, 0x7f8, write8_delegate(FUNC(galaxian_state::irq_enable_w),this)); | |
3047 | space.unmap_write(0xb000, 0xb000, 0, 0x7f8); | |
3048 | space.install_write_handler(0xb001, 0xb001, 0, 0x7f8, write8_delegate(FUNC(galaxian_state::irq_enable_w),this)); | |
3049 | 3049 | |
3050 | 3050 | /* attach the sound command handler */ |
3051 | 3051 | iospace->install_write_handler(0x00, 0x00, 0, 0xffff, write8_delegate(FUNC(galaxian_state::checkman_sound_command_w),this)); |
r17963 | r17964 | |
3057 | 3057 | |
3058 | 3058 | DRIVER_INIT_MEMBER(galaxian_state,checkmaj) |
3059 | 3059 | { |
3060 | address_space | |
3060 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
3061 | 3061 | |
3062 | 3062 | /* video extensions */ |
3063 | 3063 | common_init(machine(), galaxian_draw_bullet, galaxian_draw_background, NULL, NULL); |
3064 | 3064 | |
3065 | 3065 | /* attach the sound command handler */ |
3066 | space | |
3066 | space.install_write_handler(0x7800, 0x7800, 0, 0x7ff, write8_delegate(FUNC(galaxian_state::checkman_sound_command_w),this)); | |
3067 | 3067 | |
3068 | 3068 | /* for the title screen */ |
3069 | space | |
3069 | space.install_read_handler(0x3800, 0x3800, read8_delegate(FUNC(galaxian_state::checkmaj_protection_r),this)); | |
3070 | 3070 | } |
3071 | 3071 | |
3072 | 3072 | |
3073 | 3073 | DRIVER_INIT_MEMBER(galaxian_state,dingo) |
3074 | 3074 | { |
3075 | address_space | |
3075 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
3076 | 3076 | |
3077 | 3077 | /* video extensions */ |
3078 | 3078 | common_init(machine(), galaxian_draw_bullet, galaxian_draw_background, NULL, NULL); |
3079 | 3079 | |
3080 | 3080 | /* attach the sound command handler */ |
3081 | space | |
3081 | space.install_write_handler(0x7800, 0x7800, 0, 0x7ff, write8_delegate(FUNC(galaxian_state::checkman_sound_command_w),this)); | |
3082 | 3082 | |
3083 | space->install_read_handler(0x3000, 0x3000, read8_delegate(FUNC(galaxian_state::dingo_3000_r),this)); | |
3084 | space->install_read_handler(0x3035, 0x3035, read8_delegate(FUNC(galaxian_state::dingo_3035_r),this)); | |
3083 | space.install_read_handler(0x3000, 0x3000, read8_delegate(FUNC(galaxian_state::dingo_3000_r),this)); | |
3084 | space.install_read_handler(0x3035, 0x3035, read8_delegate(FUNC(galaxian_state::dingo_3035_r),this)); | |
3085 | 3085 | } |
3086 | 3086 | |
3087 | 3087 | |
3088 | 3088 | DRIVER_INIT_MEMBER(galaxian_state,dingoe) |
3089 | 3089 | { |
3090 | address_space | |
3090 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
3091 | 3091 | address_space *iospace = machine().device("maincpu")->memory().space(AS_IO); |
3092 | 3092 | |
3093 | 3093 | /* video extensions */ |
3094 | 3094 | common_init(machine(), galaxian_draw_bullet, galaxian_draw_background, mooncrst_extend_tile_info, mooncrst_extend_sprite_info); |
3095 | 3095 | |
3096 | 3096 | /* move the interrupt enable from $b000 to $b001 */ |
3097 | space->unmap_write(0xb000, 0xb000, 0, 0x7f8); | |
3098 | space->install_write_handler(0xb001, 0xb001, 0, 0x7f8, write8_delegate(FUNC(galaxian_state::irq_enable_w),this)); | |
3097 | space.unmap_write(0xb000, 0xb000, 0, 0x7f8); | |
3098 | space.install_write_handler(0xb001, 0xb001, 0, 0x7f8, write8_delegate(FUNC(galaxian_state::irq_enable_w),this)); | |
3099 | 3099 | |
3100 | 3100 | /* attach the sound command handler */ |
3101 | 3101 | iospace->install_write_handler(0x00, 0x00, 0, 0xffff, write8_delegate(FUNC(galaxian_state::checkman_sound_command_w),this)); |
3102 | 3102 | |
3103 | space | |
3103 | space.install_read_handler(0x3001, 0x3001, read8_delegate(FUNC(galaxian_state::dingoe_3001_r),this)); /* Protection check */ | |
3104 | 3104 | |
3105 | 3105 | /* decrypt program code */ |
3106 | 3106 | decode_dingoe(machine()); |
r17963 | r17964 | |
3109 | 3109 | |
3110 | 3110 | DRIVER_INIT_MEMBER(galaxian_state,skybase) |
3111 | 3111 | { |
3112 | address_space | |
3112 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
3113 | 3113 | |
3114 | 3114 | /* video extensions */ |
3115 | 3115 | common_init(machine(), galaxian_draw_bullet, galaxian_draw_background, pisces_extend_tile_info, pisces_extend_sprite_info); |
3116 | 3116 | |
3117 | 3117 | /* coin lockout replaced by graphics bank */ |
3118 | space | |
3118 | space.install_write_handler(0xa002, 0xa002, 0, 0x7f8, write8_delegate(FUNC(galaxian_state::galaxian_gfxbank_w),this)); | |
3119 | 3119 | |
3120 | 3120 | /* needs a full 2k of RAM */ |
3121 | space | |
3121 | space.install_ram(0x8000, 0x87ff); | |
3122 | 3122 | |
3123 | 3123 | /* extend ROM */ |
3124 | space | |
3124 | space.install_rom(0x0000, 0x5fff, memregion("maincpu")->base()); | |
3125 | 3125 | } |
3126 | 3126 | |
3127 | 3127 | |
3128 | 3128 | DRIVER_INIT_MEMBER(galaxian_state,kong) |
3129 | 3129 | { |
3130 | address_space | |
3130 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
3131 | 3131 | |
3132 | 3132 | /* video extensions */ |
3133 | 3133 | common_init(machine(), galaxian_draw_bullet, galaxian_draw_background, NULL, upper_extend_sprite_info); |
3134 | 3134 | |
3135 | 3135 | /* needs a full 2k of RAM */ |
3136 | space | |
3136 | space.install_ram(0x8000, 0x87ff); | |
3137 | 3137 | |
3138 | 3138 | /* extend ROM */ |
3139 | space | |
3139 | space.install_rom(0x0000, 0x7fff, machine().root_device().memregion("maincpu")->base()); | |
3140 | 3140 | } |
3141 | 3141 | |
3142 | 3142 | |
3143 | 3143 | static void mshuttle_decode(running_machine &machine, const UINT8 convtable[8][16]) |
3144 | 3144 | { |
3145 | address_space | |
3145 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
3146 | 3146 | UINT8 *rom = machine.root_device().memregion("maincpu")->base(); |
3147 | 3147 | UINT8 *decrypt = auto_alloc_array(machine, UINT8, 0x10000); |
3148 | 3148 | int A; |
3149 | 3149 | |
3150 | space | |
3150 | space.set_decrypted_region(0x0000, 0xffff, decrypt); | |
3151 | 3151 | |
3152 | 3152 | for (A = 0x0000;A < 0x10000;A++) |
3153 | 3153 | { |
r17963 | r17964 | |
3254 | 3254 | |
3255 | 3255 | DRIVER_INIT_MEMBER(galaxian_state,kingball) |
3256 | 3256 | { |
3257 | address_space | |
3257 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
3258 | 3258 | |
3259 | 3259 | /* video extensions */ |
3260 | 3260 | common_init(machine(), galaxian_draw_bullet, galaxian_draw_background, NULL, NULL); |
3261 | 3261 | |
3262 | 3262 | /* disable the stars */ |
3263 | space | |
3263 | space.unmap_write(0xb004, 0xb004, 0, 0x07f8); | |
3264 | 3264 | |
3265 | space->install_write_handler(0xb000, 0xb000, 0, 0x7f8, write8_delegate(FUNC(galaxian_state::kingball_sound1_w),this)); | |
3266 | space->install_write_handler(0xb001, 0xb001, 0, 0x7f8, write8_delegate(FUNC(galaxian_state::irq_enable_w),this)); | |
3267 | space->install_write_handler(0xb002, 0xb002, 0, 0x7f8, write8_delegate(FUNC(galaxian_state::kingball_sound2_w),this)); | |
3268 | space->install_write_handler(0xb003, 0xb003, 0, 0x7f8, write8_delegate(FUNC(galaxian_state::kingball_speech_dip_w),this)); | |
3265 | space.install_write_handler(0xb000, 0xb000, 0, 0x7f8, write8_delegate(FUNC(galaxian_state::kingball_sound1_w),this)); | |
3266 | space.install_write_handler(0xb001, 0xb001, 0, 0x7f8, write8_delegate(FUNC(galaxian_state::irq_enable_w),this)); | |
3267 | space.install_write_handler(0xb002, 0xb002, 0, 0x7f8, write8_delegate(FUNC(galaxian_state::kingball_sound2_w),this)); | |
3268 | space.install_write_handler(0xb003, 0xb003, 0, 0x7f8, write8_delegate(FUNC(galaxian_state::kingball_speech_dip_w),this)); | |
3269 | 3269 | |
3270 | 3270 | state_save_register_global(machine(), m_kingball_speech_dip); |
3271 | 3271 | state_save_register_global(machine(), m_kingball_sound); |
r17963 | r17964 | |
3274 | 3274 | |
3275 | 3275 | DRIVER_INIT_MEMBER(galaxian_state,scorpnmc) |
3276 | 3276 | { |
3277 | address_space | |
3277 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
3278 | 3278 | |
3279 | 3279 | /* video extensions */ |
3280 | 3280 | common_init(machine(), galaxian_draw_bullet, galaxian_draw_background, batman2_extend_tile_info, upper_extend_sprite_info); |
3281 | 3281 | |
3282 | 3282 | /* move the interrupt enable from $b000 to $b001 */ |
3283 | space->unmap_write(0xb000, 0xb000, 0, 0x7f8); | |
3284 | space->install_write_handler(0xb001, 0xb001, 0, 0x7f8, write8_delegate(FUNC(galaxian_state::irq_enable_w),this)); | |
3283 | space.unmap_write(0xb000, 0xb000, 0, 0x7f8); | |
3284 | space.install_write_handler(0xb001, 0xb001, 0, 0x7f8, write8_delegate(FUNC(galaxian_state::irq_enable_w),this)); | |
3285 | 3285 | |
3286 | 3286 | /* extra ROM */ |
3287 | space | |
3287 | space.install_rom(0x5000, 0x67ff, memregion("maincpu")->base() + 0x5000); | |
3288 | 3288 | |
3289 | 3289 | /* install RAM at $4000-$4800 */ |
3290 | space | |
3290 | space.install_ram(0x4000, 0x47ff); | |
3291 | 3291 | |
3292 | 3292 | /* doesn't appear to use original RAM */ |
3293 | space | |
3293 | space.unmap_readwrite(0x8000, 0x87ff); | |
3294 | 3294 | } |
3295 | 3295 | |
3296 | 3296 | DRIVER_INIT_MEMBER(galaxian_state,thepitm) |
3297 | 3297 | { |
3298 | address_space | |
3298 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
3299 | 3299 | |
3300 | 3300 | /* video extensions */ |
3301 | 3301 | common_init(machine(), galaxian_draw_bullet, galaxian_draw_background, mooncrst_extend_tile_info, mooncrst_extend_sprite_info); |
3302 | 3302 | |
3303 | 3303 | /* move the interrupt enable from $b000 to $b001 */ |
3304 | space->unmap_write(0xb000, 0xb000, 0, 0x7f8); | |
3305 | space->install_write_handler(0xb001, 0xb001, 0, 0x7f8, write8_delegate(FUNC(galaxian_state::irq_enable_w),this)); | |
3304 | space.unmap_write(0xb000, 0xb000, 0, 0x7f8); | |
3305 | space.install_write_handler(0xb001, 0xb001, 0, 0x7f8, write8_delegate(FUNC(galaxian_state::irq_enable_w),this)); | |
3306 | 3306 | |
3307 | 3307 | /* disable the stars */ |
3308 | space | |
3308 | space.unmap_write(0xb004, 0xb004, 0, 0x07f8); | |
3309 | 3309 | |
3310 | 3310 | /* extend ROM */ |
3311 | space | |
3311 | space.install_rom(0x0000, 0x47ff, memregion("maincpu")->base()); | |
3312 | 3312 | } |
3313 | 3313 | |
3314 | 3314 | /************************************* |
r17963 | r17964 | |
3319 | 3319 | |
3320 | 3320 | DRIVER_INIT_MEMBER(galaxian_state,theend) |
3321 | 3321 | { |
3322 | address_space | |
3322 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
3323 | 3323 | |
3324 | 3324 | /* video extensions */ |
3325 | 3325 | common_init(machine(), theend_draw_bullet, galaxian_draw_background, NULL, NULL); |
3326 | 3326 | |
3327 | 3327 | /* coin counter on the upper bit of port C */ |
3328 | space | |
3328 | space.unmap_write(0x6802, 0x6802, 0, 0x7f8); | |
3329 | 3329 | } |
3330 | 3330 | |
3331 | 3331 | |
r17963 | r17964 | |
3338 | 3338 | |
3339 | 3339 | DRIVER_INIT_MEMBER(galaxian_state,explorer) |
3340 | 3340 | { |
3341 | address_space | |
3341 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
3342 | 3342 | |
3343 | 3343 | /* video extensions */ |
3344 | 3344 | common_init(machine(), scramble_draw_bullet, scramble_draw_background, NULL, NULL); |
3345 | 3345 | |
3346 | 3346 | /* watchdog works for writes as well? (or is it just disabled?) */ |
3347 | space | |
3347 | space.install_write_handler(0x7000, 0x7000, 0, 0x7ff, write8_delegate(FUNC(galaxian_state::watchdog_reset_w),this)); | |
3348 | 3348 | |
3349 | 3349 | /* I/O appears to be direct, not via PPIs */ |
3350 | space->unmap_readwrite(0x8000, 0xffff); | |
3351 | space->install_read_port(0x8000, 0x8000, 0, 0xffc, "IN0"); | |
3352 | space->install_read_port(0x8001, 0x8001, 0, 0xffc, "IN1"); | |
3353 | space->install_read_port(0x8002, 0x8002, 0, 0xffc, "IN2"); | |
3354 | space->install_read_port(0x8003, 0x8003, 0, 0xffc, "IN3"); | |
3355 | space->install_write_handler(0x8000, 0x8000, 0, 0xfff, write8_delegate(FUNC(galaxian_state::soundlatch_byte_w),this)); | |
3356 | space->install_write_handler(0x9000, 0x9000, 0, 0xfff, write8_delegate(FUNC(galaxian_state::explorer_sound_control_w),this)); | |
3350 | space.unmap_readwrite(0x8000, 0xffff); | |
3351 | space.install_read_port(0x8000, 0x8000, 0, 0xffc, "IN0"); | |
3352 | space.install_read_port(0x8001, 0x8001, 0, 0xffc, "IN1"); | |
3353 | space.install_read_port(0x8002, 0x8002, 0, 0xffc, "IN2"); | |
3354 | space.install_read_port(0x8003, 0x8003, 0, 0xffc, "IN3"); | |
3355 | space.install_write_handler(0x8000, 0x8000, 0, 0xfff, write8_delegate(FUNC(galaxian_state::soundlatch_byte_w),this)); | |
3356 | space.install_write_handler(0x9000, 0x9000, 0, 0xfff, write8_delegate(FUNC(galaxian_state::explorer_sound_control_w),this)); | |
3357 | 3357 | } |
3358 | 3358 | |
3359 | 3359 | |
r17963 | r17964 | |
3371 | 3371 | |
3372 | 3372 | DRIVER_INIT_MEMBER(galaxian_state,atlantis) |
3373 | 3373 | { |
3374 | address_space | |
3374 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
3375 | 3375 | |
3376 | 3376 | /* video extensions */ |
3377 | 3377 | common_init(machine(), scramble_draw_bullet, scramble_draw_background, NULL, NULL); |
3378 | 3378 | |
3379 | 3379 | /* watchdog is at $7800? (or is it just disabled?) */ |
3380 | space->unmap_read(0x7000, 0x7000, 0, 0x7ff); | |
3381 | space->install_read_handler(0x7800, 0x7800, 0, 0x7ff, read8_delegate(FUNC(galaxian_state::watchdog_reset_r),this)); | |
3380 | space.unmap_read(0x7000, 0x7000, 0, 0x7ff); | |
3381 | space.install_read_handler(0x7800, 0x7800, 0, 0x7ff, read8_delegate(FUNC(galaxian_state::watchdog_reset_r),this)); | |
3382 | 3382 | } |
3383 | 3383 | |
3384 | 3384 | |
r17963 | r17964 | |
3413 | 3413 | |
3414 | 3414 | DRIVER_INIT_MEMBER(galaxian_state,froggrmc) |
3415 | 3415 | { |
3416 | address_space | |
3416 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
3417 | 3417 | |
3418 | 3418 | /* video extensions */ |
3419 | 3419 | common_init(machine(), NULL, frogger_draw_background, frogger_extend_tile_info, frogger_extend_sprite_info); |
3420 | 3420 | |
3421 | space->install_write_handler(0xa800, 0xa800, 0, 0x7ff, write8_delegate(FUNC(galaxian_state::soundlatch_byte_w),this)); | |
3422 | space->install_write_handler(0xb001, 0xb001, 0, 0x7f8, write8_delegate(FUNC(galaxian_state::froggrmc_sound_control_w),this)); | |
3421 | space.install_write_handler(0xa800, 0xa800, 0, 0x7ff, write8_delegate(FUNC(galaxian_state::soundlatch_byte_w),this)); | |
3422 | space.install_write_handler(0xb001, 0xb001, 0, 0x7f8, write8_delegate(FUNC(galaxian_state::froggrmc_sound_control_w),this)); | |
3423 | 3423 | |
3424 | 3424 | /* actually needs 2k of RAM */ |
3425 | space | |
3425 | space.install_ram(0x8000, 0x87ff); | |
3426 | 3426 | |
3427 | 3427 | /* decrypt */ |
3428 | 3428 | decode_frogger_sound(machine()); |
r17963 | r17964 | |
3458 | 3458 | |
3459 | 3459 | DRIVER_INIT_MEMBER(galaxian_state,scorpion) |
3460 | 3460 | { |
3461 | address_space | |
3461 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
3462 | 3462 | |
3463 | 3463 | common_init(machine(), scramble_draw_bullet, scramble_draw_background, batman2_extend_tile_info, upper_extend_sprite_info); |
3464 | 3464 | |
r17963 | r17964 | |
3466 | 3466 | machine().device("audiocpu")->memory().space(AS_IO)->install_readwrite_handler(0x00, 0xff, read8_delegate(FUNC(galaxian_state::scorpion_ay8910_r),this), write8_delegate(FUNC(galaxian_state::scorpion_ay8910_w),this)); |
3467 | 3467 | |
3468 | 3468 | /* extra ROM */ |
3469 | space | |
3469 | space.install_read_bank(0x5800, 0x67ff, "bank1"); | |
3470 | 3470 | membank("bank1")->set_base(memregion("maincpu")->base() + 0x5800); |
3471 | 3471 | |
3472 | 3472 | /* no background related */ |
3473 | // space | |
3473 | // space.nop_write(0x6803, 0x6803); | |
3474 | 3474 | |
3475 | 3475 | machine().device("audiocpu")->memory().space(AS_PROGRAM)->install_read_handler(0x3000, 0x3000, read8_delegate(FUNC(galaxian_state::scorpion_digitalker_intr_r),this)); |
3476 | 3476 | /* |
r17963 | r17964 | |
---|---|---|
268 | 268 | return ROM[offs]; |
269 | 269 | } |
270 | 270 | |
271 | void hyprduel_state::blt_write( address_space | |
271 | void hyprduel_state::blt_write( address_space &space, const int tmap, const offs_t offs, const UINT16 data, const UINT16 mask ) | |
272 | 272 | { |
273 | 273 | switch( tmap ) |
274 | 274 | { |
275 | case 1: hyprduel_vram_0_w(*space, offs,data,mask); break; | |
276 | case 2: hyprduel_vram_1_w(*space, offs, data, mask); break; | |
277 | case 3: hyprduel_vram_2_w(*space, offs, data, mask); break; | |
275 | case 1: hyprduel_vram_0_w(space, offs,data,mask); break; | |
276 | case 2: hyprduel_vram_1_w(space, offs, data, mask); break; | |
277 | case 3: hyprduel_vram_2_w(space, offs, data, mask); break; | |
278 | 278 | } |
279 | // logerror("%s : Blitter %X] %04X <- %04X & %04X\n", space | |
279 | // logerror("%s : Blitter %X] %04X <- %04X & %04X\n", space.machine().describe_context(), tmap, offs, data, mask); | |
280 | 280 | } |
281 | 281 | |
282 | 282 | |
r17963 | r17964 | |
344 | 344 | src_offs++; |
345 | 345 | |
346 | 346 | dst_offs &= 0xffff; |
347 | blt_write( | |
347 | blt_write(space, tmap, dst_offs, b2, mask); | |
348 | 348 | dst_offs = ((dst_offs + 1) & (0x100 - 1)) | (dst_offs & (~(0x100 - 1))); |
349 | 349 | } |
350 | 350 | break; |
r17963 | r17964 | |
360 | 360 | while (count--) |
361 | 361 | { |
362 | 362 | dst_offs &= 0xffff; |
363 | blt_write( | |
363 | blt_write(space, tmap, dst_offs, b2 << shift, mask); | |
364 | 364 | dst_offs = ((dst_offs + 1) & (0x100 - 1)) | (dst_offs & (~(0x100 - 1))); |
365 | 365 | b2++; |
366 | 366 | } |
r17963 | r17964 | |
377 | 377 | while (count--) |
378 | 378 | { |
379 | 379 | dst_offs &= 0xffff; |
380 | blt_write( | |
380 | blt_write(space, tmap, dst_offs, b2, mask); | |
381 | 381 | dst_offs = ((dst_offs + 1) & (0x100 - 1)) | (dst_offs & (~(0x100 - 1))); |
382 | 382 | } |
383 | 383 | break; |
r17963 | r17964 | |
---|---|---|
119 | 119 | |
120 | 120 | CUSTOM_INPUT_MEMBER(flstory_state::victnine_mcu_status_bit01_r) |
121 | 121 | { |
122 | address_space | |
122 | address_space &space = *m_maincpu->space(AS_PROGRAM); | |
123 | 123 | |
124 | return (victnine_mcu_status_r( | |
124 | return (victnine_mcu_status_r(space, 0) & 3); | |
125 | 125 | } |
126 | 126 | |
127 | 127 | static ADDRESS_MAP_START( victnine_map, AS_PROGRAM, 8, flstory_state ) |
r17963 | r17964 | |
---|---|---|
139 | 139 | READ8_MEMBER(atetris_state::atetris_slapstic_r) |
140 | 140 | { |
141 | 141 | int result = m_slapstic_base[0x2000 + offset]; |
142 | int new_bank = slapstic_tweak( | |
142 | int new_bank = slapstic_tweak(space, offset) & 1; | |
143 | 143 | |
144 | 144 | /* update for the new bank */ |
145 | 145 | if (new_bank != m_current_bank) |
r17963 | r17964 | |
---|---|---|
510 | 510 | |
511 | 511 | void kyugo_state::machine_reset() |
512 | 512 | { |
513 | address_space | |
513 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
514 | 514 | // must start with interrupts and sub CPU disabled |
515 | 515 | m_nmi_mask = 0; |
516 | kyugo_sub_cpu_control_w( | |
516 | kyugo_sub_cpu_control_w(space, 0, 0); | |
517 | 517 | |
518 | 518 | m_scroll_x_lo = 0; |
519 | 519 | m_scroll_x_hi = 0; |
r17963 | r17964 | |
---|---|---|
427 | 427 | machine().device<nvram_device>("nvram")->set_base(m_banked_nvram, 0x2000); |
428 | 428 | |
429 | 429 | pc_vga_init(machine(), vga_setting, NULL); |
430 | pc_vga_io_init(machine(), machine().device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, machine().device("maincpu")->memory().space(AS_IO), 0x0000); | |
430 | pc_vga_io_init(machine(), *machine().device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, *machine().device("maincpu")->memory().space(AS_IO), 0x0000); | |
431 | 431 | } |
432 | 432 | |
433 | 433 | GAME( 1993, bonanza, 0, pcat_nit, pcat_nit, pcat_nit_state, pcat_nit, ROT0, "New Image Technologies", "Bonanza (Revision 3)", GAME_NOT_WORKING|GAME_NO_SOUND ) |
r17963 | r17964 | |
---|---|---|
120 | 120 | |
121 | 121 | void tiamc1_state::machine_reset() |
122 | 122 | { |
123 | address_space *space = machine().device("maincpu")->memory().space(AS_PROGRAM); | |
124 | tiamc1_bankswitch_w(*space, 0, 0); | |
123 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
124 | tiamc1_bankswitch_w(space, 0, 0); | |
125 | 125 | } |
126 | 126 | |
127 | 127 | WRITE8_MEMBER(tiamc1_state::tiamc1_control_w) |
r17963 | r17964 | |
---|---|---|
166 | 166 | * |
167 | 167 | *************************************/ |
168 | 168 | |
169 | static offs_t decrypt_offset(address_space | |
169 | static offs_t decrypt_offset(address_space &space, offs_t offset) | |
170 | 170 | { |
171 | segag80r_state *state = space | |
171 | segag80r_state *state = space.machine().driver_data<segag80r_state>(); | |
172 | 172 | |
173 | 173 | /* ignore anything but accesses via opcode $32 (LD $(XXYY),A) */ |
174 | offs_t pc = space->device().safe_pcbase(); | |
175 | if ((UINT16)pc == 0xffff || space->read_byte(pc) != 0x32) | |
174 | offs_t pc = space.device().safe_pcbase(); | |
175 | if ((UINT16)pc == 0xffff || space.read_byte(pc) != 0x32) | |
176 | 176 | return offset; |
177 | 177 | |
178 | 178 | /* fetch the low byte of the address and munge it */ |
179 | return (offset & 0xff00) | (*state->m_decrypt)(pc, space | |
179 | return (offset & 0xff00) | (*state->m_decrypt)(pc, space.read_byte(pc + 1)); | |
180 | 180 | } |
181 | 181 | |
182 | 182 | WRITE8_MEMBER(segag80r_state::mainram_w) |
183 | 183 | { |
184 | m_mainram[decrypt_offset( | |
184 | m_mainram[decrypt_offset(space, offset)] = data; | |
185 | 185 | } |
186 | 186 | |
187 | WRITE8_MEMBER(segag80r_state::vidram_w){ segag80r_videoram_w(space, decrypt_offset(&space, offset), data); } | |
188 | WRITE8_MEMBER(segag80r_state::monsterb_vidram_w){ monsterb_videoram_w(space, decrypt_offset(&space, offset), data); } | |
189 | WRITE8_MEMBER(segag80r_state::pignewt_vidram_w){ pignewt_videoram_w(space, decrypt_offset(&space, offset), data); } | |
190 | WRITE8_MEMBER(segag80r_state::sindbadm_vidram_w){ sindbadm_videoram_w(space, decrypt_offset(&space, offset), data); } | |
191 | WRITE8_MEMBER(segag80r_state::usb_ram_w){ device_t *device = machine().device("usbsnd"); sega_usb_ram_w(device, space, decrypt_offset(machine().device("maincpu")->memory().space(AS_PROGRAM), offset), data); } | |
187 | WRITE8_MEMBER(segag80r_state::vidram_w){ segag80r_videoram_w(space, decrypt_offset(space, offset), data); } | |
188 | WRITE8_MEMBER(segag80r_state::monsterb_vidram_w){ monsterb_videoram_w(space, decrypt_offset(space, offset), data); } | |
189 | WRITE8_MEMBER(segag80r_state::pignewt_vidram_w){ pignewt_videoram_w(space, decrypt_offset(space, offset), data); } | |
190 | WRITE8_MEMBER(segag80r_state::sindbadm_vidram_w){ sindbadm_videoram_w(space, decrypt_offset(space, offset), data); } | |
191 | WRITE8_MEMBER(segag80r_state::usb_ram_w){ device_t *device = machine().device("usbsnd"); sega_usb_ram_w(device, space, decrypt_offset(*machine().device("maincpu")->memory().space(AS_PROGRAM), offset), data); } | |
192 | 192 | |
193 | 193 | |
194 | 194 |
r17963 | r17964 | |
---|---|---|
773 | 773 | return 0; |
774 | 774 | } |
775 | 775 | |
776 | static void tmnt2_put_word( address_space | |
776 | static void tmnt2_put_word( address_space &space, UINT32 addr, UINT16 data ) | |
777 | 777 | { |
778 | tmnt_state *state = space | |
778 | tmnt_state *state = space.machine().driver_data<tmnt_state>(); | |
779 | 779 | |
780 | 780 | UINT32 offs; |
781 | 781 | if (addr >= 0x180000 / 2 && addr <= 0x183fff / 2) |
r17963 | r17964 | |
785 | 785 | if (!(offs & 0x0031)) |
786 | 786 | { |
787 | 787 | offs = ((offs & 0x000e) >> 1) | ((offs & 0x1fc0) >> 3); |
788 | k053245_word_w(state->m_k053245, | |
788 | k053245_word_w(state->m_k053245, space, offs, data, 0xffff); | |
789 | 789 | } |
790 | 790 | } |
791 | 791 | else if (addr >= 0x104000 / 2 && addr <= 0x107fff / 2) |
r17963 | r17964 | |
905 | 905 | xoffs += xmod; |
906 | 906 | yoffs += ymod; |
907 | 907 | |
908 | tmnt2_put_word(&space, dst_addr + 0, attr1); | |
909 | tmnt2_put_word(&space, dst_addr + 2, code); | |
910 | tmnt2_put_word(&space, dst_addr + 4, (UINT32)yoffs); | |
911 | tmnt2_put_word(&space, dst_addr + 6, (UINT32)xoffs); | |
912 | tmnt2_put_word(&space, dst_addr + 12, attr2 | color); | |
908 | tmnt2_put_word(space, dst_addr + 0, attr1); | |
909 | tmnt2_put_word(space, dst_addr + 2, code); | |
910 | tmnt2_put_word(space, dst_addr + 4, (UINT32)yoffs); | |
911 | tmnt2_put_word(space, dst_addr + 6, (UINT32)xoffs); | |
912 | tmnt2_put_word(space, dst_addr + 12, attr2 | color); | |
913 | 913 | } |
914 | 914 | #else // for reference; do not remove |
915 | 915 | WRITE16_MEMBER(tmnt_state::tmnt2_1c0800_w) |
r17963 | r17964 | |
---|---|---|
137 | 137 | |
138 | 138 | static READ32_HANDLER( test_r ) |
139 | 139 | { |
140 | return -1;//space | |
140 | return -1;//space.machine().rand(); | |
141 | 141 | } |
142 | 142 | |
143 | 143 | /* |
144 | 144 | static READ32_HANDLER( rng_r ) |
145 | 145 | { |
146 | return space | |
146 | return space.machine().rand(); | |
147 | 147 | } |
148 | 148 | */ |
149 | 149 |
r17963 | r17964 | |
---|---|---|
1159 | 1159 | |
1160 | 1160 | READ16_MEMBER(raiden2_state::raiden2_sound_comms_r) |
1161 | 1161 | { |
1162 | return seibu_main_word_r( | |
1162 | return seibu_main_word_r(space,(offset >> 1) & 7,0xffff); | |
1163 | 1163 | } |
1164 | 1164 | |
1165 | 1165 | WRITE16_MEMBER(raiden2_state::raiden2_sound_comms_w) |
1166 | 1166 | { |
1167 | seibu_main_word_w( | |
1167 | seibu_main_word_w(space,(offset >> 1) & 7,data,0x00ff); | |
1168 | 1168 | } |
1169 | 1169 | |
1170 | 1170 | WRITE16_MEMBER(raiden2_state::raiden2_bank_w) |
r17963 | r17964 | |
---|---|---|
569 | 569 | |
570 | 570 | |
571 | 571 | |
572 | static UINT8 mcu_comm_reg_r(address_space | |
572 | static UINT8 mcu_comm_reg_r(address_space &space, int reg) | |
573 | 573 | { |
574 | taitojc_state *state = space | |
574 | taitojc_state *state = space.machine().driver_data<taitojc_state>(); | |
575 | 575 | UINT8 r = 0; |
576 | 576 | |
577 | 577 | switch (reg) |
r17963 | r17964 | |
588 | 588 | } |
589 | 589 | default: |
590 | 590 | { |
591 | //mame_printf_debug("hc11_reg_r: %02X at %08X\n", reg, space | |
591 | //mame_printf_debug("hc11_reg_r: %02X at %08X\n", reg, space.device().safe_pc()); | |
592 | 592 | break; |
593 | 593 | } |
594 | 594 | } |
r17963 | r17964 | |
596 | 596 | return r; |
597 | 597 | } |
598 | 598 | |
599 | static void mcu_comm_reg_w(address_space | |
599 | static void mcu_comm_reg_w(address_space &space, int reg, UINT8 data) | |
600 | 600 | { |
601 | taitojc_state *state = space | |
601 | taitojc_state *state = space.machine().driver_data<taitojc_state>(); | |
602 | 602 | |
603 | 603 | switch (reg) |
604 | 604 | { |
r17963 | r17964 | |
615 | 615 | } |
616 | 616 | default: |
617 | 617 | { |
618 | //mame_printf_debug("hc11_reg_w: %02X, %02X at %08X\n", reg, data, space | |
618 | //mame_printf_debug("hc11_reg_w: %02X, %02X at %08X\n", reg, data, space.device().safe_pc()); | |
619 | 619 | break; |
620 | 620 | } |
621 | 621 | } |
r17963 | r17964 | |
628 | 628 | |
629 | 629 | if (ACCESSING_BITS_24_31) |
630 | 630 | { |
631 | r |= mcu_comm_reg_r( | |
631 | r |= mcu_comm_reg_r(space, reg + 0) << 24; | |
632 | 632 | } |
633 | 633 | if (ACCESSING_BITS_16_23) |
634 | 634 | { |
635 | r |= mcu_comm_reg_r( | |
635 | r |= mcu_comm_reg_r(space, reg + 1) << 16; | |
636 | 636 | } |
637 | 637 | if (ACCESSING_BITS_8_15) |
638 | 638 | { |
639 | r |= mcu_comm_reg_r( | |
639 | r |= mcu_comm_reg_r(space, reg + 2) << 8; | |
640 | 640 | } |
641 | 641 | if (ACCESSING_BITS_0_7) |
642 | 642 | { |
643 | r |= mcu_comm_reg_r( | |
643 | r |= mcu_comm_reg_r(space, reg + 3) << 0; | |
644 | 644 | } |
645 | 645 | |
646 | 646 | return r; |
r17963 | r17964 | |
652 | 652 | |
653 | 653 | if (ACCESSING_BITS_24_31) |
654 | 654 | { |
655 | mcu_comm_reg_w( | |
655 | mcu_comm_reg_w(space, reg + 0, (data >> 24) & 0xff); | |
656 | 656 | } |
657 | 657 | if (ACCESSING_BITS_16_23) |
658 | 658 | { |
659 | mcu_comm_reg_w( | |
659 | mcu_comm_reg_w(space, reg + 1, (data >> 16) & 0xff); | |
660 | 660 | } |
661 | 661 | if (ACCESSING_BITS_8_15) |
662 | 662 | { |
663 | mcu_comm_reg_w( | |
663 | mcu_comm_reg_w(space, reg + 2, (data >> 8) & 0xff); | |
664 | 664 | } |
665 | 665 | if (ACCESSING_BITS_0_7) |
666 | 666 | { |
667 | mcu_comm_reg_w( | |
667 | mcu_comm_reg_w(space, reg + 3, (data >> 0) & 0xff); | |
668 | 668 | } |
669 | 669 | } |
670 | 670 |
r17963 | r17964 | |
---|---|---|
582 | 582 | |
583 | 583 | static SOUND_RESET(berzerk) |
584 | 584 | { |
585 | address_space | |
585 | address_space &space = *machine.device("maincpu")->memory().space(AS_IO); | |
586 | 586 | berzerk_state *state = machine.driver_data<berzerk_state>(); |
587 | 587 | /* clears the flip-flop controlling the volume and freq on the speech chip */ |
588 | state->berzerk_audio_w( | |
588 | state->berzerk_audio_w(space, 4, 0x40); | |
589 | 589 | } |
590 | 590 | |
591 | 591 |
r17963 | r17964 | |
---|---|---|
249 | 249 | DRIVER_INIT_MEMBER(magtouch_state,magtouch) |
250 | 250 | { |
251 | 251 | pc_vga_init(machine(), vga_setting, NULL); |
252 | pc_vga_io_init(machine(), machine().device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, machine().device("maincpu")->memory().space(AS_IO), 0x0000); | |
252 | pc_vga_io_init(machine(), *machine().device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, *machine().device("maincpu")->memory().space(AS_IO), 0x0000); | |
253 | 253 | } |
254 | 254 | |
255 | 255 | GAME( 1995, magtouch, 0, magtouch, magtouch, magtouch_state, magtouch, ROT0, "Micro Manufacturing", "Magical Touch", GAME_NOT_WORKING | GAME_NO_SOUND ) |
r17963 | r17964 | |
---|---|---|
1059 | 1059 | |
1060 | 1060 | static UINT32 scsi_fetch(running_machine &machine, UINT32 dsp) |
1061 | 1061 | { |
1062 | address_space | |
1062 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
1063 | 1063 | UINT32 result; |
1064 | result = space | |
1064 | result = space.read_dword(dsp); | |
1065 | 1065 | return FLIPENDIAN_INT32(result); |
1066 | 1066 | } |
1067 | 1067 | |
r17963 | r17964 | |
1159 | 1159 | |
1160 | 1160 | static void real3d_dma_callback(running_machine &machine, UINT32 src, UINT32 dst, int length, int byteswap) |
1161 | 1161 | { |
1162 | address_space | |
1162 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
1163 | 1163 | switch(dst >> 24) |
1164 | 1164 | { |
1165 | 1165 | case 0x88: /* Display List End Trigger */ |
r17963 | r17964 | |
---|---|---|
1456 | 1456 | |
1457 | 1457 | |
1458 | 1458 | |
1459 | static UINT32 cps3_flashmain_r(address_space | |
1459 | static UINT32 cps3_flashmain_r(address_space &space, int which, UINT32 offset, UINT32 mem_mask) | |
1460 | 1460 | { |
1461 | cps3_state *state = space | |
1461 | cps3_state *state = space.machine().driver_data<cps3_state>(); | |
1462 | 1462 | UINT32 result = 0; |
1463 | 1463 | |
1464 | 1464 | if (state->m_simm[which][0] == NULL || state->m_simm[which][1] == NULL || state->m_simm[which][2] == NULL || state->m_simm[which][3] == NULL) |
r17963 | r17964 | |
1494 | 1494 | |
1495 | 1495 | READ32_MEMBER(cps3_state::cps3_flash1_r) |
1496 | 1496 | { |
1497 | UINT32 retvalue = cps3_flashmain_r( | |
1497 | UINT32 retvalue = cps3_flashmain_r(space, 0, offset,mem_mask); | |
1498 | 1498 | |
1499 | 1499 | if (m_altEncryption) return retvalue; |
1500 | 1500 | |
r17963 | r17964 | |
1504 | 1504 | |
1505 | 1505 | READ32_MEMBER(cps3_state::cps3_flash2_r) |
1506 | 1506 | { |
1507 | UINT32 retvalue = cps3_flashmain_r( | |
1507 | UINT32 retvalue = cps3_flashmain_r(space, 1, offset,mem_mask); | |
1508 | 1508 | |
1509 | 1509 | if (m_altEncryption) return retvalue; |
1510 | 1510 |
r17963 | r17964 | |
---|---|---|
47 | 47 | { |
48 | 48 | UINT8 *ROM = memregion("voice")->base(); |
49 | 49 | |
50 | return ROM[pastelg_blitter_src_addr_r( | |
50 | return ROM[pastelg_blitter_src_addr_r(space) & 0x7fff]; | |
51 | 51 | } |
52 | 52 | |
53 | 53 | static ADDRESS_MAP_START( pastelg_map, AS_PROGRAM, 8, pastelg_state ) |
r17963 | r17964 | |
---|---|---|
506 | 506 | static void update_vblank_irq(running_machine &machine); |
507 | 507 | static void galileo_reset(running_machine &machine); |
508 | 508 | static TIMER_CALLBACK( galileo_timer_callback ); |
509 | static void galileo_perform_dma(address_space | |
509 | static void galileo_perform_dma(address_space &space, int which); | |
510 | 510 | static void voodoo_stall(device_t *device, int stall); |
511 | 511 | static void widget_reset(running_machine &machine); |
512 | 512 | static void update_widget_irq(running_machine &machine); |
r17963 | r17964 | |
798 | 798 | * |
799 | 799 | *************************************/ |
800 | 800 | |
801 | static UINT32 pci_bridge_r(address_space | |
801 | static UINT32 pci_bridge_r(address_space &space, UINT8 reg, UINT8 type) | |
802 | 802 | { |
803 | seattle_state *state = space | |
803 | seattle_state *state = space.machine().driver_data<seattle_state>(); | |
804 | 804 | UINT32 result = state->m_galileo.pci_bridge_regs[reg]; |
805 | 805 | |
806 | 806 | switch (reg) |
r17963 | r17964 | |
815 | 815 | } |
816 | 816 | |
817 | 817 | if (LOG_PCI) |
818 | logerror("%08X:PCI bridge read: reg %d type %d = %08X\n", space | |
818 | logerror("%08X:PCI bridge read: reg %d type %d = %08X\n", space.device().safe_pc(), reg, type, result); | |
819 | 819 | return result; |
820 | 820 | } |
821 | 821 | |
822 | 822 | |
823 | static void pci_bridge_w(address_space | |
823 | static void pci_bridge_w(address_space &space, UINT8 reg, UINT8 type, UINT32 data) | |
824 | 824 | { |
825 | seattle_state *state = space | |
825 | seattle_state *state = space.machine().driver_data<seattle_state>(); | |
826 | 826 | state->m_galileo.pci_bridge_regs[reg] = data; |
827 | 827 | if (LOG_PCI) |
828 | logerror("%08X:PCI bridge write: reg %d type %d = %08X\n", space | |
828 | logerror("%08X:PCI bridge write: reg %d type %d = %08X\n", space.device().safe_pc(), reg, type, data); | |
829 | 829 | } |
830 | 830 | |
831 | 831 | |
r17963 | r17964 | |
836 | 836 | * |
837 | 837 | *************************************/ |
838 | 838 | |
839 | static UINT32 pci_3dfx_r(address_space | |
839 | static UINT32 pci_3dfx_r(address_space &space, UINT8 reg, UINT8 type) | |
840 | 840 | { |
841 | seattle_state *state = space | |
841 | seattle_state *state = space.machine().driver_data<seattle_state>(); | |
842 | 842 | UINT32 result = state->m_galileo.pci_3dfx_regs[reg]; |
843 | 843 | |
844 | 844 | switch (reg) |
r17963 | r17964 | |
853 | 853 | } |
854 | 854 | |
855 | 855 | if (LOG_PCI) |
856 | logerror("%08X:PCI 3dfx read: reg %d type %d = %08X\n", space | |
856 | logerror("%08X:PCI 3dfx read: reg %d type %d = %08X\n", space.device().safe_pc(), reg, type, result); | |
857 | 857 | return result; |
858 | 858 | } |
859 | 859 | |
860 | 860 | |
861 | static void pci_3dfx_w(address_space | |
861 | static void pci_3dfx_w(address_space &space, UINT8 reg, UINT8 type, UINT32 data) | |
862 | 862 | { |
863 | seattle_state *state = space | |
863 | seattle_state *state = space.machine().driver_data<seattle_state>(); | |
864 | 864 | state->m_galileo.pci_3dfx_regs[reg] = data; |
865 | 865 | |
866 | 866 | switch (reg) |
r17963 | r17964 | |
876 | 876 | break; |
877 | 877 | } |
878 | 878 | if (LOG_PCI) |
879 | logerror("%08X:PCI 3dfx write: reg %d type %d = %08X\n", space | |
879 | logerror("%08X:PCI 3dfx write: reg %d type %d = %08X\n", space.device().safe_pc(), reg, type, data); | |
880 | 880 | } |
881 | 881 | |
882 | 882 | |
r17963 | r17964 | |
887 | 887 | * |
888 | 888 | *************************************/ |
889 | 889 | |
890 | static UINT32 pci_ide_r(address_space | |
890 | static UINT32 pci_ide_r(address_space &space, UINT8 reg, UINT8 type) | |
891 | 891 | { |
892 | seattle_state *state = space | |
892 | seattle_state *state = space.machine().driver_data<seattle_state>(); | |
893 | 893 | UINT32 result = state->m_galileo.pci_ide_regs[reg]; |
894 | 894 | |
895 | 895 | switch (reg) |
r17963 | r17964 | |
904 | 904 | } |
905 | 905 | |
906 | 906 | if (LOG_PCI) |
907 | logerror("%08X:PCI IDE read: reg %d type %d = %08X\n", space | |
907 | logerror("%08X:PCI IDE read: reg %d type %d = %08X\n", space.device().safe_pc(), reg, type, result); | |
908 | 908 | return result; |
909 | 909 | } |
910 | 910 | |
911 | 911 | |
912 | static void pci_ide_w(address_space | |
912 | static void pci_ide_w(address_space &space, UINT8 reg, UINT8 type, UINT32 data) | |
913 | 913 | { |
914 | seattle_state *state = space | |
914 | seattle_state *state = space.machine().driver_data<seattle_state>(); | |
915 | 915 | state->m_galileo.pci_ide_regs[reg] = data; |
916 | 916 | if (LOG_PCI) |
917 | logerror("%08X:PCI bridge write: reg %d type %d = %08X\n", space | |
917 | logerror("%08X:PCI bridge write: reg %d type %d = %08X\n", space.device().safe_pc(), reg, type, data); | |
918 | 918 | } |
919 | 919 | |
920 | 920 | |
r17963 | r17964 | |
973 | 973 | * |
974 | 974 | *************************************/ |
975 | 975 | |
976 | static int galileo_dma_fetch_next(address_space | |
976 | static int galileo_dma_fetch_next(address_space &space, int which) | |
977 | 977 | { |
978 | seattle_state *state = space | |
978 | seattle_state *state = space.machine().driver_data<seattle_state>(); | |
979 | 979 | galileo_data &galileo = state->m_galileo; |
980 | 980 | offs_t address = 0; |
981 | 981 | UINT32 data; |
r17963 | r17964 | |
990 | 990 | if (galileo.reg[GREG_DMA0_CONTROL + which] & 0x400) |
991 | 991 | { |
992 | 992 | galileo.reg[GREG_INT_STATE] |= 1 << (GINT_DMA0COMP_SHIFT + which); |
993 | update_galileo_irqs(space | |
993 | update_galileo_irqs(space.machine()); | |
994 | 994 | } |
995 | 995 | galileo.reg[GREG_DMA0_CONTROL + which] &= ~0x5000; |
996 | 996 | return 0; |
997 | 997 | } |
998 | 998 | |
999 | 999 | /* fetch the byte count */ |
1000 | data = space | |
1000 | data = space.read_dword(address); address += 4; | |
1001 | 1001 | galileo.reg[GREG_DMA0_COUNT + which] = data; |
1002 | 1002 | |
1003 | 1003 | /* fetch the source address */ |
1004 | data = space | |
1004 | data = space.read_dword(address); address += 4; | |
1005 | 1005 | galileo.reg[GREG_DMA0_SOURCE + which] = data; |
1006 | 1006 | |
1007 | 1007 | /* fetch the dest address */ |
1008 | data = space | |
1008 | data = space.read_dword(address); address += 4; | |
1009 | 1009 | galileo.reg[GREG_DMA0_DEST + which] = data; |
1010 | 1010 | |
1011 | 1011 | /* fetch the next record address */ |
1012 | data = space | |
1012 | data = space.read_dword(address); address += 4; | |
1013 | 1013 | galileo.reg[GREG_DMA0_NEXT + which] = data; |
1014 | 1014 | return 1; |
1015 | 1015 | } |
1016 | 1016 | |
1017 | 1017 | |
1018 | static void galileo_perform_dma(address_space | |
1018 | static void galileo_perform_dma(address_space &space, int which) | |
1019 | 1019 | { |
1020 | seattle_state *state = space | |
1020 | seattle_state *state = space.machine().driver_data<seattle_state>(); | |
1021 | 1021 | galileo_data &galileo = state->m_galileo; |
1022 | 1022 | do |
1023 | 1023 | { |
r17963 | r17964 | |
1068 | 1068 | } |
1069 | 1069 | |
1070 | 1070 | /* write the data and advance */ |
1071 | voodoo_w(state->m_voodoo, | |
1071 | voodoo_w(state->m_voodoo, space, (dstaddr & 0xffffff) / 4, space.read_dword(srcaddr), 0xffffffff); | |
1072 | 1072 | srcaddr += srcinc; |
1073 | 1073 | dstaddr += dstinc; |
1074 | 1074 | bytesleft -= 4; |
r17963 | r17964 | |
1080 | 1080 | { |
1081 | 1081 | while (bytesleft > 0) |
1082 | 1082 | { |
1083 | space | |
1083 | space.write_byte(dstaddr, space.read_byte(srcaddr)); | |
1084 | 1084 | srcaddr += srcinc; |
1085 | 1085 | dstaddr += dstinc; |
1086 | 1086 | bytesleft--; |
r17963 | r17964 | |
1101 | 1101 | if (!(galileo.reg[GREG_DMA0_CONTROL + which] & 0x400)) |
1102 | 1102 | { |
1103 | 1103 | galileo.reg[GREG_INT_STATE] |= 1 << (GINT_DMA0COMP_SHIFT + which); |
1104 | update_galileo_irqs(space | |
1104 | update_galileo_irqs(space.machine()); | |
1105 | 1105 | } |
1106 | 1106 | } while (galileo_dma_fetch_next(space, which)); |
1107 | 1107 | |
r17963 | r17964 | |
1169 | 1169 | |
1170 | 1170 | /* unit 0 is the PCI bridge */ |
1171 | 1171 | if (unit == 0 && func == 0) |
1172 | result = pci_bridge_r( | |
1172 | result = pci_bridge_r(space, reg, type); | |
1173 | 1173 | |
1174 | 1174 | /* unit 8 is the 3dfx card */ |
1175 | 1175 | else if (unit == 8 && func == 0) |
1176 | result = pci_3dfx_r( | |
1176 | result = pci_3dfx_r(space, reg, type); | |
1177 | 1177 | |
1178 | 1178 | /* unit 9 is the IDE controller */ |
1179 | 1179 | else if (unit == 9 && func == 0) |
1180 | result = pci_ide_r( | |
1180 | result = pci_ide_r(space, reg, type); | |
1181 | 1181 | |
1182 | 1182 | /* anything else, just log */ |
1183 | 1183 | else |
r17963 | r17964 | |
1230 | 1230 | |
1231 | 1231 | /* fetch next record */ |
1232 | 1232 | if (data & 0x2000) |
1233 | galileo_dma_fetch_next( | |
1233 | galileo_dma_fetch_next(space, which); | |
1234 | 1234 | galileo.reg[offset] &= ~0x2000; |
1235 | 1235 | |
1236 | 1236 | /* if enabling, start the DMA */ |
1237 | 1237 | if (!(oldata & 0x1000) && (data & 0x1000)) |
1238 | galileo_perform_dma( | |
1238 | galileo_perform_dma(space, which); | |
1239 | 1239 | break; |
1240 | 1240 | } |
1241 | 1241 | |
r17963 | r17964 | |
1308 | 1308 | |
1309 | 1309 | /* unit 0 is the PCI bridge */ |
1310 | 1310 | if (unit == 0 && func == 0) |
1311 | pci_bridge_w( | |
1311 | pci_bridge_w(space, reg, type, data); | |
1312 | 1312 | |
1313 | 1313 | /* unit 8 is the 3dfx card */ |
1314 | 1314 | else if (unit == 8 && func == 0) |
1315 | pci_3dfx_w( | |
1315 | pci_3dfx_w(space, reg, type, data); | |
1316 | 1316 | |
1317 | 1317 | /* unit 9 is the IDE controller */ |
1318 | 1318 | else if (unit == 9 && func == 0) |
1319 | pci_ide_w( | |
1319 | pci_ide_w(space, reg, type, data); | |
1320 | 1320 | |
1321 | 1321 | /* anything else, just log */ |
1322 | 1322 | else |
r17963 | r17964 | |
1403 | 1403 | for (which = 0; which < 4; which++) |
1404 | 1404 | if (state->m_galileo.dma_stalled_on_voodoo[which]) |
1405 | 1405 | { |
1406 | address_space | |
1406 | address_space &space = *device->machine().device("maincpu")->memory().space(AS_PROGRAM); | |
1407 | 1407 | if (LOG_DMA) logerror("Resuming DMA%d on voodoo\n", which); |
1408 | 1408 | |
1409 | 1409 | /* mark this DMA as no longer stalled */ |
r17963 | r17964 | |
---|---|---|
189 | 189 | { |
190 | 190 | /* only the first part is decrypted (and verified)*/ |
191 | 191 | |
192 | address_space | |
192 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
193 | 193 | UINT8 *dest = machine().root_device().memregion("maincpu")->base(); |
194 | 194 | int len = machine().root_device().memregion("maincpu")->bytes(); |
195 | 195 | UINT8 *src = auto_alloc_array(machine(), UINT8, len); |
r17963 | r17964 | |
215 | 215 | } |
216 | 216 | auto_free(machine(), src); |
217 | 217 | |
218 | space | |
218 | space.set_decrypted_region(0x0000, 0x7fff, dest+0x10000); | |
219 | 219 | } |
220 | 220 | |
221 | 221 | GAME( 1995, tcl, 0, tcl, tcl, tcl_state, tcl, ROT0, "Uniwang", "Taiwan Chess Legend", GAME_NOT_WORKING ) |
r17963 | r17964 | |
---|---|---|
479 | 479 | |
480 | 480 | void pturn_state::machine_reset() |
481 | 481 | { |
482 | address_space *space = machine().device("maincpu")->memory().space(AS_PROGRAM); | |
483 | soundlatch_clear_byte_w(*space,0,0); | |
482 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
483 | soundlatch_clear_byte_w(space,0,0); | |
484 | 484 | } |
485 | 485 | |
486 | 486 | static MACHINE_CONFIG_START( pturn, pturn_state ) |
r17963 | r17964 | |
---|---|---|
422 | 422 | void slyspy_set_protection_map(running_machine& machine, int type) |
423 | 423 | { |
424 | 424 | dec0_state *state = machine.driver_data<dec0_state>(); |
425 | address_space | |
425 | address_space& space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
426 | 426 | |
427 | 427 | deco_bac06_device *tilegen1 = (deco_bac06_device*)state->m_tilegen1; |
428 | 428 | deco_bac06_device *tilegen2 = (deco_bac06_device*)state->m_tilegen2; |
429 | 429 | |
430 | space | |
430 | space.install_write_handler( 0x240000, 0x24ffff, write16_delegate(FUNC(dec0_state::unmapped_w),state)); | |
431 | 431 | |
432 | space->install_write_handler( 0x24a000, 0x24a001, write16_delegate(FUNC(dec0_state::slyspy_state_w),state)); | |
433 | space->install_read_handler( 0x244000, 0x244001, read16_delegate(FUNC(dec0_state::slyspy_state_r),state)); | |
432 | space.install_write_handler( 0x24a000, 0x24a001, write16_delegate(FUNC(dec0_state::slyspy_state_w),state)); | |
433 | space.install_read_handler( 0x244000, 0x244001, read16_delegate(FUNC(dec0_state::slyspy_state_r),state)); | |
434 | 434 | |
435 | 435 | switch (type) |
436 | 436 | { |
437 | 437 | |
438 | 438 | case 0: |
439 | space->install_legacy_write_handler( *tilegen2, 0x240000, 0x240007, FUNC(deco_bac06_pf_control_0_w)); | |
440 | space->install_legacy_write_handler( *tilegen2, 0x240010, 0x240017, FUNC(deco_bac06_pf_control_1_w)); | |
439 | space.install_legacy_write_handler( *tilegen2, 0x240000, 0x240007, FUNC(deco_bac06_pf_control_0_w)); | |
440 | space.install_legacy_write_handler( *tilegen2, 0x240010, 0x240017, FUNC(deco_bac06_pf_control_1_w)); | |
441 | 441 | |
442 | space->install_legacy_write_handler( *tilegen2, 0x242000, 0x24207f, FUNC(deco_bac06_pf_colscroll_w)); | |
443 | space->install_legacy_write_handler( *tilegen2, 0x242400, 0x2427ff, FUNC(deco_bac06_pf_rowscroll_w)); | |
442 | space.install_legacy_write_handler( *tilegen2, 0x242000, 0x24207f, FUNC(deco_bac06_pf_colscroll_w)); | |
443 | space.install_legacy_write_handler( *tilegen2, 0x242400, 0x2427ff, FUNC(deco_bac06_pf_rowscroll_w)); | |
444 | 444 | |
445 | space | |
445 | space.install_legacy_write_handler( *tilegen2, 0x246000, 0x247fff, FUNC(deco_bac06_pf_data_w)); | |
446 | 446 | |
447 | space->install_legacy_write_handler( *tilegen1, 0x248000, 0x280007, FUNC(deco_bac06_pf_control_0_w)); | |
448 | space->install_legacy_write_handler( *tilegen1, 0x248010, 0x280017, FUNC(deco_bac06_pf_control_1_w)); | |
447 | space.install_legacy_write_handler( *tilegen1, 0x248000, 0x280007, FUNC(deco_bac06_pf_control_0_w)); | |
448 | space.install_legacy_write_handler( *tilegen1, 0x248010, 0x280017, FUNC(deco_bac06_pf_control_1_w)); | |
449 | 449 | |
450 | space->install_legacy_write_handler( *tilegen1, 0x24c000, 0x24c07f, FUNC(deco_bac06_pf_colscroll_w)); | |
451 | space->install_legacy_write_handler( *tilegen1, 0x24c400, 0x24c7ff, FUNC(deco_bac06_pf_rowscroll_w)); | |
450 | space.install_legacy_write_handler( *tilegen1, 0x24c000, 0x24c07f, FUNC(deco_bac06_pf_colscroll_w)); | |
451 | space.install_legacy_write_handler( *tilegen1, 0x24c400, 0x24c7ff, FUNC(deco_bac06_pf_rowscroll_w)); | |
452 | 452 | |
453 | space | |
453 | space.install_legacy_write_handler( *tilegen1, 0x24e000, 0x24ffff, FUNC(deco_bac06_pf_data_w)); | |
454 | 454 | |
455 | 455 | break; |
456 | 456 | |
r17963 | r17964 | |
458 | 458 | // 0x240000 - 0x241fff not mapped |
459 | 459 | // 0x242000 - 0x243fff not mapped |
460 | 460 | // 0x246000 - 0x247fff not mapped |
461 | space->install_legacy_write_handler( *tilegen1, 0x248000, 0x249fff, FUNC(deco_bac06_pf_data_w)); | |
462 | space->install_legacy_write_handler( *tilegen2, 0x24c000, 0x24dfff, FUNC(deco_bac06_pf_data_w)); | |
461 | space.install_legacy_write_handler( *tilegen1, 0x248000, 0x249fff, FUNC(deco_bac06_pf_data_w)); | |
462 | space.install_legacy_write_handler( *tilegen2, 0x24c000, 0x24dfff, FUNC(deco_bac06_pf_data_w)); | |
463 | 463 | // 0x24e000 - 0x24ffff not mapped |
464 | 464 | break; |
465 | 465 | |
466 | 466 | case 2: |
467 | space->install_legacy_write_handler( *tilegen2, 0x240000, 0x241fff, FUNC(deco_bac06_pf_data_w)); | |
468 | space->install_legacy_write_handler( *tilegen1, 0x242000, 0x243fff, FUNC(deco_bac06_pf_data_w)); | |
467 | space.install_legacy_write_handler( *tilegen2, 0x240000, 0x241fff, FUNC(deco_bac06_pf_data_w)); | |
468 | space.install_legacy_write_handler( *tilegen1, 0x242000, 0x243fff, FUNC(deco_bac06_pf_data_w)); | |
469 | 469 | // 0x242000 - 0x243fff not mapped |
470 | 470 | // 0x246000 - 0x247fff not mapped |
471 | 471 | // 0x248000 - 0x249fff not mapped |
472 | 472 | // 0x24c000 - 0x24dfff not mapped |
473 | space | |
473 | space.install_legacy_write_handler( *tilegen1, 0x24e000, 0x24ffff, FUNC(deco_bac06_pf_data_w)); | |
474 | 474 | break; |
475 | 475 | |
476 | 476 | case 3: |
477 | space | |
477 | space.install_legacy_write_handler( *tilegen1, 0x240000, 0x241fff, FUNC(deco_bac06_pf_data_w)); | |
478 | 478 | // 0x242000 - 0x243fff not mapped |
479 | 479 | // 0x246000 - 0x247fff not mapped |
480 | space | |
480 | space.install_legacy_write_handler( *tilegen2, 0x248000, 0x249fff, FUNC(deco_bac06_pf_data_w)); | |
481 | 481 | // 0x24c000 - 0x24dfff not mapped |
482 | 482 | // 0x24e000 - 0x24ffff not mapped |
483 | 483 | break; |
r17963 | r17964 | |
---|---|---|
362 | 362 | |
363 | 363 | READ32_MEMBER(midvunit_state::offroadc_serial_status_r) |
364 | 364 | { |
365 | int status = midway_serial_pic2_status_r( | |
365 | int status = midway_serial_pic2_status_r(space); | |
366 | 366 | return (ioport("991030")->read() & 0x7fff7fff) | (status << 31) | (status << 15); |
367 | 367 | } |
368 | 368 | |
369 | 369 | |
370 | 370 | READ32_MEMBER(midvunit_state::offroadc_serial_data_r) |
371 | 371 | { |
372 | return midway_serial_pic2_r( | |
372 | return midway_serial_pic2_r(space) << 16; | |
373 | 373 | } |
374 | 374 | |
375 | 375 | |
376 | 376 | WRITE32_MEMBER(midvunit_state::offroadc_serial_data_w) |
377 | 377 | { |
378 | midway_serial_pic2_w( | |
378 | midway_serial_pic2_w(space, data >> 16); | |
379 | 379 | } |
380 | 380 | |
381 | 381 |
r17963 | r17964 | |
---|---|---|
499 | 499 | msm5205_reset_w(device, 0); |
500 | 500 | } |
501 | 501 | |
502 | // logerror("CPU #1 b00%i-data=%2x pc=%4x\n",offset,data,space | |
502 | // logerror("CPU #1 b00%i-data=%2x pc=%4x\n",offset,data,space.device().safe_pc() ); | |
503 | 503 | } |
504 | 504 | |
505 | 505 | |
r17963 | r17964 | |
522 | 522 | msm5205_reset_w(device, 0); |
523 | 523 | } |
524 | 524 | |
525 | // logerror("CPU #1 c00%i-data=%2x pc=%4x\n",offset,data,space | |
525 | // logerror("CPU #1 c00%i-data=%2x pc=%4x\n",offset,data,space.device().safe_pc() ); | |
526 | 526 | } |
527 | 527 | |
528 | 528 |
r17963 | r17964 | |
---|---|---|
244 | 244 | DRIVER_INIT_MEMBER(pangofun_state,pangofun) |
245 | 245 | { |
246 | 246 | pc_vga_init(machine(), vga_setting, NULL); |
247 | pc_vga_io_init(machine(), machine().device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, machine().device("maincpu")->memory().space(AS_IO), 0x0000); | |
247 | pc_vga_io_init(machine(), *machine().device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, *machine().device("maincpu")->memory().space(AS_IO), 0x0000); | |
248 | 248 | } |
249 | 249 | |
250 | 250 | GAME( 1995, pangofun, 0, pangofun, pangofun, pangofun_state, pangofun, ROT0, "InfoCube", "Pango Fun (Italy)", GAME_NOT_WORKING|GAME_NO_SOUND ) |
r17963 | r17964 | |
---|---|---|
361 | 361 | |
362 | 362 | MACHINE_RESET_MEMBER(suna16_state,uballoon) |
363 | 363 | { |
364 | address_space *space = machine().device("maincpu")->memory().space(AS_PROGRAM); | |
365 | uballoon_pcm_1_bankswitch_w(*space, 0, 0); | |
364 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
365 | uballoon_pcm_1_bankswitch_w(space, 0, 0); | |
366 | 366 | } |
367 | 367 | |
368 | 368 |
r17963 | r17964 | |
---|---|---|
130 | 130 | |
131 | 131 | static UINT32 video_address; |
132 | 132 | |
133 | static UINT32 videochip_r(address_space | |
133 | static UINT32 videochip_r(address_space &space, offs_t address) | |
134 | 134 | { |
135 | 135 | UINT32 r = 0; |
136 | 136 | |
r17963 | r17964 | |
142 | 142 | return r; |
143 | 143 | } |
144 | 144 | |
145 | static void videochip_w(address_space | |
145 | static void videochip_w(address_space &space, offs_t address, UINT32 data) | |
146 | 146 | { |
147 | 147 | if (address >= 0x20000000 && address < 0x20008000) |
148 | 148 | { |
149 | 149 | //UINT32 r = (data >> 16) & 0xff; |
150 | 150 | //UINT32 g = (data >> 8) & 0xff; |
151 | 151 | //UINT32 b = (data >> 0) & 0xff; |
152 | //palette_set_color_rgb(space | |
152 | //palette_set_color_rgb(space.machine, address & 0x7fff, r, g, b); | |
153 | 153 | } |
154 | 154 | else if (address >= 0x1003d000 && address < 0x1003f000) |
155 | 155 | { |
r17963 | r17964 | |
177 | 177 | { |
178 | 178 | if (ACCESSING_BITS_32_63) |
179 | 179 | { |
180 | r |= (UINT64)(videochip_r( | |
180 | r |= (UINT64)(videochip_r(space, video_address)) << 32; | |
181 | 181 | } |
182 | 182 | } |
183 | 183 | |
r17963 | r17964 | |
191 | 191 | if (ACCESSING_BITS_32_63) |
192 | 192 | { |
193 | 193 | //printf("Address %08X = %08X\n", video_address, (UINT32)(data >> 32)); |
194 | videochip_w( | |
194 | videochip_w(space, video_address, (UINT32)(data >> 32)); | |
195 | 195 | } |
196 | 196 | } |
197 | 197 | if (offset == 1) |
r17963 | r17964 | |
---|---|---|
707 | 707 | |
708 | 708 | static READ32_HANDLER(gcu0_r) |
709 | 709 | { |
710 | return GCU_r(space | |
710 | return GCU_r(space.machine(), 0, offset, mem_mask); | |
711 | 711 | } |
712 | 712 | |
713 | 713 | static WRITE32_HANDLER(gcu0_w) |
714 | 714 | { |
715 | GCU_w(space | |
715 | GCU_w(space.machine(), 0, offset, data, mem_mask); | |
716 | 716 | } |
717 | 717 | |
718 | 718 | static READ32_HANDLER(gcu1_r) |
719 | 719 | { |
720 | return GCU_r(space | |
720 | return GCU_r(space.machine(), 1, offset, mem_mask); | |
721 | 721 | } |
722 | 722 | |
723 | 723 | static WRITE32_HANDLER(gcu1_w) |
724 | 724 | { |
725 | GCU_w(space | |
725 | GCU_w(space.machine(), 1, offset, data, mem_mask); | |
726 | 726 | } |
727 | 727 | |
728 | 728 | /*****************************************************************************/ |
r17963 | r17964 | |
733 | 733 | |
734 | 734 | if (ACCESSING_BITS_24_31) |
735 | 735 | { |
736 | r |= (space | |
736 | r |= (space.machine().root_device().ioport("IN0")->read() & 0xff) << 24; | |
737 | 737 | } |
738 | 738 | if (ACCESSING_BITS_8_15) |
739 | 739 | { |
740 | r |= (space | |
740 | r |= (space.machine().root_device().ioport("IN1")->read() & 0xff) << 8; | |
741 | 741 | } |
742 | 742 | if (ACCESSING_BITS_0_7) |
743 | 743 | { |
744 | r |= (space | |
744 | r |= (space.machine().root_device().ioport("IN2")->read() & 0xff); | |
745 | 745 | } |
746 | 746 | |
747 | 747 | return r; |
r17963 | r17964 | |
751 | 751 | { |
752 | 752 | if (offset == 0) |
753 | 753 | { |
754 | return space | |
754 | return space.machine().root_device().ioport("SENSOR1")->read() | 0x01000100; | |
755 | 755 | } |
756 | 756 | else |
757 | 757 | { |
758 | return space | |
758 | return space.machine().root_device().ioport("SENSOR2")->read() | 0x01000100; | |
759 | 759 | } |
760 | 760 | } |
761 | 761 | |
762 | 762 | static READ32_HANDLER(flashram_r) |
763 | 763 | { |
764 | firebeat_state *state = space | |
764 | firebeat_state *state = space.machine().driver_data<firebeat_state>(); | |
765 | 765 | UINT32 r = 0; |
766 | 766 | if (ACCESSING_BITS_24_31) |
767 | 767 | { |
r17963 | r17964 | |
784 | 784 | |
785 | 785 | static WRITE32_HANDLER(flashram_w) |
786 | 786 | { |
787 | firebeat_state *state = space | |
787 | firebeat_state *state = space.machine().driver_data<firebeat_state>(); | |
788 | 788 | if (ACCESSING_BITS_24_31) |
789 | 789 | { |
790 | 790 | state->m_flash[0]->write((offset*4)+0, (data >> 24) & 0xff); |
r17963 | r17964 | |
805 | 805 | |
806 | 806 | static READ32_HANDLER(soundflash_r) |
807 | 807 | { |
808 | firebeat_state *state = space | |
808 | firebeat_state *state = space.machine().driver_data<firebeat_state>(); | |
809 | 809 | UINT32 r = 0; |
810 | 810 | fujitsu_29f016a_device *chip; |
811 | 811 | if (offset >= 0 && offset < 0x200000/4) |
r17963 | r17964 | |
840 | 840 | |
841 | 841 | static WRITE32_HANDLER(soundflash_w) |
842 | 842 | { |
843 | firebeat_state *state = space | |
843 | firebeat_state *state = space.machine().driver_data<firebeat_state>(); | |
844 | 844 | fujitsu_29f016a_device *chip; |
845 | 845 | if (offset >= 0 && offset < 0x200000/4) |
846 | 846 | { |
r17963 | r17964 | |
1220 | 1220 | // printf("atapi_command_r: %08X, %08X\n", offset, mem_mask); |
1221 | 1221 | if (ACCESSING_BITS_16_31) |
1222 | 1222 | { |
1223 | r = atapi_command_reg_r(space | |
1223 | r = atapi_command_reg_r(space.machine(), offset*2); | |
1224 | 1224 | return ATAPI_ENDIAN(r) << 16; |
1225 | 1225 | } |
1226 | 1226 | else |
1227 | 1227 | { |
1228 | r = atapi_command_reg_r(space | |
1228 | r = atapi_command_reg_r(space.machine(), (offset*2) + 1); | |
1229 | 1229 | return ATAPI_ENDIAN(r) << 0; |
1230 | 1230 | } |
1231 | 1231 | } |
r17963 | r17964 | |
1236 | 1236 | |
1237 | 1237 | if (ACCESSING_BITS_16_31) |
1238 | 1238 | { |
1239 | atapi_command_reg_w(space | |
1239 | atapi_command_reg_w(space.machine(), offset*2, ATAPI_ENDIAN((data >> 16) & 0xffff)); | |
1240 | 1240 | } |
1241 | 1241 | else |
1242 | 1242 | { |
1243 | atapi_command_reg_w(space | |
1243 | atapi_command_reg_w(space.machine(), (offset*2) + 1, ATAPI_ENDIAN((data >> 0) & 0xffff)); | |
1244 | 1244 | } |
1245 | 1245 | } |
1246 | 1246 | |
r17963 | r17964 | |
1252 | 1252 | |
1253 | 1253 | if (ACCESSING_BITS_16_31) |
1254 | 1254 | { |
1255 | r = atapi_control_reg_r(space | |
1255 | r = atapi_control_reg_r(space.machine(), offset*2); | |
1256 | 1256 | return ATAPI_ENDIAN(r) << 16; |
1257 | 1257 | } |
1258 | 1258 | else |
1259 | 1259 | { |
1260 | r = atapi_control_reg_r(space | |
1260 | r = atapi_control_reg_r(space.machine(), (offset*2) + 1); | |
1261 | 1261 | return ATAPI_ENDIAN(r) << 0; |
1262 | 1262 | } |
1263 | 1263 | } |
r17963 | r17964 | |
1266 | 1266 | { |
1267 | 1267 | if (ACCESSING_BITS_16_31) |
1268 | 1268 | { |
1269 | atapi_control_reg_w(space | |
1269 | atapi_control_reg_w(space.machine(), offset*2, ATAPI_ENDIAN(data >> 16) & 0xff); | |
1270 | 1270 | } |
1271 | 1271 | else |
1272 | 1272 | { |
1273 | atapi_control_reg_w(space | |
1273 | atapi_control_reg_w(space.machine(), (offset*2) + 1, ATAPI_ENDIAN(data >> 0) & 0xff); | |
1274 | 1274 | } |
1275 | 1275 | } |
1276 | 1276 | |
r17963 | r17964 | |
1335 | 1335 | |
1336 | 1336 | static READ32_HANDLER( cabinet_r ) |
1337 | 1337 | { |
1338 | firebeat_state *state = space | |
1338 | firebeat_state *state = space.machine().driver_data<firebeat_state>(); | |
1339 | 1339 | UINT32 r = 0; |
1340 | 1340 | |
1341 | 1341 | // printf("cabinet_r: %08X, %08X\n", offset, mem_mask); |
r17963 | r17964 | |
1361 | 1361 | { |
1362 | 1362 | if (offset == 0) // Keyboard Wheel (P1) |
1363 | 1363 | { |
1364 | return space | |
1364 | return space.machine().root_device().ioport("WHEEL_P1")->read() << 24; | |
1365 | 1365 | } |
1366 | 1366 | else if (offset == 2) // Keyboard Wheel (P2) |
1367 | 1367 | { |
1368 | return space | |
1368 | return space.machine().root_device().ioport("WHEEL_P2")->read() << 24; | |
1369 | 1369 | } |
1370 | 1370 | |
1371 | 1371 | return 0; |
r17963 | r17964 | |
1500 | 1500 | |
1501 | 1501 | static READ32_HANDLER( extend_board_irq_r) |
1502 | 1502 | { |
1503 | firebeat_state *state = space | |
1503 | firebeat_state *state = space.machine().driver_data<firebeat_state>(); | |
1504 | 1504 | UINT32 r = 0; |
1505 | 1505 | |
1506 | 1506 | if (ACCESSING_BITS_24_31) |
r17963 | r17964 | |
1513 | 1513 | |
1514 | 1514 | static WRITE32_HANDLER( extend_board_irq_w ) |
1515 | 1515 | { |
1516 | firebeat_state *state = space | |
1516 | firebeat_state *state = space.machine().driver_data<firebeat_state>(); | |
1517 | 1517 | // printf("extend_board_irq_w: %08X, %08X, %08X\n", data, offset, mem_mask); |
1518 | 1518 | |
1519 | 1519 | if (ACCESSING_BITS_24_31) |
r17963 | r17964 | |
1667 | 1667 | |
1668 | 1668 | static READ32_HANDLER(ppc_spu_share_r) |
1669 | 1669 | { |
1670 | firebeat_state *state = space | |
1670 | firebeat_state *state = space.machine().driver_data<firebeat_state>(); | |
1671 | 1671 | UINT32 r = 0; |
1672 | 1672 | |
1673 | 1673 | if (ACCESSING_BITS_24_31) |
r17963 | r17964 | |
1692 | 1692 | |
1693 | 1693 | static WRITE32_HANDLER(ppc_spu_share_w) |
1694 | 1694 | { |
1695 | firebeat_state *state = space | |
1695 | firebeat_state *state = space.machine().driver_data<firebeat_state>(); | |
1696 | 1696 | if (ACCESSING_BITS_24_31) |
1697 | 1697 | { |
1698 | 1698 | state->m_spu_shared_ram[(offset * 4) + 0] = (data >> 24) & 0xff; |
r17963 | r17964 | |
1714 | 1714 | #ifdef UNUSED_FUNCTION |
1715 | 1715 | static READ16_HANDLER(m68k_spu_share_r) |
1716 | 1716 | { |
1717 | firebeat_state *state = space | |
1717 | firebeat_state *state = space.machine().driver_data<firebeat_state>(); | |
1718 | 1718 | return state->m_spu_shared_ram[offset] << 8; |
1719 | 1719 | } |
1720 | 1720 | |
1721 | 1721 | static WRITE16_HANDLER(m68k_spu_share_w) |
1722 | 1722 | { |
1723 | firebeat_state *state = space | |
1723 | firebeat_state *state = space.machine().driver_data<firebeat_state>(); | |
1724 | 1724 | state->m_spu_shared_ram[offset] = (data >> 8) & 0xff; |
1725 | 1725 | } |
1726 | 1726 | #endif |
r17963 | r17964 | |
---|---|---|
99 | 99 | |
100 | 100 | m_adpcm_reset = BIT(data, 4); |
101 | 101 | msm5205_reset_w(m_msm, !BIT(data, 4)); |
102 | ojankoc_flipscreen( | |
102 | ojankoc_flipscreen(space, data); | |
103 | 103 | } |
104 | 104 | |
105 | 105 | WRITE8_MEMBER(ojankohs_state::ojankohs_portselect_w) |
r17963 | r17964 | |
---|---|---|
43 | 43 | |
44 | 44 | static READ8_HANDLER( trvquest_question_r ) |
45 | 45 | { |
46 | gameplan_state *state = space | |
46 | gameplan_state *state = space.machine().driver_data<gameplan_state>(); | |
47 | 47 | |
48 | 48 | return state->memregion("questions")->base()[*state->m_trvquest_question * 0x2000 + offset]; |
49 | 49 | } |
r17963 | r17964 | |
---|---|---|
738 | 738 | memset(m_dsp56k_bank04_ram, 0, sizeof(m_dsp56k_bank04_ram)); |
739 | 739 | |
740 | 740 | /* The dsp56k occasionally executes out of mapped memory */ |
741 | address_space *space = machine().device<dsp56k_device>("dsp")->space(AS_PROGRAM); | |
742 | m_dsp56k_update_handler = space->set_direct_update_handler(direct_update_delegate(FUNC(polygonet_state::plygonet_dsp56k_direct_handler), this)); | |
741 | address_space &space = *machine().device<dsp56k_device>("dsp")->space(AS_PROGRAM); | |
742 | m_dsp56k_update_handler = space.set_direct_update_handler(direct_update_delegate(FUNC(polygonet_state::plygonet_dsp56k_direct_handler), this)); | |
743 | 743 | |
744 | 744 | /* save states */ |
745 | 745 | save_item(NAME(m_dsp56k_bank00_ram)); |
r17963 | r17964 | |
---|---|---|
502 | 502 | DRIVER_INIT_MEMBER(progolf_state,progolf) |
503 | 503 | { |
504 | 504 | int A; |
505 | address_space | |
505 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
506 | 506 | UINT8 *rom = machine().root_device().memregion("maincpu")->base(); |
507 | 507 | UINT8* decrypted = auto_alloc_array(machine(), UINT8, 0x10000); |
508 | 508 | |
509 | space | |
509 | space.set_decrypted_region(0x0000,0xffff, decrypted); | |
510 | 510 | |
511 | 511 | /* Swap bits 5 & 6 for opcodes */ |
512 | 512 | for (A = 0xb000 ; A < 0x10000 ; A++) |
r17963 | r17964 | |
516 | 516 | DRIVER_INIT_MEMBER(progolf_state,progolfa) |
517 | 517 | { |
518 | 518 | int A; |
519 | address_space | |
519 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
520 | 520 | UINT8 *rom = machine().root_device().memregion("maincpu")->base(); |
521 | 521 | UINT8* decrypted = auto_alloc_array(machine(), UINT8, 0x10000); |
522 | 522 | |
523 | space | |
523 | space.set_decrypted_region(0x0000,0xffff, decrypted); | |
524 | 524 | |
525 | 525 | /* data is likely to not be encrypted, just the opcodes are. */ |
526 | 526 | for (A = 0x0000 ; A < 0x10000 ; A++) |
r17963 | r17964 | |
---|---|---|
47 | 47 | |
48 | 48 | static WRITE16_HANDLER( magicstk_bgvideoram_w ) |
49 | 49 | { |
50 | playmark_state *state = space | |
50 | playmark_state *state = space.machine().driver_data<playmark_state>(); | |
51 | 51 | |
52 | 52 | COMBINE_DATA(&state->m_videoram1[offset]); |
53 | 53 | state->m_bg_tilemap->mark_tile_dirty(offset); |
r17963 | r17964 | |
55 | 55 | |
56 | 56 | static WRITE16_HANDLER( tile_banking_w ) |
57 | 57 | { |
58 | playmark_state *state = space | |
58 | playmark_state *state = space.machine().driver_data<playmark_state>(); | |
59 | 59 | |
60 | 60 | if (((data >> 12) & 0x0f) != state->m_tilebank) |
61 | 61 | { |
r17963 | r17964 | |
---|---|---|
184 | 184 | * |
185 | 185 | *************************************/ |
186 | 186 | |
187 | static offs_t decrypt_offset(address_space | |
187 | static offs_t decrypt_offset(address_space &space, offs_t offset) | |
188 | 188 | { |
189 | segag80v_state *state = space | |
189 | segag80v_state *state = space.machine().driver_data<segag80v_state>(); | |
190 | 190 | |
191 | 191 | /* ignore anything but accesses via opcode $32 (LD $(XXYY),A) */ |
192 | offs_t pc = space->device().safe_pcbase(); | |
193 | if ((UINT16)pc == 0xffff || space->read_byte(pc) != 0x32) | |
192 | offs_t pc = space.device().safe_pcbase(); | |
193 | if ((UINT16)pc == 0xffff || space.read_byte(pc) != 0x32) | |
194 | 194 | return offset; |
195 | 195 | |
196 | 196 | /* fetch the low byte of the address and munge it */ |
197 | return (offset & 0xff00) | (*state->m_decrypt)(pc, space | |
197 | return (offset & 0xff00) | (*state->m_decrypt)(pc, space.read_byte(pc + 1)); | |
198 | 198 | } |
199 | 199 | |
200 | 200 | WRITE8_MEMBER(segag80v_state::mainram_w) |
201 | 201 | { |
202 | m_mainram[decrypt_offset( | |
202 | m_mainram[decrypt_offset(space, offset)] = data; | |
203 | 203 | } |
204 | 204 | |
205 | WRITE8_MEMBER(segag80v_state::usb_ram_w){ sega_usb_ram_w(m_usb, space, decrypt_offset(machine().device("maincpu")->memory().space(AS_PROGRAM), offset), data); } | |
205 | WRITE8_MEMBER(segag80v_state::usb_ram_w){ sega_usb_ram_w(m_usb, space, decrypt_offset(*machine().device("maincpu")->memory().space(AS_PROGRAM), offset), data); } | |
206 | 206 | WRITE8_MEMBER(segag80v_state::vectorram_w) |
207 | 207 | { |
208 | m_vectorram[decrypt_offset( | |
208 | m_vectorram[decrypt_offset(space, offset)] = data; | |
209 | 209 | } |
210 | 210 | |
211 | 211 |
r17963 | r17964 | |
---|---|---|
455 | 455 | static void profbank_banksw_restore(running_machine &machine) |
456 | 456 | { |
457 | 457 | astrocde_state *state = machine.driver_data<astrocde_state>(); |
458 | address_space | |
458 | address_space &space = *machine.device("maincpu")->memory().space(AS_IO); | |
459 | 459 | |
460 | state->profpac_banksw_w( | |
460 | state->profpac_banksw_w(space, 0, state->m_profpac_bank); | |
461 | 461 | } |
462 | 462 | |
463 | 463 |
r17963 | r17964 | |
---|---|---|
311 | 311 | READ8_MEMBER(panicr_state::t5182shared_r) |
312 | 312 | { |
313 | 313 | if ((offset & 1) == 0) |
314 | return t5182_sharedram_r( | |
314 | return t5182_sharedram_r(space, offset/2); | |
315 | 315 | else |
316 | 316 | return 0; |
317 | 317 | } |
r17963 | r17964 | |
319 | 319 | WRITE8_MEMBER(panicr_state::t5182shared_w) |
320 | 320 | { |
321 | 321 | if ((offset & 1) == 0) |
322 | t5182_sharedram_w( | |
322 | t5182_sharedram_w(space, offset/2, data); | |
323 | 323 | } |
324 | 324 | |
325 | 325 |
r17963 | r17964 | |
---|---|---|
889 | 889 | static void bosco_latch_reset(running_machine &machine) |
890 | 890 | { |
891 | 891 | galaga_state *state = machine.driver_data<galaga_state>(); |
892 | address_space | |
892 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
893 | 893 | int i; |
894 | 894 | |
895 | 895 | /* Reset all latches */ |
896 | 896 | for (i = 0;i < 8;i++) |
897 | state->bosco_latch_w( | |
897 | state->bosco_latch_w(space,i,0); | |
898 | 898 | } |
899 | 899 | |
900 | 900 | MACHINE_RESET_MEMBER(galaga_state,galaga) |
r17963 | r17964 | |
---|---|---|
730 | 730 | static void daireika_palette_dma(running_machine &machine, UINT16 val) |
731 | 731 | { |
732 | 732 | //jalmah_state *state = machine.driver_data<jalmah_state>(); |
733 | address_space | |
733 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
734 | 734 | UINT32 index_1, index_2, src_addr, tmp_addr; |
735 | 735 | /*a0=301c0+jm_shared_ram[0x540/2] & 0xf00 */ |
736 | 736 | /*a1=88000*/ |
r17963 | r17964 | |
739 | 739 | for(index_1 = 0; index_1 < 0x200; index_1 += 0x20) |
740 | 740 | { |
741 | 741 | tmp_addr = src_addr; |
742 | src_addr = space | |
742 | src_addr = space.read_dword(src_addr); | |
743 | 743 | |
744 | 744 | for(index_2 = 0; index_2 < 0x20; index_2 += 2) |
745 | space | |
745 | space.write_word(0x88000 + index_2 + index_1, space.read_word(src_addr + index_2)); | |
746 | 746 | |
747 | 747 | src_addr = tmp_addr + 4; |
748 | 748 | } |
r17963 | r17964 | |
---|---|---|
45 | 45 | |
46 | 46 | void srumbler_state::machine_start() |
47 | 47 | { |
48 | address_space | |
48 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
49 | 49 | /* initialize banked ROM pointers */ |
50 | srumbler_bankswitch_w( | |
50 | srumbler_bankswitch_w(space,0,0); | |
51 | 51 | } |
52 | 52 | |
53 | 53 | static TIMER_DEVICE_CALLBACK( srumbler_interrupt ) |
r17963 | r17964 | |
---|---|---|
4535 | 4535 | ******************************************************/ |
4536 | 4536 | { |
4537 | 4537 | UINT8 *ROM = machine().root_device().memregion("maincpu")->base(); |
4538 | address_space | |
4538 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
4539 | 4539 | |
4540 | 4540 | int x; |
4541 | 4541 | |
r17963 | r17964 | |
4553 | 4553 | ROM[x+0x10000] = code; |
4554 | 4554 | } |
4555 | 4555 | |
4556 | space | |
4556 | space.set_decrypted_region(0x8000, 0xffff, machine().root_device().memregion("maincpu")->base() + 0x18000); | |
4557 | 4557 | } |
4558 | 4558 | |
4559 | 4559 | DRIVER_INIT_MEMBER(funworld_state,royalcdc) |
r17963 | r17964 | |
4568 | 4568 | ******************************************************/ |
4569 | 4569 | |
4570 | 4570 | UINT8 *ROM = machine().root_device().memregion("maincpu")->base(); |
4571 | address_space | |
4571 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
4572 | 4572 | |
4573 | 4573 | int x; |
4574 | 4574 | |
r17963 | r17964 | |
4606 | 4606 | ROM[x+0x10000] = code; |
4607 | 4607 | } |
4608 | 4608 | |
4609 | space | |
4609 | space.set_decrypted_region(0x6000, 0xffff, machine().root_device().memregion("maincpu")->base() + 0x16000); | |
4610 | 4610 | } |
4611 | 4611 | |
4612 | 4612 |
r17963 | r17964 | |
---|---|---|
191 | 191 | switch (offset) |
192 | 192 | { |
193 | 193 | case 0x01: /* start button , coins */ |
194 | return space | |
194 | return space.machine().root_device().ioport("IN0")->read(); | |
195 | 195 | case 0x02: /* Player 1 Controller */ |
196 | return space | |
196 | return space.machine().root_device().ioport("IN1")->read(); | |
197 | 197 | case 0x04: /* Player 2 Controller */ |
198 | return space | |
198 | return space.machine().root_device().ioport("IN3")->read(); | |
199 | 199 | // default: |
200 | // logerror("8741-2 unknown read %d PC=%04x\n",offset,space | |
200 | // logerror("8741-2 unknown read %d PC=%04x\n",offset,space.device().safe_pc()); | |
201 | 201 | } |
202 | 202 | /* unknown */ |
203 | 203 | return 0; |
r17963 | r17964 | |
208 | 208 | switch (offset) |
209 | 209 | { |
210 | 210 | case 0x01: /* start button */ |
211 | return space | |
211 | return space.machine().root_device().ioport("IN2")->read(); | |
212 | 212 | case 0x02: /* Player 1 Controller? */ |
213 | return space | |
213 | return space.machine().root_device().ioport("IN1")->read(); | |
214 | 214 | case 0x04: /* Player 2 Controller? */ |
215 | return space | |
215 | return space.machine().root_device().ioport("IN3")->read(); | |
216 | 216 | } |
217 | 217 | /* unknown */ |
218 | // logerror("8741-3 unknown read %d PC=%04x\n",offset,space | |
218 | // logerror("8741-3 unknown read %d PC=%04x\n",offset,space.device().safe_pc()); | |
219 | 219 | return 0; |
220 | 220 | } |
221 | 221 |
r17963 | r17964 | |
---|---|---|
101 | 101 | * |
102 | 102 | *************************************/ |
103 | 103 | |
104 | static UINT8 memory_read_byte(address_space *space, offs_t address) { return space->read_byte(address); } | |
105 | static void memory_write_byte(address_space *space, offs_t address, UINT8 data) { space->write_byte(address, data); } | |
104 | static UINT8 memory_read_byte(address_space &space, offs_t address) { return space.read_byte(address); } | |
105 | static void memory_write_byte(address_space &space, offs_t address, UINT8 data) { space.write_byte(address, data); } | |
106 | 106 | |
107 | 107 | static Z80DMA_INTERFACE( mario_dma ) |
108 | 108 | { |
r17963 | r17964 | |
---|---|---|
709 | 709 | kbdc8042_init(machine(), &at8042); |
710 | 710 | #if ENABLE_VGA |
711 | 711 | pc_vga_init(machine(), vga_setting, NULL); |
712 | pc_vga_io_init(machine(), machine().device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, machine().device("maincpu")->memory().space(AS_IO), 0x0000); | |
712 | pc_vga_io_init(machine(), *machine().device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, *machine().device("maincpu")->memory().space(AS_IO), 0x0000); | |
713 | 713 | #endif |
714 | 714 | } |
715 | 715 |
r17963 | r17964 | |
---|---|---|
332 | 332 | { |
333 | 333 | int source = ( data & 7 ); |
334 | 334 | ppu2c0x_device *ppu = machine().device<ppu2c0x_device>("ppu"); |
335 | ppu->spriteram_dma( | |
335 | ppu->spriteram_dma(space, source); | |
336 | 336 | } |
337 | 337 | |
338 | 338 | /* Only used in single monitor bios */ |
r17963 | r17964 | |
---|---|---|
717 | 717 | |
718 | 718 | MACHINE_RESET_MEMBER(mappy_state,superpac) |
719 | 719 | { |
720 | address_space | |
720 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
721 | 721 | int i; |
722 | 722 | |
723 | 723 | /* Reset all latches */ |
724 | 724 | for (i = 0; i < 0x10; i += 2) |
725 | superpac_latch_w( | |
725 | superpac_latch_w(space,i,0); | |
726 | 726 | } |
727 | 727 | |
728 | 728 | MACHINE_RESET_MEMBER(mappy_state,phozon) |
729 | 729 | { |
730 | address_space | |
730 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
731 | 731 | int i; |
732 | 732 | |
733 | 733 | /* Reset all latches */ |
734 | 734 | for (i = 0; i < 0x10; i += 2) |
735 | phozon_latch_w( | |
735 | phozon_latch_w(space, i, 0); | |
736 | 736 | } |
737 | 737 | |
738 | 738 | MACHINE_RESET_MEMBER(mappy_state,mappy) |
739 | 739 | { |
740 | address_space | |
740 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
741 | 741 | int i; |
742 | 742 | |
743 | 743 | /* Reset all latches */ |
744 | 744 | for (i = 0; i < 0x10; i += 2) |
745 | mappy_latch_w( | |
745 | mappy_latch_w(space, i, 0); | |
746 | 746 | } |
747 | 747 | |
748 | 748 | /* different games need different interrupt generators & timers because they use different Namco I/O devices */ |
r17963 | r17964 | |
---|---|---|
154 | 154 | TILE_GET_INFO_MEMBER(safarir_state::get_bg_tile_info) |
155 | 155 | { |
156 | 156 | int color; |
157 | address_space *space = machine().device("maincpu")->memory().space(AS_PROGRAM); | |
158 | UINT8 code = ram_r(*space,tile_index | 0x400); | |
157 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
158 | UINT8 code = ram_r(space,tile_index | 0x400); | |
159 | 159 | |
160 | 160 | if (code & 0x80) |
161 | 161 | color = 6; /* yellow */ |
r17963 | r17964 | |
176 | 176 | TILE_GET_INFO_MEMBER(safarir_state::get_fg_tile_info) |
177 | 177 | { |
178 | 178 | int color, flags; |
179 | address_space *space = machine().device("maincpu")->memory().space(AS_PROGRAM); | |
180 | UINT8 code = ram_r(*space,tile_index); | |
179 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
180 | UINT8 code = ram_r(space,tile_index); | |
181 | 181 | |
182 | 182 | if (code & 0x80) |
183 | 183 | color = 7; /* white */ |
r17963 | r17964 | |
---|---|---|
385 | 385 | // rom[0x2696/2] = 0x4e71; |
386 | 386 | // rom[0x26a0/2] = 0x4e71; |
387 | 387 | pc_vga_init(machine(), vga_setting, NULL); |
388 | pc_vga_io_init(machine(), machine().device("maincpu")->memory().space(AS_PROGRAM), 0x3a0000, machine().device("maincpu")->memory().space(AS_PROGRAM), 0x3c0000); | |
388 | pc_vga_io_init(machine(), *machine().device("maincpu")->memory().space(AS_PROGRAM), 0x3a0000, *machine().device("maincpu")->memory().space(AS_PROGRAM), 0x3c0000); | |
389 | 389 | |
390 | 390 | } |
391 | 391 |
r17963 | r17964 | |
---|---|---|
209 | 209 | return (m_flyback) | (ioc_regs[CONTROL] & 0x7c) | (1<<1) | 1; |
210 | 210 | } |
211 | 211 | |
212 | return archimedes_ioc_r( | |
212 | return archimedes_ioc_r(space,offset,mem_mask); | |
213 | 213 | } |
214 | 214 | |
215 | 215 | WRITE32_MEMBER(aristmk5_state::mk5_ioc_w) |
r17963 | r17964 | |
228 | 228 | return; |
229 | 229 | } |
230 | 230 | else |
231 | archimedes_ioc_w( | |
231 | archimedes_ioc_w(space,offset,data,mem_mask); | |
232 | 232 | } |
233 | 233 | } |
234 | 234 |
r17963 | r17964 | |
---|---|---|
352 | 352 | if (ACCESSING_BITS_0_15) |
353 | 353 | result |= cage_control_r(machine()); |
354 | 354 | if (ACCESSING_BITS_16_31) |
355 | result |= cage_main_r( | |
355 | result |= cage_main_r(space) << 16; | |
356 | 356 | return result; |
357 | 357 | } |
358 | 358 | |
r17963 | r17964 | |
361 | 361 | if (ACCESSING_BITS_0_15) |
362 | 362 | cage_control_w(machine(), data); |
363 | 363 | if (ACCESSING_BITS_16_31) |
364 | cage_main_w( | |
364 | cage_main_w(space, data >> 16); | |
365 | 365 | } |
366 | 366 | |
367 | 367 | static void cage_irq_callback(running_machine &machine, int reason) |
r17963 | r17964 | |
---|---|---|
246 | 246 | |
247 | 247 | void omegrace_state::machine_reset() |
248 | 248 | { |
249 | address_space | |
249 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
250 | 250 | /* Omega Race expects the vector processor to be ready. */ |
251 | 251 | avgdvg_reset_w(space, 0, 0); |
252 | 252 | } |
r17963 | r17964 | |
261 | 261 | |
262 | 262 | READ8_MEMBER(omegrace_state::omegrace_vg_go_r) |
263 | 263 | { |
264 | avgdvg_go_w( | |
264 | avgdvg_go_w(space,0,0); | |
265 | 265 | return 0; |
266 | 266 | } |
267 | 267 |
r17963 | r17964 | |
---|---|---|
57 | 57 | |
58 | 58 | static WRITE8_HANDLER( ram_w ) |
59 | 59 | { |
60 | decocass_state *state = space | |
60 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
61 | 61 | state->m_decrypted[0x0000 + offset] = swap_bits_5_6(data); |
62 | 62 | state->m_rambase[0x0000 + offset] = data; |
63 | 63 | } |
64 | 64 | |
65 | 65 | static WRITE8_HANDLER( charram_w ) |
66 | 66 | { |
67 | decocass_state *state = space | |
67 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
68 | 68 | state->m_decrypted[0x6000 + offset] = swap_bits_5_6(data); |
69 | 69 | decocass_charram_w(space, offset, data); |
70 | 70 | } |
71 | 71 | |
72 | 72 | static WRITE8_HANDLER( fgvideoram_w ) |
73 | 73 | { |
74 | decocass_state *state = space | |
74 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
75 | 75 | state->m_decrypted[0xc000 + offset] = swap_bits_5_6(data); |
76 | 76 | decocass_fgvideoram_w(space, offset, data); |
77 | 77 | } |
78 | 78 | |
79 | 79 | static WRITE8_HANDLER( fgcolorram_w ) |
80 | 80 | { |
81 | decocass_state *state = space | |
81 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
82 | 82 | state->m_decrypted[0xc400 + offset] = swap_bits_5_6(data); |
83 | 83 | decocass_colorram_w(space, offset, data); |
84 | 84 | } |
85 | 85 | |
86 | 86 | static WRITE8_HANDLER( tileram_w ) |
87 | 87 | { |
88 | decocass_state *state = space | |
88 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
89 | 89 | state->m_decrypted[0xd000 + offset] = swap_bits_5_6(data); |
90 | 90 | decocass_tileram_w(space, offset, data); |
91 | 91 | } |
92 | 92 | |
93 | 93 | static WRITE8_HANDLER( objectram_w ) |
94 | 94 | { |
95 | decocass_state *state = space | |
95 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
96 | 96 | state->m_decrypted[0xd800 + offset] = swap_bits_5_6(data); |
97 | 97 | decocass_objectram_w(space, offset, data); |
98 | 98 | } |
r17963 | r17964 | |
102 | 102 | |
103 | 103 | static READ8_HANDLER( mirrorvideoram_r ) |
104 | 104 | { |
105 | decocass_state *state = space | |
105 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
106 | 106 | offset = ((offset >> 5) & 0x1f) | ((offset & 0x1f) << 5); |
107 | 107 | return state->m_fgvideoram[offset]; |
108 | 108 | } |
109 | 109 | |
110 | 110 | static READ8_HANDLER( mirrorcolorram_r ) |
111 | 111 | { |
112 | decocass_state *state = space | |
112 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
113 | 113 | offset = ((offset >> 5) & 0x1f) | ((offset & 0x1f) << 5); |
114 | 114 | return state->m_colorram[offset]; |
115 | 115 | } |
r17963 | r17964 | |
1600 | 1600 | |
1601 | 1601 | DRIVER_INIT_MEMBER(decocass_state,decocass) |
1602 | 1602 | { |
1603 | address_space | |
1603 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
1604 | 1604 | UINT8 *rom = memregion("maincpu")->base(); |
1605 | 1605 | int A; |
1606 | 1606 | |
1607 | 1607 | /* allocate memory and mark all RAM regions with their decrypted pointers */ |
1608 | 1608 | m_decrypted = auto_alloc_array(machine(), UINT8, 0x10000); |
1609 | space->set_decrypted_region(0x0000, 0xc7ff, &m_decrypted[0x0000]); | |
1610 | space->set_decrypted_region(0xd000, 0xdbff, &m_decrypted[0xd000]); | |
1611 | space->set_decrypted_region(0xf000, 0xffff, &m_decrypted[0xf000]); | |
1609 | space.set_decrypted_region(0x0000, 0xc7ff, &m_decrypted[0x0000]); | |
1610 | space.set_decrypted_region(0xd000, 0xdbff, &m_decrypted[0xd000]); | |
1611 | space.set_decrypted_region(0xf000, 0xffff, &m_decrypted[0xf000]); | |
1612 | 1612 | |
1613 | 1613 | /* Swap bits 5 & 6 for opcodes */ |
1614 | 1614 | for (A = 0xf000; A < 0x10000; A++) |
r17963 | r17964 | |
1654 | 1654 | |
1655 | 1655 | static READ8_HANDLER( cdsteljn_input_r ) |
1656 | 1656 | { |
1657 | decocass_state *state = space | |
1657 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
1658 | 1658 | UINT8 res; |
1659 | 1659 | static const char *const portnames[2][4] = { |
1660 | 1660 | {"P1_MP0", "P1_MP1", "P1_MP2", "P1_MP3"}, |
r17963 | r17964 | |
1663 | 1663 | if(offset & 6) |
1664 | 1664 | return decocass_input_r(space,offset); |
1665 | 1665 | |
1666 | res = space | |
1666 | res = space.machine().root_device().ioport(portnames[offset & 1][state->m_mux_data])->read(); | |
1667 | 1667 | |
1668 | 1668 | return res; |
1669 | 1669 | } |
1670 | 1670 | |
1671 | 1671 | static WRITE8_HANDLER( cdsteljn_mux_w ) |
1672 | 1672 | { |
1673 | decocass_state *state = space | |
1673 | decocass_state *state = space.machine().driver_data<decocass_state>(); | |
1674 | 1674 | |
1675 | 1675 | state->m_mux_data = (data & 0xc) >> 2; |
1676 | 1676 | /* bit 0 and 1 are p1/p2 lamps */ |
r17963 | r17964 | |
---|---|---|
207 | 207 | |
208 | 208 | WRITE16_MEMBER(mystwarr_state::irq_ack_w) |
209 | 209 | { |
210 | K056832_b_word_w( | |
210 | K056832_b_word_w(space, offset, data, mem_mask); | |
211 | 211 | |
212 | 212 | if (offset == 3 && ACCESSING_BITS_0_7) |
213 | 213 | { |
r17963 | r17964 | |
227 | 227 | else |
228 | 228 | { |
229 | 229 | offset = (offset & 0x0007) | ((offset & 0x7f80) >> 4); |
230 | return K053247_word_r( | |
230 | return K053247_word_r(space,offset,mem_mask); | |
231 | 231 | } |
232 | 232 | } |
233 | 233 | |
r17963 | r17964 | |
242 | 242 | { |
243 | 243 | offset = (offset & 0x0007) | ((offset & 0x7f80) >> 4); |
244 | 244 | |
245 | K053247_word_w( | |
245 | K053247_word_w(space,offset,data,mem_mask); | |
246 | 246 | } |
247 | 247 | } |
248 | 248 | |
r17963 | r17964 | |
377 | 377 | else |
378 | 378 | { |
379 | 379 | offset = (offset & 0x0007) | ((offset & 0x1fe0) >> 2); |
380 | return K053247_word_r( | |
380 | return K053247_word_r(space,offset,mem_mask); | |
381 | 381 | } |
382 | 382 | } |
383 | 383 | |
r17963 | r17964 | |
391 | 391 | { |
392 | 392 | offset = (offset & 0x0007) | ((offset & 0x1fe0) >> 2); |
393 | 393 | |
394 | K053247_word_w( | |
394 | K053247_word_w(space,offset,data,mem_mask); | |
395 | 395 | } |
396 | 396 | } |
397 | 397 |
r17963 | r17964 | |
---|---|---|
48 | 48 | |
49 | 49 | WRITE16_MEMBER(klax_state::interrupt_ack_w) |
50 | 50 | { |
51 | atarigen_scanline_int_ack_w(&space, offset, data, mem_mask); | |
52 | atarigen_video_int_ack_w(&space, offset, data, mem_mask); | |
51 | atarigen_scanline_int_ack_w(space, offset, data, mem_mask); | |
52 | atarigen_video_int_ack_w(space, offset, data, mem_mask); | |
53 | 53 | } |
54 | 54 | |
55 | 55 |
r17963 | r17964 | |
---|---|---|
350 | 350 | state->m_PS7500timer1->adjust( attotime::never); |
351 | 351 | } |
352 | 352 | |
353 | typedef void (*ssfindo_speedup_func)(address_space | |
353 | typedef void (*ssfindo_speedup_func)(address_space &space); | |
354 | 354 | ssfindo_speedup_func ssfindo_speedup; |
355 | 355 | |
356 | static void ssfindo_speedups(address_space | |
356 | static void ssfindo_speedups(address_space& space) | |
357 | 357 | { |
358 | if (space->device().safe_pc()==0x2d6c8) // ssfindo | |
359 | space->device().execute().spin_until_time(attotime::from_usec(20)); | |
360 | else if (space->device().safe_pc()==0x2d6bc) // ssfindo | |
361 | space->device().execute().spin_until_time(attotime::from_usec(20)); | |
358 | if (space.device().safe_pc()==0x2d6c8) // ssfindo | |
359 | space.device().execute().spin_until_time(attotime::from_usec(20)); | |
360 | else if (space.device().safe_pc()==0x2d6bc) // ssfindo | |
361 | space.device().execute().spin_until_time(attotime::from_usec(20)); | |
362 | 362 | } |
363 | 363 | |
364 | static void ppcar_speedups(address_space | |
364 | static void ppcar_speedups(address_space& space) | |
365 | 365 | { |
366 | if (space->device().safe_pc()==0x000bc8) // ppcar | |
367 | space->device().execute().spin_until_time(attotime::from_usec(20)); | |
368 | else if (space->device().safe_pc()==0x000bbc) // ppcar | |
369 | space->device().execute().spin_until_time(attotime::from_usec(20)); | |
366 | if (space.device().safe_pc()==0x000bc8) // ppcar | |
367 | space.device().execute().spin_until_time(attotime::from_usec(20)); | |
368 | else if (space.device().safe_pc()==0x000bbc) // ppcar | |
369 | space.device().execute().spin_until_time(attotime::from_usec(20)); | |
370 | 370 | } |
371 | 371 | |
372 | 372 | |
r17963 | r17964 | |
394 | 394 | return (m_PS7500_IO[IRQSTA] & m_PS7500_IO[IRQMSKA]) | 0x80; |
395 | 395 | |
396 | 396 | case IOCR: //TODO: nINT1, OD[n] p.81 |
397 | if (ssfindo_speedup) ssfindo_speedup( | |
397 | if (ssfindo_speedup) ssfindo_speedup(space); | |
398 | 398 | |
399 | 399 | if( m_iocr_hack) |
400 | 400 | { |
r17963 | r17964 | |
---|---|---|
1031 | 1031 | |
1032 | 1032 | READ16_MEMBER ( segas24_state::sys16_io_r ) |
1033 | 1033 | { |
1034 | // logerror("IO read %02x (%s:%x)\n", offset, space | |
1034 | // logerror("IO read %02x (%s:%x)\n", offset, space.device().tag(), space.device().safe_pc()); | |
1035 | 1035 | if(offset < 8) |
1036 | 1036 | return (this->*io_r)(offset); |
1037 | 1037 | else if (offset < 0x20) { |
r17963 | r17964 | |
---|---|---|
179 | 179 | UINT32 adr; |
180 | 180 | } sprites[0x100]; |
181 | 181 | |
182 | static void generate_sprites(address_space | |
182 | static void generate_sprites(address_space &space, UINT32 src, UINT32 spr, int count) | |
183 | 183 | { |
184 | 184 | int i; |
185 | 185 | int scount; |
r17963 | r17964 | |
190 | 190 | for(i=0; i<count; i++) { |
191 | 191 | UINT32 adr = src + 0x100*i; |
192 | 192 | int pri; |
193 | if(!space | |
193 | if(!space.read_word(adr+2)) | |
194 | 194 | continue; |
195 | pri = space | |
195 | pri = space.read_word(adr+28); | |
196 | 196 | |
197 | 197 | if(pri < 256) { |
198 | 198 | sprites[ecount].pri = pri; |
r17963 | r17964 | |
205 | 205 | for(i=0; i<ecount; i++) { |
206 | 206 | UINT32 adr = sprites[i].adr; |
207 | 207 | if(adr) { |
208 | UINT32 set =(space->read_word(adr) << 16)|space->read_word(adr+2); | |
209 | UINT16 glob_x = space->read_word(adr+4); | |
210 | UINT16 glob_y = space->read_word(adr+8); | |
211 | UINT16 flip_x = space->read_word(adr+12) ? 0x1000 : 0x0000; | |
212 | UINT16 flip_y = space->read_word(adr+14) ? 0x2000 : 0x0000; | |
208 | UINT32 set =(space.read_word(adr) << 16)|space.read_word(adr+2); | |
209 | UINT16 glob_x = space.read_word(adr+4); | |
210 | UINT16 glob_y = space.read_word(adr+8); | |
211 | UINT16 flip_x = space.read_word(adr+12) ? 0x1000 : 0x0000; | |
212 | UINT16 flip_y = space.read_word(adr+14) ? 0x2000 : 0x0000; | |
213 | 213 | UINT16 glob_f = flip_x | (flip_y ^ 0x2000); |
214 | UINT16 zoom_x = space->read_word(adr+20); | |
215 | UINT16 zoom_y = space->read_word(adr+22); | |
214 | UINT16 zoom_x = space.read_word(adr+20); | |
215 | UINT16 zoom_y = space.read_word(adr+22); | |
216 | 216 | UINT16 color_val = 0x0000; |
217 | 217 | UINT16 color_mask = 0xffff; |
218 | 218 | UINT16 color_set = 0x0000; |
219 | 219 | UINT16 color_rotate = 0x0000; |
220 | 220 | UINT16 v; |
221 | 221 | |
222 | v = space | |
222 | v = space.read_word(adr+24); | |
223 | 223 | if(v & 0x8000) { |
224 | 224 | color_mask = 0xf3ff; |
225 | 225 | color_val |= (v & 3) << 10; |
226 | 226 | } |
227 | 227 | |
228 | v = space | |
228 | v = space.read_word(adr+26); | |
229 | 229 | if(v & 0x8000) { |
230 | 230 | color_mask &= 0xfcff; |
231 | 231 | color_val |= (v & 3) << 8; |
232 | 232 | } |
233 | 233 | |
234 | v = space | |
234 | v = space.read_word(adr+18); | |
235 | 235 | if(v & 0x8000) { |
236 | 236 | color_mask &= 0xff1f; |
237 | 237 | color_val |= v & 0xe0; |
238 | 238 | } |
239 | 239 | |
240 | v = space | |
240 | v = space.read_word(adr+16); | |
241 | 241 | if(v & 0x8000) |
242 | 242 | color_set = v & 0x1f; |
243 | 243 | if(v & 0x4000) |
r17963 | r17964 | |
250 | 250 | |
251 | 251 | if(set >= 0x200000 && set < 0xd00000) |
252 | 252 | { |
253 | UINT16 count2 = space | |
253 | UINT16 count2 = space.read_word(set); | |
254 | 254 | set += 2; |
255 | 255 | while(count2) { |
256 | UINT16 idx = space->read_word(set); | |
257 | UINT16 flip = space->read_word(set+2); | |
258 | UINT16 col = space->read_word(set+4); | |
259 | short y = space->read_word(set+6); | |
260 | short x = space->read_word(set+8); | |
256 | UINT16 idx = space.read_word(set); | |
257 | UINT16 flip = space.read_word(set+2); | |
258 | UINT16 col = space.read_word(set+4); | |
259 | short y = space.read_word(set+6); | |
260 | short x = space.read_word(set+8); | |
261 | 261 | |
262 | 262 | if(idx == 0xffff) { |
263 | 263 | set = (flip<<16) | col; |
r17963 | r17964 | |
292 | 292 | if(color_rotate) |
293 | 293 | col = (col & 0xffe0) | ((col + color_rotate) & 0x1f); |
294 | 294 | |
295 | space->write_word(spr , (flip ^ glob_f) | sprites[i].pri); | |
296 | space->write_word(spr+ 2, idx); | |
297 | space->write_word(spr+ 4, y); | |
298 | space->write_word(spr+ 6, x); | |
299 | space->write_word(spr+ 8, zoom_y); | |
300 | space->write_word(spr+10, zoom_x); | |
301 | space->write_word(spr+12, col); | |
295 | space.write_word(spr , (flip ^ glob_f) | sprites[i].pri); | |
296 | space.write_word(spr+ 2, idx); | |
297 | space.write_word(spr+ 4, y); | |
298 | space.write_word(spr+ 6, x); | |
299 | space.write_word(spr+ 8, zoom_y); | |
300 | space.write_word(spr+10, zoom_x); | |
301 | space.write_word(spr+12, col); | |
302 | 302 | spr += 16; |
303 | 303 | scount++; |
304 | 304 | if(scount == 256) |
r17963 | r17964 | |
311 | 311 | } |
312 | 312 | } |
313 | 313 | while(scount < 256) { |
314 | space | |
314 | space.write_word(spr, scount); | |
315 | 315 | scount++; |
316 | 316 | spr += 16; |
317 | 317 | } |
318 | 318 | } |
319 | 319 | |
320 | static void tkmmpzdm_esc(address_space | |
320 | static void tkmmpzdm_esc(address_space &space, UINT32 p1, UINT32 p2, UINT32 p3, UINT32 p4) | |
321 | 321 | { |
322 | konamigx_esc_alert(space | |
322 | konamigx_esc_alert(space.machine().driver_data<konamigx_state>()->m_workram, 0x0142, 0x100, 0); | |
323 | 323 | } |
324 | 324 | |
325 | static void dragoonj_esc(address_space | |
325 | static void dragoonj_esc(address_space &space, UINT32 p1, UINT32 p2, UINT32 p3, UINT32 p4) | |
326 | 326 | { |
327 | konamigx_esc_alert(space | |
327 | konamigx_esc_alert(space.machine().driver_data<konamigx_state>()->m_workram, 0x5c00, 0x100, 0); | |
328 | 328 | } |
329 | 329 | |
330 | static void sal2_esc(address_space | |
330 | static void sal2_esc(address_space &space, UINT32 p1, UINT32 p2, UINT32 p3, UINT32 p4) | |
331 | 331 | { |
332 | konamigx_esc_alert(space | |
332 | konamigx_esc_alert(space.machine().driver_data<konamigx_state>()->m_workram, 0x1c8c, 0x172, 1); | |
333 | 333 | } |
334 | 334 | |
335 | static void sexyparo_esc(address_space | |
335 | static void sexyparo_esc(address_space &space, UINT32 p1, UINT32 p2, UINT32 p3, UINT32 p4) | |
336 | 336 | { |
337 | 337 | // The d20000 should probably be p3 |
338 | 338 | generate_sprites(space, 0xc00604, 0xd20000, 0xfc); |
339 | 339 | } |
340 | 340 | |
341 | static void tbyahhoo_esc(address_space | |
341 | static void tbyahhoo_esc(address_space &space, UINT32 p1, UINT32 p2, UINT32 p3, UINT32 p4) | |
342 | 342 | { |
343 | 343 | generate_sprites(space, 0xc00000, 0xd20000, 0x100); |
344 | 344 | } |
345 | 345 | |
346 | static void daiskiss_esc(address_space | |
346 | static void daiskiss_esc(address_space &space, UINT32 p1, UINT32 p2, UINT32 p3, UINT32 p4) | |
347 | 347 | { |
348 | 348 | generate_sprites(space, 0xc00000, 0xd20000, 0x100); |
349 | 349 | } |
350 | 350 | |
351 | 351 | static UINT8 esc_program[4096]; |
352 | static void (*esc_cb)(address_space | |
352 | static void (*esc_cb)(address_space &space, UINT32 p1, UINT32 p2, UINT32 p3, UINT32 p4); | |
353 | 353 | |
354 | 354 | WRITE32_MEMBER(konamigx_state::esc_w) |
355 | 355 | { |
r17963 | r17964 | |
404 | 404 | UINT32 p2 = (space.read_word(params+4)<<16) | space.read_word(params+6); |
405 | 405 | UINT32 p3 = (space.read_word(params+8)<<16) | space.read_word(params+10); |
406 | 406 | UINT32 p4 = (space.read_word(params+12)<<16) | space.read_word(params+14); |
407 | esc_cb( | |
407 | esc_cb(space, p1, p2, p3, p4); | |
408 | 408 | } |
409 | 409 | break; |
410 | 410 | default: |
r17963 | r17964 | |
531 | 531 | waitskip.data = DATA; \ |
532 | 532 | waitskip.mask = MASK; \ |
533 | 533 | resume_trigger= 1000; \ |
534 | space | |
534 | space.install_legacy_read_handler \ | |
535 | 535 | ((BASE+START)&~3, (BASE+END)|3, FUNC(waitskip_r));} |
536 | 536 | |
537 | 537 | static int suspension_active, resume_trigger; |
r17963 | r17964 | |
909 | 909 | |
910 | 910 | READ32_MEMBER(konamigx_state::gx5bppspr_r) |
911 | 911 | { |
912 | return (K055673_rom_word_r( | |
912 | return (K055673_rom_word_r(space, offset*2+1, 0xffff) | K055673_rom_word_r(space, offset*2, 0xffff)<<16); | |
913 | 913 | } |
914 | 914 | |
915 | 915 | READ32_MEMBER(konamigx_state::gx6bppspr_r) |
916 | 916 | { |
917 | return (K055673_GX6bpp_rom_word_r( | |
917 | return (K055673_GX6bpp_rom_word_r(space, offset*2+1, 0xffff) | K055673_GX6bpp_rom_word_r(space, offset*2, 0xffff)<<16); | |
918 | 918 | } |
919 | 919 | |
920 | 920 | READ32_MEMBER(konamigx_state::type1_roz_r1) |
r17963 | r17964 | |
---|---|---|
707 | 707 | |
708 | 708 | void combatsc_state::machine_reset() |
709 | 709 | { |
710 | address_space | |
710 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
711 | 711 | int i; |
712 | 712 | |
713 | 713 | memset(m_io_ram, 0x00, 0x4000); |
r17963 | r17964 | |
726 | 726 | m_sign[i] = 0; |
727 | 727 | } |
728 | 728 | |
729 | combatsc_bankselect_w( | |
729 | combatsc_bankselect_w(space, 0, 0); | |
730 | 730 | } |
731 | 731 | |
732 | 732 | /* combat school (original) */ |
r17963 | r17964 | |
---|---|---|
200 | 200 | prot.addr = 0; |
201 | 201 | } |
202 | 202 | |
203 | static void log_protection( address_space | |
203 | static void log_protection( address_space &space, const char *warning ) | |
204 | 204 | { |
205 | quizpun2_state *state = space | |
205 | quizpun2_state *state = space.machine().driver_data<quizpun2_state>(); | |
206 | 206 | struct prot_t &prot = state->m_prot; |
207 | logerror("%04x: protection - %s (state %x, wait %x, param %02x, cmd %02x, addr %02x)\n", space | |
207 | logerror("%04x: protection - %s (state %x, wait %x, param %02x, cmd %02x, addr %02x)\n", space.device().safe_pc(), warning, | |
208 | 208 | prot.state, |
209 | 209 | prot.wait_param, |
210 | 210 | prot.param, |
r17963 | r17964 | |
242 | 242 | break; |
243 | 243 | |
244 | 244 | default: |
245 | log_protection( | |
245 | log_protection(space, "unknown address"); | |
246 | 246 | ret = 0x2e59 >> ((prot.addr & 1) ? 0 : 8); // return the address of: XOR A, RET |
247 | 247 | } |
248 | 248 | break; |
r17963 | r17964 | |
255 | 255 | } |
256 | 256 | |
257 | 257 | default: |
258 | log_protection( | |
258 | log_protection(space, "unknown read"); | |
259 | 259 | ret = 0x00; |
260 | 260 | } |
261 | 261 | |
262 | 262 | #if VERBOSE_PROTECTION_LOG |
263 | log_protection( | |
263 | log_protection(space, "info READ"); | |
264 | 264 | #endif |
265 | 265 | |
266 | 266 | prot.addr++; |
r17963 | r17964 | |
305 | 305 | prot.addr = 0; |
306 | 306 | } |
307 | 307 | else |
308 | log_protection( | |
308 | log_protection(space, "unknown command"); | |
309 | 309 | } |
310 | 310 | else if (prot.cmd >= 0x00 && prot.cmd <= 0x0f ) |
311 | 311 | { |
r17963 | r17964 | |
320 | 320 | else |
321 | 321 | { |
322 | 322 | prot.state = STATE_IDLE; |
323 | log_protection( | |
323 | log_protection(space, "unknown command"); | |
324 | 324 | } |
325 | 325 | } |
326 | 326 | else |
r17963 | r17964 | |
332 | 332 | } |
333 | 333 | |
334 | 334 | #if VERBOSE_PROTECTION_LOG |
335 | log_protection( | |
335 | log_protection(space, "info WRITE"); | |
336 | 336 | #endif |
337 | 337 | } |
338 | 338 |
r17963 | r17964 | |
---|---|---|
201 | 201 | /* handle reads from the paletteram */ |
202 | 202 | static READ16_HANDLER( palette_r ) |
203 | 203 | { |
204 | segac2_state *state = space | |
204 | segac2_state *state = space.machine().driver_data<segac2_state>(); | |
205 | 205 | offset &= 0x1ff; |
206 | 206 | if (state->m_segac2_alt_palette_mode) |
207 | 207 | offset = ((offset << 1) & 0x100) | ((offset << 2) & 0x80) | ((~offset >> 2) & 0x40) | ((offset >> 1) & 0x20) | (offset & 0x1f); |
r17963 | r17964 | |
212 | 212 | /* handle writes to the paletteram */ |
213 | 213 | static WRITE16_HANDLER( palette_w ) |
214 | 214 | { |
215 | segac2_state *state = space | |
215 | segac2_state *state = space.machine().driver_data<segac2_state>(); | |
216 | 216 | int r, g, b, newword; |
217 | 217 | int tmpr, tmpg, tmpb; |
218 | 218 | |
r17963 | r17964 | |
232 | 232 | b = ((newword >> 7) & 0x1e) | ((newword >> 14) & 0x01); |
233 | 233 | |
234 | 234 | /* set the color */ |
235 | palette_set_color_rgb(space | |
235 | palette_set_color_rgb(space.machine(), offset, pal5bit(r), pal5bit(g), pal5bit(b)); | |
236 | 236 | |
237 | 237 | // megadrive_vdp_palette_lookup[offset] = (b) | (g << 5) | (r << 10); |
238 | 238 | // megadrive_vdp_palette_lookup_sprite[offset] = (b) | (g << 5) | (r << 10); |
r17963 | r17964 | |
240 | 240 | tmpr = r >> 1; |
241 | 241 | tmpg = g >> 1; |
242 | 242 | tmpb = b >> 1; |
243 | palette_set_color_rgb(space | |
243 | palette_set_color_rgb(space.machine(), offset + 0x800, pal5bit(tmpr), pal5bit(tmpg), pal5bit(tmpb)); | |
244 | 244 | |
245 | 245 | // how is it calculated on c2? |
246 | 246 | tmpr = tmpr | 0x10; |
247 | 247 | tmpg = tmpg | 0x10; |
248 | 248 | tmpb = tmpb | 0x10; |
249 | palette_set_color_rgb(space | |
249 | palette_set_color_rgb(space.machine(), offset + 0x1000, pal5bit(tmpr), pal5bit(tmpg), pal5bit(tmpb)); | |
250 | 250 | } |
251 | 251 | |
252 | 252 | |
r17963 | r17964 | |
319 | 319 | |
320 | 320 | static READ16_HANDLER( io_chip_r ) |
321 | 321 | { |
322 | segac2_state *state = space | |
322 | segac2_state *state = space.machine().driver_data<segac2_state>(); | |
323 | 323 | static const char *const portnames[] = { "P1", "P2", "PORTC", "PORTD", "SERVICE", "COINAGE", "DSW", "PORTH" }; |
324 | 324 | offset &= 0x1f/2; |
325 | 325 | |
r17963 | r17964 | |
340 | 340 | |
341 | 341 | /* otherwise, return an input port */ |
342 | 342 | if (offset == 0x04/2 && state->m_sound_banks) |
343 | return (space->machine().root_device().ioport(portnames[offset])->read() & 0xbf) | (upd7759_busy_r(space->machine().device("upd")) << 6); | |
344 | return space->machine().root_device().ioport(portnames[offset])->read(); | |
343 | return (space.machine().root_device().ioport(portnames[offset])->read() & 0xbf) | (upd7759_busy_r(space.machine().device("upd")) << 6); | |
344 | return space.machine().root_device().ioport(portnames[offset])->read(); | |
345 | 345 | |
346 | 346 | /* 'SEGA' protection */ |
347 | 347 | case 0x10/2: |
r17963 | r17964 | |
369 | 369 | |
370 | 370 | static WRITE16_HANDLER( io_chip_w ) |
371 | 371 | { |
372 | segac2_state *state = space | |
372 | segac2_state *state = space.machine().driver_data<segac2_state>(); | |
373 | 373 | UINT8 newbank; |
374 | 374 | // UINT8 old; |
375 | 375 | |
r17963 | r17964 | |
401 | 401 | D1 : To CN1 pin J. (Coin meter 2) |
402 | 402 | D0 : To CN1 pin 8. (Coin meter 1) |
403 | 403 | */ |
404 | /* coin_lockout_w(space->machine(), 1, data & 0x08); | |
405 | coin_lockout_w(space->machine(), 0, data & 0x04); */ | |
406 | coin_counter_w(space->machine(), 1, data & 0x02); | |
407 | coin_counter_w(space->machine(), 0, data & 0x01); | |
404 | /* coin_lockout_w(space.machine(), 1, data & 0x08); | |
405 | coin_lockout_w(space.machine(), 0, data & 0x04); */ | |
406 | coin_counter_w(space.machine(), 1, data & 0x02); | |
407 | coin_counter_w(space.machine(), 0, data & 0x01); | |
408 | 408 | break; |
409 | 409 | |
410 | 410 | /* banking */ |
r17963 | r17964 | |
422 | 422 | newbank = data & 3; |
423 | 423 | if (newbank != state->m_palbank) |
424 | 424 | { |
425 | //space | |
425 | //space.machine().primary_screen->update_partial(space.machine().primary_screen->vpos() + 1); | |
426 | 426 | state->m_palbank = newbank; |
427 | recompute_palette_tables(space | |
427 | recompute_palette_tables(space.machine()); | |
428 | 428 | } |
429 | 429 | if (state->m_sound_banks > 1) |
430 | 430 | { |
431 | device_t *upd = space | |
431 | device_t *upd = space.machine().device("upd"); | |
432 | 432 | newbank = (data >> 2) & (state->m_sound_banks - 1); |
433 | 433 | upd7759_set_bank_base(upd, newbank * 0x20000); |
434 | 434 | } |
r17963 | r17964 | |
438 | 438 | case 0x1c/2: |
439 | 439 | if (state->m_sound_banks > 1) |
440 | 440 | { |
441 | device_t *upd = space | |
441 | device_t *upd = space.machine().device("upd"); | |
442 | 442 | upd7759_reset_w(upd, (data >> 1) & 1); |
443 | 443 | } |
444 | 444 | break; |
r17963 | r17964 | |
458 | 458 | |
459 | 459 | static WRITE16_HANDLER( control_w ) |
460 | 460 | { |
461 | segac2_state *state = space | |
461 | segac2_state *state = space.machine().driver_data<segac2_state>(); | |
462 | 462 | /* skip if not LSB */ |
463 | 463 | if (!ACCESSING_BITS_0_7) |
464 | 464 | return; |
465 | 465 | data &= 0x0f; |
466 | 466 | |
467 | 467 | /* bit 0 controls display enable */ |
468 | //segac2_enable_display(space | |
468 | //segac2_enable_display(space.machine(), ~data & 1); | |
469 | 469 | state->m_segac2_enable_display = ~data & 1; |
470 | 470 | |
471 | 471 | /* bit 1 resets the protection */ |
r17963 | r17964 | |
474 | 474 | |
475 | 475 | /* bit 2 controls palette shuffling; only ribbit and twinsqua use this feature */ |
476 | 476 | state->m_segac2_alt_palette_mode = ((~data & 4) >> 2); |
477 | recompute_palette_tables(space | |
477 | recompute_palette_tables(space.machine()); | |
478 | 478 | } |
479 | 479 | |
480 | 480 | |
r17963 | r17964 | |
494 | 494 | /* protection chip reads */ |
495 | 495 | static READ16_HANDLER( prot_r ) |
496 | 496 | { |
497 | segac2_state *state = space->machine().driver_data<segac2_state>(); | |
498 | if (LOG_PROTECTION) logerror("%06X:protection r=%02X\n", space->device().safe_pcbase(), state->m_prot_func ? state->m_prot_read_buf : 0xff); | |
497 | segac2_state *state = space.machine().driver_data<segac2_state>(); | |
498 | if (LOG_PROTECTION) logerror("%06X:protection r=%02X\n", space.device().safe_pcbase(), state->m_prot_func ? state->m_prot_read_buf : 0xff); | |
499 | 499 | return state->m_prot_read_buf | 0xf0; |
500 | 500 | } |
501 | 501 | |
r17963 | r17964 | |
503 | 503 | /* protection chip writes */ |
504 | 504 | static WRITE16_HANDLER( prot_w ) |
505 | 505 | { |
506 | segac2_state *state = space | |
506 | segac2_state *state = space.machine().driver_data<segac2_state>(); | |
507 | 507 | int new_sp_palbase = (data >> 2) & 3; |
508 | 508 | int new_bg_palbase = data & 3; |
509 | 509 | int table_index; |
r17963 | r17964 | |
521 | 521 | /* determine the value to return, should a read occur */ |
522 | 522 | if (state->m_prot_func) |
523 | 523 | state->m_prot_read_buf = state->m_prot_func(table_index); |
524 | if (LOG_PROTECTION) logerror("%06X:protection w=%02X, new result=%02X\n", space | |
524 | if (LOG_PROTECTION) logerror("%06X:protection w=%02X, new result=%02X\n", space.device().safe_pcbase(), data & 0x0f, state->m_prot_read_buf); | |
525 | 525 | |
526 | 526 | /* if the palette changed, force an update */ |
527 | 527 | if (new_sp_palbase != state->m_sp_palbase || new_bg_palbase != state->m_bg_palbase) |
528 | 528 | { |
529 | //space | |
529 | //space.machine().primary_screen->update_partial(space.machine().primary_screen->vpos() + 1); | |
530 | 530 | state->m_sp_palbase = new_sp_palbase; |
531 | 531 | state->m_bg_palbase = new_bg_palbase; |
532 | recompute_palette_tables(space->machine()); | |
533 | if (LOG_PALETTE) logerror("Set palbank: %d/%d (scan=%d)\n", state->m_bg_palbase, state->m_sp_palbase, space->machine().primary_screen->vpos()); | |
532 | recompute_palette_tables(space.machine()); | |
533 | if (LOG_PALETTE) logerror("Set palbank: %d/%d (scan=%d)\n", state->m_bg_palbase, state->m_sp_palbase, space.machine().primary_screen->vpos()); | |
534 | 534 | } |
535 | 535 | } |
536 | 536 | |
r17963 | r17964 | |
565 | 565 | break; |
566 | 566 | |
567 | 567 | case 0x10: /* coin counter */ |
568 | // coin_counter_w(space->machine(), 0,1); | |
569 | // coin_counter_w(space->machine(), 0,0); | |
568 | // coin_counter_w(space.machine(), 0,1); | |
569 | // coin_counter_w(space.machine(), 0,0); | |
570 | 570 | break; |
571 | 571 | |
572 | 572 | case 0x12: /* set coinage info -- followed by two 4-bit values */ |
r17963 | r17964 | |
596 | 596 | |
597 | 597 | static READ16_HANDLER( printer_r ) |
598 | 598 | { |
599 | segac2_state *state = space | |
599 | segac2_state *state = space.machine().driver_data<segac2_state>(); | |
600 | 600 | return state->m_cam_data; |
601 | 601 | } |
602 | 602 | |
603 | 603 | static WRITE16_HANDLER( print_club_camera_w ) |
604 | 604 | { |
605 | segac2_state *state = space | |
605 | segac2_state *state = space.machine().driver_data<segac2_state>(); | |
606 | 606 | state->m_cam_data = data; |
607 | 607 | } |
608 | 608 |
r17963 | r17964 | |
---|---|---|
1212 | 1212 | |
1213 | 1213 | MACHINE_RESET_MEMBER(homedata_state,pteacher) |
1214 | 1214 | { |
1215 | address_space | |
1215 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
1216 | 1216 | |
1217 | 1217 | /* on reset, ports are set as input (high impedance), therefore 0xff output */ |
1218 | pteacher_upd7807_portc_w( | |
1218 | pteacher_upd7807_portc_w(space, 0, 0xff); | |
1219 | 1219 | |
1220 | 1220 | MACHINE_RESET_CALL_MEMBER(homedata); |
1221 | 1221 | |
r17963 | r17964 | |
1228 | 1228 | |
1229 | 1229 | MACHINE_RESET_MEMBER(homedata_state,reikaids) |
1230 | 1230 | { |
1231 | address_space | |
1231 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
1232 | 1232 | |
1233 | 1233 | /* on reset, ports are set as input (high impedance), therefore 0xff output */ |
1234 | reikaids_upd7807_portc_w( | |
1234 | reikaids_upd7807_portc_w(space, 0, 0xff); | |
1235 | 1235 | |
1236 | 1236 | MACHINE_RESET_CALL_MEMBER(homedata); |
1237 | 1237 |
r17963 | r17964 | |
---|---|---|
1493 | 1493 | |
1494 | 1494 | DRIVER_INIT_MEMBER(exidy_state,fax) |
1495 | 1495 | { |
1496 | address_space | |
1496 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
1497 | 1497 | |
1498 | 1498 | exidy_video_config(machine(), 0x04, 0x04, TRUE); |
1499 | 1499 | |
1500 | 1500 | /* reset the ROM bank */ |
1501 | fax_bank_select_w( | |
1501 | fax_bank_select_w(space,0,0); | |
1502 | 1502 | } |
1503 | 1503 | |
1504 | 1504 |
r17963 | r17964 | |
---|---|---|
411 | 411 | DRIVER_INIT_MEMBER(pcktgal_state,deco222) |
412 | 412 | { |
413 | 413 | int A; |
414 | address_space | |
414 | address_space &space = *machine().device("audiocpu")->memory().space(AS_PROGRAM); | |
415 | 415 | UINT8 *decrypted = auto_alloc_array(machine(), UINT8, 0x10000); |
416 | 416 | UINT8 *rom = machine().root_device().memregion("audiocpu")->base(); |
417 | 417 | |
418 | space | |
418 | space.set_decrypted_region(0x8000, 0xffff, decrypted); | |
419 | 419 | |
420 | 420 | /* bits 5 and 6 of the opcodes are swapped */ |
421 | 421 | for (A = 0x8000;A < 0x18000;A++) |
r17963 | r17964 | |
---|---|---|
563 | 563 | } |
564 | 564 | |
565 | 565 | /* preliminary dma code, dma is used to copy program code -> ram */ |
566 | static void hng64_do_dma(address_space | |
566 | static void hng64_do_dma(address_space &space) | |
567 | 567 | { |
568 | hng64_state *state = space | |
568 | hng64_state *state = space.machine().driver_data<hng64_state>(); | |
569 | 569 | |
570 | 570 | //printf("Performing DMA Start %08x Len %08x Dst %08x\n", state->m_dma_start, state->m_dma_len, state->m_dma_dst); |
571 | 571 | |
r17963 | r17964 | |
573 | 573 | { |
574 | 574 | UINT32 dat; |
575 | 575 | |
576 | dat = space->read_dword(state->m_dma_start); | |
577 | space->write_dword(state->m_dma_dst, dat); | |
576 | dat = space.read_dword(state->m_dma_start); | |
577 | space.write_dword(state->m_dma_dst, dat); | |
578 | 578 | state->m_dma_start += 4; |
579 | 579 | state->m_dma_dst += 4; |
580 | 580 | state->m_dma_len--; |
r17963 | r17964 | |
621 | 621 | case 0x1214: m_dma_dst = m_sysregs[offset]; break; |
622 | 622 | case 0x1224: |
623 | 623 | m_dma_len = m_sysregs[offset]; |
624 | hng64_do_dma( | |
624 | hng64_do_dma(space); | |
625 | 625 | break; |
626 | 626 | //default: |
627 | 627 | // printf("HNG64 writing to SYSTEM Registers 0x%08x == 0x%08x. (PC=%08x)\n", offset*4, m_sysregs[offset], space.device().safe_pc()); |
r17963 | r17964 | |
1806 | 1806 | |
1807 | 1807 | KL5C80_virtual_mem_sync(this); |
1808 | 1808 | |
1809 | address_space *space = machine().device<z80_device>("comm")->space(AS_PROGRAM); | |
1810 | space->set_direct_update_handler(direct_update_delegate(FUNC(hng64_state::KL5C80_direct_handler), this)); | |
1809 | address_space &space = *machine().device<z80_device>("comm")->space(AS_PROGRAM); | |
1810 | space.set_direct_update_handler(direct_update_delegate(FUNC(hng64_state::KL5C80_direct_handler), this)); | |
1811 | 1811 | |
1812 | 1812 | machine().device("comm")->execute().set_input_line(INPUT_LINE_RESET, PULSE_LINE); // reset the CPU and let 'er rip |
1813 | 1813 | // machine().device("comm")->execute().set_input_line(INPUT_LINE_HALT, ASSERT_LINE); // hold on there pardner... |
r17963 | r17964 | |
---|---|---|
579 | 579 | |
580 | 580 | static void irqhandler(device_t *device, int irq) |
581 | 581 | { |
582 | // macrossp_state *state = space | |
582 | // macrossp_state *state = space.machine().driver_data<macrossp_state>(); | |
583 | 583 | logerror("ES5506 irq %d\n", irq); |
584 | 584 | |
585 | 585 | /* IRQ lines 1 & 4 on the sound 68000 are definitely triggered by the ES5506, |
r17963 | r17964 | |
---|---|---|
202 | 202 | |
203 | 203 | static READ8_HANDLER( gladiator_dsw1_r ) |
204 | 204 | { |
205 | int orig = space | |
205 | int orig = space.machine().root_device().ioport("DSW1")->read()^0xff; | |
206 | 206 | |
207 | 207 | return BITSWAP8(orig, 0,1,2,3,4,5,6,7); |
208 | 208 | } |
209 | 209 | |
210 | 210 | static READ8_HANDLER( gladiator_dsw2_r ) |
211 | 211 | { |
212 | int orig = space | |
212 | int orig = space.machine().root_device().ioport("DSW2")->read()^0xff; | |
213 | 213 | |
214 | 214 | return BITSWAP8(orig, 2,3,4,5,6,7,1,0); |
215 | 215 | } |
r17963 | r17964 | |
218 | 218 | { |
219 | 219 | int coins = 0; |
220 | 220 | |
221 | if( space | |
221 | if( space.machine().root_device().ioport("COINS")->read() & 0xc0 ) coins = 0x80; | |
222 | 222 | switch(offset) |
223 | 223 | { |
224 | 224 | case 0x01: /* start button , coins */ |
225 | return space | |
225 | return space.machine().root_device().ioport("IN0")->read() | coins; | |
226 | 226 | case 0x02: /* Player 1 Controller , coins */ |
227 | return space | |
227 | return space.machine().root_device().ioport("IN1")->read() | coins; | |
228 | 228 | case 0x04: /* Player 2 Controller , coins */ |
229 | return space | |
229 | return space.machine().root_device().ioport("IN2")->read() | coins; | |
230 | 230 | } |
231 | 231 | /* unknown */ |
232 | 232 | return 0; |
r17963 | r17964 | |
237 | 237 | switch(offset) |
238 | 238 | { |
239 | 239 | case 0x01: /* button 3 */ |
240 | return space | |
240 | return space.machine().root_device().ioport("IN3")->read(); | |
241 | 241 | } |
242 | 242 | /* unknown */ |
243 | 243 | return 0; |
r17963 | r17964 | |
---|---|---|
102 | 102 | |
103 | 103 | WRITE16_MEMBER(cabal_state::cabal_sound_irq_trigger_word_w) |
104 | 104 | { |
105 | seibu_main_word_w( | |
105 | seibu_main_word_w(space,4,data,mem_mask); | |
106 | 106 | |
107 | 107 | /* spin for a while to let the Z80 read the command, otherwise coins "stick" */ |
108 | 108 | space.device().execute().spin_until_time(attotime::from_usec(50)); |
r17963 | r17964 | |
848 | 848 | |
849 | 849 | static void seibu_sound_bootleg(running_machine &machine,const char *cpu,int length) |
850 | 850 | { |
851 | address_space | |
851 | address_space &space = *machine.device(cpu)->memory().space(AS_PROGRAM); | |
852 | 852 | UINT8 *decrypt = auto_alloc_array(machine, UINT8, length); |
853 | 853 | UINT8 *rom = machine.root_device().memregion(cpu)->base(); |
854 | 854 | |
855 | space | |
855 | space.set_decrypted_region(0x0000, (length < 0x10000) ? (length - 1) : 0x1fff, decrypt); | |
856 | 856 | |
857 | 857 | memcpy(decrypt, rom+length, length); |
858 | 858 |
r17963 | r17964 | |
---|---|---|
164 | 164 | static void vendetta_video_banking( running_machine &machine, int select ) |
165 | 165 | { |
166 | 166 | vendetta_state *state = machine.driver_data<vendetta_state>(); |
167 | address_space | |
167 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
168 | 168 | |
169 | 169 | if (select & 1) |
170 | 170 | { |
171 | space->install_read_bank(state->m_video_banking_base + 0x2000, state->m_video_banking_base + 0x2fff, "bank4" ); | |
172 | space->install_write_handler(state->m_video_banking_base + 0x2000, state->m_video_banking_base + 0x2fff, write8_delegate(FUNC(vendetta_state::paletteram_xBBBBBGGGGGRRRRR_byte_be_w), state) ); | |
173 | space->install_legacy_readwrite_handler(*state->m_k053246, state->m_video_banking_base + 0x0000, state->m_video_banking_base + 0x0fff, FUNC(k053247_r), FUNC(k053247_w) ); | |
171 | space.install_read_bank(state->m_video_banking_base + 0x2000, state->m_video_banking_base + 0x2fff, "bank4" ); | |
172 | space.install_write_handler(state->m_video_banking_base + 0x2000, state->m_video_banking_base + 0x2fff, write8_delegate(FUNC(vendetta_state::paletteram_xBBBBBGGGGGRRRRR_byte_be_w), state) ); | |
173 | space.install_legacy_readwrite_handler(*state->m_k053246, state->m_video_banking_base + 0x0000, state->m_video_banking_base + 0x0fff, FUNC(k053247_r), FUNC(k053247_w) ); | |
174 | 174 | state->membank("bank4")->set_base(state->m_generic_paletteram_8); |
175 | 175 | } |
176 | 176 | else |
177 | 177 | { |
178 | space->install_readwrite_handler(state->m_video_banking_base + 0x2000, state->m_video_banking_base + 0x2fff, read8_delegate(FUNC(vendetta_state::vendetta_K052109_r),state), write8_delegate(FUNC(vendetta_state::vendetta_K052109_w),state) ); | |
179 | space->install_legacy_readwrite_handler(*state->m_k052109, state->m_video_banking_base + 0x0000, state->m_video_banking_base + 0x0fff, FUNC(k052109_r), FUNC(k052109_w) ); | |
178 | space.install_readwrite_handler(state->m_video_banking_base + 0x2000, state->m_video_banking_base + 0x2fff, read8_delegate(FUNC(vendetta_state::vendetta_K052109_r),state), write8_delegate(FUNC(vendetta_state::vendetta_K052109_w),state) ); | |
179 | space.install_legacy_readwrite_handler(*state->m_k052109, state->m_video_banking_base + 0x0000, state->m_video_banking_base + 0x0fff, FUNC(k052109_r), FUNC(k052109_w) ); | |
180 | 180 | } |
181 | 181 | } |
182 | 182 |
r17963 | r17964 | |
---|---|---|
1369 | 1369 | m_maincpu->set_input_line(4, HOLD_LINE); |
1370 | 1370 | |
1371 | 1371 | // set tile banks |
1372 | address_space *space = m_maincpu->space(AS_PROGRAM); | |
1373 | rom_5704_bank_w(*space, 1, m_workram[0x3094/2] & 0x00ff, 0x00ff); | |
1372 | address_space &space = *m_maincpu->space(AS_PROGRAM); | |
1373 | rom_5704_bank_w(space, 1, m_workram[0x3094/2] & 0x00ff, 0x00ff); | |
1374 | 1374 | |
1375 | 1375 | // process any new sound data |
1376 | 1376 | UINT16 temp = m_workram[soundoffs]; |
1377 | 1377 | if ((temp & 0xff00) != 0x0000) |
1378 | 1378 | { |
1379 | m_mapper->write( | |
1379 | m_mapper->write(space, 0x03, temp >> 8); | |
1380 | 1380 | m_workram[soundoffs] = temp & 0x00ff; |
1381 | 1381 | } |
1382 | 1382 | |
r17963 | r17964 | |
1414 | 1414 | UINT16 temp = m_workram[0x0bd0/2]; |
1415 | 1415 | if ((temp & 0xff00) != 0x0000) |
1416 | 1416 | { |
1417 | address_space *space = m_maincpu->space(AS_PROGRAM); | |
1418 | m_mapper->write(*space, 0x03, temp >> 8); | |
1417 | address_space &space = *m_maincpu->space(AS_PROGRAM); | |
1418 | m_mapper->write(space, 0x03, temp >> 8); | |
1419 | 1419 | m_workram[0x0bd0/2] = temp & 0x00ff; |
1420 | 1420 | } |
1421 | 1421 | } |
r17963 | r17964 | |
1444 | 1444 | UINT16 temp = m_workram[0x2cfc/2]; |
1445 | 1445 | if ((temp & 0xff00) != 0x0000) |
1446 | 1446 | { |
1447 | address_space *space = m_maincpu->space(AS_PROGRAM); | |
1448 | m_mapper->write(*space, 0x03, temp >> 8); | |
1447 | address_space &space = *m_maincpu->space(AS_PROGRAM); | |
1448 | m_mapper->write(space, 0x03, temp >> 8); | |
1449 | 1449 | m_workram[0x2cfc/2] = temp & 0x00ff; |
1450 | 1450 | } |
1451 | 1451 | |
r17963 | r17964 | |
1471 | 1471 | temp = m_workram[0x01d0/2]; |
1472 | 1472 | if ((temp & 0xff00) != 0x0000) |
1473 | 1473 | { |
1474 | address_space *space = m_maincpu->space(AS_PROGRAM); | |
1475 | m_mapper->write(*space, 0x03, temp); | |
1474 | address_space &space = *m_maincpu->space(AS_PROGRAM); | |
1475 | m_mapper->write(space, 0x03, temp); | |
1476 | 1476 | m_workram[0x01d0/2] = temp & 0x00ff; |
1477 | 1477 | } |
1478 | 1478 | |
r17963 | r17964 | |
1497 | 1497 | UINT16 temp = m_workram[0x0008/2]; |
1498 | 1498 | if ((temp & 0x00ff) != 0x0000) |
1499 | 1499 | { |
1500 | address_space *space = m_maincpu->space(AS_PROGRAM); | |
1501 | m_mapper->write(*space, 0x03, temp >> 8); | |
1500 | address_space &space = *m_maincpu->space(AS_PROGRAM); | |
1501 | m_mapper->write(space, 0x03, temp >> 8); | |
1502 | 1502 | m_workram[0x0008/2] = temp & 0xff00; |
1503 | 1503 | } |
1504 | 1504 | } |
r17963 | r17964 | |
1620 | 1620 | // bit 4 is GONG |
1621 | 1621 | // if (data & 0x10) popmessage("GONG"); |
1622 | 1622 | // are the following really lamps? |
1623 | // set_led_status(space->machine(), 1,data & 0x20); | |
1624 | // set_led_status(space->machine(), 2,data & 0x40); | |
1625 | // set_led_status(space->machine(), 3,data & 0x80); | |
1623 | // set_led_status(space.machine(), 1,data & 0x20); | |
1624 | // set_led_status(space.machine(), 2,data & 0x40); | |
1625 | // set_led_status(space.machine(), 3,data & 0x80); | |
1626 | 1626 | break; |
1627 | 1627 | } |
1628 | 1628 | break; |
r17963 | r17964 | |
---|---|---|
122 | 122 | } |
123 | 123 | |
124 | 124 | static void scu_do_transfer(running_machine &machine,UINT8 event); |
125 | static void scu_dma_direct(address_space *space, UINT8 dma_ch); /*DMA level 0 direct transfer function*/ | |
126 | static void scu_dma_indirect(address_space *space, UINT8 dma_ch); /*DMA level 0 indirect transfer function*/ | |
125 | static void scu_dma_direct(address_space &space, UINT8 dma_ch); /*DMA level 0 direct transfer function*/ | |
126 | static void scu_dma_indirect(address_space &space, UINT8 dma_ch); /*DMA level 0 indirect transfer function*/ | |
127 | 127 | |
128 | 128 | /**************************************************************************************/ |
129 | 129 | |
r17963 | r17964 | |
239 | 239 | static void scu_do_transfer(running_machine &machine,UINT8 event) |
240 | 240 | { |
241 | 241 | saturn_state *state = machine.driver_data<saturn_state>(); |
242 | address_space | |
242 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
243 | 243 | int i; |
244 | 244 | |
245 | 245 | for(i=0;i<3;i++) |
r17963 | r17964 | |
282 | 282 | |
283 | 283 | static READ32_HANDLER( saturn_scu_r ) |
284 | 284 | { |
285 | saturn_state *state = space | |
285 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
286 | 286 | UINT32 res; |
287 | 287 | |
288 | 288 | /*TODO: write only registers must return 0 or open bus */ |
r17963 | r17964 | |
290 | 290 | { |
291 | 291 | case 0x5c/4: |
292 | 292 | // Super Major League and Shin Megami Tensei - Akuma Zensho reads from there (undocumented), DMA status mirror? |
293 | if(LOG_SCU) logerror("(PC=%08x) DMA status reg read\n",space | |
293 | if(LOG_SCU) logerror("(PC=%08x) DMA status reg read\n",space.device().safe_pc()); | |
294 | 294 | res = state->m_scu_regs[0x7c/4]; |
295 | 295 | break; |
296 | 296 | case 0x7c/4: |
297 | if(LOG_SCU) logerror("(PC=%08x) DMA status reg read\n",space | |
297 | if(LOG_SCU) logerror("(PC=%08x) DMA status reg read\n",space.device().safe_pc()); | |
298 | 298 | res = state->m_scu_regs[offset]; |
299 | 299 | break; |
300 | 300 | case 0x80/4: |
r17963 | r17964 | |
305 | 305 | res = dsp_ram_addr_r(); |
306 | 306 | break; |
307 | 307 | case 0xa0/4: |
308 | if(LOG_SCU) logerror("(PC=%08x) IRQ mask reg read %08x MASK=%08x\n",space | |
308 | if(LOG_SCU) logerror("(PC=%08x) IRQ mask reg read %08x MASK=%08x\n",space.device().safe_pc(),mem_mask,state->m_scu_regs[0xa0/4]); | |
309 | 309 | res = state->m_scu.ism; |
310 | 310 | break; |
311 | 311 | case 0xa4/4: |
312 | if(LOG_SCU) logerror("(PC=%08x) IRQ status reg read %08x MASK=%08x\n",space | |
312 | if(LOG_SCU) logerror("(PC=%08x) IRQ status reg read %08x MASK=%08x\n",space.device().safe_pc(),mem_mask,state->m_scu_regs[0xa0/4]); | |
313 | 313 | res = state->m_scu.ist; |
314 | 314 | break; |
315 | 315 | case 0xc8/4: |
316 | logerror("(PC=%08x) SCU version reg read\n",space | |
316 | logerror("(PC=%08x) SCU version reg read\n",space.device().safe_pc()); | |
317 | 317 | res = 0x00000004;/*SCU Version 4, OK? */ |
318 | 318 | break; |
319 | 319 | default: |
320 | if(LOG_SCU) logerror("(PC=%08x) SCU reg read at %d = %08x\n",space | |
320 | if(LOG_SCU) logerror("(PC=%08x) SCU reg read at %d = %08x\n",space.device().safe_pc(),offset,state->m_scu_regs[offset]); | |
321 | 321 | res = state->m_scu_regs[offset]; |
322 | 322 | break; |
323 | 323 | } |
r17963 | r17964 | |
329 | 329 | |
330 | 330 | static WRITE32_HANDLER( saturn_scu_w ) |
331 | 331 | { |
332 | saturn_state *state = space | |
332 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
333 | 333 | |
334 | 334 | COMBINE_DATA(&state->m_scu_regs[offset]); |
335 | 335 | |
r17963 | r17964 | |
390 | 390 | case 0x98/4: /*if(LOG_SCU) logerror("timer 1 mode data = %08x\n",state->m_scu_regs[38]);*/ break; |
391 | 391 | case 0xa0/4: /* IRQ mask */ |
392 | 392 | state->m_scu.ism = state->m_scu_regs[0xa0/4]; |
393 | scu_test_pending_irq(space | |
393 | scu_test_pending_irq(space.machine()); | |
394 | 394 | break; |
395 | 395 | case 0xa4/4: /* IRQ control */ |
396 | if(LOG_SCU) logerror("PC=%08x IRQ status reg set:%08x %08x\n",space | |
396 | if(LOG_SCU) logerror("PC=%08x IRQ status reg set:%08x %08x\n",space.device().safe_pc(),state->m_scu_regs[41],mem_mask); | |
397 | 397 | state->m_scu.ist &= state->m_scu_regs[offset]; |
398 | 398 | break; |
399 | 399 | case 0xa8/4: if(LOG_SCU) logerror("A-Bus IRQ ACK %08x\n",state->m_scu_regs[42]); break; |
r17963 | r17964 | |
441 | 441 | DnMV_0(2); |
442 | 442 | } |
443 | 443 | |
444 | static void scu_single_transfer(address_space | |
444 | static void scu_single_transfer(address_space &space, UINT32 src, UINT32 dst,UINT8 *src_shift) | |
445 | 445 | { |
446 | 446 | UINT32 src_data; |
447 | 447 | |
448 | 448 | if(src & 1) |
449 | 449 | { |
450 | 450 | /* Road Blaster does a work ram h to color ram with offsetted source address, do some data rotation */ |
451 | src_data = ((space->read_dword(src & 0x07fffffc) & 0x00ffffff)<<8); | |
452 | src_data |= ((space->read_dword((src & 0x07fffffc)+4) & 0xff000000) >> 24); | |
451 | src_data = ((space.read_dword(src & 0x07fffffc) & 0x00ffffff)<<8); | |
452 | src_data |= ((space.read_dword((src & 0x07fffffc)+4) & 0xff000000) >> 24); | |
453 | 453 | src_data >>= (*src_shift)*16; |
454 | 454 | } |
455 | 455 | else |
456 | src_data = space | |
456 | src_data = space.read_dword(src & 0x07fffffc) >> (*src_shift)*16; | |
457 | 457 | |
458 | space | |
458 | space.write_word(dst,src_data); | |
459 | 459 | |
460 | 460 | *src_shift ^= 1; |
461 | 461 | } |
462 | 462 | |
463 | static void scu_dma_direct(address_space | |
463 | static void scu_dma_direct(address_space &space, UINT8 dma_ch) | |
464 | 464 | { |
465 | saturn_state *state = space | |
465 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
466 | 466 | UINT32 tmp_src,tmp_dst,tmp_size; |
467 | 467 | UINT8 cd_transfer_flag; |
468 | 468 | |
r17963 | r17964 | |
501 | 501 | |
502 | 502 | for (i = 0; i < state->m_scu.size[dma_ch];i+=state->m_scu.dst_add[dma_ch]) |
503 | 503 | { |
504 | space | |
504 | space.write_dword(state->m_scu.dst[dma_ch],space.read_dword(state->m_scu.src[dma_ch])); | |
505 | 505 | if(state->m_scu.dst_add[dma_ch] == 8) |
506 | space | |
506 | space.write_dword(state->m_scu.dst[dma_ch]+4,space.read_dword(state->m_scu.src[dma_ch])); | |
507 | 507 | |
508 | 508 | state->m_scu.src[dma_ch]+=state->m_scu.src_add[dma_ch]; |
509 | 509 | state->m_scu.dst[dma_ch]+=state->m_scu.dst_add[dma_ch]; |
r17963 | r17964 | |
536 | 536 | /*TODO: this is completely wrong HW-wise ... */ |
537 | 537 | switch(dma_ch) |
538 | 538 | { |
539 | case 0: space->machine().scheduler().timer_set(attotime::from_usec(300), FUNC(dma_lv0_ended)); break; | |
540 | case 1: space->machine().scheduler().timer_set(attotime::from_usec(300), FUNC(dma_lv1_ended)); break; | |
541 | case 2: space->machine().scheduler().timer_set(attotime::from_usec(300), FUNC(dma_lv2_ended)); break; | |
539 | case 0: space.machine().scheduler().timer_set(attotime::from_usec(300), FUNC(dma_lv0_ended)); break; | |
540 | case 1: space.machine().scheduler().timer_set(attotime::from_usec(300), FUNC(dma_lv1_ended)); break; | |
541 | case 2: space.machine().scheduler().timer_set(attotime::from_usec(300), FUNC(dma_lv2_ended)); break; | |
542 | 542 | } |
543 | 543 | } |
544 | 544 | } |
545 | 545 | |
546 | static void scu_dma_indirect(address_space | |
546 | static void scu_dma_indirect(address_space &space,UINT8 dma_ch) | |
547 | 547 | { |
548 | saturn_state *state = space | |
548 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
549 | 549 | |
550 | 550 | /*Helper to get out of the cycle*/ |
551 | 551 | UINT8 job_done = 0; |
r17963 | r17964 | |
561 | 561 | do{ |
562 | 562 | tmp_src = state->m_scu.index[dma_ch]; |
563 | 563 | |
564 | indirect_size = space->read_dword(state->m_scu.index[dma_ch]); | |
565 | indirect_src = space->read_dword(state->m_scu.index[dma_ch]+8); | |
566 | indirect_dst = space->read_dword(state->m_scu.index[dma_ch]+4); | |
564 | indirect_size = space.read_dword(state->m_scu.index[dma_ch]); | |
565 | indirect_src = space.read_dword(state->m_scu.index[dma_ch]+8); | |
566 | indirect_dst = space.read_dword(state->m_scu.index[dma_ch]+4); | |
567 | 567 | |
568 | 568 | /*Indirect Mode end factor*/ |
569 | 569 | if(indirect_src & 0x80000000) |
r17963 | r17964 | |
599 | 599 | } |
600 | 600 | } |
601 | 601 | |
602 | //if(DRUP(0)) space->write_dword(tmp_src+8,state->m_scu.src[0]|job_done ? 0x80000000 : 0); | |
603 | //if(DWUP(0)) space->write_dword(tmp_src+4,state->m_scu.dst[0]); | |
602 | //if(DRUP(0)) space.write_dword(tmp_src+8,state->m_scu.src[0]|job_done ? 0x80000000 : 0); | |
603 | //if(DWUP(0)) space.write_dword(tmp_src+4,state->m_scu.dst[0]); | |
604 | 604 | |
605 | 605 | state->m_scu.index[dma_ch] = tmp_src+0xc; |
606 | 606 | |
r17963 | r17964 | |
610 | 610 | /*TODO: this is completely wrong HW-wise ... */ |
611 | 611 | switch(dma_ch) |
612 | 612 | { |
613 | case 0: space->machine().scheduler().timer_set(attotime::from_usec(300), FUNC(dma_lv0_ended)); break; | |
614 | case 1: space->machine().scheduler().timer_set(attotime::from_usec(300), FUNC(dma_lv1_ended)); break; | |
615 | case 2: space->machine().scheduler().timer_set(attotime::from_usec(300), FUNC(dma_lv2_ended)); break; | |
613 | case 0: space.machine().scheduler().timer_set(attotime::from_usec(300), FUNC(dma_lv0_ended)); break; | |
614 | case 1: space.machine().scheduler().timer_set(attotime::from_usec(300), FUNC(dma_lv1_ended)); break; | |
615 | case 2: space.machine().scheduler().timer_set(attotime::from_usec(300), FUNC(dma_lv2_ended)); break; | |
616 | 616 | } |
617 | 617 | } |
618 | 618 | } |
r17963 | r17964 | |
622 | 622 | |
623 | 623 | static WRITE16_HANDLER( saturn_soundram_w ) |
624 | 624 | { |
625 | saturn_state *state = space | |
625 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
626 | 626 | |
627 | //space | |
627 | //space.machine().scheduler().synchronize(); // force resync | |
628 | 628 | |
629 | 629 | COMBINE_DATA(&state->m_sound_ram[offset]); |
630 | 630 | } |
631 | 631 | |
632 | 632 | static READ16_HANDLER( saturn_soundram_r ) |
633 | 633 | { |
634 | saturn_state *state = space | |
634 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
635 | 635 | |
636 | //space | |
636 | //space.machine().scheduler().synchronize(); // force resync | |
637 | 637 | |
638 | 638 | return state->m_sound_ram[offset]; |
639 | 639 | } |
r17963 | r17964 | |
641 | 641 | /* communication,SLAVE CPU acquires data from the MASTER CPU and triggers an irq. */ |
642 | 642 | static WRITE32_HANDLER( minit_w ) |
643 | 643 | { |
644 | saturn_state *state = space | |
644 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
645 | 645 | |
646 | //logerror("cpu %s (PC=%08X) MINIT write = %08x\n", space->device().tag(), space->device().safe_pc(),data); | |
647 | space->machine().scheduler().boost_interleave(state->m_minit_boost_timeslice, attotime::from_usec(state->m_minit_boost)); | |
648 | space->machine().scheduler().trigger(1000); | |
646 | //logerror("cpu %s (PC=%08X) MINIT write = %08x\n", space.device().tag(), space.device().safe_pc(),data); | |
647 | space.machine().scheduler().boost_interleave(state->m_minit_boost_timeslice, attotime::from_usec(state->m_minit_boost)); | |
648 | space.machine().scheduler().trigger(1000); | |
649 | 649 | sh2_set_frt_input(state->m_slave, PULSE_LINE); |
650 | 650 | } |
651 | 651 | |
652 | 652 | static WRITE32_HANDLER( sinit_w ) |
653 | 653 | { |
654 | saturn_state *state = space | |
654 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
655 | 655 | |
656 | //logerror("cpu %s (PC=%08X) SINIT write = %08x\n", space->device().tag(), space->device().safe_pc(),data); | |
657 | space->machine().scheduler().boost_interleave(state->m_sinit_boost_timeslice, attotime::from_usec(state->m_sinit_boost)); | |
656 | //logerror("cpu %s (PC=%08X) SINIT write = %08x\n", space.device().tag(), space.device().safe_pc(),data); | |
657 | space.machine().scheduler().boost_interleave(state->m_sinit_boost_timeslice, attotime::from_usec(state->m_sinit_boost)); | |
658 | 658 | sh2_set_frt_input(state->m_maincpu, PULSE_LINE); |
659 | 659 | } |
660 | 660 | |
661 | 661 | static READ8_HANDLER(saturn_backupram_r) |
662 | 662 | { |
663 | saturn_state *state = space | |
663 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
664 | 664 | |
665 | 665 | if(!(offset & 1)) |
666 | 666 | return 0; // yes, it makes sure the "holes" are there. |
r17963 | r17964 | |
670 | 670 | |
671 | 671 | static WRITE8_HANDLER(saturn_backupram_w) |
672 | 672 | { |
673 | saturn_state *state = space | |
673 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
674 | 674 | |
675 | 675 | if(!(offset & 1)) |
676 | 676 | return; |
r17963 | r17964 | |
743 | 743 | |
744 | 744 | static READ8_HANDLER( saturn_cart_type_r ) |
745 | 745 | { |
746 | saturn_state *state = space | |
746 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
747 | 747 | const int cart_ram_header[7] = { 0xff, 0x21, 0x22, 0x23, 0x24, 0x5a, 0x5c }; |
748 | 748 | |
749 | 749 | return cart_ram_header[state->m_cart_type]; |
r17963 | r17964 | |
1981 | 1981 | |
1982 | 1982 | static READ32_HANDLER( saturn_cart_dram0_r ) |
1983 | 1983 | { |
1984 | saturn_state *state = space | |
1984 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
1985 | 1985 | |
1986 | 1986 | return state->m_cart_dram[offset]; |
1987 | 1987 | } |
1988 | 1988 | |
1989 | 1989 | static WRITE32_HANDLER( saturn_cart_dram0_w ) |
1990 | 1990 | { |
1991 | saturn_state *state = space | |
1991 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
1992 | 1992 | |
1993 | 1993 | COMBINE_DATA(&state->m_cart_dram[offset]); |
1994 | 1994 | } |
1995 | 1995 | |
1996 | 1996 | static READ32_HANDLER( saturn_cart_dram1_r ) |
1997 | 1997 | { |
1998 | saturn_state *state = space | |
1998 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
1999 | 1999 | |
2000 | 2000 | return state->m_cart_dram[offset+0x200000/4]; |
2001 | 2001 | } |
2002 | 2002 | |
2003 | 2003 | static WRITE32_HANDLER( saturn_cart_dram1_w ) |
2004 | 2004 | { |
2005 | saturn_state *state = space | |
2005 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
2006 | 2006 | |
2007 | 2007 | COMBINE_DATA(&state->m_cart_dram[offset+0x200000/4]); |
2008 | 2008 | } |
2009 | 2009 | |
2010 | 2010 | static READ32_HANDLER( saturn_cs1_r ) |
2011 | 2011 | { |
2012 | saturn_state *state = space | |
2012 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
2013 | 2013 | UINT32 res; |
2014 | 2014 | |
2015 | 2015 | res = 0; |
r17963 | r17964 | |
2023 | 2023 | |
2024 | 2024 | static WRITE32_HANDLER( saturn_cs1_w ) |
2025 | 2025 | { |
2026 | saturn_state *state = space | |
2026 | saturn_state *state = space.machine().driver_data<saturn_state>(); | |
2027 | 2027 | |
2028 | 2028 | if(ACCESSING_BITS_16_23) |
2029 | 2029 | state->m_cart_backupram[offset*2+0] = (data & 0x00ff0000) >> 16; |
r17963 | r17964 | |
---|---|---|
161 | 161 | } |
162 | 162 | |
163 | 163 | if (ACCESSING_BITS_8_15) |
164 | tms34061_w( | |
164 | tms34061_w(space, col, row, func, data >> 8); | |
165 | 165 | |
166 | 166 | if (ACCESSING_BITS_0_7) |
167 | tms34061_w( | |
167 | tms34061_w(space, col | 1, row, func, data & 0xff); | |
168 | 168 | } |
169 | 169 | |
170 | 170 | READ16_MEMBER(jpmsys5_state::sys5_tms34061_r) |
r17963 | r17964 | |
185 | 185 | } |
186 | 186 | |
187 | 187 | if (ACCESSING_BITS_8_15) |
188 | data |= tms34061_r( | |
188 | data |= tms34061_r(space, col, row, func) << 8; | |
189 | 189 | |
190 | 190 | if (ACCESSING_BITS_0_7) |
191 | data |= tms34061_r( | |
191 | data |= tms34061_r(space, col | 1, row, func); | |
192 | 192 | |
193 | 193 | return data; |
194 | 194 | } |
r17963 | r17964 | |
---|---|---|
5744 | 5744 | static void maketrax_rom_decode(running_machine &machine) |
5745 | 5745 | { |
5746 | 5746 | pacman_state *state = machine.driver_data<pacman_state>(); |
5747 | address_space | |
5747 | address_space &space = *state->m_maincpu->space(AS_PROGRAM); | |
5748 | 5748 | UINT8 *decrypted = auto_alloc_array(machine, UINT8, 0x4000); |
5749 | 5749 | UINT8 *rom = machine.root_device().memregion("maincpu")->base(); |
5750 | 5750 | |
5751 | 5751 | /* patch protection using a copy of the opcodes so ROM checksum */ |
5752 | 5752 | /* tests will not fail */ |
5753 | space | |
5753 | space.set_decrypted_region(0x0000, 0x3fff, decrypted); | |
5754 | 5754 | |
5755 | 5755 | memcpy(decrypted,rom,0x4000); |
5756 | 5756 | |
r17963 | r17964 | |
5777 | 5777 | static void korosuke_rom_decode(running_machine &machine) |
5778 | 5778 | { |
5779 | 5779 | pacman_state *state = machine.driver_data<pacman_state>(); |
5780 | address_space | |
5780 | address_space &space = *state->m_maincpu->space(AS_PROGRAM); | |
5781 | 5781 | UINT8 *decrypted = auto_alloc_array(machine, UINT8, 0x4000); |
5782 | 5782 | UINT8 *rom = machine.root_device().memregion("maincpu")->base(); |
5783 | 5783 | |
5784 | 5784 | /* patch protection using a copy of the opcodes so ROM checksum */ |
5785 | 5785 | /* tests will not fail */ |
5786 | space | |
5786 | space.set_decrypted_region(0x0000, 0x3fff, decrypted); | |
5787 | 5787 | |
5788 | 5788 | memcpy(decrypted,rom,0x4000); |
5789 | 5789 |
r17963 | r17964 | |
---|---|---|
53 | 53 | /* The protection of the Japanese (and alt US) version */ |
54 | 54 | /* I'd love to see someone dump the 68705 / i8751 roms */ |
55 | 55 | |
56 | static void write_dword( address_space | |
56 | static void write_dword( address_space &space, offs_t offset, UINT32 data ) | |
57 | 57 | { |
58 | space->write_word(offset, data >> 16); | |
59 | space->write_word(offset + 2, data); | |
58 | space.write_word(offset, data >> 16); | |
59 | space.write_word(offset + 2, data); | |
60 | 60 | } |
61 | 61 | |
62 | 62 | WRITE16_MEMBER(sf_state::protection_w) |
r17963 | r17964 | |
81 | 81 | |
82 | 82 | base = 0x1b6e8 + 0x300e * map; |
83 | 83 | |
84 | write_dword(&space, 0xffc01c, 0x16bfc + 0x270 * map); | |
85 | write_dword(&space, 0xffc020, base + 0x80); | |
86 | write_dword(&space, 0xffc024, base); | |
87 | write_dword(&space, 0xffc028, base + 0x86); | |
88 | write_dword(&space, 0xffc02c, base + 0x8e); | |
89 | write_dword(&space, 0xffc030, base + 0x20e); | |
90 | write_dword(&space, 0xffc034, base + 0x30e); | |
91 | write_dword(&space, 0xffc038, base + 0x38e); | |
92 | write_dword(&space, 0xffc03c, base + 0x40e); | |
93 | write_dword(&space, 0xffc040, base + 0x80e); | |
94 | write_dword(&space, 0xffc044, base + 0xc0e); | |
95 | write_dword(&space, 0xffc048, base + 0x180e); | |
96 | write_dword(&space, 0xffc04c, base + 0x240e); | |
97 | write_dword(&space, 0xffc050, 0x19548 + 0x60 * map); | |
98 | write_dword(&space, 0xffc054, 0x19578 + 0x60 * map); | |
84 | write_dword(space, 0xffc01c, 0x16bfc + 0x270 * map); | |
85 | write_dword(space, 0xffc020, base + 0x80); | |
86 | write_dword(space, 0xffc024, base); | |
87 | write_dword(space, 0xffc028, base + 0x86); | |
88 | write_dword(space, 0xffc02c, base + 0x8e); | |
89 | write_dword(space, 0xffc030, base + 0x20e); | |
90 | write_dword(space, 0xffc034, base + 0x30e); | |
91 | write_dword(space, 0xffc038, base + 0x38e); | |
92 | write_dword(space, 0xffc03c, base + 0x40e); | |
93 | write_dword(space, 0xffc040, base + 0x80e); | |
94 | write_dword(space, 0xffc044, base + 0xc0e); | |
95 | write_dword(space, 0xffc048, base + 0x180e); | |
96 | write_dword(space, 0xffc04c, base + 0x240e); | |
97 | write_dword(space, 0xffc050, 0x19548 + 0x60 * map); | |
98 | write_dword(space, 0xffc054, 0x19578 + 0x60 * map); | |
99 | 99 | break; |
100 | 100 | } |
101 | 101 | case 2: |
r17963 | r17964 | |
---|---|---|
818 | 818 | } |
819 | 819 | } |
820 | 820 | |
821 | static void cde_dma_transfer(address_space | |
821 | static void cde_dma_transfer(address_space &space, int channel, int next) | |
822 | 822 | { |
823 | konamim2_state *state = space | |
823 | konamim2_state *state = space.machine().driver_data<konamim2_state>(); | |
824 | 824 | UINT32 address; |
825 | 825 | //int length; |
826 | 826 | int i; |
r17963 | r17964 | |
838 | 838 | |
839 | 839 | for (i=0; i < state->m_cde_dma[channel].next_length; i++) |
840 | 840 | { |
841 | space | |
841 | space.write_byte(address, 0xff); // TODO: do the real transfer... | |
842 | 842 | address++; |
843 | 843 | } |
844 | 844 | } |
r17963 | r17964 | |
976 | 976 | { |
977 | 977 | m_cde_dma[0].dma_done = 1; |
978 | 978 | |
979 | cde_dma_transfer( | |
979 | cde_dma_transfer(space, 0, 0); | |
980 | 980 | } |
981 | 981 | if (d & 0x40) |
982 | 982 | { |
983 | 983 | m_cde_dma[0].dma_done = 1; |
984 | 984 | |
985 | cde_dma_transfer( | |
985 | cde_dma_transfer(space, 0, 1); | |
986 | 986 | } |
987 | 987 | break; |
988 | 988 | } |
r17963 | r17964 | |
---|---|---|
809 | 809 | return ~8 + ((eeprom->read_bit() & 1) ? 8 : 0); |
810 | 810 | } |
811 | 811 | |
812 | INLINE void vctrl_w(address_space | |
812 | INLINE void vctrl_w(address_space &space, offs_t offset, UINT16 data, UINT16 mem_mask, int GFX) | |
813 | 813 | { |
814 | cave_state *state = space | |
814 | cave_state *state = space.machine().driver_data<cave_state>(); | |
815 | 815 | UINT16 *VCTRL = state->m_vctrl[GFX]; |
816 | 816 | if (offset == 4 / 2) |
817 | 817 | { |
r17963 | r17964 | |
826 | 826 | } |
827 | 827 | COMBINE_DATA(&VCTRL[offset]); |
828 | 828 | } |
829 | WRITE16_MEMBER(cave_state::pwrinst2_vctrl_0_w){ vctrl_w(&space, offset, data, mem_mask, 0); } | |
830 | WRITE16_MEMBER(cave_state::pwrinst2_vctrl_1_w){ vctrl_w(&space, offset, data, mem_mask, 1); } | |
831 | WRITE16_MEMBER(cave_state::pwrinst2_vctrl_2_w){ vctrl_w(&space, offset, data, mem_mask, 2); } | |
832 | WRITE16_MEMBER(cave_state::pwrinst2_vctrl_3_w){ vctrl_w(&space, offset, data, mem_mask, 3); } | |
829 | WRITE16_MEMBER(cave_state::pwrinst2_vctrl_0_w){ vctrl_w(space, offset, data, mem_mask, 0); } | |
830 | WRITE16_MEMBER(cave_state::pwrinst2_vctrl_1_w){ vctrl_w(space, offset, data, mem_mask, 1); } | |
831 | WRITE16_MEMBER(cave_state::pwrinst2_vctrl_2_w){ vctrl_w(space, offset, data, mem_mask, 2); } | |
832 | WRITE16_MEMBER(cave_state::pwrinst2_vctrl_3_w){ vctrl_w(space, offset, data, mem_mask, 3); } | |
833 | 833 | |
834 | 834 | static ADDRESS_MAP_START( pwrinst2_map, AS_PROGRAM, 16, cave_state ) |
835 | 835 | AM_RANGE(0x000000, 0x1fffff) AM_ROM // ROM |
r17963 | r17964 | |
---|---|---|
519 | 519 | ADDRESS_MAP_END |
520 | 520 | |
521 | 521 | |
522 | void defender_install_io_space(address_space | |
522 | void defender_install_io_space(address_space &space) | |
523 | 523 | { |
524 | williams_state *state = space->machine().driver_data<williams_state>(); | |
525 | pia6821_device *pia_0 = space->machine().device<pia6821_device>("pia_0"); | |
526 | pia6821_device *pia_1 = space->machine().device<pia6821_device>("pia_1"); | |
524 | williams_state *state = space.machine().driver_data<williams_state>(); | |
525 | pia6821_device *pia_0 = space.machine().device<pia6821_device>("pia_0"); | |
526 | pia6821_device *pia_1 = space.machine().device<pia6821_device>("pia_1"); | |
527 | 527 | |
528 | 528 | /* this routine dynamically installs the memory mapped above from c000-cfff */ |
529 | space->install_write_bank (0xc000, 0xc00f, 0, 0x03e0, "bank4"); | |
530 | space->install_write_handler (0xc010, 0xc01f, 0, 0x03e0, write8_delegate(FUNC(williams_state::defender_video_control_w),state)); | |
531 | space->install_write_handler (0xc3ff, 0xc3ff, write8_delegate(FUNC(williams_state::williams_watchdog_reset_w),state)); | |
532 | space->install_read_bank(0xc400, 0xc4ff, 0, 0x0300, "bank3"); | |
533 | space->install_write_handler(0xc400, 0xc4ff, 0, 0x0300, write8_delegate(FUNC(williams_state::williams_cmos_w),state)); | |
534 | space->install_read_handler (0xc800, 0xcbff, 0, 0x03e0, read8_delegate(FUNC(williams_state::williams_video_counter_r),state)); | |
535 | space->install_readwrite_handler(0xcc00, 0xcc03, 0, 0x03e0, read8_delegate(FUNC(pia6821_device::read), pia_1), write8_delegate(FUNC(pia6821_device::write), pia_1)); | |
536 | space->install_readwrite_handler(0xcc04, 0xcc07, 0, 0x03e0, read8_delegate(FUNC(pia6821_device::read), pia_0), write8_delegate(FUNC(pia6821_device::write), pia_0)); | |
537 | state->membank("bank3")->set_base(space->machine().driver_data<williams_state>()->m_nvram); | |
538 | state->membank("bank4")->set_base(space->machine().driver_data<williams_state>()->m_generic_paletteram_8); | |
529 | space.install_write_bank (0xc000, 0xc00f, 0, 0x03e0, "bank4"); | |
530 | space.install_write_handler (0xc010, 0xc01f, 0, 0x03e0, write8_delegate(FUNC(williams_state::defender_video_control_w),state)); | |
531 | space.install_write_handler (0xc3ff, 0xc3ff, write8_delegate(FUNC(williams_state::williams_watchdog_reset_w),state)); | |
532 | space.install_read_bank(0xc400, 0xc4ff, 0, 0x0300, "bank3"); | |
533 | space.install_write_handler(0xc400, 0xc4ff, 0, 0x0300, write8_delegate(FUNC(williams_state::williams_cmos_w),state)); | |
534 | space.install_read_handler (0xc800, 0xcbff, 0, 0x03e0, read8_delegate(FUNC(williams_state::williams_video_counter_r),state)); | |
535 | space.install_readwrite_handler(0xcc00, 0xcc03, 0, 0x03e0, read8_delegate(FUNC(pia6821_device::read), pia_1), write8_delegate(FUNC(pia6821_device::write), pia_1)); | |
536 | space.install_readwrite_handler(0xcc04, 0xcc07, 0, 0x03e0, read8_delegate(FUNC(pia6821_device::read), pia_0), write8_delegate(FUNC(pia6821_device::write), pia_0)); | |
537 | state->membank("bank3")->set_base(space.machine().driver_data<williams_state>()->m_nvram); | |
538 | state->membank("bank4")->set_base(space.machine().driver_data<williams_state>()->m_generic_paletteram_8); | |
539 | 539 | } |
540 | 540 | |
541 | 541 |
r17963 | r17964 | |
---|---|---|
72 | 72 | // rising edge |
73 | 73 | if (vblank_on) |
74 | 74 | { |
75 | address_space *space = screen.machine().device("maincpu")->memory().space(AS_PROGRAM); | |
76 | state->dec8_mxc06_karn_buffer_spriteram_w(*space, 0, 0); | |
75 | address_space &space = *screen.machine().device("maincpu")->memory().space(AS_PROGRAM); | |
76 | state->dec8_mxc06_karn_buffer_spriteram_w(space, 0, 0); | |
77 | 77 | } |
78 | 78 | } |
79 | 79 | |
r17963 | r17964 | |
3527 | 3527 | /* Ghostbusters, Darwin, Oscar use a "Deco 222" custom 6502 for sound. */ |
3528 | 3528 | DRIVER_INIT_MEMBER(dec8_state,deco222) |
3529 | 3529 | { |
3530 | address_space | |
3530 | address_space &space = *machine().device("audiocpu")->memory().space(AS_PROGRAM); | |
3531 | 3531 | int A; |
3532 | 3532 | UINT8 *decrypt; |
3533 | 3533 | UINT8 *rom; |
r17963 | r17964 | |
3536 | 3536 | rom = memregion("audiocpu")->base(); |
3537 | 3537 | decrypt = auto_alloc_array(machine(), UINT8, 0x8000); |
3538 | 3538 | |
3539 | space | |
3539 | space.set_decrypted_region(0x8000, 0xffff, decrypt); | |
3540 | 3540 | |
3541 | 3541 | for (A = 0x8000; A < 0x10000; A++) |
3542 | 3542 | decrypt[A - 0x8000] = (rom[A] & 0x9f) | ((rom[A] & 0x20) << 1) | ((rom[A] & 0x40) >> 1); |
r17963 | r17964 | |
---|---|---|
80 | 80 | |
81 | 81 | static void cage_irq_callback(running_machine &machine, int reason) |
82 | 82 | { |
83 | address_space | |
83 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
84 | 84 | |
85 | 85 | if (reason) |
86 | 86 | atarigen_sound_int_gen(machine.device("maincpu")); |
r17963 | r17964 | |
201 | 201 | |
202 | 202 | if (ACCESSING_BITS_16_23) |
203 | 203 | { |
204 | //cage_reset_w( | |
204 | //cage_reset_w(space, data & 0x00100000); | |
205 | 205 | coin_counter_w(machine(), 0, data & 0x00080000); |
206 | 206 | coin_counter_w(machine(), 1, data & 0x00010000); |
207 | 207 | } |
r17963 | r17964 | |
236 | 236 | if (ACCESSING_BITS_0_15) |
237 | 237 | result |= cage_control_r(machine()); |
238 | 238 | if (ACCESSING_BITS_16_31) |
239 | result |= cage_main_r( | |
239 | result |= cage_main_r(space) << 16; | |
240 | 240 | return result; |
241 | 241 | } |
242 | 242 | |
r17963 | r17964 | |
246 | 246 | if (ACCESSING_BITS_0_15) |
247 | 247 | cage_control_w(machine(), data); |
248 | 248 | if (ACCESSING_BITS_16_31) |
249 | cage_main_w( | |
249 | cage_main_w(space, data >> 16); | |
250 | 250 | } |
251 | 251 | |
252 | 252 | |
r17963 | r17964 | |
271 | 271 | } |
272 | 272 | |
273 | 273 | |
274 | static void tmek_protection_w(address_space | |
274 | static void tmek_protection_w(address_space &space, offs_t offset, UINT16 data) | |
275 | 275 | { |
276 | atarigt_state *state = space | |
276 | atarigt_state *state = space.machine().driver_data<atarigt_state>(); | |
277 | 277 | /* |
278 | 278 | T-Mek init: |
279 | 279 | ($387C0) = $0001 |
r17963 | r17964 | |
282 | 282 | Read ($38488) |
283 | 283 | */ |
284 | 284 | |
285 | if (LOG_PROTECTION) logerror("%06X:Protection W@%06X = %04X\n", space | |
285 | if (LOG_PROTECTION) logerror("%06X:Protection W@%06X = %04X\n", space.device().safe_pcbase(), offset, data); | |
286 | 286 | |
287 | 287 | /* track accesses */ |
288 | 288 | tmek_update_mode(state, offset); |
r17963 | r17964 | |
295 | 295 | } |
296 | 296 | } |
297 | 297 | |
298 | static void tmek_protection_r(address_space | |
298 | static void tmek_protection_r(address_space &space, offs_t offset, UINT16 *data) | |
299 | 299 | { |
300 | atarigt_state *state = space->machine().driver_data<atarigt_state>(); | |
301 | if (LOG_PROTECTION) logerror("%06X:Protection R@%06X\n", space->device().safe_pcbase(), offset); | |
300 | atarigt_state *state = space.machine().driver_data<atarigt_state>(); | |
301 | if (LOG_PROTECTION) logerror("%06X:Protection R@%06X\n", space.device().safe_pcbase(), offset); | |
302 | 302 | |
303 | 303 | /* track accesses */ |
304 | 304 | tmek_update_mode(state, offset); |
r17963 | r17964 | |
362 | 362 | |
363 | 363 | |
364 | 364 | |
365 | static void primrage_protection_w(address_space | |
365 | static void primrage_protection_w(address_space &space, offs_t offset, UINT16 data) | |
366 | 366 | { |
367 | atarigt_state *state = space | |
367 | atarigt_state *state = space.machine().driver_data<atarigt_state>(); | |
368 | 368 | if (LOG_PROTECTION) |
369 | 369 | { |
370 | UINT32 pc = space | |
370 | UINT32 pc = space.device().safe_pcbase(); | |
371 | 371 | switch (pc) |
372 | 372 | { |
373 | 373 | /* protection code from 20f90 - 21000 */ |
r17963 | r17964 | |
400 | 400 | |
401 | 401 | /* catch anything else */ |
402 | 402 | default: |
403 | logerror("%06X:Unknown protection W@%06X = %04X\n", space | |
403 | logerror("%06X:Unknown protection W@%06X = %04X\n", space.device().safe_pcbase(), offset, data); | |
404 | 404 | break; |
405 | 405 | } |
406 | 406 | } |
r17963 | r17964 | |
433 | 433 | |
434 | 434 | |
435 | 435 | |
436 | static void primrage_protection_r(address_space | |
436 | static void primrage_protection_r(address_space &space, offs_t offset, UINT16 *data) | |
437 | 437 | { |
438 | atarigt_state *state = space | |
438 | atarigt_state *state = space.machine().driver_data<atarigt_state>(); | |
439 | 439 | /* track accesses */ |
440 | 440 | primage_update_mode(state, offset); |
441 | 441 | |
442 | 442 | if (LOG_PROTECTION) |
443 | 443 | { |
444 | UINT32 pc = space | |
444 | UINT32 pc = space.device().safe_pcbase(); | |
445 | 445 | UINT32 p1, p2, a6; |
446 | 446 | switch (pc) |
447 | 447 | { |
r17963 | r17964 | |
461 | 461 | case 0x275bc: |
462 | 462 | break; |
463 | 463 | case 0x275cc: |
464 | a6 = space->device().state().state_int(M68K_A6); | |
465 | p1 = (space->read_word(a6+8) << 16) | space->read_word(a6+10); | |
466 | p2 = (space->read_word(a6+12) << 16) | space->read_word(a6+14); | |
464 | a6 = space.device().state().state_int(M68K_A6); | |
465 | p1 = (space.read_word(a6+8) << 16) | space.read_word(a6+10); | |
466 | p2 = (space.read_word(a6+12) << 16) | space.read_word(a6+14); | |
467 | 467 | logerror("Known Protection @ 275BC(%08X, %08X): R@%06X ", p1, p2, offset); |
468 | 468 | break; |
469 | 469 | case 0x275d2: |
r17963 | r17964 | |
479 | 479 | |
480 | 480 | /* protection code from 3d8dc - 3d95a */ |
481 | 481 | case 0x3d8f4: |
482 | a6 = space->device().state().state_int(M68K_A6); | |
483 | p1 = (space->read_word(a6+12) << 16) | space->read_word(a6+14); | |
482 | a6 = space.device().state().state_int(M68K_A6); | |
483 | p1 = (space.read_word(a6+12) << 16) | space.read_word(a6+14); | |
484 | 484 | logerror("Known Protection @ 3D8F4(%08X): R@%06X ", p1, offset); |
485 | 485 | break; |
486 | 486 | case 0x3d8fa: |
r17963 | r17964 | |
490 | 490 | |
491 | 491 | /* protection code from 437fa - 43860 */ |
492 | 492 | case 0x43814: |
493 | a6 = space->device().state().state_int(M68K_A6); | |
494 | p1 = space->read_dword(a6+14) & 0xffffff; | |
493 | a6 = space.device().state().state_int(M68K_A6); | |
494 | p1 = space.read_dword(a6+14) & 0xffffff; | |
495 | 495 | logerror("Known Protection @ 43814(%08X): R@%06X ", p1, offset); |
496 | 496 | break; |
497 | 497 | case 0x4381c: |
r17963 | r17964 | |
504 | 504 | |
505 | 505 | /* catch anything else */ |
506 | 506 | default: |
507 | logerror("%06X:Unknown protection R@%06X\n", space | |
507 | logerror("%06X:Unknown protection R@%06X\n", space.device().safe_pcbase(), offset); | |
508 | 508 | break; |
509 | 509 | } |
510 | 510 | } |
r17963 | r17964 | |
557 | 557 | if (ACCESSING_BITS_16_31) |
558 | 558 | { |
559 | 559 | result = atarigt_colorram_r(address); |
560 | (*m_protection_r)( | |
560 | (*m_protection_r)(space, address, &result); | |
561 | 561 | result32 |= result << 16; |
562 | 562 | } |
563 | 563 | if (ACCESSING_BITS_0_15) |
564 | 564 | { |
565 | 565 | result = atarigt_colorram_r(address + 2); |
566 | (*m_protection_r)( | |
566 | (*m_protection_r)(space, address + 2, &result); | |
567 | 567 | result32 |= result; |
568 | 568 | } |
569 | 569 | |
r17963 | r17964 | |
579 | 579 | { |
580 | 580 | if (!m_ignore_writes) |
581 | 581 | atarigt_colorram_w(address, data >> 16, mem_mask >> 16); |
582 | (*m_protection_w)( | |
582 | (*m_protection_w)(space, address, data >> 16); | |
583 | 583 | } |
584 | 584 | if (ACCESSING_BITS_0_15) |
585 | 585 | { |
586 | 586 | if (!m_ignore_writes) |
587 | 587 | atarigt_colorram_w(address + 2, data, mem_mask); |
588 | (*m_protection_w)( | |
588 | (*m_protection_w)(space, address + 2, data); | |
589 | 589 | } |
590 | 590 | } |
591 | 591 | |
r17963 | r17964 | |
1257 | 1257 | if (pc == 0x25834 || pc == 0x25860) |
1258 | 1258 | logerror("%06X:PFW@%06X = %08X & %08X (src=%06X)\n", space.device().safe_pc(), 0xd72000 + offset*4, data, mem_mask, (UINT32)space.device().state().state_int(M68K_A3) - 2); |
1259 | 1259 | |
1260 | atarigen_playfield32_w( | |
1260 | atarigen_playfield32_w(space, offset, data, mem_mask); | |
1261 | 1261 | } |
1262 | 1262 | |
1263 | 1263 | DRIVER_INIT_MEMBER(atarigt_state,tmek) |
r17963 | r17964 | |
---|---|---|
400 | 400 | |
401 | 401 | DRIVER_INIT_MEMBER(darkmist_state,darkmist) |
402 | 402 | { |
403 | address_space | |
403 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
404 | 404 | int i, len; |
405 | 405 | UINT8 *ROM = machine().root_device().memregion("maincpu")->base(); |
406 | 406 | UINT8 *buffer = auto_alloc_array(machine(), UINT8, 0x10000); |
r17963 | r17964 | |
436 | 436 | decrypt[i] = p; |
437 | 437 | } |
438 | 438 | |
439 | space->set_decrypted_region(0x0000, 0x7fff, decrypt); | |
440 | space->machine().root_device().membank("bank1")->set_base(&ROM[0x010000]); | |
439 | space.set_decrypted_region(0x0000, 0x7fff, decrypt); | |
440 | space.machine().root_device().membank("bank1")->set_base(&ROM[0x010000]); | |
441 | 441 | |
442 | 442 | /* adr line swaps */ |
443 | 443 | ROM = machine().root_device().memregion("user1")->base(); |
r17963 | r17964 | |
---|---|---|
87 | 87 | |
88 | 88 | static READ8_HANDLER( es5503_sample_r ) |
89 | 89 | { |
90 | UINT8 *rom = space->machine().root_device().memregion("es5503")->base(); | |
91 | es5503_device *es5503 = space->machine().device<es5503_device>("es5503"); | |
90 | UINT8 *rom = space.machine().root_device().memregion("es5503")->base(); | |
91 | es5503_device *es5503 = space.machine().device<es5503_device>("es5503"); | |
92 | 92 | |
93 | 93 | return rom[offset + (es5503->get_channel_strobe() * 0x10000)]; |
94 | 94 | } |
r17963 | r17964 | |
100 | 100 | static WRITE16_HANDLER( output_w ) |
101 | 101 | { |
102 | 102 | if (ACCESSING_BITS_0_7) |
103 | logerror("%06x:output_w(%x) = %02x\n", space | |
103 | logerror("%06x:output_w(%x) = %02x\n", space.device().safe_pc(), offset, data); | |
104 | 104 | } |
105 | 105 | |
106 | 106 | |
107 | 107 | static READ16_HANDLER( coin_chip_r ) |
108 | 108 | { |
109 | 109 | if (offset == 1) |
110 | return space->machine().root_device().ioport("COINCHIP")->read(); | |
111 | logerror("%06x:coin_chip_r(%02x) & %04x\n", space->device().safe_pc(), offset, mem_mask); | |
110 | return space.machine().root_device().ioport("COINCHIP")->read(); | |
111 | logerror("%06x:coin_chip_r(%02x) & %04x\n", space.device().safe_pc(), offset, mem_mask); | |
112 | 112 | return 0xffff; |
113 | 113 | } |
114 | 114 | |
115 | 115 | static WRITE16_HANDLER( coin_chip_w ) |
116 | 116 | { |
117 | logerror("%06x:coin_chip_w(%02x) = %04x & %04x\n", space | |
117 | logerror("%06x:coin_chip_w(%02x) = %04x & %04x\n", space.device().safe_pc(), offset, data, mem_mask); | |
118 | 118 | } |
119 | 119 | |
120 | 120 | // inputs at 282000, 282002 (full word) |
r17963 | r17964 | |
---|---|---|
4708 | 4708 | if (data & (~3)) |
4709 | 4709 | logerror("%s: invalid oki bank %02x\n", machine().describe_context(), data); |
4710 | 4710 | |
4711 | // logerror("%04x: oki bank %02x\n", space | |
4711 | // logerror("%04x: oki bank %02x\n", space.device().safe_pc(), data); | |
4712 | 4712 | } |
4713 | 4713 | |
4714 | 4714 | static ADDRESS_MAP_START( twinactn_sound_cpu, AS_PROGRAM, 8, nmk16_state ) |
r17963 | r17964 | |
---|---|---|
115 | 115 | |
116 | 116 | /* expression handlers */ |
117 | 117 | static UINT64 expression_read_memory(void *param, const char *name, expression_space space, UINT32 address, int size); |
118 | static UINT64 expression_read_program_direct(address_space | |
118 | static UINT64 expression_read_program_direct(address_space &space, int opcode, offs_t address, int size); | |
119 | 119 | static UINT64 expression_read_memory_region(running_machine &machine, const char *rgntag, offs_t address, int size); |
120 | 120 | static void expression_write_memory(void *param, const char *name, expression_space space, UINT32 address, int size, UINT64 data); |
121 | static void expression_write_program_direct(address_space | |
121 | static void expression_write_program_direct(address_space &space, int opcode, offs_t address, int size, UINT64 data); | |
122 | 122 | static void expression_write_memory_region(running_machine &machine, const char *rgntag, offs_t address, int size, UINT64 data); |
123 | 123 | static expression_error::error_code expression_validate(void *param, const char *name, expression_space space); |
124 | 124 | |
r17963 | r17964 | |
448 | 448 | address |
449 | 449 | -------------------------------------------------*/ |
450 | 450 | |
451 | int debug_cpu_translate(address_space | |
451 | int debug_cpu_translate(address_space &space, int intention, offs_t *address) | |
452 | 452 | { |
453 | 453 | device_memory_interface *memory; |
454 | if (space->device().interface(memory)) | |
455 | return memory->translate(space->spacenum(), intention, *address); | |
454 | if (space.device().interface(memory)) | |
455 | return memory->translate(space.spacenum(), intention, *address); | |
456 | 456 | return true; |
457 | 457 | } |
458 | 458 | |
r17963 | r17964 | |
466 | 466 | the specified memory space |
467 | 467 | -------------------------------------------------*/ |
468 | 468 | |
469 | UINT8 debug_read_byte(address_space | |
469 | UINT8 debug_read_byte(address_space &space, offs_t address, int apply_translation) | |
470 | 470 | { |
471 | address_space *space = const_cast<address_space *>(_space); | |
472 | debugcpu_private *global = space->machine().debugcpu_data; | |
471 | debugcpu_private *global = space.machine().debugcpu_data; | |
473 | 472 | UINT64 custom; |
474 | 473 | UINT8 result; |
475 | 474 | |
476 | 475 | /* mask against the logical byte mask */ |
477 | address &= space | |
476 | address &= space.logbytemask(); | |
478 | 477 | |
479 | 478 | /* all accesses from this point on are for the debugger */ |
480 | space | |
479 | space.set_debugger_access(global->debugger_access = true); | |
481 | 480 | |
482 | 481 | /* translate if necessary; if not mapped, return 0xff */ |
483 | 482 | if (apply_translation && !debug_cpu_translate(space, TRANSLATE_READ_DEBUG, &address)) |
484 | 483 | result = 0xff; |
485 | 484 | |
486 | 485 | /* if there is a custom read handler, and it returns true, use that value */ |
487 | else if (space | |
486 | else if (space.device().memory().read(space.spacenum(), address, 1, custom)) | |
488 | 487 | result = custom; |
489 | 488 | |
490 | 489 | /* otherwise, call the byte reading function for the translated address */ |
491 | 490 | else |
492 | result = space | |
491 | result = space.read_byte(address); | |
493 | 492 | |
494 | 493 | /* no longer accessing via the debugger */ |
495 | space | |
494 | space.set_debugger_access(global->debugger_access = false); | |
496 | 495 | return result; |
497 | 496 | } |
498 | 497 | |
r17963 | r17964 | |
502 | 501 | specified memory space |
503 | 502 | -------------------------------------------------*/ |
504 | 503 | |
505 | UINT16 debug_read_word(address_space | |
504 | UINT16 debug_read_word(address_space &space, offs_t address, int apply_translation) | |
506 | 505 | { |
507 | address_space *space = const_cast<address_space *>(_space); | |
508 | debugcpu_private *global = space->machine().debugcpu_data; | |
506 | debugcpu_private *global = space.machine().debugcpu_data; | |
509 | 507 | UINT16 result; |
510 | 508 | |
511 | 509 | /* mask against the logical byte mask */ |
512 | address &= space | |
510 | address &= space.logbytemask(); | |
513 | 511 | |
514 | 512 | /* if this is misaligned read, or if there are no word readers, just read two bytes */ |
515 | 513 | if ((address & 1) != 0) |
r17963 | r17964 | |
518 | 516 | UINT8 byte1 = debug_read_byte(space, address + 1, apply_translation); |
519 | 517 | |
520 | 518 | /* based on the endianness, the result is assembled differently */ |
521 | if (space | |
519 | if (space.endianness() == ENDIANNESS_LITTLE) | |
522 | 520 | result = byte0 | (byte1 << 8); |
523 | 521 | else |
524 | 522 | result = byte1 | (byte0 << 8); |
r17963 | r17964 | |
530 | 528 | UINT64 custom; |
531 | 529 | |
532 | 530 | /* all accesses from this point on are for the debugger */ |
533 | space | |
531 | space.set_debugger_access(global->debugger_access = true); | |
534 | 532 | |
535 | 533 | /* translate if necessary; if not mapped, return 0xffff */ |
536 | 534 | if (apply_translation && !debug_cpu_translate(space, TRANSLATE_READ_DEBUG, &address)) |
537 | 535 | result = 0xffff; |
538 | 536 | |
539 | 537 | /* if there is a custom read handler, and it returns true, use that value */ |
540 | else if (space | |
538 | else if (space.device().memory().read(space.spacenum(), address, 2, custom)) | |
541 | 539 | result = custom; |
542 | 540 | |
543 | 541 | /* otherwise, call the byte reading function for the translated address */ |
544 | 542 | else |
545 | result = space | |
543 | result = space.read_word(address); | |
546 | 544 | |
547 | 545 | /* no longer accessing via the debugger */ |
548 | space | |
546 | space.set_debugger_access(global->debugger_access = false); | |
549 | 547 | } |
550 | 548 | |
551 | 549 | return result; |
r17963 | r17964 | |
557 | 555 | specified memory space |
558 | 556 | -------------------------------------------------*/ |
559 | 557 | |
560 | UINT32 debug_read_dword(address_space | |
558 | UINT32 debug_read_dword(address_space &space, offs_t address, int apply_translation) | |
561 | 559 | { |
562 | address_space *space = const_cast<address_space *>(_space); | |
563 | debugcpu_private *global = space->machine().debugcpu_data; | |
560 | debugcpu_private *global = space.machine().debugcpu_data; | |
564 | 561 | UINT32 result; |
565 | 562 | |
566 | 563 | /* mask against the logical byte mask */ |
567 | address &= space | |
564 | address &= space.logbytemask(); | |
568 | 565 | |
569 | 566 | /* if this is misaligned read, or if there are no dword readers, just read two words */ |
570 | 567 | if ((address & 3) != 0) |
r17963 | r17964 | |
573 | 570 | UINT16 word1 = debug_read_word(space, address + 2, apply_translation); |
574 | 571 | |
575 | 572 | /* based on the endianness, the result is assembled differently */ |
576 | if (space | |
573 | if (space.endianness() == ENDIANNESS_LITTLE) | |
577 | 574 | result = word0 | (word1 << 16); |
578 | 575 | else |
579 | 576 | result = word1 | (word0 << 16); |
r17963 | r17964 | |
585 | 582 | UINT64 custom; |
586 | 583 | |
587 | 584 | /* all accesses from this point on are for the debugger */ |
588 | space | |
585 | space.set_debugger_access(global->debugger_access = true); | |
589 | 586 | |
590 | 587 | /* translate if necessary; if not mapped, return 0xffffffff */ |
591 | 588 | if (apply_translation && !debug_cpu_translate(space, TRANSLATE_READ_DEBUG, &address)) |
592 | 589 | result = 0xffffffff; |
593 | 590 | |
594 | 591 | /* if there is a custom read handler, and it returns true, use that value */ |
595 | else if (space | |
592 | else if (space.device().memory().read(space.spacenum(), address, 4, custom)) | |
596 | 593 | result = custom; |
597 | 594 | |
598 | 595 | /* otherwise, call the byte reading function for the translated address */ |
599 | 596 | else |
600 | result = space | |
597 | result = space.read_dword(address); | |
601 | 598 | |
602 | 599 | /* no longer accessing via the debugger */ |
603 | space | |
600 | space.set_debugger_access(global->debugger_access = false); | |
604 | 601 | } |
605 | 602 | |
606 | 603 | return result; |
r17963 | r17964 | |
612 | 609 | specified memory space |
613 | 610 | -------------------------------------------------*/ |
614 | 611 | |
615 | UINT64 debug_read_qword(address_space | |
612 | UINT64 debug_read_qword(address_space &space, offs_t address, int apply_translation) | |
616 | 613 | { |
617 | address_space *space = const_cast<address_space *>(_space); | |
618 | debugcpu_private *global = space->machine().debugcpu_data; | |
614 | debugcpu_private *global = space.machine().debugcpu_data; | |
619 | 615 | UINT64 result; |
620 | 616 | |
621 | 617 | /* mask against the logical byte mask */ |
622 | address &= space | |
618 | address &= space.logbytemask(); | |
623 | 619 | |
624 | 620 | /* if this is misaligned read, or if there are no qword readers, just read two dwords */ |
625 | 621 | if ((address & 7) != 0) |
r17963 | r17964 | |
628 | 624 | UINT32 dword1 = debug_read_dword(space, address + 4, apply_translation); |
629 | 625 | |
630 | 626 | /* based on the endianness, the result is assembled differently */ |
631 | if (space | |
627 | if (space.endianness() == ENDIANNESS_LITTLE) | |
632 | 628 | result = dword0 | ((UINT64)dword1 << 32); |
633 | 629 | else |
634 | 630 | result = dword1 | ((UINT64)dword0 << 32); |
r17963 | r17964 | |
640 | 636 | UINT64 custom; |
641 | 637 | |
642 | 638 | /* all accesses from this point on are for the debugger */ |
643 | space | |
639 | space.set_debugger_access(global->debugger_access = true); | |
644 | 640 | |
645 | 641 | /* translate if necessary; if not mapped, return 0xffffffffffffffff */ |
646 | 642 | if (apply_translation && !debug_cpu_translate(space, TRANSLATE_READ_DEBUG, &address)) |
647 | 643 | result = ~(UINT64)0; |
648 | 644 | |
649 | 645 | /* if there is a custom read handler, and it returns true, use that value */ |
650 | else if (space | |
646 | else if (space.device().memory().read(space.spacenum(), address, 8, custom)) | |
651 | 647 | result = custom; |
652 | 648 | |
653 | 649 | /* otherwise, call the byte reading function for the translated address */ |
654 | 650 | else |
655 | result = space | |
651 | result = space.read_qword(address); | |
656 | 652 | |
657 | 653 | /* no longer accessing via the debugger */ |
658 | space | |
654 | space.set_debugger_access(global->debugger_access = false); | |
659 | 655 | } |
660 | 656 | |
661 | 657 | return result; |
r17963 | r17964 | |
667 | 663 | from the specified memory space |
668 | 664 | -------------------------------------------------*/ |
669 | 665 | |
670 | UINT64 debug_read_memory(address_space | |
666 | UINT64 debug_read_memory(address_space &space, offs_t address, int size, int apply_translation) | |
671 | 667 | { |
672 | 668 | UINT64 result = ~(UINT64)0 >> (64 - 8*size); |
673 | 669 | switch (size) |
r17963 | r17964 | |
686 | 682 | specified memory space |
687 | 683 | -------------------------------------------------*/ |
688 | 684 | |
689 | void debug_write_byte(address_space | |
685 | void debug_write_byte(address_space &space, offs_t address, UINT8 data, int apply_translation) | |
690 | 686 | { |
691 | address_space *space = const_cast<address_space *>(_space); | |
692 | debugcpu_private *global = space->machine().debugcpu_data; | |
687 | debugcpu_private *global = space.machine().debugcpu_data; | |
693 | 688 | |
694 | 689 | /* mask against the logical byte mask */ |
695 | address &= space | |
690 | address &= space.logbytemask(); | |
696 | 691 | |
697 | 692 | /* all accesses from this point on are for the debugger */ |
698 | space | |
693 | space.set_debugger_access(global->debugger_access = true); | |
699 | 694 | |
700 | 695 | /* translate if necessary; if not mapped, we're done */ |
701 | 696 | if (apply_translation && !debug_cpu_translate(space, TRANSLATE_WRITE_DEBUG, &address)) |
702 | 697 | ; |
703 | 698 | |
704 | 699 | /* if there is a custom write handler, and it returns true, use that */ |
705 | else if (space | |
700 | else if (space.device().memory().write(space.spacenum(), address, 1, data)) | |
706 | 701 | ; |
707 | 702 | |
708 | 703 | /* otherwise, call the byte reading function for the translated address */ |
709 | 704 | else |
710 | space | |
705 | space.write_byte(address, data); | |
711 | 706 | |
712 | 707 | /* no longer accessing via the debugger */ |
713 | space | |
708 | space.set_debugger_access(global->debugger_access = false); | |
714 | 709 | global->memory_modified = true; |
715 | 710 | } |
716 | 711 | |
r17963 | r17964 | |
720 | 715 | specified memory space |
721 | 716 | -------------------------------------------------*/ |
722 | 717 | |
723 | void debug_write_word(address_space | |
718 | void debug_write_word(address_space &space, offs_t address, UINT16 data, int apply_translation) | |
724 | 719 | { |
725 | address_space *space = const_cast<address_space *>(_space); | |
726 | debugcpu_private *global = space->machine().debugcpu_data; | |
720 | debugcpu_private *global = space.machine().debugcpu_data; | |
727 | 721 | |
728 | 722 | /* mask against the logical byte mask */ |
729 | address &= space | |
723 | address &= space.logbytemask(); | |
730 | 724 | |
731 | 725 | /* if this is a misaligned write, or if there are no word writers, just read two bytes */ |
732 | 726 | if ((address & 1) != 0) |
733 | 727 | { |
734 | if (space | |
728 | if (space.endianness() == ENDIANNESS_LITTLE) | |
735 | 729 | { |
736 | 730 | debug_write_byte(space, address + 0, data >> 0, apply_translation); |
737 | 731 | debug_write_byte(space, address + 1, data >> 8, apply_translation); |
r17963 | r17964 | |
747 | 741 | else |
748 | 742 | { |
749 | 743 | /* all accesses from this point on are for the debugger */ |
750 | space | |
744 | space.set_debugger_access(global->debugger_access = true); | |
751 | 745 | |
752 | 746 | /* translate if necessary; if not mapped, we're done */ |
753 | 747 | if (apply_translation && !debug_cpu_translate(space, TRANSLATE_WRITE_DEBUG, &address)) |
754 | 748 | ; |
755 | 749 | |
756 | 750 | /* if there is a custom write handler, and it returns true, use that */ |
757 | else if (space | |
751 | else if (space.device().memory().write(space.spacenum(), address, 2, data)) | |
758 | 752 | ; |
759 | 753 | |
760 | 754 | /* otherwise, call the byte reading function for the translated address */ |
761 | 755 | else |
762 | space | |
756 | space.write_word(address, data); | |
763 | 757 | |
764 | 758 | /* no longer accessing via the debugger */ |
765 | space | |
759 | space.set_debugger_access(global->debugger_access = false); | |
766 | 760 | global->memory_modified = true; |
767 | 761 | } |
768 | 762 | } |
r17963 | r17964 | |
773 | 767 | specified memory space |
774 | 768 | -------------------------------------------------*/ |
775 | 769 | |
776 | void debug_write_dword(address_space | |
770 | void debug_write_dword(address_space &space, offs_t address, UINT32 data, int apply_translation) | |
777 | 771 | { |
778 | address_space *space = const_cast<address_space *>(_space); | |
779 | debugcpu_private *global = space->machine().debugcpu_data; | |
772 | debugcpu_private *global = space.machine().debugcpu_data; | |
780 | 773 | |
781 | 774 | /* mask against the logical byte mask */ |
782 | address &= space | |
775 | address &= space.logbytemask(); | |
783 | 776 | |
784 | 777 | /* if this is a misaligned write, or if there are no dword writers, just read two words */ |
785 | 778 | if ((address & 3) != 0) |
786 | 779 | { |
787 | if (space | |
780 | if (space.endianness() == ENDIANNESS_LITTLE) | |
788 | 781 | { |
789 | 782 | debug_write_word(space, address + 0, data >> 0, apply_translation); |
790 | 783 | debug_write_word(space, address + 2, data >> 16, apply_translation); |
r17963 | r17964 | |
800 | 793 | else |
801 | 794 | { |
802 | 795 | /* all accesses from this point on are for the debugger */ |
803 | space | |
796 | space.set_debugger_access(global->debugger_access = true); | |
804 | 797 | |
805 | 798 | /* translate if necessary; if not mapped, we're done */ |
806 | 799 | if (apply_translation && !debug_cpu_translate(space, TRANSLATE_WRITE_DEBUG, &address)) |
807 | 800 | ; |
808 | 801 | |
809 | 802 | /* if there is a custom write handler, and it returns true, use that */ |
810 | else if (space | |
803 | else if (space.device().memory().write(space.spacenum(), address, 4, data)) | |
811 | 804 | ; |
812 | 805 | |
813 | 806 | /* otherwise, call the byte reading function for the translated address */ |
814 | 807 | else |
815 | space | |
808 | space.write_dword(address, data); | |
816 | 809 | |
817 | 810 | /* no longer accessing via the debugger */ |
818 | space | |
811 | space.set_debugger_access(global->debugger_access = false); | |
819 | 812 | global->memory_modified = true; |
820 | 813 | } |
821 | 814 | } |
r17963 | r17964 | |
826 | 819 | specified memory space |
827 | 820 | -------------------------------------------------*/ |
828 | 821 | |
829 | void debug_write_qword(address_space | |
822 | void debug_write_qword(address_space &space, offs_t address, UINT64 data, int apply_translation) | |
830 | 823 | { |
831 | address_space *space = const_cast<address_space *>(_space); | |
832 | debugcpu_private *global = space->machine().debugcpu_data; | |
824 | debugcpu_private *global = space.machine().debugcpu_data; | |
833 | 825 | |
834 | 826 | /* mask against the logical byte mask */ |
835 | address &= space | |
827 | address &= space.logbytemask(); | |
836 | 828 | |
837 | 829 | /* if this is a misaligned write, or if there are no qword writers, just read two dwords */ |
838 | 830 | if ((address & 7) != 0) |
839 | 831 | { |
840 | if (space | |
832 | if (space.endianness() == ENDIANNESS_LITTLE) | |
841 | 833 | { |
842 | 834 | debug_write_dword(space, address + 0, data >> 0, apply_translation); |
843 | 835 | debug_write_dword(space, address + 4, data >> 32, apply_translation); |
r17963 | r17964 | |
853 | 845 | else |
854 | 846 | { |
855 | 847 | /* all accesses from this point on are for the debugger */ |
856 | space | |
848 | space.set_debugger_access(global->debugger_access = true); | |
857 | 849 | |
858 | 850 | /* translate if necessary; if not mapped, we're done */ |
859 | 851 | if (apply_translation && !debug_cpu_translate(space, TRANSLATE_WRITE_DEBUG, &address)) |
860 | 852 | ; |
861 | 853 | |
862 | 854 | /* if there is a custom write handler, and it returns true, use that */ |
863 | else if (space | |
855 | else if (space.device().memory().write(space.spacenum(), address, 8, data)) | |
864 | 856 | ; |
865 | 857 | |
866 | 858 | /* otherwise, call the byte reading function for the translated address */ |
867 | 859 | else |
868 | space | |
860 | space.write_qword(address, data); | |
869 | 861 | |
870 | 862 | /* no longer accessing via the debugger */ |
871 | space | |
863 | space.set_debugger_access(global->debugger_access = false); | |
872 | 864 | global->memory_modified = true; |
873 | 865 | } |
874 | 866 | } |
r17963 | r17964 | |
879 | 871 | to the specified memory space |
880 | 872 | -------------------------------------------------*/ |
881 | 873 | |
882 | void debug_write_memory(address_space | |
874 | void debug_write_memory(address_space &space, offs_t address, UINT64 data, int size, int apply_translation) | |
883 | 875 | { |
884 | 876 | switch (size) |
885 | 877 | { |
r17963 | r17964 | |
896 | 888 | the given offset from opcode space |
897 | 889 | -------------------------------------------------*/ |
898 | 890 | |
899 | UINT64 debug_read_opcode(address_space | |
891 | UINT64 debug_read_opcode(address_space &space, offs_t address, int size, int arg) | |
900 | 892 | { |
901 | address_space *space = const_cast<address_space *>(_space); | |
902 | 893 | UINT64 result = ~(UINT64)0 & (~(UINT64)0 >> (64 - 8*size)), result2; |
903 | debugcpu_private *global = space | |
894 | debugcpu_private *global = space.machine().debugcpu_data; | |
904 | 895 | |
905 | 896 | /* keep in logical range */ |
906 | address &= space | |
897 | address &= space.logbytemask(); | |
907 | 898 | |
908 | 899 | /* return early if we got the result directly */ |
909 | space | |
900 | space.set_debugger_access(global->debugger_access = true); | |
910 | 901 | device_memory_interface *memory; |
911 | if (space | |
902 | if (space.device().interface(memory) && memory->readop(address, size, result2)) | |
912 | 903 | { |
913 | space | |
904 | space.set_debugger_access(global->debugger_access = false); | |
914 | 905 | return result2; |
915 | 906 | } |
916 | 907 | |
917 | 908 | /* if we're bigger than the address bus, break into smaller pieces */ |
918 | if (size > space | |
909 | if (size > space.data_width() / 8) | |
919 | 910 | { |
920 | 911 | int halfsize = size / 2; |
921 | 912 | UINT64 r0 = debug_read_opcode(space, address + 0, halfsize, arg); |
922 | 913 | UINT64 r1 = debug_read_opcode(space, address + halfsize, halfsize, arg); |
923 | 914 | |
924 | if (space | |
915 | if (space.endianness() == ENDIANNESS_LITTLE) | |
925 | 916 | return r0 | (r1 << (8 * halfsize)); |
926 | 917 | else |
927 | 918 | return r1 | (r0 << (8 * halfsize)); |
r17963 | r17964 | |
932 | 923 | return result; |
933 | 924 | |
934 | 925 | /* keep in physical range */ |
935 | address &= space | |
926 | address &= space.bytemask(); | |
936 | 927 | offs_t addrxor = 0; |
937 | switch (space | |
928 | switch (space.data_width() / 8 * 10 + size) | |
938 | 929 | { |
939 | 930 | /* dump opcodes in bytes from a byte-sized bus */ |
940 | 931 | case 11: |
r17963 | r17964 | |
942 | 933 | |
943 | 934 | /* dump opcodes in bytes from a word-sized bus */ |
944 | 935 | case 21: |
945 | addrxor = (space | |
936 | addrxor = (space.endianness() == ENDIANNESS_LITTLE) ? BYTE_XOR_LE(0) : BYTE_XOR_BE(0); | |
946 | 937 | break; |
947 | 938 | |
948 | 939 | /* dump opcodes in words from a word-sized bus */ |
r17963 | r17964 | |
951 | 942 | |
952 | 943 | /* dump opcodes in bytes from a dword-sized bus */ |
953 | 944 | case 41: |
954 | addrxor = (space | |
945 | addrxor = (space.endianness() == ENDIANNESS_LITTLE) ? BYTE4_XOR_LE(0) : BYTE4_XOR_BE(0); | |
955 | 946 | break; |
956 | 947 | |
957 | 948 | /* dump opcodes in words from a dword-sized bus */ |
958 | 949 | case 42: |
959 | addrxor = (space | |
950 | addrxor = (space.endianness() == ENDIANNESS_LITTLE) ? WORD_XOR_LE(0) : WORD_XOR_BE(0); | |
960 | 951 | break; |
961 | 952 | |
962 | 953 | /* dump opcodes in dwords from a dword-sized bus */ |
r17963 | r17964 | |
965 | 956 | |
966 | 957 | /* dump opcodes in bytes from a qword-sized bus */ |
967 | 958 | case 81: |
968 | addrxor = (space | |
959 | addrxor = (space.endianness() == ENDIANNESS_LITTLE) ? BYTE8_XOR_LE(0) : BYTE8_XOR_BE(0); | |
969 | 960 | break; |
970 | 961 | |
971 | 962 | /* dump opcodes in words from a qword-sized bus */ |
972 | 963 | case 82: |
973 | addrxor = (space | |
964 | addrxor = (space.endianness() == ENDIANNESS_LITTLE) ? WORD2_XOR_LE(0) : WORD2_XOR_BE(0); | |
974 | 965 | break; |
975 | 966 | |
976 | 967 | /* dump opcodes in dwords from a qword-sized bus */ |
977 | 968 | case 84: |
978 | addrxor = (space | |
969 | addrxor = (space.endianness() == ENDIANNESS_LITTLE) ? DWORD_XOR_LE(0) : DWORD_XOR_BE(0); | |
979 | 970 | break; |
980 | 971 | |
981 | 972 | /* dump opcodes in qwords from a qword-sized bus */ |
r17963 | r17964 | |
983 | 974 | break; |
984 | 975 | |
985 | 976 | default: |
986 | fatalerror("debug_read_opcode: unknown type = %d\n", space | |
977 | fatalerror("debug_read_opcode: unknown type = %d\n", space.data_width() / 8 * 10 + size); | |
987 | 978 | break; |
988 | 979 | } |
989 | 980 | |
990 | 981 | /* turn on debugger access */ |
991 | 982 | if (!global->debugger_access) |
992 | space | |
983 | space.set_debugger_access(global->debugger_access = true); | |
993 | 984 | |
994 | 985 | /* switch off the size and handle unaligned accesses */ |
995 | 986 | switch (size) |
996 | 987 | { |
997 | 988 | case 1: |
998 | result = (arg) ? space | |
989 | result = (arg) ? space.direct().read_raw_byte(address, addrxor) : space.direct().read_decrypted_byte(address, addrxor); | |
999 | 990 | break; |
1000 | 991 | |
1001 | 992 | case 2: |
1002 | result = (arg) ? space | |
993 | result = (arg) ? space.direct().read_raw_word(address & ~1, addrxor) : space.direct().read_decrypted_word(address & ~1, addrxor); | |
1003 | 994 | if ((address & 1) != 0) |
1004 | 995 | { |
1005 | result2 = (arg) ? space->direct().read_raw_word((address & ~1) + 2, addrxor) : space->direct().read_decrypted_word((address & ~1) + 2, addrxor); | |
1006 | if (space->endianness() == ENDIANNESS_LITTLE) | |
996 | result2 = (arg) ? space.direct().read_raw_word((address & ~1) + 2, addrxor) : space.direct().read_decrypted_word((address & ~1) + 2, addrxor); | |
997 | if (space.endianness() == ENDIANNESS_LITTLE) | |
1007 | 998 | result = (result >> (8 * (address & 1))) | (result2 << (16 - 8 * (address & 1))); |
1008 | 999 | else |
1009 | 1000 | result = (result << (8 * (address & 1))) | (result2 >> (16 - 8 * (address & 1))); |
r17963 | r17964 | |
1012 | 1003 | break; |
1013 | 1004 | |
1014 | 1005 | case 4: |
1015 | result = (arg) ? space | |
1006 | result = (arg) ? space.direct().read_raw_dword(address & ~3, addrxor) : space.direct().read_decrypted_dword(address & ~3, addrxor); | |
1016 | 1007 | if ((address & 3) != 0) |
1017 | 1008 | { |
1018 | result2 = (arg) ? space->direct().read_raw_dword((address & ~3) + 4, addrxor) : space->direct().read_decrypted_dword((address & ~3) + 4, addrxor); | |
1019 | if (space->endianness() == ENDIANNESS_LITTLE) | |
1009 | result2 = (arg) ? space.direct().read_raw_dword((address & ~3) + 4, addrxor) : space.direct().read_decrypted_dword((address & ~3) + 4, addrxor); | |
1010 | if (space.endianness() == ENDIANNESS_LITTLE) | |
1020 | 1011 | result = (result >> (8 * (address & 3))) | (result2 << (32 - 8 * (address & 3))); |
1021 | 1012 | else |
1022 | 1013 | result = (result << (8 * (address & 3))) | (result2 >> (32 - 8 * (address & 3))); |
r17963 | r17964 | |
1025 | 1016 | break; |
1026 | 1017 | |
1027 | 1018 | case 8: |
1028 | result = (arg) ? space | |
1019 | result = (arg) ? space.direct().read_raw_qword(address & ~7, addrxor) : space.direct().read_decrypted_qword(address & ~7, addrxor); | |
1029 | 1020 | if ((address & 7) != 0) |
1030 | 1021 | { |
1031 | result2 = (arg) ? space->direct().read_raw_qword((address & ~7) + 8, addrxor) : space->direct().read_decrypted_qword((address & ~7) + 8, addrxor); | |
1032 | if (space->endianness() == ENDIANNESS_LITTLE) | |
1022 | result2 = (arg) ? space.direct().read_raw_qword((address & ~7) + 8, addrxor) : space.direct().read_decrypted_qword((address & ~7) + 8, addrxor); | |
1023 | if (space.endianness() == ENDIANNESS_LITTLE) | |
1033 | 1024 | result = (result >> (8 * (address & 7))) | (result2 << (64 - 8 * (address & 7))); |
1034 | 1025 | else |
1035 | 1026 | result = (result << (8 * (address & 7))) | (result2 >> (64 - 8 * (address & 7))); |
r17963 | r17964 | |
1038 | 1029 | } |
1039 | 1030 | |
1040 | 1031 | /* no longer accessing via the debugger */ |
1041 | space | |
1032 | space.set_debugger_access(global->debugger_access = false); | |
1042 | 1033 | return result; |
1043 | 1034 | } |
1044 | 1035 | |
r17963 | r17964 | |
1178 | 1169 | device = debug_cpu_get_visible_cpu(machine); |
1179 | 1170 | space = device->memory().space(AS_PROGRAM + (spacenum - EXPSPACE_PROGRAM_LOGICAL)); |
1180 | 1171 | if (space != NULL) |
1181 | result = debug_read_memory(space, space->address_to_byte(address), size, true); | |
1172 | result = debug_read_memory(*space, space->address_to_byte(address), size, true); | |
1182 | 1173 | break; |
1183 | 1174 | |
1184 | 1175 | case EXPSPACE_PROGRAM_PHYSICAL: |
r17963 | r17964 | |
1191 | 1182 | device = debug_cpu_get_visible_cpu(machine); |
1192 | 1183 | space = device->memory().space(AS_PROGRAM + (spacenum - EXPSPACE_PROGRAM_PHYSICAL)); |
1193 | 1184 | if (space != NULL) |
1194 | result = debug_read_memory(space, space->address_to_byte(address), size, false); | |
1185 | result = debug_read_memory(*space, space->address_to_byte(address), size, false); | |
1195 | 1186 | break; |
1196 | 1187 | |
1197 | 1188 | case EXPSPACE_OPCODE: |
r17963 | r17964 | |
1200 | 1191 | device = expression_get_device(machine, name); |
1201 | 1192 | if (device == NULL) |
1202 | 1193 | device = debug_cpu_get_visible_cpu(machine); |
1203 | result = expression_read_program_direct(device->memory().space(AS_PROGRAM), (spacenum == EXPSPACE_OPCODE), address, size); | |
1194 | result = expression_read_program_direct(*device->memory().space(AS_PROGRAM), (spacenum == EXPSPACE_OPCODE), address, size); | |
1204 | 1195 | break; |
1205 | 1196 | |
1206 | 1197 | case EXPSPACE_REGION: |
r17963 | r17964 | |
1221 | 1212 | directly from an opcode or RAM pointer |
1222 | 1213 | -------------------------------------------------*/ |
1223 | 1214 | |
1224 | static UINT64 expression_read_program_direct(address_space | |
1215 | static UINT64 expression_read_program_direct(address_space &space, int opcode, offs_t address, int size) | |
1225 | 1216 | { |
1226 | address_space *space = const_cast<address_space *>(_space); | |
1227 | 1217 | UINT64 result = ~(UINT64)0 >> (64 - 8*size); |
1218 | UINT8 *base; | |
1228 | 1219 | |
1229 | if (space != NULL) | |
1220 | /* adjust the address into a byte address, but not if being called recursively */ | |
1221 | if ((opcode & 2) == 0) | |
1222 | address = space.address_to_byte(address); | |
1223 | ||
1224 | /* call ourself recursively until we are byte-sized */ | |
1225 | if (size > 1) | |
1230 | 1226 | { |
1231 | UINT8 *base; | |
1227 | int halfsize = size / 2; | |
1228 | UINT64 r0, r1; | |
1232 | 1229 | |
1233 | /* adjust the address into a byte address, but not if being called recursively */ | |
1234 | if ((opcode & 2) == 0) | |
1235 | address = space->address_to_byte(address); | |
1230 | /* read each half, from lower address to upper address */ | |
1231 | r0 = expression_read_program_direct(space, opcode | 2, address + 0, halfsize); | |
1232 | r1 = expression_read_program_direct(space, opcode | 2, address + halfsize, halfsize); | |
1236 | 1233 | |
1237 | /* call ourself recursively until we are byte-sized */ | |
1238 | if (size > 1) | |
1239 | { | |
1240 | int halfsize = size / 2; | |
1241 | UINT64 r0, r1; | |
1234 | /* assemble based on the target endianness */ | |
1235 | if (space.endianness() == ENDIANNESS_LITTLE) | |
1236 | result = r0 | (r1 << (8 * halfsize)); | |
1237 | else | |
1238 | result = r1 | (r0 << (8 * halfsize)); | |
1239 | } | |
1242 | 1240 | |
1243 | /* read each half, from lower address to upper address */ | |
1244 | r0 = expression_read_program_direct(space, opcode | 2, address + 0, halfsize); | |
1245 | r1 = expression_read_program_direct(space, opcode | 2, address + halfsize, halfsize); | |
1241 | /* handle the byte-sized final requests */ | |
1242 | else | |
1243 | { | |
1244 | /* lowmask specified which address bits are within the databus width */ | |
1245 | offs_t lowmask = space.data_width() / 8 - 1; | |
1246 | 1246 | |
1247 | /* assemble based on the target endianness */ | |
1248 | if (space->endianness() == ENDIANNESS_LITTLE) | |
1249 | result = r0 | (r1 << (8 * halfsize)); | |
1250 | else | |
1251 | result = r1 | (r0 << (8 * halfsize)); | |
1252 | } | |
1253 | ||
1254 | /* handle the byte-sized final requests */ | |
1247 | /* get the base of memory, aligned to the address minus the lowbits */ | |
1248 | if (opcode & 1) | |
1249 | base = (UINT8 *)space.direct().read_decrypted_ptr(address & ~lowmask); | |
1255 | 1250 | else |
1256 | { | |
1257 | /* lowmask specified which address bits are within the databus width */ | |
1258 | offs_t lowmask = space->data_width() / 8 - 1; | |
1251 | base = (UINT8 *)space.get_read_ptr(address & ~lowmask); | |
1259 | 1252 | |
1260 | /* get the base of memory, aligned to the address minus the lowbits */ | |
1261 | if (opcode & 1) | |
1262 | base = (UINT8 *)space->direct().read_decrypted_ptr(address & ~lowmask); | |
1253 | /* if we have a valid base, return the appropriate byte */ | |
1254 | if (base != NULL) | |
1255 | { | |
1256 | if (space.endianness() == ENDIANNESS_LITTLE) | |
1257 | result = base[BYTE8_XOR_LE(address) & lowmask]; | |
1263 | 1258 | else |
1264 | base = (UINT8 *)space->get_read_ptr(address & ~lowmask); | |
1265 | ||
1266 | /* if we have a valid base, return the appropriate byte */ | |
1267 | if (base != NULL) | |
1268 | { | |
1269 | if (space->endianness() == ENDIANNESS_LITTLE) | |
1270 | result = base[BYTE8_XOR_LE(address) & lowmask]; | |
1271 | else | |
1272 | result = base[BYTE8_XOR_BE(address) & lowmask]; | |
1273 | } | |
1259 | result = base[BYTE8_XOR_BE(address) & lowmask]; | |
1274 | 1260 | } |
1275 | 1261 | } |
1276 | 1262 | return result; |
r17963 | r17964 | |
1349 | 1335 | device = debug_cpu_get_visible_cpu(machine); |
1350 | 1336 | space = device->memory().space(AS_PROGRAM + (spacenum - EXPSPACE_PROGRAM_LOGICAL)); |
1351 | 1337 | if (space != NULL) |
1352 | debug_write_memory(space, space->address_to_byte(address), data, size, true); | |
1338 | debug_write_memory(*space, space->address_to_byte(address), data, size, true); | |
1353 | 1339 | break; |
1354 | 1340 | |
1355 | 1341 | case EXPSPACE_PROGRAM_PHYSICAL: |
r17963 | r17964 | |
1362 | 1348 | device = debug_cpu_get_visible_cpu(machine); |
1363 | 1349 | space = device->memory().space(AS_PROGRAM + (spacenum - EXPSPACE_PROGRAM_PHYSICAL)); |
1364 | 1350 | if (space != NULL) |
1365 | debug_write_memory(space, space->address_to_byte(address), data, size, false); | |
1351 | debug_write_memory(*space, space->address_to_byte(address), data, size, false); | |
1366 | 1352 | break; |
1367 | 1353 | |
1368 | 1354 | case EXPSPACE_OPCODE: |
r17963 | r17964 | |
1371 | 1357 | device = expression_get_device(machine, name); |
1372 | 1358 | if (device == NULL) |
1373 | 1359 | device = debug_cpu_get_visible_cpu(machine); |
1374 | expression_write_program_direct(device->memory().space(AS_PROGRAM), (spacenum == EXPSPACE_OPCODE), address, size, data); | |
1360 | expression_write_program_direct(*device->memory().space(AS_PROGRAM), (spacenum == EXPSPACE_OPCODE), address, size, data); | |
1375 | 1361 | break; |
1376 | 1362 | |
1377 | 1363 | case EXPSPACE_REGION: |
r17963 | r17964 | |
1391 | 1377 | directly to an opcode or RAM pointer |
1392 | 1378 | -------------------------------------------------*/ |
1393 | 1379 | |
1394 | static void expression_write_program_direct(address_space | |
1380 | static void expression_write_program_direct(address_space &space, int opcode, offs_t address, int size, UINT64 data) | |
1395 | 1381 | { |
1396 | address_space *space = const_cast<address_space *>(_space); | |
1397 | if (space != NULL) | |
1398 | { | |
1399 | debugcpu_private *global = space->machine().debugcpu_data; | |
1400 | UINT8 *base; | |
1382 | debugcpu_private *global = space.machine().debugcpu_data; | |
1383 | UINT8 *base; | |
1401 | 1384 | |
1402 | /* adjust the address into a byte address, but not if being called recursively */ | |
1403 | if ((opcode & 2) == 0) | |
1404 | address = space->address_to_byte(address); | |
1385 | /* adjust the address into a byte address, but not if being called recursively */ | |
1386 | if ((opcode & 2) == 0) | |
1387 | address = space.address_to_byte(address); | |
1405 | 1388 | |
1406 | /* call ourself recursively until we are byte-sized */ | |
1407 | if (size > 1) | |
1389 | /* call ourself recursively until we are byte-sized */ | |
1390 | if (size > 1) | |
1391 | { | |
1392 | int halfsize = size / 2; | |
1393 | UINT64 r0, r1, halfmask; | |
1394 | ||
1395 | /* break apart based on the target endianness */ | |
1396 | halfmask = ~(UINT64)0 >> (64 - 8 * halfsize); | |
1397 | if (space.endianness() == ENDIANNESS_LITTLE) | |
1408 | 1398 | { |
1409 | int halfsize = size / 2; | |
1410 | UINT64 r0, r1, halfmask; | |
1399 | r0 = data & halfmask; | |
1400 | r1 = (data >> (8 * halfsize)) & halfmask; | |
1401 | } | |
1402 | else | |
1403 | { | |
1404 | r0 = (data >> (8 * halfsize)) & halfmask; | |
1405 | r1 = data & halfmask; | |
1406 | } | |
1411 | 1407 | |
1412 | /* break apart based on the target endianness */ | |
1413 | halfmask = ~(UINT64)0 >> (64 - 8 * halfsize); | |
1414 | if (space->endianness() == ENDIANNESS_LITTLE) | |
1415 | { | |
1416 | r0 = data & halfmask; | |
1417 | r1 = (data >> (8 * halfsize)) & halfmask; | |
1418 | } | |
1419 | else | |
1420 | { | |
1421 | r0 = (data >> (8 * halfsize)) & halfmask; | |
1422 | r1 = data & halfmask; | |
1423 | } | |
1408 | /* write each half, from lower address to upper address */ | |
1409 | expression_write_program_direct(space, opcode | 2, address + 0, halfsize, r0); | |
1410 | expression_write_program_direct(space, opcode | 2, address + halfsize, halfsize, r1); | |
1411 | } | |
1424 | 1412 | |
1425 | /* write each half, from lower address to upper address */ | |
1426 | expression_write_program_direct(space, opcode | 2, address + 0, halfsize, r0); | |
1427 | expression_write_program_direct(space, opcode | 2, address + halfsize, halfsize, r1); | |
1428 | } | |
1413 | /* handle the byte-sized final case */ | |
1414 | else | |
1415 | { | |
1416 | /* lowmask specified which address bits are within the databus width */ | |
1417 | offs_t lowmask = space.data_width() / 8 - 1; | |
1429 | 1418 | |
1430 | /* handle the byte-sized final case */ | |
1419 | /* get the base of memory, aligned to the address minus the lowbits */ | |
1420 | if (opcode & 1) | |
1421 | base = (UINT8 *)space.direct().read_decrypted_ptr(address & ~lowmask); | |
1431 | 1422 | else |
1432 | { | |
1433 | /* lowmask specified which address bits are within the databus width */ | |
1434 | offs_t lowmask = space->data_width() / 8 - 1; | |
1423 | base = (UINT8 *)space.get_read_ptr(address & ~lowmask); | |
1435 | 1424 | |
1436 | /* get the base of memory, aligned to the address minus the lowbits */ | |
1437 | if (opcode & 1) | |
1438 | base = (UINT8 *)space->direct().read_decrypted_ptr(address & ~lowmask); | |
1425 | /* if we have a valid base, write the appropriate byte */ | |
1426 | if (base != NULL) | |
1427 | { | |
1428 | if (space.endianness() == ENDIANNESS_LITTLE) | |
1429 | base[BYTE8_XOR_LE(address) & lowmask] = data; | |
1439 | 1430 | else |
1440 | base = (UINT8 *)space->get_read_ptr(address & ~lowmask); | |
1441 | ||
1442 | /* if we have a valid base, write the appropriate byte */ | |
1443 | if (base != NULL) | |
1444 | { | |
1445 | if (space->endianness() == ENDIANNESS_LITTLE) | |
1446 | base[BYTE8_XOR_LE(address) & lowmask] = data; | |
1447 | else | |
1448 | base[BYTE8_XOR_BE(address) & lowmask] = data; | |
1449 | global->memory_modified = true; | |
1450 | } | |
1431 | base[BYTE8_XOR_BE(address) & lowmask] = data; | |
1432 | global->memory_modified = true; | |
1451 | 1433 | } |
1452 | 1434 | } |
1453 | 1435 | } |
r17963 | r17964 | |
2057 | 2039 | #ifdef MAME_DEBUG |
2058 | 2040 | if (m_memory != NULL && m_disasm != NULL) |
2059 | 2041 | { |
2060 | address_space *space = m_memory->space(AS_PROGRAM); | |
2061 | int bytes = space->address_to_byte(result & DASMFLAG_LENGTHMASK); | |
2042 | address_space &space = *m_memory->space(AS_PROGRAM); | |
2043 | int bytes = space.address_to_byte(result & DASMFLAG_LENGTHMASK); | |
2062 | 2044 | assert(bytes >= m_disasm->min_opcode_bytes()); |
2063 | 2045 | assert(bytes <= m_disasm->max_opcode_bytes()); |
2064 | 2046 | (void) bytes; // appease compiler |
r17963 | r17964 | |
2684 | 2666 | return 0; |
2685 | 2667 | |
2686 | 2668 | // no program interface, just fail |
2687 | address_space *space = m_memory->space(AS_PROGRAM); | |
2688 | if (space == NULL) | |
2689 | return 0; | |
2669 | address_space &space = *m_memory->space(AS_PROGRAM); | |
2690 | 2670 | |
2691 | 2671 | // zero out the buffers |
2692 | 2672 | UINT8 opbuf[64], argbuf[64]; |
r17963 | r17964 | |
2703 | 2683 | |
2704 | 2684 | // disassemble and then convert to bytes |
2705 | 2685 | char buff[256]; |
2706 | int numbytes = disassemble(buff, address & space->logaddrmask(), opbuf, argbuf) & DASMFLAG_LENGTHMASK; | |
2707 | numbytes = space->address_to_byte(numbytes); | |
2686 | int numbytes = disassemble(buff, address & space.logaddrmask(), opbuf, argbuf) & DASMFLAG_LENGTHMASK; | |
2687 | numbytes = space.address_to_byte(numbytes); | |
2708 | 2688 | |
2709 | 2689 | // return a CRC of the resulting bytes |
2710 | 2690 | return crc32(0, argbuf, numbytes); |
r17963 | r17964 | |
3036 | 3016 | assert(m_memory != NULL && m_disasm != NULL); |
3037 | 3017 | |
3038 | 3018 | // determine the adjusted PC |
3039 | address_space *space = m_memory->space(AS_PROGRAM); | |
3040 | offs_t pcbyte = space->address_to_byte(pc) & space->bytemask(); | |
3019 | address_space &space = *m_memory->space(AS_PROGRAM); | |
3020 | offs_t pcbyte = space.address_to_byte(pc) & space.bytemask(); | |
3041 | 3021 | |
3042 | 3022 | // fetch the bytes up to the maximum |
3043 | 3023 | UINT8 opbuf[64], argbuf[64]; |
r17963 | r17964 | |
3100 | 3080 | |
3101 | 3081 | UINT64 device_debug::get_logunmap(symbol_table &table, void *ref) |
3102 | 3082 | { |
3103 | address_space *space = reinterpret_cast<address_space *>(table.globalref()); | |
3104 | return space->log_unmap(); | |
3083 | address_space &space = *reinterpret_cast<address_space *>(table.globalref()); | |
3084 | return space.log_unmap(); | |
3105 | 3085 | } |
3106 | 3086 | |
3107 | 3087 | |
r17963 | r17964 | |
3112 | 3092 | |
3113 | 3093 | void device_debug::set_logunmap(symbol_table &table, void *ref, UINT64 value) |
3114 | 3094 | { |
3115 | address_space *space = reinterpret_cast<address_space *>(table.globalref()); | |
3116 | space->set_log_unmap(value ? true : false); | |
3095 | address_space &space = *reinterpret_cast<address_space *>(table.globalref()); | |
3096 | space.set_log_unmap(value ? true : false); | |
3117 | 3097 | } |
3118 | 3098 | |
3119 | 3099 |
r17963 | r17964 | |
---|---|---|
627 | 627 | { |
628 | 628 | switch (size) |
629 | 629 | { |
630 | case 1: data = debug_read_byte(source.m_space, offs, !m_no_translation); break; | |
631 | case 2: data = debug_read_word(source.m_space, offs, !m_no_translation); break; | |
632 | case 4: data = debug_read_dword(source.m_space, offs, !m_no_translation); break; | |
633 | case 8: data = debug_read_qword(source.m_space, offs, !m_no_translation); break; | |
630 | case 1: data = debug_read_byte(*source.m_space, offs, !m_no_translation); break; | |
631 | case 2: data = debug_read_word(*source.m_space, offs, !m_no_translation); break; | |
632 | case 4: data = debug_read_dword(*source.m_space, offs, !m_no_translation); break; | |
633 | case 8: data = debug_read_qword(*source.m_space, offs, !m_no_translation); break; | |
634 | 634 | } |
635 | 635 | } |
636 | 636 | return ismapped; |
r17963 | r17964 | |
674 | 674 | { |
675 | 675 | switch (size) |
676 | 676 | { |
677 | case 1: debug_write_byte(source.m_space, offs, data, !m_no_translation); break; | |
678 | case 2: debug_write_word(source.m_space, offs, data, !m_no_translation); break; | |
679 | case 4: debug_write_dword(source.m_space, offs, data, !m_no_translation); break; | |
680 | case 8: debug_write_qword(source.m_space, offs, data, !m_no_translation); break; | |
677 | case 1: debug_write_byte(*source.m_space, offs, data, !m_no_translation); break; | |
678 | case 2: debug_write_word(*source.m_space, offs, data, !m_no_translation); break; | |
679 | case 4: debug_write_dword(*source.m_space, offs, data, !m_no_translation); break; | |
680 | case 8: debug_write_qword(*source.m_space, offs, data, !m_no_translation); break; | |
681 | 681 | } |
682 | 682 | return; |
683 | 683 | } |
r17963 | r17964 | |
---|---|---|
422 | 422 | /* ----- debugger memory accessors ----- */ |
423 | 423 | |
424 | 424 | /* return the physical address corresponding to the given logical address */ |
425 | int debug_cpu_translate(address_space | |
425 | int debug_cpu_translate(address_space &space, int intention, offs_t *address); | |
426 | 426 | |
427 | 427 | /* return a byte from the the specified memory space */ |
428 | UINT8 debug_read_byte(address_space | |
428 | UINT8 debug_read_byte(address_space &space, offs_t address, int apply_translation); | |
429 | 429 | |
430 | 430 | /* return a word from the the specified memory space */ |
431 | UINT16 debug_read_word(address_space | |
431 | UINT16 debug_read_word(address_space &space, offs_t address, int apply_translation); | |
432 | 432 | |
433 | 433 | /* return a dword from the the specified memory space */ |
434 | UINT32 debug_read_dword(address_space | |
434 | UINT32 debug_read_dword(address_space &space, offs_t address, int apply_translation); | |
435 | 435 | |
436 | 436 | /* return a qword from the the specified memory space */ |
437 | UINT64 debug_read_qword(address_space | |
437 | UINT64 debug_read_qword(address_space &space, offs_t address, int apply_translation); | |
438 | 438 | |
439 | 439 | /* return 1,2,4 or 8 bytes from the specified memory space */ |
440 | UINT64 debug_read_memory(address_space | |
440 | UINT64 debug_read_memory(address_space &space, offs_t address, int size, int apply_translation); | |
441 | 441 | |
442 | 442 | /* write a byte to the specified memory space */ |
443 | void debug_write_byte(address_space | |
443 | void debug_write_byte(address_space &space, offs_t address, UINT8 data, int apply_translation); | |
444 | 444 | |
445 | 445 | /* write a word to the specified memory space */ |
446 | void debug_write_word(address_space | |
446 | void debug_write_word(address_space &space, offs_t address, UINT16 data, int apply_translation); | |
447 | 447 | |
448 | 448 | /* write a dword to the specified memory space */ |
449 | void debug_write_dword(address_space | |
449 | void debug_write_dword(address_space &space, offs_t address, UINT32 data, int apply_translation); | |
450 | 450 | |
451 | 451 | /* write a qword to the specified memory space */ |
452 | void debug_write_qword(address_space | |
452 | void debug_write_qword(address_space &space, offs_t address, UINT64 data, int apply_translation); | |
453 | 453 | |
454 | 454 | /* write 1,2,4 or 8 bytes to the specified memory space */ |
455 | void debug_write_memory(address_space | |
455 | void debug_write_memory(address_space &space, offs_t address, UINT64 data, int size, int apply_translation); | |
456 | 456 | |
457 | 457 | /* read 1,2,4 or 8 bytes at the given offset from opcode space */ |
458 | UINT64 debug_read_opcode(address_space | |
458 | UINT64 debug_read_opcode(address_space &space, offs_t offset, int size, int arg); | |
459 | 459 | |
460 | 460 | |
461 | 461 | #endif |
r17963 | r17964 | |
---|---|---|
263 | 263 | while (curpcbyte < fillpcbyte) |
264 | 264 | { |
265 | 265 | fillpcbyte--; |
266 | opbuf[1000 + fillpcbyte - targetpcbyte] = debug_read_opcode(source.m_space, fillpcbyte, 1, FALSE); | |
267 | argbuf[1000 + fillpcbyte - targetpcbyte] = debug_read_opcode(source.m_space, fillpcbyte, 1, TRUE); | |
266 | opbuf[1000 + fillpcbyte - targetpcbyte] = debug_read_opcode(*source.m_space, fillpcbyte, 1, FALSE); | |
267 | argbuf[1000 + fillpcbyte - targetpcbyte] = debug_read_opcode(*source.m_space, fillpcbyte, 1, TRUE); | |
268 | 268 | } |
269 | 269 | |
270 | 270 | // loop until we get past the target instruction |
r17963 | r17964 | |
278 | 278 | |
279 | 279 | // get the disassembly, but only if mapped |
280 | 280 | instlen = 1; |
281 | if (debug_cpu_translate(source.m_space, TRANSLATE_FETCH, &physpcbyte)) | |
281 | if (debug_cpu_translate(*source.m_space, TRANSLATE_FETCH, &physpcbyte)) | |
282 | 282 | { |
283 | 283 | char dasmbuffer[100]; |
284 | 284 | instlen = source.m_device.debug()->disassemble(dasmbuffer, scanpc, &opbuf[1000 + scanpcbyte - targetpcbyte], &argbuf[1000 + scanpcbyte - targetpcbyte]) & DASMFLAG_LENGTHMASK; |
r17963 | r17964 | |
322 | 322 | // output the first value |
323 | 323 | int offset = 0; |
324 | 324 | if (maxchars >= char_num * minbytes) |
325 | offset = sprintf(string, "%s", core_i64_format(debug_read_opcode(source.m_space, pcbyte, minbytes, FALSE), minbytes * char_num, source.is_octal())); | |
325 | offset = sprintf(string, "%s", core_i64_format(debug_read_opcode(*source.m_space, pcbyte, minbytes, FALSE), minbytes * char_num, source.is_octal())); | |
326 | 326 | |
327 | 327 | // output subsequent values |
328 | 328 | int byte; |
329 | 329 | for (byte = minbytes; byte < numbytes && offset + 1 + char_num * minbytes < maxchars; byte += minbytes) |
330 | offset += sprintf(&string[offset], " %s", core_i64_format(debug_read_opcode(source.m_space, pcbyte + byte, minbytes, encrypted), minbytes * char_num, source.is_octal())); | |
330 | offset += sprintf(&string[offset], " %s", core_i64_format(debug_read_opcode(*source.m_space, pcbyte + byte, minbytes, encrypted), minbytes * char_num, source.is_octal())); | |
331 | 331 | |
332 | 332 | // if we ran out of room, indicate more |
333 | 333 | string[maxchars - 1] = 0; |
r17963 | r17964 | |
407 | 407 | char buffer[100]; |
408 | 408 | int numbytes = 0; |
409 | 409 | offs_t physpcbyte = pcbyte; |
410 | if (debug_cpu_translate(source.m_space, TRANSLATE_FETCH_DEBUG, &physpcbyte)) | |
410 | if (debug_cpu_translate(*source.m_space, TRANSLATE_FETCH_DEBUG, &physpcbyte)) | |
411 | 411 | { |
412 | 412 | UINT8 opbuf[64], argbuf[64]; |
413 | 413 | |
414 | 414 | // fetch the bytes up to the maximum |
415 | 415 | for (numbytes = 0; numbytes < maxbytes; numbytes++) |
416 | 416 | { |
417 | opbuf[numbytes] = debug_read_opcode(source.m_space, pcbyte + numbytes, 1, FALSE); | |
418 | argbuf[numbytes] = debug_read_opcode(source.m_space, pcbyte + numbytes, 1, TRUE); | |
417 | opbuf[numbytes] = debug_read_opcode(*source.m_space, pcbyte + numbytes, 1, FALSE); | |
418 | argbuf[numbytes] = debug_read_opcode(*source.m_space, pcbyte + numbytes, 1, TRUE); | |
419 | 419 | } |
420 | 420 | |
421 | 421 | // disassemble the result |
r17963 | r17964 | |
---|---|---|
159 | 159 | given address is valid for cheating |
160 | 160 | -------------------------------------------------*/ |
161 | 161 | |
162 | INLINE int cheat_address_is_valid(address_space | |
162 | INLINE int cheat_address_is_valid(address_space &space, offs_t address) | |
163 | 163 | { |
164 | return debug_cpu_translate(space, TRANSLATE_READ, &address) && (space | |
164 | return debug_cpu_translate(space, TRANSLATE_READ, &address) && (space.get_write_ptr(address) != NULL); | |
165 | 165 | } |
166 | 166 | |
167 | 167 | |
r17963 | r17964 | |
208 | 208 | and swapping if necessary |
209 | 209 | -------------------------------------------------*/ |
210 | 210 | |
211 | INLINE UINT64 cheat_read_extended(const cheat_system *cheatsys, address_space | |
211 | INLINE UINT64 cheat_read_extended(const cheat_system *cheatsys, address_space &space, offs_t address) | |
212 | 212 | { |
213 | 213 | return cheat_sign_extend(cheatsys, cheat_byte_swap(cheatsys, debug_read_memory(space, address, cheatsys->width, TRUE))); |
214 | 214 | } |
r17963 | r17964 | |
557 | 557 | address space |
558 | 558 | -------------------------------------------------*/ |
559 | 559 | |
560 | int debug_command_parameter_cpu_space(running_machine &machine, const char *param, int spacenum, address_space * | |
560 | int debug_command_parameter_cpu_space(running_machine &machine, const char *param, int spacenum, address_space *&result) | |
561 | 561 | { |
562 | 562 | device_t *cpu; |
563 | 563 | |
r17963 | r17964 | |
566 | 566 | return FALSE; |
567 | 567 | |
568 | 568 | /* fetch the space pointer */ |
569 | *result = cpu->memory().space(spacenum); | |
570 | if (*result == NULL) | |
569 | result = cpu->memory().space(spacenum); | |
570 | if (result == NULL) | |
571 | 571 | { |
572 | 572 | debug_console_printf(machine, "No matching memory space found for CPU '%s'\n", cpu->tag()); |
573 | 573 | return FALSE; |
r17963 | r17964 | |
1321 | 1321 | int wpnum; |
1322 | 1322 | |
1323 | 1323 | /* CPU is implicit */ |
1324 | if (!debug_command_parameter_cpu_space(machine, NULL, ref, | |
1324 | if (!debug_command_parameter_cpu_space(machine, NULL, ref, space)) | |
1325 | 1325 | return; |
1326 | 1326 | |
1327 | 1327 | /* param 1 is the address */ |
r17963 | r17964 | |
1536 | 1536 | return; |
1537 | 1537 | if (!debug_command_parameter_number(machine, param[2], &length)) |
1538 | 1538 | return; |
1539 | if (!debug_command_parameter_cpu_space(machine, (params > 3) ? param[3] : NULL, ref, | |
1539 | if (!debug_command_parameter_cpu_space(machine, (params > 3) ? param[3] : NULL, ref, space)) | |
1540 | 1540 | return; |
1541 | 1541 | |
1542 | 1542 | /* determine the addresses to write */ |
r17963 | r17964 | |
1554 | 1554 | /* now write the data out */ |
1555 | 1555 | for (i = offset; i <= endoffset; i++) |
1556 | 1556 | { |
1557 | UINT8 byte = debug_read_byte(space, i, TRUE); | |
1557 | UINT8 byte = debug_read_byte(*space, i, TRUE); | |
1558 | 1558 | fwrite(&byte, 1, 1, f); |
1559 | 1559 | } |
1560 | 1560 | |
r17963 | r17964 | |
1580 | 1580 | return; |
1581 | 1581 | if (!debug_command_parameter_number(machine, param[2], &length)) |
1582 | 1582 | return; |
1583 | if (!debug_command_parameter_cpu_space(machine, (params > 3) ? param[3] : NULL, ref, | |
1583 | if (!debug_command_parameter_cpu_space(machine, (params > 3) ? param[3] : NULL, ref, space)) | |
1584 | 1584 | return; |
1585 | 1585 | |
1586 | 1586 | /* determine the addresses to read */ |
r17963 | r17964 | |
1603 | 1603 | /* check if end of file has been reached and stop loading if it has */ |
1604 | 1604 | if (feof(f)) |
1605 | 1605 | break; |
1606 | debug_write_byte(space, i, byte, TRUE); | |
1606 | debug_write_byte(*space, i, byte, TRUE); | |
1607 | 1607 | } |
1608 | 1608 | /* close the file */ |
1609 | 1609 | fclose(f); |
r17963 | r17964 | |
1634 | 1634 | return; |
1635 | 1635 | if (!debug_command_parameter_number(machine, param[4], &ascii)) |
1636 | 1636 | return; |
1637 | if (!debug_command_parameter_cpu_space(machine, (params > 5) ? param[5] : NULL, ref, | |
1637 | if (!debug_command_parameter_cpu_space(machine, (params > 5) ? param[5] : NULL, ref, space)) | |
1638 | 1638 | return; |
1639 | 1639 | |
1640 | 1640 | /* further validation */ |
r17963 | r17964 | |
1673 | 1673 | if (i + j <= endoffset) |
1674 | 1674 | { |
1675 | 1675 | offs_t curaddr = i + j; |
1676 | if (debug_cpu_translate(space, TRANSLATE_READ_DEBUG, &curaddr)) | |
1676 | if (debug_cpu_translate(*space, TRANSLATE_READ_DEBUG, &curaddr)) | |
1677 | 1677 | { |
1678 | UINT64 value = debug_read_memory(space, i + j, width, TRUE); | |
1678 | UINT64 value = debug_read_memory(*space, i + j, width, TRUE); | |
1679 | 1679 | outdex += sprintf(&output[outdex], " %s", core_i64_hex_format(value, width * 2)); |
1680 | 1680 | } |
1681 | 1681 | else |
r17963 | r17964 | |
1692 | 1692 | for (j = 0; j < 16 && (i + j) <= endoffset; j++) |
1693 | 1693 | { |
1694 | 1694 | offs_t curaddr = i + j; |
1695 | if (debug_cpu_translate(space, TRANSLATE_READ_DEBUG, &curaddr)) | |
1695 | if (debug_cpu_translate(*space, TRANSLATE_READ_DEBUG, &curaddr)) | |
1696 | 1696 | { |
1697 | UINT8 byte = debug_read_byte(space, i + j, TRUE); | |
1697 | UINT8 byte = debug_read_byte(*space, i + j, TRUE); | |
1698 | 1698 | outdex += sprintf(&output[outdex], "%c", (byte >= 32 && byte < 127) ? byte : '.'); |
1699 | 1699 | } |
1700 | 1700 | else |
r17963 | r17964 | |
1730 | 1730 | memset(cheat_region, 0, sizeof(cheat_region)); |
1731 | 1731 | |
1732 | 1732 | /* validate parameters */ |
1733 | if (!debug_command_parameter_cpu_space(machine, (params > 3) ? param[3] : NULL, AS_PROGRAM, | |
1733 | if (!debug_command_parameter_cpu_space(machine, (params > 3) ? param[3] : NULL, AS_PROGRAM, space)) | |
1734 | 1734 | return; |
1735 | 1735 | |
1736 | 1736 | if (ref == 0) |
r17963 | r17964 | |
1815 | 1815 | for (i = 0; i <= region_count; i++) |
1816 | 1816 | if (!cheat_region[i].disabled) |
1817 | 1817 | for (curaddr = cheat_region[i].offset; curaddr <= cheat_region[i].endoffset; curaddr += cheat.width) |
1818 | if (cheat_address_is_valid(space, curaddr)) | |
1818 | if (cheat_address_is_valid(*space, curaddr)) | |
1819 | 1819 | real_length++; |
1820 | 1820 | |
1821 | 1821 | if (real_length == 0) |
r17963 | r17964 | |
1844 | 1844 | return; |
1845 | 1845 | } |
1846 | 1846 | |
1847 | if (!debug_command_parameter_cpu_space(machine, &cheat.cpu, AS_PROGRAM, | |
1847 | if (!debug_command_parameter_cpu_space(machine, &cheat.cpu, AS_PROGRAM, space)) | |
1848 | 1848 | return; |
1849 | 1849 | |
1850 | 1850 | cheat_map *newmap = auto_alloc_array(machine, cheat_map, cheat.length + real_length); |
r17963 | r17964 | |
1861 | 1861 | for (i = 0; i < region_count; i++) |
1862 | 1862 | if (!cheat_region[i].disabled) |
1863 | 1863 | for (curaddr = cheat_region[i].offset; curaddr <= cheat_region[i].endoffset; curaddr += cheat.width) |
1864 | if (cheat_address_is_valid(space, curaddr)) | |
1864 | if (cheat_address_is_valid(*space, curaddr)) | |
1865 | 1865 | { |
1866 | cheat.cheatmap[active_cheat].previous_value = cheat_read_extended(&cheat, space, curaddr); | |
1866 | cheat.cheatmap[active_cheat].previous_value = cheat_read_extended(&cheat, *space, curaddr); | |
1867 | 1867 | cheat.cheatmap[active_cheat].first_value = cheat.cheatmap[active_cheat].previous_value; |
1868 | 1868 | cheat.cheatmap[active_cheat].offset = curaddr; |
1869 | 1869 | cheat.cheatmap[active_cheat].state = 1; |
r17963 | r17964 | |
1911 | 1911 | return; |
1912 | 1912 | } |
1913 | 1913 | |
1914 | if (!debug_command_parameter_cpu_space(machine, &cheat.cpu, AS_PROGRAM, | |
1914 | if (!debug_command_parameter_cpu_space(machine, &cheat.cpu, AS_PROGRAM, space)) | |
1915 | 1915 | return; |
1916 | 1916 | |
1917 | 1917 | if (params > 1 && !debug_command_parameter_number(machine, param[1], &comp_value)) |
r17963 | r17964 | |
1951 | 1951 | for (cheatindex = 0; cheatindex < cheat.length; cheatindex += 1) |
1952 | 1952 | if (cheat.cheatmap[cheatindex].state == 1) |
1953 | 1953 | { |
1954 | UINT64 cheat_value = cheat_read_extended(&cheat, space, cheat.cheatmap[cheatindex].offset); | |
1954 | UINT64 cheat_value = cheat_read_extended(&cheat, *space, cheat.cheatmap[cheatindex].offset); | |
1955 | 1955 | UINT64 comp_byte = (ref == 0) ? cheat.cheatmap[cheatindex].previous_value : cheat.cheatmap[cheatindex].first_value; |
1956 | 1956 | UINT8 disable_byte = FALSE; |
1957 | 1957 | |
r17963 | r17964 | |
2066 | 2066 | UINT64 sizemask; |
2067 | 2067 | FILE *f = NULL; |
2068 | 2068 | |
2069 | if (!debug_command_parameter_cpu_space(machine, &cheat.cpu, AS_PROGRAM, | |
2069 | if (!debug_command_parameter_cpu_space(machine, &cheat.cpu, AS_PROGRAM, space)) | |
2070 | 2070 | return; |
2071 | 2071 | |
2072 | 2072 | if (!debug_command_parameter_cpu(machine, &cheat.cpu, &cpu)) |
r17963 | r17964 | |
2097 | 2097 | { |
2098 | 2098 | if (cheat.cheatmap[cheatindex].state == 1) |
2099 | 2099 | { |
2100 | UINT64 value = cheat_byte_swap(&cheat, cheat_read_extended(&cheat, space, cheat.cheatmap[cheatindex].offset)) & sizemask; | |
2100 | UINT64 value = cheat_byte_swap(&cheat, cheat_read_extended(&cheat, *space, cheat.cheatmap[cheatindex].offset)) & sizemask; | |
2101 | 2101 | offs_t address = space->byte_to_address(cheat.cheatmap[cheatindex].offset); |
2102 | 2102 | |
2103 | 2103 | if (params > 0) |
r17963 | r17964 | |
2167 | 2167 | return; |
2168 | 2168 | if (!debug_command_parameter_number(machine, param[1], &length)) |
2169 | 2169 | return; |
2170 | if (!debug_command_parameter_cpu_space(machine, NULL, ref, | |
2170 | if (!debug_command_parameter_cpu_space(machine, NULL, ref, space)) | |
2171 | 2171 | return; |
2172 | 2172 | |
2173 | 2173 | /* further validation */ |
r17963 | r17964 | |
2223 | 2223 | { |
2224 | 2224 | switch (data_size[j]) |
2225 | 2225 | { |
2226 | case 1: match = ((UINT8)debug_read_byte(space, i + suboffset, TRUE) == (UINT8)data_to_find[j]); break; | |
2227 | case 2: match = ((UINT16)debug_read_word(space, i + suboffset, TRUE) == (UINT16)data_to_find[j]); break; | |
2228 | case 4: match = ((UINT32)debug_read_dword(space, i + suboffset, TRUE) == (UINT32)data_to_find[j]); break; | |
2229 | case 8: match = ((UINT64)debug_read_qword(space, i + suboffset, TRUE) == (UINT64)data_to_find[j]); break; | |
2226 | case 1: match = ((UINT8)debug_read_byte(*space, i + suboffset, TRUE) == (UINT8)data_to_find[j]); break; | |
2227 | case 2: match = ((UINT16)debug_read_word(*space, i + suboffset, TRUE) == (UINT16)data_to_find[j]); break; | |
2228 | case 4: match = ((UINT32)debug_read_dword(*space, i + suboffset, TRUE) == (UINT32)data_to_find[j]); break; | |
2229 | case 8: match = ((UINT64)debug_read_qword(*space, i + suboffset, TRUE) == (UINT64)data_to_find[j]); break; | |
2230 | 2230 | default: /* all other cases are wildcards */ break; |
2231 | 2231 | } |
2232 | 2232 | suboffset += data_size[j] & 0x0f; |
r17963 | r17964 | |
2265 | 2265 | return; |
2266 | 2266 | if (!debug_command_parameter_number(machine, param[3], &bytes)) |
2267 | 2267 | return; |
2268 | if (!debug_command_parameter_cpu_space(machine, (params > 4) ? param[4] : NULL, AS_PROGRAM, | |
2268 | if (!debug_command_parameter_cpu_space(machine, (params > 4) ? param[4] : NULL, AS_PROGRAM, space)) | |
2269 | 2269 | return; |
2270 | 2270 | |
2271 | 2271 | /* determine the width of the bytes */ |
r17963 | r17964 | |
2302 | 2302 | |
2303 | 2303 | /* make sure we can translate the address */ |
2304 | 2304 | tempaddr = pcbyte; |
2305 | if (debug_cpu_translate(space, TRANSLATE_FETCH_DEBUG, &tempaddr)) | |
2305 | if (debug_cpu_translate(*space, TRANSLATE_FETCH_DEBUG, &tempaddr)) | |
2306 | 2306 | { |
2307 | 2307 | UINT8 opbuf[64], argbuf[64]; |
2308 | 2308 | |
2309 | 2309 | /* fetch the bytes up to the maximum */ |
2310 | 2310 | for (numbytes = 0; numbytes < maxbytes; numbytes++) |
2311 | 2311 | { |
2312 | opbuf[numbytes] = debug_read_opcode(space, pcbyte + numbytes, 1, FALSE); | |
2313 | argbuf[numbytes] = debug_read_opcode(space, pcbyte + numbytes, 1, TRUE); | |
2312 | opbuf[numbytes] = debug_read_opcode(*space, pcbyte + numbytes, 1, FALSE); | |
2313 | argbuf[numbytes] = debug_read_opcode(*space, pcbyte + numbytes, 1, TRUE); | |
2314 | 2314 | } |
2315 | 2315 | |
2316 | 2316 | /* disassemble the result */ |
r17963 | r17964 | |
2323 | 2323 | int startdex = outdex; |
2324 | 2324 | numbytes = space->address_to_byte(numbytes); |
2325 | 2325 | for (j = 0; j < numbytes; j += minbytes) |
2326 | outdex += sprintf(&output[outdex], "%s ", core_i64_hex_format(debug_read_opcode(space, pcbyte + j, minbytes, FALSE), minbytes * 2)); | |
2326 | outdex += sprintf(&output[outdex], "%s ", core_i64_hex_format(debug_read_opcode(*space, pcbyte + j, minbytes, FALSE), minbytes * 2)); | |
2327 | 2327 | if (outdex - startdex < byteswidth) |
2328 | 2328 | outdex += sprintf(&output[outdex], "%*s", byteswidth - (outdex - startdex), ""); |
2329 | 2329 | outdex += sprintf(&output[outdex], " "); |
r17963 | r17964 | |
2449 | 2449 | { |
2450 | 2450 | /* validate parameters */ |
2451 | 2451 | address_space *space; |
2452 | if (!debug_command_parameter_cpu_space(machine, (params > 0) ? param[0] : NULL, AS_PROGRAM, | |
2452 | if (!debug_command_parameter_cpu_space(machine, (params > 0) ? param[0] : NULL, AS_PROGRAM, space)) | |
2453 | 2453 | return; |
2454 | 2454 | |
2455 | 2455 | UINT64 count = device_debug::HISTORY_SIZE; |
r17963 | r17964 | |
2473 | 2473 | UINT8 opbuf[64], argbuf[64]; |
2474 | 2474 | for (int numbytes = 0; numbytes < maxbytes; numbytes++) |
2475 | 2475 | { |
2476 | opbuf[numbytes] = debug_read_opcode(space, pcbyte + numbytes, 1, false); | |
2477 | argbuf[numbytes] = debug_read_opcode(space, pcbyte + numbytes, 1, true); | |
2476 | opbuf[numbytes] = debug_read_opcode(*space, pcbyte + numbytes, 1, false); | |
2477 | argbuf[numbytes] = debug_read_opcode(*space, pcbyte + numbytes, 1, true); | |
2478 | 2478 | } |
2479 | 2479 | |
2480 | 2480 | char buffer[200]; |
r17963 | r17964 | |
2557 | 2557 | return; |
2558 | 2558 | |
2559 | 2559 | /* CPU is implicit */ |
2560 | if (!debug_command_parameter_cpu_space(machine, NULL, ref, | |
2560 | if (!debug_command_parameter_cpu_space(machine, NULL, ref, space)) | |
2561 | 2561 | return; |
2562 | 2562 | |
2563 | 2563 | /* do the translation first */ |
r17963 | r17964 | |
2565 | 2565 | { |
2566 | 2566 | static const char *const intnames[] = { "Read", "Write", "Fetch" }; |
2567 | 2567 | taddress = space->address_to_byte(address) & space->bytemask(); |
2568 | if (debug_cpu_translate(space, intention, &taddress)) | |
2568 | if (debug_cpu_translate(*space, intention, &taddress)) | |
2569 | 2569 | { |
2570 | const char *mapname = | |
2570 | const char *mapname = space->get_handler_string((intention == TRANSLATE_WRITE_DEBUG) ? ROW_WRITE : ROW_READ, taddress); | |
2571 | 2571 | debug_console_printf(machine, "%7s: %s logical == %s physical -> %s\n", intnames[intention & 3], core_i64_hex_format(address, space->logaddrchars()), core_i64_hex_format(space->byte_to_address(taddress), space->addrchars()), mapname); |
2572 | 2572 | } |
2573 | 2573 | else |
r17963 | r17964 | |
---|---|---|
35 | 35 | cpustate->a=lh5801_add_generic(cpustate,cpustate->a,data,cpustate->t&C); |
36 | 36 | } |
37 | 37 | |
38 | INLINE void lh5801_add_mem(lh5801_state *cpustate, address_space | |
38 | INLINE void lh5801_add_mem(lh5801_state *cpustate, address_space &space, int addr, UINT8 data) | |
39 | 39 | { |
40 | int v=lh5801_add_generic(cpustate, space->read_byte(addr),data,0); | |
41 | space->write_byte(addr,v); | |
40 | int v=lh5801_add_generic(cpustate, space.read_byte(addr),data,0); | |
41 | space.write_byte(addr,v); | |
42 | 42 | } |
43 | 43 | |
44 | 44 | INLINE void lh5801_adr(lh5801_state *cpustate, PAIR *reg) |
r17963 | r17964 | |
95 | 95 | if (!cpustate->a) cpustate->t|=Z; |
96 | 96 | } |
97 | 97 | |
98 | INLINE void lh5801_and_mem(lh5801_state *cpustate, address_space | |
98 | INLINE void lh5801_and_mem(lh5801_state *cpustate, address_space &space, int addr, UINT8 data) | |
99 | 99 | { |
100 | data&=space | |
100 | data&=space.read_byte(addr); | |
101 | 101 | cpustate->t&=~Z; |
102 | 102 | if (!data) cpustate->t|=Z; |
103 | space | |
103 | space.write_byte(addr,data); | |
104 | 104 | } |
105 | 105 | |
106 | 106 | INLINE void lh5801_bit(lh5801_state *cpustate, UINT8 a, UINT8 b) |
r17963 | r17964 | |
123 | 123 | if (!cpustate->a) cpustate->t|=Z; |
124 | 124 | } |
125 | 125 | |
126 | INLINE void lh5801_ora_mem(lh5801_state *cpustate, address_space | |
126 | INLINE void lh5801_ora_mem(lh5801_state *cpustate, address_space &space, int addr, UINT8 data) | |
127 | 127 | { |
128 | data|=space | |
128 | data|=space.read_byte(addr); | |
129 | 129 | cpustate->t&=~Z; |
130 | 130 | if (!data) cpustate->t|=Z; |
131 | space | |
131 | space.write_byte(addr,data); | |
132 | 132 | } |
133 | 133 | |
134 | 134 | INLINE void lh5801_lda(lh5801_state *cpustate, UINT8 data) |
r17963 | r17964 | |
270 | 270 | // flags? |
271 | 271 | } |
272 | 272 | |
273 | INLINE void lh5801_drl(lh5801_state *cpustate, address_space | |
273 | INLINE void lh5801_drl(lh5801_state *cpustate, address_space &space, int adr) | |
274 | 274 | { |
275 | UINT16 t=cpustate->a|(space | |
275 | UINT16 t=cpustate->a|(space.read_byte(adr)<<8); | |
276 | 276 | |
277 | 277 | cpustate->a=t>>8; |
278 | space | |
278 | space.write_byte(adr,t>>4); | |
279 | 279 | } |
280 | 280 | |
281 | INLINE void lh5801_drr(lh5801_state *cpustate, address_space | |
281 | INLINE void lh5801_drr(lh5801_state *cpustate, address_space &space, int adr) | |
282 | 282 | { |
283 | UINT16 t=space | |
283 | UINT16 t=space.read_byte(adr)|(cpustate->a<<8); | |
284 | 284 | |
285 | 285 | cpustate->a=t; |
286 | space | |
286 | space.write_byte(adr,t>>4); | |
287 | 287 | } |
288 | 288 | |
289 | 289 | INLINE void lh5801_rol(lh5801_state *cpustate) |
r17963 | r17964 | |
398 | 398 | case 0x40: lh5801_inc(cpustate,&XH);cpustate->icount-=9;break; |
399 | 399 | case 0x42: lh5801_dec(cpustate,&XH);cpustate->icount-=9;break; |
400 | 400 | case 0x48: X=S;cpustate->icount-=11;break; |
401 | case 0x49: lh5801_and_mem(cpustate, cpustate->io, X, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=17;break; | |
401 | case 0x49: lh5801_and_mem(cpustate, *cpustate->io, X, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=17;break; | |
402 | 402 | case 0x4a: X=X;cpustate->icount-=11;break; //!!! |
403 | case 0x4b: lh5801_ora_mem(cpustate, cpustate->io, X, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=17;break; | |
403 | case 0x4b: lh5801_ora_mem(cpustate, *cpustate->io, X, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=17;break; | |
404 | 404 | case 0x4c: cpustate->bf=0;/*off !*/ cpustate->icount-=8;break; |
405 | 405 | case 0x4d: lh5801_bit(cpustate,cpustate->io->read_byte(X), cpustate->direct->read_decrypted_byte(P++));cpustate->icount-=14;break; |
406 | 406 | case 0x4e: S=X;cpustate->icount-=11;break; |
407 | case 0x4f: lh5801_add_mem(cpustate, cpustate->io, X, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=17;break; | |
407 | case 0x4f: lh5801_add_mem(cpustate, *cpustate->io, X, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=17;break; | |
408 | 408 | case 0x50: lh5801_inc(cpustate,&YH);cpustate->icount-=9;break; |
409 | 409 | case 0x52: lh5801_dec(cpustate,&YH);cpustate->icount-=9;break; |
410 | 410 | case 0x58: X=P;cpustate->icount-=11;break; |
411 | case 0x59: lh5801_and_mem(cpustate, cpustate->io, Y, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=17;break; | |
411 | case 0x59: lh5801_and_mem(cpustate, *cpustate->io, Y, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=17;break; | |
412 | 412 | case 0x5a: Y=X;cpustate->icount-=11;break; |
413 | case 0x5b: lh5801_ora_mem(cpustate, cpustate->io, Y, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=17;break; | |
413 | case 0x5b: lh5801_ora_mem(cpustate, *cpustate->io, Y, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=17;break; | |
414 | 414 | case 0x5d: lh5801_bit(cpustate,cpustate->io->read_byte(Y), cpustate->direct->read_decrypted_byte(P++));cpustate->icount-=14;break; |
415 | 415 | case 0x5e: lh5801_jmp(cpustate,X);cpustate->icount-=11;break; // P=X |
416 | case 0x5f: lh5801_add_mem(cpustate, cpustate->io, Y, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=17;break; | |
416 | case 0x5f: lh5801_add_mem(cpustate, *cpustate->io, Y, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=17;break; | |
417 | 417 | case 0x60: lh5801_inc(cpustate,&UH);cpustate->icount-=9;break; |
418 | 418 | case 0x62: lh5801_dec(cpustate,&UH);cpustate->icount-=9;break; |
419 | case 0x69: lh5801_and_mem(cpustate, cpustate->io, U, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=17;break; | |
419 | case 0x69: lh5801_and_mem(cpustate, *cpustate->io, U, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=17;break; | |
420 | 420 | case 0x6a: U=X;cpustate->icount-=11;break; |
421 | case 0x6b: lh5801_ora_mem(cpustate, cpustate->io, U, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=17;break; | |
421 | case 0x6b: lh5801_ora_mem(cpustate, *cpustate->io, U, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=17;break; | |
422 | 422 | case 0x6d: lh5801_bit(cpustate,cpustate->io->read_byte(X), cpustate->direct->read_decrypted_byte(P++));cpustate->icount-=14;break; |
423 | case 0x6f: lh5801_add_mem(cpustate, cpustate->io, U, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=17;break; | |
423 | case 0x6f: lh5801_add_mem(cpustate, *cpustate->io, U, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=17;break; | |
424 | 424 | case 0x81: cpustate->t|=IE; /*sie !*/cpustate->icount-=8;break; |
425 | 425 | case 0x88: lh5801_push_word(cpustate,X); cpustate->icount-=14;break; |
426 | 426 | case 0x8a: lh5801_pop(cpustate); cpustate->icount-=12; break; |
r17963 | r17964 | |
449 | 449 | case 0xca: lh5801_adr(cpustate,&cpustate->x);cpustate->icount-=11;break; |
450 | 450 | case 0xcc: /*atp sends a to data bus*/cpustate->icount-=9;break; |
451 | 451 | case 0xce: lh5801_am(cpustate,cpustate->a); cpustate->icount-=9; break; |
452 | case 0xd3: lh5801_drr(cpustate, cpustate->io, X); cpustate->icount-=16; break; | |
453 | case 0xd7: lh5801_drl(cpustate, cpustate->io, X); cpustate->icount-=16; break; | |
452 | case 0xd3: lh5801_drr(cpustate, *cpustate->io, X); cpustate->icount-=16; break; | |
453 | case 0xd7: lh5801_drl(cpustate, *cpustate->io, X); cpustate->icount-=16; break; | |
454 | 454 | case 0xda: lh5801_adr(cpustate,&cpustate->y);cpustate->icount-=11;break; |
455 | 455 | case 0xde: lh5801_am(cpustate,cpustate->a|0x100); cpustate->icount-=9; break; |
456 | 456 | case 0xea: lh5801_adr(cpustate,&cpustate->u);cpustate->icount-=11;break; |
457 | 457 | case 0xe9: |
458 | 458 | adr=lh5801_readop_word(cpustate); |
459 | lh5801_and_mem(cpustate, cpustate->io, adr, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=23; | |
459 | lh5801_and_mem(cpustate, *cpustate->io, adr, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=23; | |
460 | 460 | break; |
461 | 461 | case 0xeb: |
462 | 462 | adr=lh5801_readop_word(cpustate); |
463 | lh5801_ora_mem(cpustate, cpustate->io, adr, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=23; | |
463 | lh5801_ora_mem(cpustate, *cpustate->io, adr, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=23; | |
464 | 464 | break; |
465 | 465 | case 0xec: cpustate->t=cpustate->a; cpustate->icount-=9;break; |
466 | 466 | case 0xed: |
r17963 | r17964 | |
469 | 469 | cpustate->icount-=20;break; |
470 | 470 | case 0xef: |
471 | 471 | adr=lh5801_readop_word(cpustate); |
472 | lh5801_add_mem(cpustate, cpustate->io, adr, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=23; | |
472 | lh5801_add_mem(cpustate, *cpustate->io, adr, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=23; | |
473 | 473 | break; |
474 | 474 | |
475 | 475 | default: |
r17963 | r17964 | |
542 | 542 | case 0x46: X--;cpustate->icount-=5;break; |
543 | 543 | case 0x47: lh5801_lde(cpustate,&cpustate->x);cpustate->icount-=6;break; |
544 | 544 | case 0x48: XH=cpustate->direct->read_decrypted_byte(P++);cpustate->icount-=6;break; |
545 | case 0x49: lh5801_and_mem(cpustate, cpustate->program, X, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=13;break; | |
545 | case 0x49: lh5801_and_mem(cpustate, *cpustate->program, X, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=13;break; | |
546 | 546 | case 0x4a: XL=cpustate->direct->read_decrypted_byte(P++);cpustate->icount-=6;break; |
547 | case 0x4b: lh5801_ora_mem(cpustate, cpustate->program, X, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=13;break; | |
547 | case 0x4b: lh5801_ora_mem(cpustate, *cpustate->program, X, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=13;break; | |
548 | 548 | case 0x4c: lh5801_cpa(cpustate,XH, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=7;break; |
549 | 549 | case 0x4d: lh5801_bit(cpustate,cpustate->program->read_byte(X), cpustate->direct->read_decrypted_byte(P++));cpustate->icount-=10;break; |
550 | 550 | case 0x4e: lh5801_cpa(cpustate,XL, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=7;break; |
551 | case 0x4f: lh5801_add_mem(cpustate, cpustate->program, X, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=13;break; | |
551 | case 0x4f: lh5801_add_mem(cpustate, *cpustate->program, X, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=13;break; | |
552 | 552 | case 0x50: lh5801_inc(cpustate,&YL);cpustate->icount-=5;break; |
553 | 553 | case 0x51: lh5801_sin(cpustate,&cpustate->y); cpustate->icount-=6;break; |
554 | 554 | case 0x52: lh5801_dec(cpustate,&YL);cpustate->icount-=5;break; |
r17963 | r17964 | |
558 | 558 | case 0x56: Y--;cpustate->icount-=5;break; |
559 | 559 | case 0x57: lh5801_lde(cpustate,&cpustate->y);cpustate->icount-=6;break; |
560 | 560 | case 0x58: YH=cpustate->direct->read_decrypted_byte(P++);cpustate->icount-=6;break; |
561 | case 0x59: lh5801_and_mem(cpustate, cpustate->program, Y, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=13;break; | |
561 | case 0x59: lh5801_and_mem(cpustate, *cpustate->program, Y, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=13;break; | |
562 | 562 | case 0x5a: YL=cpustate->direct->read_decrypted_byte(P++);cpustate->icount-=6;break; |
563 | case 0x5b: lh5801_ora_mem(cpustate, cpustate->program, Y, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=13;break; | |
563 | case 0x5b: lh5801_ora_mem(cpustate, *cpustate->program, Y, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=13;break; | |
564 | 564 | case 0x5c: lh5801_cpa(cpustate,YH, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=7;break; |
565 | 565 | case 0x5d: lh5801_bit(cpustate,cpustate->program->read_byte(Y), cpustate->direct->read_decrypted_byte(P++));cpustate->icount-=10;break; |
566 | 566 | case 0x5e: lh5801_cpa(cpustate,YL, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=7;break; |
567 | case 0x5f: lh5801_add_mem(cpustate, cpustate->program, Y, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=13;break; | |
567 | case 0x5f: lh5801_add_mem(cpustate, *cpustate->program, Y, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=13;break; | |
568 | 568 | case 0x60: lh5801_inc(cpustate,&UL);cpustate->icount-=5;break; |
569 | 569 | case 0x61: lh5801_sin(cpustate,&cpustate->u); cpustate->icount-=6;break; |
570 | 570 | case 0x62: lh5801_dec(cpustate,&UL);cpustate->icount-=5;break; |
r17963 | r17964 | |
574 | 574 | case 0x66: U--;cpustate->icount-=5;break; |
575 | 575 | case 0x67: lh5801_lde(cpustate,&cpustate->u);cpustate->icount-=6;break; |
576 | 576 | case 0x68: UH=cpustate->direct->read_decrypted_byte(P++);cpustate->icount-=6;break; |
577 | case 0x69: lh5801_and_mem(cpustate, cpustate->program, U, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=13;break; | |
577 | case 0x69: lh5801_and_mem(cpustate, *cpustate->program, U, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=13;break; | |
578 | 578 | case 0x6a: UL=cpustate->direct->read_decrypted_byte(P++);cpustate->icount-=6;break; |
579 | case 0x6b: lh5801_ora_mem(cpustate, cpustate->program, U, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=13;break; | |
579 | case 0x6b: lh5801_ora_mem(cpustate, *cpustate->program, U, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=13;break; | |
580 | 580 | case 0x6c: lh5801_cpa(cpustate,UH, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=7;break; |
581 | 581 | case 0x6d: lh5801_bit(cpustate,cpustate->program->read_byte(U), cpustate->direct->read_decrypted_byte(P++));cpustate->icount-=10;break; |
582 | 582 | case 0x6e: lh5801_cpa(cpustate,UL, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=7;break; |
583 | case 0x6f: lh5801_add_mem(cpustate, cpustate->program, U, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=13;break; | |
583 | case 0x6f: lh5801_add_mem(cpustate, *cpustate->program, U, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=13;break; | |
584 | 584 | case 0x80: lh5801_sbc(cpustate,XH); cpustate->icount-=6;break; |
585 | 585 | case 0x81: lh5801_branch_plus(cpustate,!(cpustate->t&C)); cpustate->icount-=8; break; |
586 | 586 | case 0x82: lh5801_adc(cpustate,XH); cpustate->icount-=6;break; |
r17963 | r17964 | |
648 | 648 | case 0xcd: lh5801_vector(cpustate,1, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=7;break; |
649 | 649 | case 0xcf: lh5801_vector(cpustate,cpustate->t&V, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=8;break; |
650 | 650 | case 0xd1: lh5801_ror(cpustate); cpustate->icount-=6; break; |
651 | case 0xd3: lh5801_drr(cpustate, cpustate->program, X); cpustate->icount-=12; break; | |
651 | case 0xd3: lh5801_drr(cpustate, *cpustate->program, X); cpustate->icount-=12; break; | |
652 | 652 | case 0xd5: lh5801_shr(cpustate); cpustate->icount-=6; break; |
653 | case 0xd7: lh5801_drl(cpustate, cpustate->program, X); cpustate->icount-=12; break; | |
653 | case 0xd7: lh5801_drl(cpustate, *cpustate->program, X); cpustate->icount-=12; break; | |
654 | 654 | case 0xd9: lh5801_shl(cpustate); cpustate->icount-=6; break; |
655 | 655 | case 0xdb: lh5801_rol(cpustate); cpustate->icount-=6; break; |
656 | 656 | case 0xdd: lh5801_inc(cpustate,&cpustate->a);cpustate->icount-=5;break; |
r17963 | r17964 | |
658 | 658 | case 0xe1: cpustate->pu=1;/*spu!*/ cpustate->icount-=4; break; |
659 | 659 | case 0xe3: cpustate->pu=0;/*rpu!*/ cpustate->icount-=4; break; |
660 | 660 | case 0xe9: |
661 | adr=lh5801_readop_word(cpustate);lh5801_and_mem(cpustate, cpustate->program, adr, cpustate->direct->read_decrypted_byte(P++)); | |
661 | adr=lh5801_readop_word(cpustate);lh5801_and_mem(cpustate, *cpustate->program, adr, cpustate->direct->read_decrypted_byte(P++)); | |
662 | 662 | cpustate->icount-=19;break; |
663 | 663 | case 0xeb: |
664 | adr=lh5801_readop_word(cpustate);lh5801_ora_mem(cpustate, cpustate->program, adr, cpustate->direct->read_decrypted_byte(P++)); | |
664 | adr=lh5801_readop_word(cpustate);lh5801_ora_mem(cpustate, *cpustate->program, adr, cpustate->direct->read_decrypted_byte(P++)); | |
665 | 665 | cpustate->icount-=19;break; |
666 | 666 | case 0xed: |
667 | 667 | adr=lh5801_readop_word(cpustate);lh5801_bit(cpustate,cpustate->program->read_byte(adr), cpustate->direct->read_decrypted_byte(P++)); |
668 | 668 | cpustate->icount-=16;break; |
669 | 669 | case 0xef: |
670 | 670 | adr=lh5801_readop_word(cpustate); |
671 | lh5801_add_mem(cpustate, cpustate->program, adr, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=19; | |
671 | lh5801_add_mem(cpustate, *cpustate->program, adr, cpustate->direct->read_decrypted_byte(P++)); cpustate->icount-=19; | |
672 | 672 | break; |
673 | 673 | case 0xf1: lh5801_aex(cpustate); cpustate->icount-=6; break; |
674 | 674 | case 0xf5: cpustate->program->write_byte(Y++, cpustate->program->read_byte(X++)); cpustate->icount-=7; break; //tin |
r17963 | r17964 | |
---|---|---|
536 | 536 | |
537 | 537 | static READ16_HANDLER( h8_itu_r ) |
538 | 538 | { |
539 | h83xx_state *h8 = get_safe_token(&space | |
539 | h83xx_state *h8 = get_safe_token(&space.device()); | |
540 | 540 | |
541 | 541 | if (mem_mask == 0xffff) |
542 | 542 | { |
r17963 | r17964 | |
557 | 557 | |
558 | 558 | static WRITE16_HANDLER( h8_itu_w ) |
559 | 559 | { |
560 | h83xx_state *h8 = get_safe_token(&space | |
560 | h83xx_state *h8 = get_safe_token(&space.device()); | |
561 | 561 | |
562 | 562 | if (mem_mask == 0xffff) |
563 | 563 | { |
r17963 | r17964 | |
577 | 577 | |
578 | 578 | static READ16_HANDLER( h8_3007_itu_r ) |
579 | 579 | { |
580 | h83xx_state *h8 = get_safe_token(&space | |
580 | h83xx_state *h8 = get_safe_token(&space.device()); | |
581 | 581 | |
582 | 582 | if (mem_mask == 0xffff) |
583 | 583 | { |
r17963 | r17964 | |
597 | 597 | } |
598 | 598 | static WRITE16_HANDLER( h8_3007_itu_w ) |
599 | 599 | { |
600 | h83xx_state *h8 = get_safe_token(&space | |
600 | h83xx_state *h8 = get_safe_token(&space.device()); | |
601 | 601 | |
602 | 602 | if (mem_mask == 0xffff) |
603 | 603 | { |
r17963 | r17964 | |
617 | 617 | |
618 | 618 | static READ16_HANDLER( h8_3007_itu1_r ) |
619 | 619 | { |
620 | h83xx_state *h8 = get_safe_token(&space | |
620 | h83xx_state *h8 = get_safe_token(&space.device()); | |
621 | 621 | |
622 | 622 | if (mem_mask == 0xffff) |
623 | 623 | { |
r17963 | r17964 | |
637 | 637 | } |
638 | 638 | static WRITE16_HANDLER( h8_3007_itu1_w ) |
639 | 639 | { |
640 | h83xx_state *h8 = get_safe_token(&space | |
640 | h83xx_state *h8 = get_safe_token(&space.device()); | |
641 | 641 | |
642 | 642 | if (mem_mask == 0xffff) |
643 | 643 | { |
r17963 | r17964 | |
657 | 657 | |
658 | 658 | static WRITE16_HANDLER( h8s2241_per_regs_w ) |
659 | 659 | { |
660 | h83xx_state *h8 = get_safe_token(&space | |
660 | h83xx_state *h8 = get_safe_token(&space.device()); | |
661 | 661 | if (mem_mask == 0xffff) |
662 | 662 | { |
663 | 663 | h8s2241_per_regs_write_16(h8, (offset << 1), data); |
r17963 | r17964 | |
674 | 674 | |
675 | 675 | static WRITE16_HANDLER( h8s2246_per_regs_w ) |
676 | 676 | { |
677 | h83xx_state *h8 = get_safe_token(&space | |
677 | h83xx_state *h8 = get_safe_token(&space.device()); | |
678 | 678 | if (mem_mask == 0xffff) |
679 | 679 | { |
680 | 680 | h8s2246_per_regs_write_16(h8, (offset << 1), data); |
r17963 | r17964 | |
691 | 691 | |
692 | 692 | static WRITE16_HANDLER( h8s2323_per_regs_w ) |
693 | 693 | { |
694 | h83xx_state *h8 = get_safe_token(&space | |
694 | h83xx_state *h8 = get_safe_token(&space.device()); | |
695 | 695 | if (mem_mask == 0xffff) |
696 | 696 | { |
697 | 697 | h8s2323_per_regs_write_16(h8, (offset << 1), data); |
r17963 | r17964 | |
708 | 708 | |
709 | 709 | static WRITE16_HANDLER( h8s2394_per_regs_w ) |
710 | 710 | { |
711 | h83xx_state *h8 = get_safe_token(&space | |
711 | h83xx_state *h8 = get_safe_token(&space.device()); | |
712 | 712 | if (mem_mask == 0xffff) |
713 | 713 | { |
714 | 714 | h8s2394_per_regs_write_16(h8, (offset << 1), data); |
r17963 | r17964 | |
725 | 725 | |
726 | 726 | static READ16_HANDLER( h8s2241_per_regs_r ) |
727 | 727 | { |
728 | h83xx_state *h8 = get_safe_token(&space | |
728 | h83xx_state *h8 = get_safe_token(&space.device()); | |
729 | 729 | if (mem_mask == 0xffff) |
730 | 730 | { |
731 | 731 | return h8s2241_per_regs_read_16(h8, (offset << 1)); |
r17963 | r17964 | |
743 | 743 | |
744 | 744 | static READ16_HANDLER( h8s2246_per_regs_r ) |
745 | 745 | { |
746 | h83xx_state *h8 = get_safe_token(&space | |
746 | h83xx_state *h8 = get_safe_token(&space.device()); | |
747 | 747 | if (mem_mask == 0xffff) |
748 | 748 | { |
749 | 749 | return h8s2246_per_regs_read_16(h8, (offset << 1)); |
r17963 | r17964 | |
761 | 761 | |
762 | 762 | static READ16_HANDLER( h8s2323_per_regs_r ) |
763 | 763 | { |
764 | h83xx_state *h8 = get_safe_token(&space | |
764 | h83xx_state *h8 = get_safe_token(&space.device()); | |
765 | 765 | if (mem_mask == 0xffff) |
766 | 766 | { |
767 | 767 | return h8s2323_per_regs_read_16(h8, (offset << 1)); |
r17963 | r17964 | |
779 | 779 | |
780 | 780 | static READ16_HANDLER( h8s2394_per_regs_r ) |
781 | 781 | { |
782 | h83xx_state *h8 = get_safe_token(&space | |
782 | h83xx_state *h8 = get_safe_token(&space.device()); | |
783 | 783 | if (mem_mask == 0xffff) |
784 | 784 | { |
785 | 785 | return h8s2394_per_regs_read_16(h8, (offset << 1)); |
r17963 | r17964 | |
---|---|---|
515 | 515 | UINT8 reg; |
516 | 516 | UINT64 frc; |
517 | 517 | static const UINT64 divider[4] = { 2, 8, 32, 1 }; |
518 | h83xx_state *h8 = get_safe_token(&space | |
518 | h83xx_state *h8 = get_safe_token(&space.device()); | |
519 | 519 | |
520 | 520 | reg = (offset + 0x88) & 0xff; |
521 | 521 | |
r17963 | r17964 | |
603 | 603 | static WRITE8_HANDLER( h8330_itu_w ) |
604 | 604 | { |
605 | 605 | UINT8 reg; |
606 | h83xx_state *h8 = get_safe_token(&space | |
606 | h83xx_state *h8 = get_safe_token(&space.device()); | |
607 | 607 | |
608 | 608 | reg = (offset + 0x88) & 0xff; |
609 | 609 |
r17963 | r17964 | |
---|---|---|
6 | 6 | |
7 | 7 | READ32_HANDLER( m68340_internal_serial_r ) |
8 | 8 | { |
9 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space | |
9 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space.device()); | |
10 | 10 | m68340_serial* serial = m68k->m68340SERIAL; |
11 | 11 | assert(serial != NULL); |
12 | 12 | |
13 | 13 | if (serial) |
14 | 14 | { |
15 | int pc = space | |
15 | int pc = space.device().safe_pc(); | |
16 | 16 | logerror("%08x m68340_internal_serial_r %08x, (%08x)\n", pc, offset*4,mem_mask); |
17 | 17 | } |
18 | 18 | |
r17963 | r17964 | |
21 | 21 | |
22 | 22 | WRITE32_HANDLER( m68340_internal_serial_w ) |
23 | 23 | { |
24 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space | |
24 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space.device()); | |
25 | 25 | m68340_serial* serial = m68k->m68340SERIAL; |
26 | 26 | assert(serial != NULL); |
27 | 27 | |
28 | 28 | if (serial) |
29 | 29 | { |
30 | int pc = space | |
30 | int pc = space.device().safe_pc(); | |
31 | 31 | logerror("%08x m68340_internal_serial_w %08x, %08x (%08x)\n", pc, offset*4,data,mem_mask); |
32 | 32 | } |
33 | 33 |
r17963 | r17964 | |
---|---|---|
101 | 101 | typedef void (*m68k_rte_func)(device_t *device); |
102 | 102 | typedef int (*m68k_tas_func)(device_t *device); |
103 | 103 | |
104 | typedef UINT8 (*m68307_porta_read_callback)(address_space *space, bool dedicated, UINT8 line_mask); | |
105 | typedef void (*m68307_porta_write_callback)(address_space *space, bool dedicated, UINT8 data, UINT8 line_mask); | |
106 | typedef UINT16 (*m68307_portb_read_callback)(address_space *space, bool dedicated, UINT16 line_mask); | |
107 | typedef void (*m68307_portb_write_callback)(address_space *space, bool dedicated, UINT16 data, UINT16 line_mask); | |
104 | typedef UINT8 (*m68307_porta_read_callback)(address_space &space, bool dedicated, UINT8 line_mask); | |
105 | typedef void (*m68307_porta_write_callback)(address_space &space, bool dedicated, UINT8 data, UINT8 line_mask); | |
106 | typedef UINT16 (*m68307_portb_read_callback)(address_space &space, bool dedicated, UINT16 line_mask); | |
107 | typedef void (*m68307_portb_write_callback)(address_space &space, bool dedicated, UINT16 data, UINT16 line_mask); | |
108 | 108 | |
109 | 109 | |
110 | 110 |
r17963 | r17964 | |
---|---|---|
6 | 6 | |
7 | 7 | READ16_HANDLER( m68307_internal_sim_r ) |
8 | 8 | { |
9 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space | |
9 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space.device()); | |
10 | 10 | m68307_sim* sim = m68k->m68307SIM; |
11 | 11 | assert(sim != NULL); |
12 | 12 | |
13 | int pc = space | |
13 | int pc = space.device().safe_pc(); | |
14 | 14 | |
15 | 15 | if (sim) |
16 | 16 | { |
r17963 | r17964 | |
43 | 43 | |
44 | 44 | WRITE16_HANDLER( m68307_internal_sim_w ) |
45 | 45 | { |
46 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space | |
46 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space.device()); | |
47 | 47 | m68307_sim* sim = m68k->m68307SIM; |
48 | 48 | assert(sim != NULL); |
49 | 49 | |
50 | int pc = space | |
50 | int pc = space.device().safe_pc(); | |
51 | 51 | |
52 | 52 | if (sim) |
53 | 53 | { |
r17963 | r17964 | |
150 | 150 | } |
151 | 151 | |
152 | 152 | |
153 | UINT16 m68307_sim::read_padat(address_space | |
153 | UINT16 m68307_sim::read_padat(address_space &space, UINT16 mem_mask) | |
154 | 154 | { |
155 | int pc = space->device().safe_pc(); | |
156 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space->device()); | |
155 | int pc = space.device().safe_pc(); | |
156 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space.device()); | |
157 | 157 | |
158 | 158 | if (m68k->m_m68307_porta_r) |
159 | 159 | { |
r17963 | r17964 | |
177 | 177 | } |
178 | 178 | |
179 | 179 | |
180 | void m68307_sim::write_padat(address_space | |
180 | void m68307_sim::write_padat(address_space &space, UINT16 data, UINT16 mem_mask) | |
181 | 181 | { |
182 | int pc = space->device().safe_pc(); | |
183 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space->device()); | |
182 | int pc = space.device().safe_pc(); | |
183 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space.device()); | |
184 | 184 | COMBINE_DATA(&m_padat); |
185 | 185 | |
186 | 186 | if (m68k->m_m68307_porta_w) |
r17963 | r17964 | |
203 | 203 | COMBINE_DATA(&m_pbddr); |
204 | 204 | } |
205 | 205 | |
206 | UINT16 m68307_sim::read_pbdat(address_space | |
206 | UINT16 m68307_sim::read_pbdat(address_space &space, UINT16 mem_mask) | |
207 | 207 | { |
208 | int pc = space->device().safe_pc(); | |
209 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space->device()); | |
208 | int pc = space.device().safe_pc(); | |
209 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space.device()); | |
210 | 210 | |
211 | 211 | if (m68k->m_m68307_portb_r) |
212 | 212 | { |
r17963 | r17964 | |
230 | 230 | } |
231 | 231 | |
232 | 232 | |
233 | void m68307_sim::write_pbdat(address_space | |
233 | void m68307_sim::write_pbdat(address_space &space, UINT16 data, UINT16 mem_mask) | |
234 | 234 | { |
235 | int pc = space->device().safe_pc(); | |
236 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space->device()); | |
235 | int pc = space.device().safe_pc(); | |
236 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space.device()); | |
237 | 237 | COMBINE_DATA(&m_pbdat); |
238 | 238 | |
239 | 239 | if (m68k->m_m68307_portb_w) |
r17963 | r17964 | |
---|---|---|
7 | 7 | |
8 | 8 | READ8_HANDLER( m68307_internal_mbus_r ) |
9 | 9 | { |
10 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space | |
10 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space.device()); | |
11 | 11 | m68307_mbus* mbus = m68k->m68307MBUS; |
12 | 12 | assert(mbus != NULL); |
13 | 13 | UINT8 retval; |
14 | 14 | |
15 | 15 | if (mbus) |
16 | 16 | { |
17 | int pc = space | |
17 | int pc = space.device().safe_pc(); | |
18 | 18 | |
19 | 19 | |
20 | 20 | switch (offset) |
21 | 21 | { |
22 | 22 | case m68307BUS_MADR: |
23 | 23 | logerror("%08x m68307_internal_mbus_r %08x (MADR - M-Bus Address Register)\n", pc, offset); |
24 | return space | |
24 | return space.machine().rand(); | |
25 | 25 | |
26 | 26 | case m68307BUS_MFDR: |
27 | 27 | logerror("%08x m68307_internal_mbus_r %08x (MFDR - M-Bus Frequency Divider Register)\n", pc, offset); |
28 | return space | |
28 | return space.machine().rand(); | |
29 | 29 | |
30 | 30 | case m68307BUS_MBCR: |
31 | 31 | logerror("%08x m68307_internal_mbus_r %08x (MFCR - M-Bus Control Register)\n", pc, offset); |
32 | return mbus->m_MFCR;//space | |
32 | return mbus->m_MFCR;//space.machine().rand(); | |
33 | 33 | |
34 | 34 | case m68307BUS_MBSR: |
35 | 35 | logerror("%08x m68307_internal_mbus_r %08x (MBSR - M-Bus Status Register)\n", pc, offset); |
r17963 | r17964 | |
42 | 42 | case m68307BUS_MBDR: |
43 | 43 | logerror("%08x m68307_internal_mbus_r %08x (MBDR - M-Bus Data I/O Register)\n", pc, offset); |
44 | 44 | mbus->m_intpend = true; |
45 | return 0xff;//space | |
45 | return 0xff;//space.machine().rand(); | |
46 | 46 | |
47 | 47 | default: |
48 | 48 | logerror("%08x m68307_internal_mbus_r %08x (UNKNOWN / ILLEGAL)\n", pc, offset); |
r17963 | r17964 | |
55 | 55 | |
56 | 56 | WRITE8_HANDLER( m68307_internal_mbus_w ) |
57 | 57 | { |
58 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space | |
58 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space.device()); | |
59 | 59 | m68307_mbus* mbus = m68k->m68307MBUS; |
60 | 60 | assert(mbus != NULL); |
61 | 61 | |
62 | 62 | if (mbus) |
63 | 63 | { |
64 | int pc = space | |
64 | int pc = space.device().safe_pc(); | |
65 | 65 | |
66 | 66 | switch (offset) |
67 | 67 | { |
r17963 | r17964 | |
---|---|---|
15 | 15 | |
16 | 16 | READ8_HANDLER( m68307_internal_serial_r ) |
17 | 17 | { |
18 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space | |
18 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space.device()); | |
19 | 19 | m68307_serial* serial = m68k->m68307SERIAL; |
20 | 20 | assert(serial != NULL); |
21 | 21 | |
r17963 | r17964 | |
29 | 29 | else |
30 | 30 | { |
31 | 31 | |
32 | int pc = space | |
32 | int pc = space.device().safe_pc(); | |
33 | 33 | |
34 | 34 | switch (offset) |
35 | 35 | { |
36 | 36 | case m68307SER_UMR1_UMR2: |
37 | 37 | logerror("%08x m68307_internal_serial_r %08x (UMR1, UMR2 - UART Mode Register)\n", pc, offset); |
38 | return space | |
38 | return space.machine().rand(); | |
39 | 39 | |
40 | 40 | case m68307SER_USR_UCSR: |
41 | 41 | logerror("%08x m68307_internal_serial_r %08x (USR, UCSR - UART Status/Clock Select Register)\n", pc, offset); |
42 | return space | |
42 | return space.machine().rand(); | |
43 | 43 | |
44 | 44 | case m68307SER_UCR: |
45 | 45 | logerror("%08x m68307_internal_serial_r %08x (UCR - UART Command Register)\n", pc, offset); |
46 | return space | |
46 | return space.machine().rand(); | |
47 | 47 | |
48 | 48 | case m68307SER_URB_UTB: |
49 | 49 | logerror("%08x m68307_internal_serial_r %08x (URB, UTB - UART Recieve/Transmit Buffer)\n", pc, offset); |
50 | return 0xff;//space | |
50 | return 0xff;//space.machine().rand(); | |
51 | 51 | |
52 | 52 | case m68307SER_UIPCR_UACR: |
53 | 53 | logerror("%08x m68307_internal_serial_r %08x (UIPCR, UACR - UART Input Port Change Register / UART Control Register)\n", pc, offset); |
54 | return 0xff;//space | |
54 | return 0xff;//space.machine().rand(); | |
55 | 55 | |
56 | 56 | case m68307SER_UISR_UIMR: |
57 | 57 | logerror("%08x m68307_internal_serial_r %08x (UISR, UIMR - UART Interrupt Status Register / UART Interrupt Mask Register)\n", pc, offset); |
58 | return space | |
58 | return space.machine().rand() & 0x87; | |
59 | 59 | |
60 | 60 | case m68307SER_UBG1: |
61 | 61 | logerror("%08x m68307_internal_serial_r %08x (UBG1 - UART Baud Rate Gen. Precaler MSB)\n", pc, offset); |
62 | return space | |
62 | return space.machine().rand() & 0x87; | |
63 | 63 | |
64 | 64 | case m68307SER_UBG2: |
65 | 65 | logerror("%08x m68307_internal_serial_r %08x (UBG1 - UART Baud Rate Gen. Precaler LSB)\n", pc, offset); |
66 | return space | |
66 | return space.machine().rand() & 0x87; | |
67 | 67 | |
68 | 68 | case m68307SER_UIVR: |
69 | 69 | logerror("%08x m68307_internal_serial_r %08x (UIVR - UART Interrupt Vector Register)\n", pc, offset); |
70 | return space | |
70 | return space.machine().rand() & 0x87; | |
71 | 71 | |
72 | 72 | case m68307SER_UIP: |
73 | 73 | logerror("%08x m68307_internal_serial_r %08x (UIP - UART Register Input Port)\n", pc, offset); |
74 | return space | |
74 | return space.machine().rand() & 0x87; | |
75 | 75 | |
76 | 76 | case m68307SER_UOP1: |
77 | 77 | logerror("%08x m68307_internal_serial_r %08x (UOP1 - UART Output Port Bit Set Cmd)\n", pc, offset); |
78 | return space | |
78 | return space.machine().rand() & 0x87; | |
79 | 79 | |
80 | 80 | case m68307SER_UOP0: |
81 | 81 | logerror("%08x m68307_internal_serial_r %08x (UOP0 - UART Output Port Bit Reset Cmd)\n", pc, offset); |
82 | return space | |
82 | return space.machine().rand() & 0x87; | |
83 | 83 | |
84 | 84 | default: |
85 | 85 | logerror("%08x m68307_internal_serial_r %08x (UNKNOWN / ILLEGAL)\n", pc, offset); |
r17963 | r17964 | |
93 | 93 | |
94 | 94 | WRITE8_HANDLER( m68307_internal_serial_w ) |
95 | 95 | { |
96 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space | |
96 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space.device()); | |
97 | 97 | m68307_serial* serial = m68k->m68307SERIAL; |
98 | 98 | assert(serial != NULL); |
99 | 99 | |
100 | int pc = space | |
100 | int pc = space.device().safe_pc(); | |
101 | 101 | |
102 | 102 | if (serial) |
103 | 103 | { |
r17963 | r17964 | |
---|---|---|
51 | 51 | |
52 | 52 | void write_pacnt(UINT16 data, UINT16 mem_mask); |
53 | 53 | void write_paddr(UINT16 data, UINT16 mem_mask); |
54 | UINT16 read_padat(address_space *space, UINT16 mem_mask); | |
55 | void write_padat(address_space *space, UINT16 data, UINT16 mem_mask); | |
54 | UINT16 read_padat(address_space &space, UINT16 mem_mask); | |
55 | void write_padat(address_space &space, UINT16 data, UINT16 mem_mask); | |
56 | 56 | |
57 | 57 | void write_pbcnt(UINT16 data, UINT16 mem_mask); |
58 | 58 | void write_pbddr(UINT16 data, UINT16 mem_mask); |
59 | UINT16 read_pbdat(address_space *space, UINT16 mem_mask); | |
60 | void write_pbdat(address_space *space, UINT16 data, UINT16 mem_mask); | |
59 | UINT16 read_pbdat(address_space &space, UINT16 mem_mask); | |
60 | void write_pbdat(address_space &space, UINT16 data, UINT16 mem_mask); | |
61 | 61 | |
62 | 62 | |
63 | 63 |
r17963 | r17964 | |
---|---|---|
6 | 6 | |
7 | 7 | READ32_HANDLER( m68340_internal_dma_r ) |
8 | 8 | { |
9 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space | |
9 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space.device()); | |
10 | 10 | m68340_dma* dma = m68k->m68340DMA; |
11 | 11 | assert(dma != NULL); |
12 | 12 | |
13 | 13 | if (dma) |
14 | 14 | { |
15 | int pc = space | |
15 | int pc = space.device().safe_pc(); | |
16 | 16 | logerror("%08x m68340_internal_dma_r %08x, (%08x)\n", pc, offset*4,mem_mask); |
17 | 17 | } |
18 | 18 | |
r17963 | r17964 | |
21 | 21 | |
22 | 22 | WRITE32_HANDLER( m68340_internal_dma_w ) |
23 | 23 | { |
24 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space | |
24 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space.device()); | |
25 | 25 | m68340_dma* dma = m68k->m68340DMA; |
26 | 26 | assert(dma != NULL); |
27 | 27 | |
28 | 28 | if (dma) |
29 | 29 | { |
30 | int pc = space | |
30 | int pc = space.device().safe_pc(); | |
31 | 31 | logerror("%08x m68340_internal_dma_w %08x, %08x (%08x)\n", pc, offset*4,data,mem_mask); |
32 | 32 | } |
33 | 33 | } |
r17963 | r17964 | |
---|---|---|
7 | 7 | |
8 | 8 | READ32_HANDLER( m68340_internal_timer_r ) |
9 | 9 | { |
10 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space | |
10 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space.device()); | |
11 | 11 | m68340_timer* timer = m68k->m68340TIMER; |
12 | 12 | assert(timer != NULL); |
13 | 13 | |
14 | 14 | if (timer) |
15 | 15 | { |
16 | int pc = space | |
16 | int pc = space.device().safe_pc(); | |
17 | 17 | logerror("%08x m68340_internal_timer_r %08x, (%08x)\n", pc, offset*4,mem_mask); |
18 | 18 | } |
19 | 19 | |
r17963 | r17964 | |
22 | 22 | |
23 | 23 | WRITE32_HANDLER( m68340_internal_timer_w ) |
24 | 24 | { |
25 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space | |
25 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space.device()); | |
26 | 26 | m68340_timer* timer = m68k->m68340TIMER; |
27 | 27 | assert(timer != NULL); |
28 | 28 | |
29 | 29 | if (timer) |
30 | 30 | { |
31 | int pc = space | |
31 | int pc = space.device().safe_pc(); | |
32 | 32 | logerror("%08x m68340_internal_timer_w %08x, %08x (%08x)\n", pc, offset*4,data,mem_mask); |
33 | 33 | } |
34 | 34 | } |
r17963 | r17964 | |
---|---|---|
6 | 6 | |
7 | 7 | READ16_HANDLER( m68307_internal_timer_r ) |
8 | 8 | { |
9 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space | |
9 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space.device()); | |
10 | 10 | m68307_timer* timer = m68k->m68307TIMER; |
11 | 11 | assert(timer != NULL); |
12 | 12 | |
13 | 13 | if (timer) |
14 | 14 | { |
15 | int pc = space | |
15 | int pc = space.device().safe_pc(); | |
16 | 16 | int which = offset & 0x8; |
17 | 17 | |
18 | 18 | switch (offset&0x7) |
r17963 | r17964 | |
34 | 34 | |
35 | 35 | WRITE16_HANDLER( m68307_internal_timer_w ) |
36 | 36 | { |
37 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space | |
37 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space.device()); | |
38 | 38 | m68307_timer* timer = m68k->m68307TIMER; |
39 | 39 | assert(timer != NULL); |
40 | 40 | |
41 | 41 | if (timer) |
42 | 42 | { |
43 | int pc = space | |
43 | int pc = space.device().safe_pc(); | |
44 | 44 | int which = offset & 0x8; |
45 | 45 | |
46 | 46 | switch (offset&0x7) |
r17963 | r17964 | |
---|---|---|
2075 | 2075 | |
2076 | 2076 | static READ16_HANDLER( m68307_internal_base_r ) |
2077 | 2077 | { |
2078 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space | |
2078 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space.device()); | |
2079 | 2079 | |
2080 | int pc = space | |
2080 | int pc = space.device().safe_pc(); | |
2081 | 2081 | logerror("%08x m68307_internal_base_r %08x, (%04x)\n", pc, offset*2,mem_mask); |
2082 | 2082 | |
2083 | 2083 | switch (offset<<1) |
r17963 | r17964 | |
2094 | 2094 | |
2095 | 2095 | static WRITE16_HANDLER( m68307_internal_base_w ) |
2096 | 2096 | { |
2097 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space | |
2097 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space.device()); | |
2098 | 2098 | |
2099 | int pc = space | |
2099 | int pc = space.device().safe_pc(); | |
2100 | 2100 | logerror("%08x m68307_internal_base_w %08x, %04x (%04x)\n", pc, offset*2,data,mem_mask); |
2101 | 2101 | int base = 0; |
2102 | 2102 | //int mask = 0; |
r17963 | r17964 | |
2763 | 2763 | |
2764 | 2764 | static READ32_HANDLER( m68340_internal_base_r ) |
2765 | 2765 | { |
2766 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space->device()); | |
2767 | int pc = space->device().safe_pc(); | |
2766 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space.device()); | |
2767 | int pc = space.device().safe_pc(); | |
2768 | 2768 | logerror("%08x m68340_internal_base_r %08x, (%08x)\n", pc, offset*4,mem_mask); |
2769 | 2769 | return m68k->m68340_base; |
2770 | 2770 | } |
2771 | 2771 | |
2772 | 2772 | static WRITE32_HANDLER( m68340_internal_base_w ) |
2773 | 2773 | { |
2774 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space | |
2774 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space.device()); | |
2775 | 2775 | |
2776 | int pc = space | |
2776 | int pc = space.device().safe_pc(); | |
2777 | 2777 | logerror("%08x m68340_internal_base_w %08x, %08x (%08x)\n", pc, offset*4,data,mem_mask); |
2778 | 2778 | |
2779 | 2779 | // other conditions? |
r17963 | r17964 | |
---|---|---|
6 | 6 | |
7 | 7 | READ16_HANDLER( m68340_internal_sim_r ) |
8 | 8 | { |
9 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space | |
9 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space.device()); | |
10 | 10 | m68340_sim* sim = m68k->m68340SIM; |
11 | 11 | assert(sim != NULL); |
12 | 12 | |
13 | 13 | if (sim) |
14 | 14 | { |
15 | int pc = space | |
15 | int pc = space.device().safe_pc(); | |
16 | 16 | |
17 | 17 | switch (offset<<1) |
18 | 18 | { |
19 | 19 | case m68340SIM_MCR: |
20 | 20 | logerror("%08x m68340_internal_sim_r %04x, (%04x) (MCR - Module Configuration Register)\n", pc, offset*2,mem_mask); |
21 | return space | |
21 | return space.machine().rand(); | |
22 | 22 | |
23 | 23 | case m68340SIM_SYNCR: |
24 | 24 | logerror("%08x m68340_internal_sim_r %04x, (%04x) (SYNCR - Clock Synthesizer Register)\n", pc, offset*2,mem_mask); |
25 | return space | |
25 | return space.machine().rand(); | |
26 | 26 | |
27 | 27 | case m68340SIM_AVR_RSR: |
28 | 28 | logerror("%08x m68340_internal_sim_r %04x, (%04x) (AVR, RSR - Auto Vector Register, Reset Status Register)\n", pc, offset*2,mem_mask); |
29 | return space | |
29 | return space.machine().rand(); | |
30 | 30 | |
31 | 31 | case m68340SIM_SWIV_SYPCR: |
32 | 32 | logerror("%08x m68340_internal_sim_r %04x, (%04x) (SWIV_SYPCR - Software Interrupt Vector, System Protection Control Register)\n", pc, offset*2,mem_mask); |
33 | return space | |
33 | return space.machine().rand(); | |
34 | 34 | |
35 | 35 | case m68340SIM_PICR: |
36 | 36 | logerror("%08x m68340_internal_sim_r %04x, (%04x) (PICR - Periodic Interrupt Control Register)\n", pc, offset*2,mem_mask); |
37 | return space | |
37 | return space.machine().rand(); | |
38 | 38 | |
39 | 39 | case m68340SIM_PITR: |
40 | 40 | logerror("%08x m68340_internal_sim_r %04x, (%04x) (PITR - Periodic Interrupt Timer Register)\n", pc, offset*2,mem_mask); |
41 | return space | |
41 | return space.machine().rand(); | |
42 | 42 | |
43 | 43 | case m68340SIM_SWSR: |
44 | 44 | logerror("%08x m68340_internal_sim_r %04x, (%04x) (SWSR - Software Service)\n", pc, offset*2,mem_mask); |
45 | return space | |
45 | return space.machine().rand(); | |
46 | 46 | |
47 | 47 | default: |
48 | 48 | logerror("%08x m68340_internal_sim_r %04x, (%04x)\n", pc, offset*2,mem_mask); |
r17963 | r17964 | |
57 | 57 | READ8_HANDLER( m68340_internal_sim_ports_r ) |
58 | 58 | { |
59 | 59 | offset += 0x10; |
60 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space | |
60 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space.device()); | |
61 | 61 | m68340_sim* sim = m68k->m68340SIM; |
62 | 62 | assert(sim != NULL); |
63 | 63 | |
64 | 64 | if (sim) |
65 | 65 | { |
66 | int pc = space | |
66 | int pc = space.device().safe_pc(); | |
67 | 67 | |
68 | 68 | switch (offset) |
69 | 69 | { |
70 | 70 | case m68340SIM_PORTA: |
71 | 71 | logerror("%08x m68340_internal_sim_r %04x (PORTA - Port A Data)\n", pc, offset); |
72 | return space | |
72 | return space.machine().rand(); | |
73 | 73 | |
74 | 74 | case m68340SIM_DDRA: |
75 | 75 | logerror("%08x m68340_internal_sim_r %04x (DDRA - Port A Data Direction)\n", pc, offset); |
76 | return space | |
76 | return space.machine().rand(); | |
77 | 77 | |
78 | 78 | case m68340SIM_PPRA1: |
79 | 79 | logerror("%08x m68340_internal_sim_r %04x (PPRA1 - Port A Pin Assignment 1)\n", pc, offset); |
80 | return space | |
80 | return space.machine().rand(); | |
81 | 81 | |
82 | 82 | case m68340SIM_PPRA2: |
83 | 83 | logerror("%08x m68340_internal_sim_r %04x (PPRA2 - Port A Pin Assignment 2)\n", pc, offset); |
84 | return space | |
84 | return space.machine().rand(); | |
85 | 85 | |
86 | 86 | case m68340SIM_PORTB: |
87 | 87 | logerror("%08x m68340_internal_sim_r %04x (PORTB - Port B Data 0)\n", pc, offset); |
88 | return space | |
88 | return space.machine().rand(); | |
89 | 89 | |
90 | 90 | case m68340SIM_PORTB1: |
91 | 91 | logerror("%08x m68340_internal_sim_r %04x (PORTB1 - Port B Data 1)\n", pc, offset); |
92 | return space | |
92 | return space.machine().rand(); | |
93 | 93 | |
94 | 94 | case m68340SIM_DDRB: |
95 | 95 | logerror("%08x m68340_internal_sim_r %04x (DDR - Port B Data Direction)\n", pc, offset); |
96 | return space | |
96 | return space.machine().rand(); | |
97 | 97 | |
98 | 98 | case m68340SIM_PPARB: |
99 | 99 | logerror("%08x m68340_internal_sim_r %04x (PPARB - Port B Pin Assignment)\n", pc, offset); |
100 | return space | |
100 | return space.machine().rand(); | |
101 | 101 | |
102 | 102 | default: |
103 | 103 | logerror("%08x m68340_internal_sim_r %04x (ILLEGAL?)\n", pc, offset); |
104 | return space | |
104 | return space.machine().rand(); | |
105 | 105 | |
106 | 106 | } |
107 | 107 | } |
r17963 | r17964 | |
113 | 113 | { |
114 | 114 | offset += m68340SIM_AM_CS0>>2; |
115 | 115 | |
116 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space | |
116 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space.device()); | |
117 | 117 | m68340_sim* sim = m68k->m68340SIM; |
118 | 118 | assert(sim != NULL); |
119 | 119 | |
120 | 120 | if (sim) |
121 | 121 | { |
122 | int pc = space | |
122 | int pc = space.device().safe_pc(); | |
123 | 123 | |
124 | 124 | switch (offset<<2) |
125 | 125 | { |
r17963 | r17964 | |
143 | 143 | |
144 | 144 | WRITE16_HANDLER( m68340_internal_sim_w ) |
145 | 145 | { |
146 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space | |
146 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space.device()); | |
147 | 147 | m68340_sim* sim = m68k->m68340SIM; |
148 | 148 | assert(sim != NULL); |
149 | 149 | |
150 | 150 | if (sim) |
151 | 151 | { |
152 | int pc = space | |
152 | int pc = space.device().safe_pc(); | |
153 | 153 | |
154 | 154 | switch (offset<<1) |
155 | 155 | { |
r17963 | r17964 | |
193 | 193 | WRITE8_HANDLER( m68340_internal_sim_ports_w ) |
194 | 194 | { |
195 | 195 | offset += 0x10; |
196 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space | |
196 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space.device()); | |
197 | 197 | m68340_sim* sim = m68k->m68340SIM; |
198 | 198 | assert(sim != NULL); |
199 | 199 | |
200 | 200 | if (sim) |
201 | 201 | { |
202 | int pc = space | |
202 | int pc = space.device().safe_pc(); | |
203 | 203 | |
204 | 204 | switch (offset) |
205 | 205 | { |
r17963 | r17964 | |
246 | 246 | WRITE32_HANDLER( m68340_internal_sim_cs_w ) |
247 | 247 | { |
248 | 248 | offset += m68340SIM_AM_CS0>>2; |
249 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space | |
249 | m68ki_cpu_core *m68k = m68k_get_safe_token(&space.device()); | |
250 | 250 | m68340_sim* sim = m68k->m68340SIM; |
251 | 251 | assert(sim != NULL); |
252 | 252 | |
253 | 253 | if (sim) |
254 | 254 | { |
255 | int pc = space | |
255 | int pc = space.device().safe_pc(); | |
256 | 256 | |
257 | 257 | switch (offset<<2) |
258 | 258 | { |
r17963 | r17964 | |
---|---|---|
197 | 197 | void (*scanline_callback_ind16)(screen_device &screen, bitmap_ind16 &bitmap, int scanline, const tms34010_display_params *params); |
198 | 198 | void (*scanline_callback_rgb32)(screen_device &screen, bitmap_rgb32 &bitmap, int scanline, const tms34010_display_params *params); |
199 | 199 | void (*output_int)(device_t *device, int state); /* output interrupt callback */ |
200 | void (*to_shiftreg)(address_space *space, offs_t, UINT16 *); /* shift register write */ | |
201 | void (*from_shiftreg)(address_space *space, offs_t, UINT16 *); /* shift register read */ | |
200 | void (*to_shiftreg)(address_space &space, offs_t, UINT16 *); /* shift register write */ | |
201 | void (*from_shiftreg)(address_space &space, offs_t, UINT16 *); /* shift register read */ | |
202 | 202 | }; |
203 | 203 | |
204 | 204 |
r17963 | r17964 | |
---|---|---|
316 | 316 | static UINT32 read_pixel_shiftreg(tms34010_state *tms, offs_t offset) |
317 | 317 | { |
318 | 318 | if (tms->config->to_shiftreg) |
319 | tms->config->to_shiftreg(tms->program, offset, &tms->shiftreg[0]); | |
319 | tms->config->to_shiftreg(*tms->program, offset, &tms->shiftreg[0]); | |
320 | 320 | else |
321 | 321 | fatalerror("To ShiftReg function not set. PC = %08X\n", tms->pc); |
322 | 322 | return tms->shiftreg[0]; |
r17963 | r17964 | |
460 | 460 | static void write_pixel_shiftreg(tms34010_state *tms, offs_t offset, UINT32 data) |
461 | 461 | { |
462 | 462 | if (tms->config->from_shiftreg) |
463 | tms->config->from_shiftreg(tms->program, offset, &tms->shiftreg[0]); | |
463 | tms->config->from_shiftreg(*tms->program, offset, &tms->shiftreg[0]); | |
464 | 464 | else |
465 | 465 | fatalerror("From ShiftReg function not set. PC = %08X\n", tms->pc); |
466 | 466 | } |
r17963 | r17964 | |
699 | 699 | /* the first time we are run */ |
700 | 700 | tms->reset_deferred = tms->config->halt_on_reset; |
701 | 701 | if (tms->config->halt_on_reset) |
702 | tms34010_io_register_w(device->space(AS_PROGRAM), REG_HSTCTLH, 0x8000, 0xffff); | |
702 | tms34010_io_register_w(*device->space(AS_PROGRAM), REG_HSTCTLH, 0x8000, 0xffff); | |
703 | 703 | } |
704 | 704 | |
705 | 705 | |
r17963 | r17964 | |
1193 | 1193 | |
1194 | 1194 | WRITE16_HANDLER( tms34010_io_register_w ) |
1195 | 1195 | { |
1196 | tms34010_state *tms = get_safe_token(&space | |
1196 | tms34010_state *tms = get_safe_token(&space.device()); | |
1197 | 1197 | int oldreg, newreg; |
1198 | 1198 | |
1199 | 1199 | /* Set register */ |
r17963 | r17964 | |
1222 | 1222 | break; |
1223 | 1223 | |
1224 | 1224 | case REG_PMASK: |
1225 | if (data) logerror("Plane masking not supported. PC=%08X\n", space | |
1225 | if (data) logerror("Plane masking not supported. PC=%08X\n", space.device().safe_pc()); | |
1226 | 1226 | break; |
1227 | 1227 | |
1228 | 1228 | case REG_DPYCTL: |
r17963 | r17964 | |
1262 | 1262 | if (!(oldreg & 0x0080) && (newreg & 0x0080)) |
1263 | 1263 | { |
1264 | 1264 | if (tms->config->output_int) |
1265 | (*tms->config->output_int)(&space | |
1265 | (*tms->config->output_int)(&space.device(), 1); | |
1266 | 1266 | } |
1267 | 1267 | else if ((oldreg & 0x0080) && !(newreg & 0x0080)) |
1268 | 1268 | { |
1269 | 1269 | if (tms->config->output_int) |
1270 | (*tms->config->output_int)(&space | |
1270 | (*tms->config->output_int)(&space.device(), 0); | |
1271 | 1271 | } |
1272 | 1272 | |
1273 | 1273 | /* input interrupt? (should really be state-based, but the functions don't exist!) */ |
r17963 | r17964 | |
1336 | 1336 | |
1337 | 1337 | WRITE16_HANDLER( tms34020_io_register_w ) |
1338 | 1338 | { |
1339 | tms34010_state *tms = get_safe_token(&space | |
1339 | tms34010_state *tms = get_safe_token(&space.device()); | |
1340 | 1340 | int oldreg, newreg; |
1341 | 1341 | |
1342 | 1342 | /* Set register */ |
r17963 | r17964 | |
1373 | 1373 | |
1374 | 1374 | case REG020_PMASKL: |
1375 | 1375 | case REG020_PMASKH: |
1376 | if (data) logerror("Plane masking not supported. PC=%08X\n", space | |
1376 | if (data) logerror("Plane masking not supported. PC=%08X\n", space.device().safe_pc()); | |
1377 | 1377 | break; |
1378 | 1378 | |
1379 | 1379 | case REG020_DPYCTL: |
r17963 | r17964 | |
1413 | 1413 | if (!(oldreg & 0x0080) && (newreg & 0x0080)) |
1414 | 1414 | { |
1415 | 1415 | if (tms->config->output_int) |
1416 | (*tms->config->output_int)(&space | |
1416 | (*tms->config->output_int)(&space.device(), 1); | |
1417 | 1417 | } |
1418 | 1418 | else if ((oldreg & 0x0080) && !(newreg & 0x0080)) |
1419 | 1419 | { |
1420 | 1420 | if (tms->config->output_int) |
1421 | (*tms->config->output_int)(&space | |
1421 | (*tms->config->output_int)(&space.device(), 0); | |
1422 | 1422 | } |
1423 | 1423 | |
1424 | 1424 | /* input interrupt? (should really be state-based, but the functions don't exist!) */ |
r17963 | r17964 | |
1499 | 1499 | |
1500 | 1500 | READ16_HANDLER( tms34010_io_register_r ) |
1501 | 1501 | { |
1502 | tms34010_state *tms = get_safe_token(&space | |
1502 | tms34010_state *tms = get_safe_token(&space.device()); | |
1503 | 1503 | int result, total; |
1504 | 1504 | |
1505 | 1505 | // if (LOG_CONTROL_REGS) |
r17963 | r17964 | |
1542 | 1542 | |
1543 | 1543 | READ16_HANDLER( tms34020_io_register_r ) |
1544 | 1544 | { |
1545 | tms34010_state *tms = get_safe_token(&space | |
1545 | tms34010_state *tms = get_safe_token(&space.device()); | |
1546 | 1546 | int result, total; |
1547 | 1547 | |
1548 | 1548 | // if (LOG_CONTROL_REGS) |
r17963 | r17964 | |
1595 | 1595 | |
1596 | 1596 | void tms34010_host_w(device_t *cpu, int reg, int data) |
1597 | 1597 | { |
1598 | address_space *space; | |
1599 | 1598 | tms34010_state *tms = get_safe_token(cpu); |
1600 | 1599 | unsigned int addr; |
1601 | 1600 | |
r17963 | r17964 | |
1629 | 1628 | |
1630 | 1629 | /* control register */ |
1631 | 1630 | case TMS34010_HOST_CONTROL: |
1631 | { | |
1632 | 1632 | tms->external_host_access = TRUE; |
1633 | space = tms->device->space(AS_PROGRAM); | |
1633 | address_space &space = *tms->device->space(AS_PROGRAM); | |
1634 | 1634 | tms34010_io_register_w(space, REG_HSTCTLH, data & 0xff00, 0xffff); |
1635 | 1635 | tms34010_io_register_w(space, REG_HSTCTLL, data & 0x00ff, 0xffff); |
1636 | 1636 | tms->external_host_access = FALSE; |
1637 | 1637 | break; |
1638 | } | |
1638 | 1639 | |
1639 | 1640 | /* error case */ |
1640 | 1641 | default: |
r17963 | r17964 | |
---|---|---|
201 | 201 | |
202 | 202 | |
203 | 203 | /* Shift register handling */ |
204 | static void memory_w(address_space | |
204 | static void memory_w(address_space &space, offs_t offset,UINT16 data) | |
205 | 205 | { |
206 | space | |
206 | space.write_word(offset, data); | |
207 | 207 | } |
208 | 208 | |
209 | static UINT16 memory_r(address_space | |
209 | static UINT16 memory_r(address_space &space, offs_t offset) | |
210 | 210 | { |
211 | return space | |
211 | return space.read_word(offset); | |
212 | 212 | } |
213 | 213 | |
214 | static void shiftreg_w(address_space | |
214 | static void shiftreg_w(address_space &space, offs_t offset,UINT16 data) | |
215 | 215 | { |
216 | tms34010_state *tms = get_safe_token(&space | |
216 | tms34010_state *tms = get_safe_token(&space.device()); | |
217 | 217 | if (tms->config->from_shiftreg) |
218 | 218 | (*tms->config->from_shiftreg)(space, (UINT32)(offset << 3) & ~15, &tms->shiftreg[0]); |
219 | 219 | else |
220 | 220 | logerror("From ShiftReg function not set. PC = %08X\n", tms->pc); |
221 | 221 | } |
222 | 222 | |
223 | static UINT16 shiftreg_r(address_space | |
223 | static UINT16 shiftreg_r(address_space &space, offs_t offset) | |
224 | 224 | { |
225 | tms34010_state *tms = get_safe_token(&space | |
225 | tms34010_state *tms = get_safe_token(&space.device()); | |
226 | 226 | if (tms->config->to_shiftreg) |
227 | 227 | (*tms->config->to_shiftreg)(space, (UINT32)(offset << 3) & ~15, &tms->shiftreg[0]); |
228 | 228 | else |
r17963 | r17964 | |
230 | 230 | return tms->shiftreg[0]; |
231 | 231 | } |
232 | 232 | |
233 | static UINT16 dummy_shiftreg_r(address_space | |
233 | static UINT16 dummy_shiftreg_r(address_space &space, offs_t offset) | |
234 | 234 | { |
235 | tms34010_state *tms = get_safe_token(&space | |
235 | tms34010_state *tms = get_safe_token(&space.device()); | |
236 | 236 | return tms->shiftreg[0]; |
237 | 237 | } |
238 | 238 | |
r17963 | r17964 | |
1038 | 1038 | if (!P_FLAG(tms)) |
1039 | 1039 | { |
1040 | 1040 | int dx, dy, x, y, /*words,*/ yreverse; |
1041 | void (*word_write)(address_space *space,offs_t address,UINT16 data); | |
1042 | UINT16 (*word_read)(address_space *space,offs_t address); | |
1041 | void (*word_write)(address_space &space,offs_t address,UINT16 data); | |
1042 | UINT16 (*word_read)(address_space &space,offs_t address); | |
1043 | 1043 | UINT32 readwrites = 0; |
1044 | 1044 | UINT32 saddr, daddr; |
1045 | 1045 | XY dstxy = { 0 }; |
r17963 | r17964 | |
1113 | 1113 | UINT32 srcword, dstword = 0; |
1114 | 1114 | |
1115 | 1115 | /* fetch the initial source word */ |
1116 | srcword = (*word_read)(tms->program, srcwordaddr++ << 1); | |
1116 | srcword = (*word_read)(*tms->program, srcwordaddr++ << 1); | |
1117 | 1117 | readwrites++; |
1118 | 1118 | |
1119 | 1119 | /* fetch the initial dest word */ |
1120 | 1120 | if (PIXEL_OP_REQUIRES_SOURCE || TRANSPARENCY || (daddr & 0x0f) != 0) |
1121 | 1121 | { |
1122 | dstword = (*word_read)(tms->program, dstwordaddr << 1); | |
1122 | dstword = (*word_read)(*tms->program, dstwordaddr << 1); | |
1123 | 1123 | readwrites++; |
1124 | 1124 | } |
1125 | 1125 | |
r17963 | r17964 | |
1132 | 1132 | /* fetch more words if necessary */ |
1133 | 1133 | if (srcbit + BITS_PER_PIXEL > 16) |
1134 | 1134 | { |
1135 | srcword |= (*word_read)(tms->program, srcwordaddr++ << 1) << 16; | |
1135 | srcword |= (*word_read)(*tms->program, srcwordaddr++ << 1) << 16; | |
1136 | 1136 | readwrites++; |
1137 | 1137 | } |
1138 | 1138 | |
r17963 | r17964 | |
1149 | 1149 | if (PIXEL_OP_REQUIRES_SOURCE || TRANSPARENCY) |
1150 | 1150 | if (dstbit + BITS_PER_PIXEL > 16) |
1151 | 1151 | { |
1152 | dstword |= (*word_read)(tms->program, (dstwordaddr + 1) << 1) << 16; | |
1152 | dstword |= (*word_read)(*tms->program, (dstwordaddr + 1) << 1) << 16; | |
1153 | 1153 | readwrites++; |
1154 | 1154 | } |
1155 | 1155 | |
r17963 | r17964 | |
1164 | 1164 | dstbit += BITS_PER_PIXEL; |
1165 | 1165 | if (dstbit > 16) |
1166 | 1166 | { |
1167 | (*word_write)(tms->program, dstwordaddr++ << 1, dstword); | |
1167 | (*word_write)(*tms->program, dstwordaddr++ << 1, dstword); | |
1168 | 1168 | readwrites++; |
1169 | 1169 | dstbit -= 16; |
1170 | 1170 | dstword >>= 16; |
r17963 | r17964 | |
1177 | 1177 | /* if we're right-partial, read and mask the remaining bits */ |
1178 | 1178 | if (dstbit != 16) |
1179 | 1179 | { |
1180 | UINT16 origdst = (*word_read)(tms->program, dstwordaddr << 1); | |
1180 | UINT16 origdst = (*word_read)(*tms->program, dstwordaddr << 1); | |
1181 | 1181 | UINT16 mask = 0xffff << dstbit; |
1182 | 1182 | dstword = (dstword & ~mask) | (origdst & mask); |
1183 | 1183 | readwrites++; |
1184 | 1184 | } |
1185 | 1185 | |
1186 | (*word_write)(tms->program, dstwordaddr++ << 1, dstword); | |
1186 | (*word_write)(*tms->program, dstwordaddr++ << 1, dstword); | |
1187 | 1187 | readwrites++; |
1188 | 1188 | } |
1189 | 1189 | |
r17963 | r17964 | |
1215 | 1215 | dwordaddr = daddr >> 4; |
1216 | 1216 | |
1217 | 1217 | /* fetch the initial source word */ |
1218 | srcword = (*word_read)(tms->program, swordaddr++ << 1); | |
1218 | srcword = (*word_read)(*tms->program, swordaddr++ << 1); | |
1219 | 1219 | srcmask = PIXEL_MASK << (saddr & 15); |
1220 | 1220 | |
1221 | 1221 | /* handle the left partial word */ |
1222 | 1222 | if (left_partials != 0) |
1223 | 1223 | { |
1224 | 1224 | /* fetch the destination word */ |
1225 | dstword = (*word_read)(tms->program, dwordaddr << 1); | |
1225 | dstword = (*word_read)(*tms->program, dwordaddr << 1); | |
1226 | 1226 | dstmask = PIXEL_MASK << (daddr & 15); |
1227 | 1227 | |
1228 | 1228 | /* loop over partials */ |
r17963 | r17964 | |
1231 | 1231 | /* fetch another word if necessary */ |
1232 | 1232 | if (srcmask == 0) |
1233 | 1233 | { |
1234 | srcword = (*word_read)(tms->program, swordaddr++ << 1); | |
1234 | srcword = (*word_read)(*tms->program, swordaddr++ << 1); | |
1235 | 1235 | srcmask = PIXEL_MASK; |
1236 | 1236 | } |
1237 | 1237 | |
r17963 | r17964 | |
1253 | 1253 | } |
1254 | 1254 | |
1255 | 1255 | /* write the result */ |
1256 | (*word_write)(tms->program, dwordaddr++ << 1, dstword); | |
1256 | (*word_write)(*tms->program, dwordaddr++ << 1, dstword); | |
1257 | 1257 | } |
1258 | 1258 | |
1259 | 1259 | /* loop over full words */ |
r17963 | r17964 | |
1261 | 1261 | { |
1262 | 1262 | /* fetch the destination word (if necessary) */ |
1263 | 1263 | if (PIXEL_OP_REQUIRES_SOURCE || TRANSPARENCY) |
1264 | dstword = (*word_read)(tms->program, dwordaddr << 1); | |
1264 | dstword = (*word_read)(*tms->program, dwordaddr << 1); | |
1265 | 1265 | else |
1266 | 1266 | dstword = 0; |
1267 | 1267 | dstmask = PIXEL_MASK; |
r17963 | r17964 | |
1272 | 1272 | /* fetch another word if necessary */ |
1273 | 1273 | if (srcmask == 0) |
1274 | 1274 | { |
1275 | srcword = (*word_read)(tms->program, swordaddr++ << 1); | |
1275 | srcword = (*word_read)(*tms->program, swordaddr++ << 1); | |
1276 | 1276 | srcmask = PIXEL_MASK; |
1277 | 1277 | } |
1278 | 1278 | |
r17963 | r17964 | |
1294 | 1294 | } |
1295 | 1295 | |
1296 | 1296 | /* write the result */ |
1297 | (*word_write)(tms->program, dwordaddr++ << 1, dstword); | |
1297 | (*word_write)(*tms->program, dwordaddr++ << 1, dstword); | |
1298 | 1298 | } |
1299 | 1299 | |
1300 | 1300 | /* handle the right partial word */ |
1301 | 1301 | if (right_partials != 0) |
1302 | 1302 | { |
1303 | 1303 | /* fetch the destination word */ |
1304 | dstword = (*word_read)(tms->program, dwordaddr << 1); | |
1304 | dstword = (*word_read)(*tms->program, dwordaddr << 1); | |
1305 | 1305 | dstmask = PIXEL_MASK; |
1306 | 1306 | |
1307 | 1307 | /* loop over partials */ |
r17963 | r17964 | |
1311 | 1311 | if (srcmask == 0) |
1312 | 1312 | { |
1313 | 1313 | LOGGFX((" right fetch @ %08x\n", swordaddr)); |
1314 | srcword = (*word_read)(tms->program, swordaddr++ << 1); | |
1314 | srcword = (*word_read)(*tms->program, swordaddr++ << 1); | |
1315 | 1315 | srcmask = PIXEL_MASK; |
1316 | 1316 | } |
1317 | 1317 | |
r17963 | r17964 | |
1333 | 1333 | } |
1334 | 1334 | |
1335 | 1335 | /* write the result */ |
1336 | (*word_write)(tms->program, dwordaddr++ << 1, dstword); | |
1336 | (*word_write)(*tms->program, dwordaddr++ << 1, dstword); | |
1337 | 1337 | } |
1338 | 1338 | #endif |
1339 | 1339 | |
r17963 | r17964 | |
1385 | 1385 | if (!P_FLAG(tms)) |
1386 | 1386 | { |
1387 | 1387 | int dx, dy, x, y, words, yreverse; |
1388 | void (*word_write)(address_space *space,offs_t address,UINT16 data); | |
1389 | UINT16 (*word_read)(address_space *space,offs_t address); | |
1388 | void (*word_write)(address_space &space,offs_t address,UINT16 data); | |
1389 | UINT16 (*word_read)(address_space &space,offs_t address); | |
1390 | 1390 | UINT32 saddr, daddr; |
1391 | 1391 | XY dstxy = { 0 }; |
1392 | 1392 | |
r17963 | r17964 | |
1484 | 1484 | dwordaddr = (daddr + 15) >> 4; |
1485 | 1485 | |
1486 | 1486 | /* fetch the initial source word */ |
1487 | srcword = (*word_read)(tms->program, --swordaddr << 1); | |
1487 | srcword = (*word_read)(*tms->program, --swordaddr << 1); | |
1488 | 1488 | srcmask = PIXEL_MASK << ((saddr - BITS_PER_PIXEL) & 15); |
1489 | 1489 | |
1490 | 1490 | /* handle the right partial word */ |
1491 | 1491 | if (right_partials != 0) |
1492 | 1492 | { |
1493 | 1493 | /* fetch the destination word */ |
1494 | dstword = (*word_read)(tms->program, --dwordaddr << 1); | |
1494 | dstword = (*word_read)(*tms->program, --dwordaddr << 1); | |
1495 | 1495 | dstmask = PIXEL_MASK << ((daddr - BITS_PER_PIXEL) & 15); |
1496 | 1496 | |
1497 | 1497 | /* loop over partials */ |
r17963 | r17964 | |
1500 | 1500 | /* fetch source pixel if necessary */ |
1501 | 1501 | if (srcmask == 0) |
1502 | 1502 | { |
1503 | srcword = (*word_read)(tms->program, --swordaddr << 1); | |
1503 | srcword = (*word_read)(*tms->program, --swordaddr << 1); | |
1504 | 1504 | srcmask = PIXEL_MASK << (16 - BITS_PER_PIXEL); |
1505 | 1505 | } |
1506 | 1506 | |
r17963 | r17964 | |
1522 | 1522 | } |
1523 | 1523 | |
1524 | 1524 | /* write the result */ |
1525 | (*word_write)(tms->program, dwordaddr << 1, dstword); | |
1525 | (*word_write)(*tms->program, dwordaddr << 1, dstword); | |
1526 | 1526 | } |
1527 | 1527 | |
1528 | 1528 | /* loop over full words */ |
r17963 | r17964 | |
1531 | 1531 | /* fetch the destination word (if necessary) */ |
1532 | 1532 | dwordaddr--; |
1533 | 1533 | if (PIXEL_OP_REQUIRES_SOURCE || TRANSPARENCY) |
1534 | dstword = (*word_read)(tms->program, dwordaddr << 1); | |
1534 | dstword = (*word_read)(*tms->program, dwordaddr << 1); | |
1535 | 1535 | else |
1536 | 1536 | dstword = 0; |
1537 | 1537 | dstmask = PIXEL_MASK << (16 - BITS_PER_PIXEL); |
r17963 | r17964 | |
1542 | 1542 | /* fetch source pixel if necessary */ |
1543 | 1543 | if (srcmask == 0) |
1544 | 1544 | { |
1545 | srcword = (*word_read)(tms->program, --swordaddr << 1); | |
1545 | srcword = (*word_read)(*tms->program, --swordaddr << 1); | |
1546 | 1546 | srcmask = PIXEL_MASK << (16 - BITS_PER_PIXEL); |
1547 | 1547 | } |
1548 | 1548 | |
r17963 | r17964 | |
1564 | 1564 | } |
1565 | 1565 | |
1566 | 1566 | /* write the result */ |
1567 | (*word_write)(tms->program, dwordaddr << 1, dstword); | |
1567 | (*word_write)(*tms->program, dwordaddr << 1, dstword); | |
1568 | 1568 | } |
1569 | 1569 | |
1570 | 1570 | /* handle the left partial word */ |
1571 | 1571 | if (left_partials != 0) |
1572 | 1572 | { |
1573 | 1573 | /* fetch the destination word */ |
1574 | dstword = (*word_read)(tms->program, --dwordaddr << 1); | |
1574 | dstword = (*word_read)(*tms->program, --dwordaddr << 1); | |
1575 | 1575 | dstmask = PIXEL_MASK << (16 - BITS_PER_PIXEL); |
1576 | 1576 | |
1577 | 1577 | /* loop over partials */ |
r17963 | r17964 | |
1580 | 1580 | /* fetch the source pixel if necessary */ |
1581 | 1581 | if (srcmask == 0) |
1582 | 1582 | { |
1583 | srcword = (*word_read)(tms->program, --swordaddr << 1); | |
1583 | srcword = (*word_read)(*tms->program, --swordaddr << 1); | |
1584 | 1584 | srcmask = PIXEL_MASK << (16 - BITS_PER_PIXEL); |
1585 | 1585 | } |
1586 | 1586 | |
r17963 | r17964 | |
1602 | 1602 | } |
1603 | 1603 | |
1604 | 1604 | /* write the result */ |
1605 | (*word_write)(tms->program, dwordaddr << 1, dstword); | |
1605 | (*word_write)(*tms->program, dwordaddr << 1, dstword); | |
1606 | 1606 | } |
1607 | 1607 | |
1608 | 1608 | /* update for next row */ |
r17963 | r17964 | |
1650 | 1650 | if (!P_FLAG(tms)) |
1651 | 1651 | { |
1652 | 1652 | int dx, dy, x, y, words, left_partials, right_partials, full_words; |
1653 | void (*word_write)(address_space *space,offs_t address,UINT16 data); | |
1654 | UINT16 (*word_read)(address_space *space,offs_t address); | |
1653 | void (*word_write)(address_space &space,offs_t address,UINT16 data); | |
1654 | UINT16 (*word_read)(address_space &space,offs_t address); | |
1655 | 1655 | UINT32 saddr, daddr; |
1656 | 1656 | XY dstxy = { 0 }; |
1657 | 1657 | |
r17963 | r17964 | |
1727 | 1727 | dwordaddr = daddr >> 4; |
1728 | 1728 | |
1729 | 1729 | /* fetch the initial source word */ |
1730 | srcword = (*word_read)(tms->program, swordaddr++ << 1); | |
1730 | srcword = (*word_read)(*tms->program, swordaddr++ << 1); | |
1731 | 1731 | srcmask = 1 << (saddr & 15); |
1732 | 1732 | |
1733 | 1733 | /* handle the left partial word */ |
1734 | 1734 | if (left_partials != 0) |
1735 | 1735 | { |
1736 | 1736 | /* fetch the destination word */ |
1737 | dstword = (*word_read)(tms->program, dwordaddr << 1); | |
1737 | dstword = (*word_read)(*tms->program, dwordaddr << 1); | |
1738 | 1738 | dstmask = PIXEL_MASK << (daddr & 15); |
1739 | 1739 | |
1740 | 1740 | /* loop over partials */ |
r17963 | r17964 | |
1751 | 1751 | srcmask <<= 1; |
1752 | 1752 | if (srcmask == 0) |
1753 | 1753 | { |
1754 | srcword = (*word_read)(tms->program, swordaddr++ << 1); | |
1754 | srcword = (*word_read)(*tms->program, swordaddr++ << 1); | |
1755 | 1755 | srcmask = 0x0001; |
1756 | 1756 | } |
1757 | 1757 | |
r17963 | r17964 | |
1760 | 1760 | } |
1761 | 1761 | |
1762 | 1762 | /* write the result */ |
1763 | (*word_write)(tms->program, dwordaddr++ << 1, dstword); | |
1763 | (*word_write)(*tms->program, dwordaddr++ << 1, dstword); | |
1764 | 1764 | } |
1765 | 1765 | |
1766 | 1766 | /* loop over full words */ |
r17963 | r17964 | |
1768 | 1768 | { |
1769 | 1769 | /* fetch the destination word (if necessary) */ |
1770 | 1770 | if (PIXEL_OP_REQUIRES_SOURCE || TRANSPARENCY) |
1771 | dstword = (*word_read)(tms->program, dwordaddr << 1); | |
1771 | dstword = (*word_read)(*tms->program, dwordaddr << 1); | |
1772 | 1772 | else |
1773 | 1773 | dstword = 0; |
1774 | 1774 | dstmask = PIXEL_MASK; |
r17963 | r17964 | |
1787 | 1787 | srcmask <<= 1; |
1788 | 1788 | if (srcmask == 0) |
1789 | 1789 | { |
1790 | srcword = (*word_read)(tms->program, swordaddr++ << 1); | |
1790 | srcword = (*word_read)(*tms->program, swordaddr++ << 1); | |
1791 | 1791 | srcmask = 0x0001; |
1792 | 1792 | } |
1793 | 1793 | |
r17963 | r17964 | |
1796 | 1796 | } |
1797 | 1797 | |
1798 | 1798 | /* write the result */ |
1799 | (*word_write)(tms->program, dwordaddr++ << 1, dstword); | |
1799 | (*word_write)(*tms->program, dwordaddr++ << 1, dstword); | |
1800 | 1800 | } |
1801 | 1801 | |
1802 | 1802 | /* handle the right partial word */ |
1803 | 1803 | if (right_partials != 0) |
1804 | 1804 | { |
1805 | 1805 | /* fetch the destination word */ |
1806 | dstword = (*word_read)(tms->program, dwordaddr << 1); | |
1806 | dstword = (*word_read)(*tms->program, dwordaddr << 1); | |
1807 | 1807 | dstmask = PIXEL_MASK; |
1808 | 1808 | |
1809 | 1809 | /* loop over partials */ |
r17963 | r17964 | |
1820 | 1820 | srcmask <<= 1; |
1821 | 1821 | if (srcmask == 0) |
1822 | 1822 | { |
1823 | srcword = (*word_read)(tms->program, swordaddr++ << 1); | |
1823 | srcword = (*word_read)(*tms->program, swordaddr++ << 1); | |
1824 | 1824 | srcmask = 0x0001; |
1825 | 1825 | } |
1826 | 1826 | |
r17963 | r17964 | |
1829 | 1829 | } |
1830 | 1830 | |
1831 | 1831 | /* write the result */ |
1832 | (*word_write)(tms->program, dwordaddr++ << 1, dstword); | |
1832 | (*word_write)(*tms->program, dwordaddr++ << 1, dstword); | |
1833 | 1833 | } |
1834 | 1834 | |
1835 | 1835 | /* update for next row */ |
r17963 | r17964 | |
1864 | 1864 | if (!P_FLAG(tms)) |
1865 | 1865 | { |
1866 | 1866 | int dx, dy, x, y, words, left_partials, right_partials, full_words; |
1867 | void (*word_write)(address_space *space,offs_t address,UINT16 data); | |
1868 | UINT16 (*word_read)(address_space *space,offs_t address); | |
1867 | void (*word_write)(address_space &space,offs_t address,UINT16 data); | |
1868 | UINT16 (*word_read)(address_space &space,offs_t address); | |
1869 | 1869 | UINT32 daddr; |
1870 | 1870 | XY dstxy = { 0 }; |
1871 | 1871 | |
r17963 | r17964 | |
1943 | 1943 | if (left_partials != 0) |
1944 | 1944 | { |
1945 | 1945 | /* fetch the destination word */ |
1946 | dstword = (*word_read)(tms->program, dwordaddr << 1); | |
1946 | dstword = (*word_read)(*tms->program, dwordaddr << 1); | |
1947 | 1947 | dstmask = PIXEL_MASK << (daddr & 15); |
1948 | 1948 | |
1949 | 1949 | /* loop over partials */ |
r17963 | r17964 | |
1960 | 1960 | } |
1961 | 1961 | |
1962 | 1962 | /* write the result */ |
1963 | (*word_write)(tms->program, dwordaddr++ << 1, dstword); | |
1963 | (*word_write)(*tms->program, dwordaddr++ << 1, dstword); | |
1964 | 1964 | } |
1965 | 1965 | |
1966 | 1966 | /* loop over full words */ |
r17963 | r17964 | |
1968 | 1968 | { |
1969 | 1969 | /* fetch the destination word (if necessary) */ |
1970 | 1970 | if (PIXEL_OP_REQUIRES_SOURCE || TRANSPARENCY) |
1971 | dstword = (*word_read)(tms->program, dwordaddr << 1); | |
1971 | dstword = (*word_read)(*tms->program, dwordaddr << 1); | |
1972 | 1972 | else |
1973 | 1973 | dstword = 0; |
1974 | 1974 | dstmask = PIXEL_MASK; |
r17963 | r17964 | |
1987 | 1987 | } |
1988 | 1988 | |
1989 | 1989 | /* write the result */ |
1990 | (*word_write)(tms->program, dwordaddr++ << 1, dstword); | |
1990 | (*word_write)(*tms->program, dwordaddr++ << 1, dstword); | |
1991 | 1991 | } |
1992 | 1992 | |
1993 | 1993 | /* handle the right partial word */ |
1994 | 1994 | if (right_partials != 0) |
1995 | 1995 | { |
1996 | 1996 | /* fetch the destination word */ |
1997 | dstword = (*word_read)(tms->program, dwordaddr << 1); | |
1997 | dstword = (*word_read)(*tms->program, dwordaddr << 1); | |
1998 | 1998 | dstmask = PIXEL_MASK; |
1999 | 1999 | |
2000 | 2000 | /* loop over partials */ |
r17963 | r17964 | |
2011 | 2011 | } |
2012 | 2012 | |
2013 | 2013 | /* write the result */ |
2014 | (*word_write)(tms->program, dwordaddr++ << 1, dstword); | |
2014 | (*word_write)(*tms->program, dwordaddr++ << 1, dstword); | |
2015 | 2015 | } |
2016 | 2016 | |
2017 | 2017 | /* update for next row */ |
r17963 | r17964 | |
---|---|---|
599 | 599 | |
600 | 600 | static READ16_HANDLER( m37710_internal_word_r ) |
601 | 601 | { |
602 | m37710i_cpu_struct *cpustate = get_safe_token(&space | |
602 | m37710i_cpu_struct *cpustate = get_safe_token(&space.device()); | |
603 | 603 | UINT16 ret = 0; |
604 | 604 | |
605 | 605 | if (mem_mask & 0x00ff) |
r17963 | r17964 | |
612 | 612 | |
613 | 613 | static WRITE16_HANDLER( m37710_internal_word_w ) |
614 | 614 | { |
615 | m37710i_cpu_struct *cpustate = get_safe_token(&space | |
615 | m37710i_cpu_struct *cpustate = get_safe_token(&space.device()); | |
616 | 616 | |
617 | 617 | if (mem_mask & 0x00ff) |
618 | 618 | m37710_internal_w(cpustate, offset*2, data & 0xff); |
r17963 | r17964 | |
---|---|---|
485 | 485 | |
486 | 486 | READ16_HANDLER( program_r ) |
487 | 487 | { |
488 | dsp56k_core* cpustate = get_safe_token(&space | |
488 | dsp56k_core* cpustate = get_safe_token(&space.device()); | |
489 | 489 | return cpustate->program_ram[offset]; |
490 | 490 | } |
491 | 491 | |
492 | 492 | WRITE16_HANDLER( program_w ) |
493 | 493 | { |
494 | dsp56k_core* cpustate = get_safe_token(&space | |
494 | dsp56k_core* cpustate = get_safe_token(&space.device()); | |
495 | 495 | cpustate->program_ram[offset] = data; |
496 | 496 | } |
497 | 497 | |
498 | 498 | /* Work */ |
499 | 499 | READ16_HANDLER( peripheral_register_r ) |
500 | 500 | { |
501 | dsp56k_core* cpustate = get_safe_token(&space | |
501 | dsp56k_core* cpustate = get_safe_token(&space.device()); | |
502 | 502 | // (printf) logerror("Peripheral read 0x%04x\n", O2A(offset)); |
503 | 503 | |
504 | 504 | switch (O2A(offset)) |
r17963 | r17964 | |
633 | 633 | |
634 | 634 | WRITE16_HANDLER( peripheral_register_w ) |
635 | 635 | { |
636 | dsp56k_core* cpustate = get_safe_token(&space | |
636 | dsp56k_core* cpustate = get_safe_token(&space.device()); | |
637 | 637 | |
638 | 638 | // Its primary behavior is RAM |
639 | 639 | // COMBINE_DATA(&cpustate->peripheral_ram[offset]); |
r17963 | r17964 | |
---|---|---|
2283 | 2283 | |
2284 | 2284 | static READ8_HANDLER( t90_internal_registers_r ) |
2285 | 2285 | { |
2286 | t90_Regs *cpustate = get_safe_token(&space | |
2286 | t90_Regs *cpustate = get_safe_token(&space.device()); | |
2287 | 2287 | |
2288 | 2288 | #define RIO cpustate->io->read_byte( T90_IOBASE+offset ) |
2289 | 2289 | |
r17963 | r17964 | |
2498 | 2498 | { |
2499 | 2499 | #define WIO cpustate->io->write_byte( T90_IOBASE+offset, data ) |
2500 | 2500 | |
2501 | t90_Regs *cpustate = get_safe_token(&space | |
2501 | t90_Regs *cpustate = get_safe_token(&space.device()); | |
2502 | 2502 | UINT8 out_mask; |
2503 | 2503 | UINT8 old = cpustate->internal_registers[offset]; |
2504 | 2504 | switch ( T90_IOBASE + offset ) |
r17963 | r17964 | |
---|---|---|
65 | 65 | return (se3208_state_t *)downcast<legacy_cpu_device *>(device)->token(); |
66 | 66 | } |
67 | 67 | |
68 | INLINE UINT32 read_dword_unaligned(address_space | |
68 | INLINE UINT32 read_dword_unaligned(address_space &space, UINT32 address) | |
69 | 69 | { |
70 | 70 | if (address & 3) |
71 | return space | |
71 | return space.read_byte(address) | space.read_byte(address+1)<<8 | space.read_byte(address+2)<<16 | space.read_byte(address+3)<<24; | |
72 | 72 | else |
73 | return space | |
73 | return space.read_dword(address); | |
74 | 74 | } |
75 | 75 | |
76 | INLINE UINT16 read_word_unaligned(address_space | |
76 | INLINE UINT16 read_word_unaligned(address_space &space, UINT32 address) | |
77 | 77 | { |
78 | 78 | if (address & 1) |
79 | return space | |
79 | return space.read_byte(address) | space.read_byte(address+1)<<8; | |
80 | 80 | else |
81 | return space | |
81 | return space.read_word(address); | |
82 | 82 | } |
83 | 83 | |
84 | INLINE void write_dword_unaligned(address_space | |
84 | INLINE void write_dword_unaligned(address_space &space, UINT32 address, UINT32 data) | |
85 | 85 | { |
86 | 86 | if (address & 3) |
87 | 87 | { |
88 | space->write_byte(address, data & 0xff); | |
89 | space->write_byte(address+1, (data>>8)&0xff); | |
90 | space->write_byte(address+2, (data>>16)&0xff); | |
91 | space->write_byte(address+3, (data>>24)&0xff); | |
88 | space.write_byte(address, data & 0xff); | |
89 | space.write_byte(address+1, (data>>8)&0xff); | |
90 | space.write_byte(address+2, (data>>16)&0xff); | |
91 | space.write_byte(address+3, (data>>24)&0xff); | |
92 | 92 | } |
93 | 93 | else |
94 | 94 | { |
95 | space | |
95 | space.write_dword(address, data); | |
96 | 96 | } |
97 | 97 | } |
98 | 98 | |
99 | INLINE void write_word_unaligned(address_space | |
99 | INLINE void write_word_unaligned(address_space &space, UINT32 address, UINT16 data) | |
100 | 100 | { |
101 | 101 | if (address & 1) |
102 | 102 | { |
103 | space->write_byte(address, data & 0xff); | |
104 | space->write_byte(address+1, (data>>8)&0xff); | |
103 | space.write_byte(address, data & 0xff); | |
104 | space.write_byte(address+1, (data>>8)&0xff); | |
105 | 105 | } |
106 | 106 | else |
107 | 107 | { |
108 | space | |
108 | space.write_word(address, data); | |
109 | 109 | } |
110 | 110 | } |
111 | 111 | |
r17963 | r17964 | |
117 | 117 | |
118 | 118 | INLINE UINT16 SE3208_Read16(se3208_state_t *se3208_state, UINT32 addr) |
119 | 119 | { |
120 | return read_word_unaligned(se3208_state->program,addr); | |
120 | return read_word_unaligned(*se3208_state->program,addr); | |
121 | 121 | } |
122 | 122 | |
123 | 123 | INLINE UINT32 SE3208_Read32(se3208_state_t *se3208_state, UINT32 addr) |
124 | 124 | { |
125 | return read_dword_unaligned(se3208_state->program,addr); | |
125 | return read_dword_unaligned(*se3208_state->program,addr); | |
126 | 126 | } |
127 | 127 | |
128 | 128 | INLINE void SE3208_Write8(se3208_state_t *se3208_state, UINT32 addr,UINT8 val) |
r17963 | r17964 | |
132 | 132 | |
133 | 133 | INLINE void SE3208_Write16(se3208_state_t *se3208_state, UINT32 addr,UINT16 val) |
134 | 134 | { |
135 | write_word_unaligned(se3208_state->program,addr,val); | |
135 | write_word_unaligned(*se3208_state->program,addr,val); | |
136 | 136 | } |
137 | 137 | |
138 | 138 | INLINE void SE3208_Write32(se3208_state_t *se3208_state, UINT32 addr,UINT32 val) |
139 | 139 | { |
140 | write_dword_unaligned(se3208_state->program,addr,val); | |
140 | write_dword_unaligned(*se3208_state->program,addr,val); | |
141 | 141 | } |
142 | 142 | |
143 | 143 |
r17963 | r17964 | |
---|---|---|
983 | 983 | |
984 | 984 | static READ8_HANDLER( tlcs900_internal_r ) |
985 | 985 | { |
986 | tlcs900_state *cpustate = get_safe_token( &space | |
986 | tlcs900_state *cpustate = get_safe_token( &space.device() ); | |
987 | 987 | |
988 | 988 | return cpustate->reg[ offset ]; |
989 | 989 | } |
r17963 | r17964 | |
991 | 991 | |
992 | 992 | static WRITE8_HANDLER( tlcs900_internal_w ) |
993 | 993 | { |
994 | tlcs900_state *cpustate = get_safe_token( &space | |
994 | tlcs900_state *cpustate = get_safe_token( &space.device() ); | |
995 | 995 | |
996 | 996 | switch ( offset ) |
997 | 997 | { |
r17963 | r17964 | |
1767 | 1767 | |
1768 | 1768 | static READ8_HANDLER( tmp95c063_internal_r ) |
1769 | 1769 | { |
1770 | tlcs900_state *cpustate = get_safe_token( &space | |
1770 | tlcs900_state *cpustate = get_safe_token( &space.device() ); | |
1771 | 1771 | |
1772 | 1772 | if (!cpustate->port_read.isnull()) |
1773 | 1773 | { |
r17963 | r17964 | |
1794 | 1794 | |
1795 | 1795 | static WRITE8_HANDLER( tmp95c063_internal_w ) |
1796 | 1796 | { |
1797 | tlcs900_state *cpustate = get_safe_token( &space | |
1797 | tlcs900_state *cpustate = get_safe_token( &space.device() ); | |
1798 | 1798 | |
1799 | 1799 | switch ( offset ) |
1800 | 1800 | { |
r17963 | r17964 | |
---|---|---|
47 | 47 | |
48 | 48 | #define PPC cpustate->ppc.d |
49 | 49 | |
50 | #define RDMEM_ID(a) cpustate->rdmem_id(cpustate->space, a) | |
51 | #define WRMEM_ID(a,d) cpustate->wrmem_id(cpustate->space, a, d) | |
50 | #define RDMEM_ID(a) cpustate->rdmem_id(*cpustate->space, a) | |
51 | #define WRMEM_ID(a,d) cpustate->wrmem_id(*cpustate->space, a, d) | |
52 | 52 | |
53 | 53 | #define IRQ_STATE cpustate->irq_state |
54 | 54 | #define AFTER_CLI cpustate->after_cli |
r17963 | r17964 | |
---|---|---|
346 | 346 | static READ8_HANDLER( m4510_read_0000 ) |
347 | 347 | { |
348 | 348 | UINT8 result = 0x00; |
349 | m4510_Regs *cpustate = get_safe_token(&space | |
349 | m4510_Regs *cpustate = get_safe_token(&space.device()); | |
350 | 350 | |
351 | 351 | switch(offset) |
352 | 352 | { |
r17963 | r17964 | |
363 | 363 | |
364 | 364 | static WRITE8_HANDLER( m4510_write_0000 ) |
365 | 365 | { |
366 | m4510_Regs *cpustate = get_safe_token(&space | |
366 | m4510_Regs *cpustate = get_safe_token(&space.device()); | |
367 | 367 | |
368 | 368 | switch(offset) |
369 | 369 | { |
r17963 | r17964 | |
375 | 375 | break; |
376 | 376 | } |
377 | 377 | |
378 | cpustate->out_port_func(0, m4510_get_port(downcast<legacy_cpu_device *>(&space | |
378 | cpustate->out_port_func(0, m4510_get_port(downcast<legacy_cpu_device *>(&space.device()))); | |
379 | 379 | } |
380 | 380 | |
381 | 381 | static ADDRESS_MAP_START(m4510_mem, AS_PROGRAM, 8, legacy_cpu_device) |
r17963 | r17964 | |
---|---|---|
374 | 374 | |
375 | 375 | static READ8_HANDLER( m6510_read_0000 ) |
376 | 376 | { |
377 | m6502_Regs *cpustate = get_safe_token(&space | |
377 | m6502_Regs *cpustate = get_safe_token(&space.device()); | |
378 | 378 | UINT8 result = 0x00; |
379 | 379 | |
380 | 380 | switch(offset) |
r17963 | r17964 | |
400 | 400 | |
401 | 401 | static WRITE8_HANDLER( m6510_write_0000 ) |
402 | 402 | { |
403 | m6502_Regs *cpustate = get_safe_token(&space | |
403 | m6502_Regs *cpustate = get_safe_token(&space.device()); | |
404 | 404 | |
405 | 405 | switch(offset) |
406 | 406 | { |
r17963 | r17964 | |
---|---|---|
102 | 102 | |
103 | 103 | static READ8_HANDLER( m6509_read_00000 ) |
104 | 104 | { |
105 | m6509_Regs *cpustate = get_safe_token(&space | |
105 | m6509_Regs *cpustate = get_safe_token(&space.device()); | |
106 | 106 | |
107 | 107 | return cpustate->pc_bank.b.h2; |
108 | 108 | } |
109 | 109 | |
110 | 110 | static READ8_HANDLER( m6509_read_00001 ) |
111 | 111 | { |
112 | m6509_Regs *cpustate = get_safe_token(&space | |
112 | m6509_Regs *cpustate = get_safe_token(&space.device()); | |
113 | 113 | |
114 | 114 | return cpustate->ind_bank.b.h2; |
115 | 115 | } |
116 | 116 | |
117 | 117 | static WRITE8_HANDLER( m6509_write_00000 ) |
118 | 118 | { |
119 | m6509_Regs *cpustate = get_safe_token(&space | |
119 | m6509_Regs *cpustate = get_safe_token(&space.device()); | |
120 | 120 | |
121 | 121 | cpustate->pc_bank.b.h2=data&0xf; |
122 | 122 | cpustate->pc.w.h=cpustate->pc_bank.w.h; |
r17963 | r17964 | |
124 | 124 | |
125 | 125 | static WRITE8_HANDLER( m6509_write_00001 ) |
126 | 126 | { |
127 | m6509_Regs *cpustate = get_safe_token(&space | |
127 | m6509_Regs *cpustate = get_safe_token(&space.device()); | |
128 | 128 | |
129 | 129 | cpustate->ind_bank.b.h2=data&0xf; |
130 | 130 | } |
r17963 | r17964 | |
---|---|---|
906 | 906 | |
907 | 907 | /*********************************************************************************/ |
908 | 908 | |
909 | static UINT8 ppc403_read8(address_space | |
909 | static UINT8 ppc403_read8(address_space &space, UINT32 a) | |
910 | 910 | { |
911 | 911 | if(a >= 0x40000000 && a <= 0x4000000f) /* Serial Port */ |
912 | 912 | return ppc403_spu_r(a); |
913 | return space | |
913 | return space.read_byte(a); | |
914 | 914 | } |
915 | 915 | |
916 | 916 | #define ppc403_read16 memory_read_word_32be |
917 | 917 | #define ppc403_read32 memory_read_dword_32be |
918 | 918 | |
919 | static void ppc403_write8(address_space | |
919 | static void ppc403_write8(address_space &space, UINT32 a, UINT8 d) | |
920 | 920 | { |
921 | 921 | if( a >= 0x40000000 && a <= 0x4000000f ) /* Serial Port */ |
922 | 922 | { |
923 | 923 | ppc403_spu_w(a, d); |
924 | 924 | return; |
925 | 925 | } |
926 | space | |
926 | space.write_byte(a, d); | |
927 | 927 | } |
928 | 928 | |
929 | 929 | #define ppc403_write16 memory_write_word_32be |
930 | 930 | #define ppc403_write32 memory_write_dword_32be |
931 | 931 | |
932 | static UINT16 ppc403_read16_unaligned(address_space | |
932 | static UINT16 ppc403_read16_unaligned(address_space &space, UINT32 a) | |
933 | 933 | { |
934 | 934 | fatalerror("ppc: Unaligned read16 %08X at %08X\n", a, ppc.pc); |
935 | 935 | return 0; |
936 | 936 | } |
937 | 937 | |
938 | static UINT32 ppc403_read32_unaligned(address_space | |
938 | static UINT32 ppc403_read32_unaligned(address_space &space, UINT32 a) | |
939 | 939 | { |
940 | 940 | fatalerror("ppc: Unaligned read32 %08X at %08X\n", a, ppc.pc); |
941 | 941 | return 0; |
942 | 942 | } |
943 | 943 | |
944 | static void ppc403_write16_unaligned(address_space | |
944 | static void ppc403_write16_unaligned(address_space &space, UINT32 a, UINT16 d) | |
945 | 945 | { |
946 | 946 | fatalerror("ppc: Unaligned write16 %08X, %04X at %08X\n", a, d, ppc.pc); |
947 | 947 | } |
948 | 948 | |
949 | static void ppc403_write32_unaligned(address_space | |
949 | static void ppc403_write32_unaligned(address_space &space, UINT32 a, UINT32 d) | |
950 | 950 | { |
951 | 951 | fatalerror("ppc: Unaligned write32 %08X, %08X at %08X\n", a, d, ppc.pc); |
952 | 952 | } |
r17963 | r17964 | |
---|---|---|
66 | 66 | |
67 | 67 | /***********************************************************************/ |
68 | 68 | |
69 | static UINT16 ppc_read16_unaligned(address_space | |
69 | static UINT16 ppc_read16_unaligned(address_space &space, UINT32 a) | |
70 | 70 | { |
71 | 71 | return ((UINT16)ppc.read8(space, a+0) << 8) | ((UINT16)ppc.read8(space, a+1) << 0); |
72 | 72 | } |
73 | 73 | |
74 | static UINT32 ppc_read32_unaligned(address_space | |
74 | static UINT32 ppc_read32_unaligned(address_space &space, UINT32 a) | |
75 | 75 | { |
76 | 76 | return ((UINT32)ppc.read8(space, a+0) << 24) | ((UINT32)ppc.read8(space, a+1) << 16) | |
77 | 77 | ((UINT32)ppc.read8(space, a+2) << 8) | ((UINT32)ppc.read8(space, a+3) << 0); |
78 | 78 | } |
79 | 79 | |
80 | static UINT64 ppc_read64_unaligned(address_space | |
80 | static UINT64 ppc_read64_unaligned(address_space &space, UINT32 a) | |
81 | 81 | { |
82 | 82 | return ((UINT64)READ32(space, a+0) << 32) | (UINT64)(READ32(space, a+4)); |
83 | 83 | } |
84 | 84 | |
85 | static void ppc_write16_unaligned(address_space | |
85 | static void ppc_write16_unaligned(address_space &space, UINT32 a, UINT16 d) | |
86 | 86 | { |
87 | 87 | ppc.write8(space, a+0, (UINT8)(d >> 8)); |
88 | 88 | ppc.write8(space, a+1, (UINT8)(d)); |
89 | 89 | } |
90 | 90 | |
91 | static void ppc_write32_unaligned(address_space | |
91 | static void ppc_write32_unaligned(address_space &space, UINT32 a, UINT32 d) | |
92 | 92 | { |
93 | 93 | ppc.write8(space, a+0, (UINT8)(d >> 24)); |
94 | 94 | ppc.write8(space, a+1, (UINT8)(d >> 16)); |
r17963 | r17964 | |
96 | 96 | ppc.write8(space, a+3, (UINT8)(d >> 0)); |
97 | 97 | } |
98 | 98 | |
99 | static void ppc_write64_unaligned(address_space | |
99 | static void ppc_write64_unaligned(address_space &space, UINT32 a, UINT64 d) | |
100 | 100 | { |
101 | 101 | ppc.write32(space, a+0, (UINT32)(d >> 32)); |
102 | 102 | ppc.write32(space, a+4, (UINT32)(d)); |
r17963 | r17964 | |
289 | 289 | return success; |
290 | 290 | } |
291 | 291 | |
292 | static UINT8 ppc_read8_translated(address_space | |
292 | static UINT8 ppc_read8_translated(address_space &space, offs_t address) | |
293 | 293 | { |
294 | 294 | ppc_translate_address(&address, PPC_TRANSLATE_DATA | PPC_TRANSLATE_READ); |
295 | return space | |
295 | return space.read_byte(address); | |
296 | 296 | } |
297 | 297 | |
298 | static UINT16 ppc_read16_translated(address_space | |
298 | static UINT16 ppc_read16_translated(address_space &space, offs_t address) | |
299 | 299 | { |
300 | 300 | ppc_translate_address(&address, PPC_TRANSLATE_DATA | PPC_TRANSLATE_READ); |
301 | return space | |
301 | return space.read_word(address); | |
302 | 302 | } |
303 | 303 | |
304 | static UINT32 ppc_read32_translated(address_space | |
304 | static UINT32 ppc_read32_translated(address_space &space, offs_t address) | |
305 | 305 | { |
306 | 306 | ppc_translate_address(&address, PPC_TRANSLATE_DATA | PPC_TRANSLATE_READ); |
307 | return space | |
307 | return space.read_dword(address); | |
308 | 308 | } |
309 | 309 | |
310 | static UINT64 ppc_read64_translated(address_space | |
310 | static UINT64 ppc_read64_translated(address_space &space, offs_t address) | |
311 | 311 | { |
312 | 312 | ppc_translate_address(&address, PPC_TRANSLATE_DATA | PPC_TRANSLATE_READ); |
313 | return space | |
313 | return space.read_qword(address); | |
314 | 314 | } |
315 | 315 | |
316 | static void ppc_write8_translated(address_space | |
316 | static void ppc_write8_translated(address_space &space, offs_t address, UINT8 data) | |
317 | 317 | { |
318 | 318 | ppc_translate_address(&address, PPC_TRANSLATE_DATA | PPC_TRANSLATE_WRITE); |
319 | space | |
319 | space.write_byte(address, data); | |
320 | 320 | } |
321 | 321 | |
322 | static void ppc_write16_translated(address_space | |
322 | static void ppc_write16_translated(address_space &space, offs_t address, UINT16 data) | |
323 | 323 | { |
324 | 324 | ppc_translate_address(&address, PPC_TRANSLATE_DATA | PPC_TRANSLATE_WRITE); |
325 | space | |
325 | space.write_word(address, data); | |
326 | 326 | } |
327 | 327 | |
328 | static void ppc_write32_translated(address_space | |
328 | static void ppc_write32_translated(address_space &space, offs_t address, UINT32 data) | |
329 | 329 | { |
330 | 330 | ppc_translate_address(&address, PPC_TRANSLATE_DATA | PPC_TRANSLATE_WRITE); |
331 | space | |
331 | space.write_dword(address, data); | |
332 | 332 | } |
333 | 333 | |
334 | static void ppc_write64_translated(address_space | |
334 | static void ppc_write64_translated(address_space &space, offs_t address, UINT64 data) | |
335 | 335 | { |
336 | 336 | ppc_translate_address(&address, PPC_TRANSLATE_DATA | PPC_TRANSLATE_WRITE); |
337 | space | |
337 | space.write_qword(address, data); | |
338 | 338 | } |
339 | 339 | |
340 | 340 | #ifndef PPC_DRC |
341 | static UINT32 ppc_readop_translated(address_space | |
341 | static UINT32 ppc_readop_translated(address_space &space, offs_t address) | |
342 | 342 | { |
343 | 343 | ppc_translate_address(&address, PPC_TRANSLATE_CODE | PPC_TRANSLATE_READ); |
344 | return space | |
344 | return space.read_dword(address); | |
345 | 345 | } |
346 | 346 | #endif |
347 | 347 |
r17963 | r17964 | |
---|---|---|
2337 | 2337 | |
2338 | 2338 | static READ8_HANDLER( ppc4xx_spu_r ) |
2339 | 2339 | { |
2340 | powerpc_state *ppc = *(powerpc_state **)downcast<legacy_cpu_device *>(&space | |
2340 | powerpc_state *ppc = *(powerpc_state **)downcast<legacy_cpu_device *>(&space.device())->token(); | |
2341 | 2341 | UINT8 result = 0xff; |
2342 | 2342 | |
2343 | 2343 | switch (offset) |
r17963 | r17964 | |
2364 | 2364 | |
2365 | 2365 | static WRITE8_HANDLER( ppc4xx_spu_w ) |
2366 | 2366 | { |
2367 | powerpc_state *ppc = *(powerpc_state **)downcast<legacy_cpu_device *>(&space | |
2367 | powerpc_state *ppc = *(powerpc_state **)downcast<legacy_cpu_device *>(&space.device())->token(); | |
2368 | 2368 | UINT8 oldstate, newstate; |
2369 | 2369 | |
2370 | 2370 | if (PRINTF_SPU) |
r17963 | r17964 | |
---|---|---|
330 | 330 | |
331 | 331 | /* PowerPC function pointers for memory accesses/exceptions */ |
332 | 332 | jmp_buf exception_jmpbuf; |
333 | UINT8 (*read8)(address_space *space, offs_t address); | |
334 | UINT16 (*read16)(address_space *space, offs_t address); | |
335 | UINT32 (*read32)(address_space *space, offs_t address); | |
336 | UINT64 (*read64)(address_space *space, offs_t address); | |
337 | void (*write8)(address_space *space, offs_t address, UINT8 data); | |
338 | void (*write16)(address_space *space, offs_t address, UINT16 data); | |
339 | void (*write32)(address_space *space, offs_t address, UINT32 data); | |
340 | void (*write64)(address_space *space, offs_t address, UINT64 data); | |
341 | UINT16 (*read16_unaligned)(address_space *space, offs_t address); | |
342 | UINT32 (*read32_unaligned)(address_space *space, offs_t address); | |
343 | UINT64 (*read64_unaligned)(address_space *space, offs_t address); | |
344 | void (*write16_unaligned)(address_space *space, offs_t address, UINT16 data); | |
345 | void (*write32_unaligned)(address_space *space, offs_t address, UINT32 data); | |
346 | void (*write64_unaligned)(address_space *space, offs_t address, UINT64 data); | |
333 | UINT8 (*read8)(address_space &space, offs_t address); | |
334 | UINT16 (*read16)(address_space &space, offs_t address); | |
335 | UINT32 (*read32)(address_space &space, offs_t address); | |
336 | UINT64 (*read64)(address_space &space, offs_t address); | |
337 | void (*write8)(address_space &space, offs_t address, UINT8 data); | |
338 | void (*write16)(address_space &space, offs_t address, UINT16 data); | |
339 | void (*write32)(address_space &space, offs_t address, UINT32 data); | |
340 | void (*write64)(address_space &space, offs_t address, UINT64 data); | |
341 | UINT16 (*read16_unaligned)(address_space &space, offs_t address); | |
342 | UINT32 (*read32_unaligned)(address_space &space, offs_t address); | |
343 | UINT64 (*read64_unaligned)(address_space &space, offs_t address); | |
344 | void (*write16_unaligned)(address_space &space, offs_t address, UINT16 data); | |
345 | void (*write32_unaligned)(address_space &space, offs_t address, UINT32 data); | |
346 | void (*write64_unaligned)(address_space &space, offs_t address, UINT64 data); | |
347 | 347 | |
348 | 348 | void (* optable19[1024])(UINT32); |
349 | 349 | void (* optable31[1024])(UINT32); |
r17963 | r17964 | |
786 | 786 | return 0; |
787 | 787 | } |
788 | 788 | |
789 | static UINT8 ppc_read8_translated(address_space *space, offs_t address); | |
790 | static UINT16 ppc_read16_translated(address_space *space, offs_t address); | |
791 | static UINT32 ppc_read32_translated(address_space *space, offs_t address); | |
792 | static UINT64 ppc_read64_translated(address_space *space, offs_t address); | |
793 | static void ppc_write8_translated(address_space *space, offs_t address, UINT8 data); | |
794 | static void ppc_write16_translated(address_space *space, offs_t address, UINT16 data); | |
795 | static void ppc_write32_translated(address_space *space, offs_t address, UINT32 data); | |
796 | static void ppc_write64_translated(address_space *space, offs_t address, UINT64 data); | |
789 | static UINT8 ppc_read8_translated(address_space &space, offs_t address); | |
790 | static UINT16 ppc_read16_translated(address_space &space, offs_t address); | |
791 | static UINT32 ppc_read32_translated(address_space &space, offs_t address); | |
792 | static UINT64 ppc_read64_translated(address_space &space, offs_t address); | |
793 | static void ppc_write8_translated(address_space &space, offs_t address, UINT8 data); | |
794 | static void ppc_write16_translated(address_space &space, offs_t address, UINT16 data); | |
795 | static void ppc_write32_translated(address_space &space, offs_t address, UINT32 data); | |
796 | static void ppc_write64_translated(address_space &space, offs_t address, UINT64 data); | |
797 | 797 | |
798 | 798 | INLINE void ppc_set_msr(UINT32 value) |
799 | 799 | { |
r17963 | r17964 | |
---|---|---|
149 | 149 | INLINE UINT16 RW(sh2_state *sh2, offs_t A) |
150 | 150 | { |
151 | 151 | if (A >= 0xe0000000) |
152 | return sh2_internal_r(sh2->internal, (A & 0x1fc)>>2, 0xffff << (((~A) & 2)*8)) >> (((~A) & 2)*8); | |
152 | return sh2_internal_r(*sh2->internal, (A & 0x1fc)>>2, 0xffff << (((~A) & 2)*8)) >> (((~A) & 2)*8); | |
153 | 153 | |
154 | 154 | if (A >= 0xc0000000) |
155 | 155 | return sh2->program->read_word(A); |
r17963 | r17964 | |
160 | 160 | INLINE UINT32 RL(sh2_state *sh2, offs_t A) |
161 | 161 | { |
162 | 162 | if (A >= 0xe0000000) |
163 | return sh2_internal_r(sh2->internal, (A & 0x1fc)>>2, 0xffffffff); | |
163 | return sh2_internal_r(*sh2->internal, (A & 0x1fc)>>2, 0xffffffff); | |
164 | 164 | |
165 | 165 | if (A >= 0xc0000000) |
166 | 166 | return sh2->program->read_dword(A); |
r17963 | r17964 | |
---|---|---|
27 | 27 | INLINE UINT32 RL(sh2_state *sh2, offs_t A) |
28 | 28 | { |
29 | 29 | if (A >= 0xe0000000) |
30 | return sh2_internal_r(sh2->internal, (A & 0x1fc)>>2, 0xffffffff); | |
30 | return sh2_internal_r(*sh2->internal, (A & 0x1fc)>>2, 0xffffffff); | |
31 | 31 | |
32 | 32 | if (A >= 0xc0000000) |
33 | 33 | return sh2->program->read_dword(A); |
r17963 | r17964 | |
42 | 42 | { |
43 | 43 | if (A >= 0xe0000000) |
44 | 44 | { |
45 | sh2_internal_w(sh2->internal, (A & 0x1fc)>>2, V, 0xffffffff); | |
45 | sh2_internal_w(*sh2->internal, (A & 0x1fc)>>2, V, 0xffffffff); | |
46 | 46 | return; |
47 | 47 | } |
48 | 48 | |
r17963 | r17964 | |
508 | 508 | |
509 | 509 | WRITE32_HANDLER( sh2_internal_w ) |
510 | 510 | { |
511 | sh2_state *sh2 = GET_SH2(&space | |
511 | sh2_state *sh2 = GET_SH2(&space.device()); | |
512 | 512 | UINT32 old; |
513 | 513 | |
514 | 514 | #ifdef USE_SH2DRC |
r17963 | r17964 | |
522 | 522 | // logerror("sh2_internal_w: Write %08x (%x), %08x @ %08x\n", 0xfffffe00+offset*4, offset, data, mem_mask); |
523 | 523 | |
524 | 524 | // if(offset != 0x20) |
525 | // printf("sh2_internal_w: Write %08x (%x), %08x @ %08x (PC %x)\n", 0xfffffe00+offset*4, offset, data, mem_mask, space | |
525 | // printf("sh2_internal_w: Write %08x (%x), %08x @ %08x (PC %x)\n", 0xfffffe00+offset*4, offset, data, mem_mask, space.device().safe_pc()); | |
526 | 526 | |
527 | 527 | switch( offset ) |
528 | 528 | { |
r17963 | r17964 | |
688 | 688 | |
689 | 689 | READ32_HANDLER( sh2_internal_r ) |
690 | 690 | { |
691 | sh2_state *sh2 = GET_SH2(&space | |
691 | sh2_state *sh2 = GET_SH2(&space.device()); | |
692 | 692 | |
693 | 693 | #ifdef USE_SH2DRC |
694 | 694 | offset &= 0x7f; |
r17963 | r17964 | |
---|---|---|
413 | 413 | |
414 | 414 | static READ16_HANDLER( cpuregs_r ) |
415 | 415 | { |
416 | tms32051_state *cpustate = get_safe_token(&space | |
416 | tms32051_state *cpustate = get_safe_token(&space.device()); | |
417 | 417 | |
418 | 418 | switch (offset) |
419 | 419 | { |
r17963 | r17964 | |
458 | 458 | |
459 | 459 | case 0x28: return 0; // PDWSR |
460 | 460 | default: |
461 | if(!space | |
461 | if(!space.debugger_access()) | |
462 | 462 | fatalerror("32051: cpuregs_r: unimplemented memory-mapped register %02X at %04X\n", offset, cpustate->pc-1); |
463 | 463 | } |
464 | 464 | |
r17963 | r17964 | |
467 | 467 | |
468 | 468 | static WRITE16_HANDLER( cpuregs_w ) |
469 | 469 | { |
470 | tms32051_state *cpustate = get_safe_token(&space | |
470 | tms32051_state *cpustate = get_safe_token(&space.device()); | |
471 | 471 | |
472 | 472 | switch (offset) |
473 | 473 | { |
r17963 | r17964 | |
536 | 536 | |
537 | 537 | case 0x28: break; // PDWSR |
538 | 538 | default: |
539 | if(!space | |
539 | if(!space.debugger_access()) | |
540 | 540 | fatalerror("32051: cpuregs_w: unimplemented memory-mapped register %02X, data %04X at %04X\n", offset, data, cpustate->pc-1); |
541 | 541 | } |
542 | 542 | } |
r17963 | r17964 | |
---|---|---|
12 | 12 | |
13 | 13 | WRITE32_HANDLER( sh3_internal_high_w ) |
14 | 14 | { |
15 | sh4_state *sh4 = get_safe_token(&space | |
15 | sh4_state *sh4 = get_safe_token(&space.device()); | |
16 | 16 | COMBINE_DATA(&sh4->m_sh3internal_upper[offset]); |
17 | 17 | |
18 | 18 | switch (offset) |
r17963 | r17964 | |
75 | 75 | |
76 | 76 | READ32_HANDLER( sh3_internal_high_r ) |
77 | 77 | { |
78 | sh4_state *sh4 = get_safe_token(&space | |
78 | sh4_state *sh4 = get_safe_token(&space.device()); | |
79 | 79 | |
80 | 80 | UINT32 ret = 0; |
81 | 81 | |
r17963 | r17964 | |
140 | 140 | |
141 | 141 | READ32_HANDLER( sh3_internal_r ) |
142 | 142 | { |
143 | sh4_state *sh4 = get_safe_token(&space | |
143 | sh4_state *sh4 = get_safe_token(&space.device()); | |
144 | 144 | |
145 | 145 | if (offset<0x1000) |
146 | 146 | { |
r17963 | r17964 | |
385 | 385 | |
386 | 386 | WRITE32_HANDLER( sh3_internal_w ) |
387 | 387 | { |
388 | sh4_state *sh4 = get_safe_token(&space | |
388 | sh4_state *sh4 = get_safe_token(&space.device()); | |
389 | 389 | |
390 | 390 | |
391 | 391 |
r17963 | r17964 | |
---|---|---|
669 | 669 | |
670 | 670 | WRITE32_HANDLER( sh4_internal_w ) |
671 | 671 | { |
672 | sh4_state *sh4 = get_safe_token(&space | |
672 | sh4_state *sh4 = get_safe_token(&space.device()); | |
673 | 673 | int a; |
674 | 674 | UINT32 addr = (offset << 2) + 0xfe000000; |
675 | 675 | offset = ((addr & 0xfc) >> 2) | ((addr & 0x1fe0000) >> 11); |
r17963 | r17964 | |
897 | 897 | |
898 | 898 | READ32_HANDLER( sh4_internal_r ) |
899 | 899 | { |
900 | sh4_state *sh4 = get_safe_token(&space | |
900 | sh4_state *sh4 = get_safe_token(&space.device()); | |
901 | 901 | |
902 | 902 | if (sh4->cpu_type != CPU_TYPE_SH4) |
903 | 903 | fatalerror("sh4_internal_r uses sh4->m[] with SH3\n"); |
r17963 | r17964 | |
1247 | 1247 | |
1248 | 1248 | READ64_HANDLER( sh4_tlb_r ) |
1249 | 1249 | { |
1250 | sh4_state *sh4 = get_safe_token(&space | |
1250 | sh4_state *sh4 = get_safe_token(&space.device()); | |
1251 | 1251 | |
1252 | 1252 | int offs = offset*8; |
1253 | 1253 | |
r17963 | r17964 | |
1265 | 1265 | |
1266 | 1266 | WRITE64_HANDLER( sh4_tlb_w ) |
1267 | 1267 | { |
1268 | sh4_state *sh4 = get_safe_token(&space | |
1268 | sh4_state *sh4 = get_safe_token(&space.device()); | |
1269 | 1269 | |
1270 | 1270 | int offs = offset*8; |
1271 | 1271 |
r17963 | r17964 | |
---|---|---|
585 | 585 | |
586 | 586 | static WRITE8_HANDLER( wrmpya_w ) |
587 | 587 | { |
588 | g65816i_cpu_struct *cpustate = get_safe_token(&space | |
588 | g65816i_cpu_struct *cpustate = get_safe_token(&space.device()); | |
589 | 589 | |
590 | 590 | cpustate->wrmpya = data; |
591 | 591 | } |
592 | 592 | |
593 | 593 | static WRITE8_HANDLER( wrmpyb_w ) |
594 | 594 | { |
595 | g65816i_cpu_struct *cpustate = get_safe_token(&space | |
595 | g65816i_cpu_struct *cpustate = get_safe_token(&space.device()); | |
596 | 596 | |
597 | 597 | cpustate->wrmpyb = data; |
598 | 598 | cpustate->rdmpy = cpustate->wrmpya * cpustate->wrmpyb; |
r17963 | r17964 | |
601 | 601 | |
602 | 602 | static WRITE8_HANDLER( wrdivl_w ) |
603 | 603 | { |
604 | g65816i_cpu_struct *cpustate = get_safe_token(&space | |
604 | g65816i_cpu_struct *cpustate = get_safe_token(&space.device()); | |
605 | 605 | |
606 | 606 | cpustate->wrdiv = (data) | (cpustate->wrdiv & 0xff00); |
607 | 607 | } |
608 | 608 | |
609 | 609 | static WRITE8_HANDLER( wrdivh_w ) |
610 | 610 | { |
611 | g65816i_cpu_struct *cpustate = get_safe_token(&space | |
611 | g65816i_cpu_struct *cpustate = get_safe_token(&space.device()); | |
612 | 612 | |
613 | 613 | cpustate->wrdiv = (data << 8) | (cpustate->wrdiv & 0xff); |
614 | 614 | } |
615 | 615 | |
616 | 616 | static WRITE8_HANDLER( wrdvdd_w ) |
617 | 617 | { |
618 | g65816i_cpu_struct *cpustate = get_safe_token(&space | |
618 | g65816i_cpu_struct *cpustate = get_safe_token(&space.device()); | |
619 | 619 | UINT16 quotient, remainder; |
620 | 620 | |
621 | 621 | cpustate->dvdd = data; |
r17963 | r17964 | |
629 | 629 | |
630 | 630 | static WRITE8_HANDLER( memsel_w ) |
631 | 631 | { |
632 | g65816i_cpu_struct *cpustate = get_safe_token(&space | |
632 | g65816i_cpu_struct *cpustate = get_safe_token(&space.device()); | |
633 | 633 | cpustate->fastROM = data & 1; |
634 | 634 | } |
635 | 635 | |
636 | 636 | static READ8_HANDLER( rddivl_r ) |
637 | 637 | { |
638 | g65816i_cpu_struct *cpustate = get_safe_token(&space | |
638 | g65816i_cpu_struct *cpustate = get_safe_token(&space.device()); | |
639 | 639 | return cpustate->rddiv & 0xff; |
640 | 640 | } |
641 | 641 | |
642 | 642 | static READ8_HANDLER( rddivh_r ) |
643 | 643 | { |
644 | g65816i_cpu_struct *cpustate = get_safe_token(&space | |
644 | g65816i_cpu_struct *cpustate = get_safe_token(&space.device()); | |
645 | 645 | return cpustate->rddiv >> 8; |
646 | 646 | } |
647 | 647 | |
648 | 648 | static READ8_HANDLER( rdmpyl_r ) |
649 | 649 | { |
650 | g65816i_cpu_struct *cpustate = get_safe_token(&space | |
650 | g65816i_cpu_struct *cpustate = get_safe_token(&space.device()); | |
651 | 651 | return cpustate->rdmpy & 0xff; |
652 | 652 | } |
653 | 653 | |
654 | 654 | static READ8_HANDLER( rdmpyh_r ) |
655 | 655 | { |
656 | g65816i_cpu_struct *cpustate = get_safe_token(&space | |
656 | g65816i_cpu_struct *cpustate = get_safe_token(&space.device()); | |
657 | 657 | return cpustate->rdmpy >> 8; |
658 | 658 | } |
659 | 659 |
r17963 | r17964 | |
---|---|---|
85 | 85 | INLINE uint g65816i_read_8_vector(g65816i_cpu_struct *cpustate, uint address) |
86 | 86 | { |
87 | 87 | if (READ_VECTOR) |
88 | return READ_VECTOR(cpustate->program, address); | |
88 | return READ_VECTOR(*cpustate->program, address); | |
89 | 89 | else |
90 | 90 | return g65816i_read_8_normal(cpustate, address); |
91 | 91 | } |
r17963 | r17964 | |
---|---|---|
98 | 98 | #define SETPC(R,x) do { (R)->nextpc = (x); } while (0) |
99 | 99 | #define SETPCL(R,x,l) do { (R)->nextpc = (x); (R)->r[l] = (R)->pc + 4; } while (0) |
100 | 100 | |
101 | #define RBYTE(R,x) (*(R)->cur.read_byte)((R)->program, x) | |
102 | #define RWORD(R,x) (*(R)->cur.read_word)((R)->program, x) | |
103 | #define RLONG(R,x) (*(R)->cur.read_dword)((R)->program, x) | |
101 | #define RBYTE(R,x) (*(R)->cur.read_byte)(*(R)->program, x) | |
102 | #define RWORD(R,x) (*(R)->cur.read_word)(*(R)->program, x) | |
103 | #define RLONG(R,x) (*(R)->cur.read_dword)(*(R)->program, x) | |
104 | 104 | |
105 | #define WBYTE(R,x,v) (*(R)->cur.write_byte)((R)->program, x, v) | |
106 | #define WWORD(R,x,v) (*(R)->cur.write_word)((R)->program, x, v) | |
107 | #define WLONG(R,x,v) (*(R)->cur.write_dword)((R)->program, x, v) | |
105 | #define WBYTE(R,x,v) (*(R)->cur.write_byte)(*(R)->program, x, v) | |
106 | #define WWORD(R,x,v) (*(R)->cur.write_word)(*(R)->program, x, v) | |
107 | #define WLONG(R,x,v) (*(R)->cur.write_dword)(*(R)->program, x, v) | |
108 | 108 | |
109 | 109 | #define SR cpr[0][COP0_Status] |
110 | 110 | #define CAUSE cpr[0][COP0_Cause] |
r17963 | r17964 | |
187 | 187 | static void swl_le(r3000_state *r3000, UINT32 op); |
188 | 188 | static void swr_le(r3000_state *r3000, UINT32 op); |
189 | 189 | |
190 | static UINT8 readcache_be(address_space *space, offs_t offset); | |
191 | static UINT16 readcache_be_word(address_space *space, offs_t offset); | |
192 | static UINT32 readcache_be_dword(address_space *space, offs_t offset); | |
193 | static void writecache_be(address_space *space, offs_t offset, UINT8 data); | |
194 | static void writecache_be_word(address_space *space, offs_t offset, UINT16 data); | |
195 | static void writecache_be_dword(address_space *space, offs_t offset, UINT32 data); | |
190 | static UINT8 readcache_be(address_space &space, offs_t offset); | |
191 | static UINT16 readcache_be_word(address_space &space, offs_t offset); | |
192 | static UINT32 readcache_be_dword(address_space &space, offs_t offset); | |
193 | static void writecache_be(address_space &space, offs_t offset, UINT8 data); | |
194 | static void writecache_be_word(address_space &space, offs_t offset, UINT16 data); | |
195 | static void writecache_be_dword(address_space &space, offs_t offset, UINT32 data); | |
196 | 196 | |
197 | static UINT8 readcache_le(address_space *space, offs_t offset); | |
198 | static UINT16 readcache_le_word(address_space *space, offs_t offset); | |
199 | static UINT32 readcache_le_dword(address_space *space, offs_t offset); | |
200 | static void writecache_le(address_space *space, offs_t offset, UINT8 data); | |
201 | static void writecache_le_word(address_space *space, offs_t offset, UINT16 data); | |
202 | static void writecache_le_dword(address_space *space, offs_t offset, UINT32 data); | |
197 | static UINT8 readcache_le(address_space &space, offs_t offset); | |
198 | static UINT16 readcache_le_word(address_space &space, offs_t offset); | |
199 | static UINT32 readcache_le_dword(address_space &space, offs_t offset); | |
200 | static void writecache_le(address_space &space, offs_t offset, UINT8 data); | |
201 | static void writecache_le_word(address_space &space, offs_t offset, UINT16 data); | |
202 | static void writecache_le_dword(address_space &space, offs_t offset, UINT32 data); | |
203 | 203 | |
204 | 204 | |
205 | 205 | |
r17963 | r17964 | |
892 | 892 | CACHE I/O |
893 | 893 | ***************************************************************************/ |
894 | 894 | |
895 | static UINT8 readcache_be(address_space | |
895 | static UINT8 readcache_be(address_space &space, offs_t offset) | |
896 | 896 | { |
897 | r3000_state *r3000 = get_safe_token(&space | |
897 | r3000_state *r3000 = get_safe_token(&space.device()); | |
898 | 898 | offset &= 0x1fffffff; |
899 | 899 | return (offset * 4 < r3000->cache_size) ? r3000->cache[BYTE4_XOR_BE(offset)] : 0xff; |
900 | 900 | } |
901 | 901 | |
902 | static UINT16 readcache_be_word(address_space | |
902 | static UINT16 readcache_be_word(address_space &space, offs_t offset) | |
903 | 903 | { |
904 | r3000_state *r3000 = get_safe_token(&space | |
904 | r3000_state *r3000 = get_safe_token(&space.device()); | |
905 | 905 | offset &= 0x1fffffff; |
906 | 906 | return (offset * 4 < r3000->cache_size) ? *(UINT16 *)&r3000->cache[WORD_XOR_BE(offset)] : 0xffff; |
907 | 907 | } |
908 | 908 | |
909 | static UINT32 readcache_be_dword(address_space | |
909 | static UINT32 readcache_be_dword(address_space &space, offs_t offset) | |
910 | 910 | { |
911 | r3000_state *r3000 = get_safe_token(&space | |
911 | r3000_state *r3000 = get_safe_token(&space.device()); | |
912 | 912 | offset &= 0x1fffffff; |
913 | 913 | return (offset * 4 < r3000->cache_size) ? *(UINT32 *)&r3000->cache[offset] : 0xffffffff; |
914 | 914 | } |
915 | 915 | |
916 | static void writecache_be(address_space | |
916 | static void writecache_be(address_space &space, offs_t offset, UINT8 data) | |
917 | 917 | { |
918 | r3000_state *r3000 = get_safe_token(&space | |
918 | r3000_state *r3000 = get_safe_token(&space.device()); | |
919 | 919 | offset &= 0x1fffffff; |
920 | 920 | if (offset * 4 < r3000->cache_size) r3000->cache[BYTE4_XOR_BE(offset)] = data; |
921 | 921 | } |
922 | 922 | |
923 | static void writecache_be_word(address_space | |
923 | static void writecache_be_word(address_space &space, offs_t offset, UINT16 data) | |
924 | 924 | { |
925 | r3000_state *r3000 = get_safe_token(&space | |
925 | r3000_state *r3000 = get_safe_token(&space.device()); | |
926 | 926 | offset &= 0x1fffffff; |
927 | 927 | if (offset * 4 < r3000->cache_size) *(UINT16 *)&r3000->cache[WORD_XOR_BE(offset)] = data; |
928 | 928 | } |
929 | 929 | |
930 | static void writecache_be_dword(address_space | |
930 | static void writecache_be_dword(address_space &space, offs_t offset, UINT32 data) | |
931 | 931 | { |
932 | r3000_state *r3000 = get_safe_token(&space | |
932 | r3000_state *r3000 = get_safe_token(&space.device()); | |
933 | 933 | offset &= 0x1fffffff; |
934 | 934 | if (offset * 4 < r3000->cache_size) *(UINT32 *)&r3000->cache[offset] = data; |
935 | 935 | } |
936 | 936 | |
937 | static UINT8 readcache_le(address_space | |
937 | static UINT8 readcache_le(address_space &space, offs_t offset) | |
938 | 938 | { |
939 | r3000_state *r3000 = get_safe_token(&space | |
939 | r3000_state *r3000 = get_safe_token(&space.device()); | |
940 | 940 | offset &= 0x1fffffff; |
941 | 941 | return (offset * 4 < r3000->cache_size) ? r3000->cache[BYTE4_XOR_LE(offset)] : 0xff; |
942 | 942 | } |
943 | 943 | |
944 | static UINT16 readcache_le_word(address_space | |
944 | static UINT16 readcache_le_word(address_space &space, offs_t offset) | |
945 | 945 | { |
946 | r3000_state *r3000 = get_safe_token(&space | |
946 | r3000_state *r3000 = get_safe_token(&space.device()); | |
947 | 947 | offset &= 0x1fffffff; |
948 | 948 | return (offset * 4 < r3000->cache_size) ? *(UINT16 *)&r3000->cache[WORD_XOR_LE(offset)] : 0xffff; |
949 | 949 | } |
950 | 950 | |
951 | static UINT32 readcache_le_dword(address_space | |
951 | static UINT32 readcache_le_dword(address_space &space, offs_t offset) | |
952 | 952 | { |
953 | r3000_state *r3000 = get_safe_token(&space | |
953 | r3000_state *r3000 = get_safe_token(&space.device()); | |
954 | 954 | offset &= 0x1fffffff; |
955 | 955 | return (offset * 4 < r3000->cache_size) ? *(UINT32 *)&r3000->cache[offset] : 0xffffffff; |
956 | 956 | } |
957 | 957 | |
958 | static void writecache_le(address_space | |
958 | static void writecache_le(address_space &space, offs_t offset, UINT8 data) | |
959 | 959 | { |
960 | r3000_state *r3000 = get_safe_token(&space | |
960 | r3000_state *r3000 = get_safe_token(&space.device()); | |
961 | 961 | offset &= 0x1fffffff; |
962 | 962 | if (offset * 4 < r3000->cache_size) r3000->cache[BYTE4_XOR_LE(offset)] = data; |
963 | 963 | } |
964 | 964 | |
965 | static void writecache_le_word(address_space | |
965 | static void writecache_le_word(address_space &space, offs_t offset, UINT16 data) | |
966 | 966 | { |
967 | r3000_state *r3000 = get_safe_token(&space | |
967 | r3000_state *r3000 = get_safe_token(&space.device()); | |
968 | 968 | offset &= 0x1fffffff; |
969 | 969 | if (offset * 4 < r3000->cache_size) *(UINT16 *)&r3000->cache[WORD_XOR_LE(offset)] = data; |
970 | 970 | } |
971 | 971 | |
972 | static void writecache_le_dword(address_space | |
972 | static void writecache_le_dword(address_space &space, offs_t offset, UINT32 data) | |
973 | 973 | { |
974 | r3000_state *r3000 = get_safe_token(&space | |
974 | r3000_state *r3000 = get_safe_token(&space.device()); | |
975 | 975 | offset &= 0x1fffffff; |
976 | 976 | if (offset * 4 < r3000->cache_size) *(UINT32 *)&r3000->cache[offset] = data; |
977 | 977 | } |
r17963 | r17964 | |
---|---|---|
557 | 557 | |
558 | 558 | static WRITE8_HANDLER( tms70x0_pf_w ) /* Perpherial file write */ |
559 | 559 | { |
560 | tms7000_state *cpustate = get_safe_token(&space | |
560 | tms7000_state *cpustate = get_safe_token(&space.device()); | |
561 | 561 | UINT8 temp1, temp2, temp3; |
562 | 562 | |
563 | 563 | switch( offset ) |
r17963 | r17964 | |
626 | 626 | |
627 | 627 | static READ8_HANDLER( tms70x0_pf_r ) /* Perpherial file read */ |
628 | 628 | { |
629 | tms7000_state *cpustate = get_safe_token(&space | |
629 | tms7000_state *cpustate = get_safe_token(&space.device()); | |
630 | 630 | UINT8 result; |
631 | 631 | UINT8 temp1, temp2, temp3; |
632 | 632 | |
r17963 | r17964 | |
719 | 719 | } |
720 | 720 | |
721 | 721 | static WRITE8_HANDLER( tms7000_internal_w ) { |
722 | tms7000_state *cpustate = get_safe_token(&space | |
722 | tms7000_state *cpustate = get_safe_token(&space.device()); | |
723 | 723 | cpustate->rf[ offset ] = data; |
724 | 724 | } |
725 | 725 | |
726 | 726 | static READ8_HANDLER( tms7000_internal_r ) { |
727 | tms7000_state *cpustate = get_safe_token(&space | |
727 | tms7000_state *cpustate = get_safe_token(&space.device()); | |
728 | 728 | return cpustate->rf[ offset ]; |
729 | 729 | } |
730 | 730 |
r17963 | r17964 | |
---|---|---|
529 | 529 | READ16_HANDLER(ti990_10_internal_r) |
530 | 530 | { |
531 | 531 | //return cpustate->ROM[offset]; |
532 | return space | |
532 | return space.read_word(0x1ffc00+offset); | |
533 | 533 | } |
534 | 534 | |
535 | 535 | #endif |
r17963 | r17964 | |
541 | 541 | */ |
542 | 542 | READ8_HANDLER(tms9995_internal1_r) |
543 | 543 | { |
544 | tms99xx_state *cpustate = get_safe_token(&space | |
544 | tms99xx_state *cpustate = get_safe_token(&space.device()); | |
545 | 545 | return cpustate->RAM[offset]; |
546 | 546 | } |
547 | 547 | |
548 | 548 | WRITE8_HANDLER(tms9995_internal1_w) |
549 | 549 | { |
550 | tms99xx_state *cpustate = get_safe_token(&space | |
550 | tms99xx_state *cpustate = get_safe_token(&space.device()); | |
551 | 551 | cpustate->RAM[offset]=data; |
552 | 552 | } |
553 | 553 | |
r17963 | r17964 | |
556 | 556 | */ |
557 | 557 | READ8_HANDLER(tms9995_internal2_r) |
558 | 558 | { |
559 | tms99xx_state *cpustate = get_safe_token(&space | |
559 | tms99xx_state *cpustate = get_safe_token(&space.device()); | |
560 | 560 | return cpustate->RAM[offset+0xfc]; |
561 | 561 | } |
562 | 562 | |
563 | 563 | WRITE8_HANDLER(tms9995_internal2_w) |
564 | 564 | { |
565 | tms99xx_state *cpustate = get_safe_token(&space | |
565 | tms99xx_state *cpustate = get_safe_token(&space.device()); | |
566 | 566 | cpustate->RAM[offset+0xfc]=data; |
567 | 567 | } |
568 | 568 | |
r17963 | r17964 | |
1076 | 1076 | #if (TMS99XX_MODEL == TI990_10_ID) |
1077 | 1077 | READ8_HANDLER(ti990_10_mapper_cru_r) |
1078 | 1078 | { |
1079 | tms99xx_state *cpustate = get_safe_token(&space | |
1079 | tms99xx_state *cpustate = get_safe_token(&space.device()); | |
1080 | 1080 | int reply = 0; |
1081 | 1081 | |
1082 | 1082 | switch(cpustate->mapper_cru_read_register) |
r17963 | r17964 | |
1115 | 1115 | |
1116 | 1116 | WRITE8_HANDLER(ti990_10_mapper_cru_w) |
1117 | 1117 | { |
1118 | tms99xx_state *cpustate = get_safe_token(&space | |
1118 | tms99xx_state *cpustate = get_safe_token(&space.device()); | |
1119 | 1119 | switch (offset) |
1120 | 1120 | { |
1121 | 1121 | case 0: |
r17963 | r17964 | |
1157 | 1157 | |
1158 | 1158 | READ8_HANDLER(ti990_10_eir_cru_r) |
1159 | 1159 | { |
1160 | tms99xx_state *cpustate = get_safe_token(&space | |
1160 | tms99xx_state *cpustate = get_safe_token(&space.device()); | |
1161 | 1161 | return (offset == 1) ? (cpustate->error_interrupt_register & 0xff) : 0; |
1162 | 1162 | } |
1163 | 1163 | |
1164 | 1164 | WRITE8_HANDLER(ti990_10_eir_cru_w) |
1165 | 1165 | { |
1166 | tms99xx_state *cpustate = get_safe_token(&space | |
1166 | tms99xx_state *cpustate = get_safe_token(&space.device()); | |
1167 | 1167 | if (offset < 4) /* does not work for EIR_MAPERR */ |
1168 | 1168 | { |
1169 | 1169 | cpustate->error_interrupt_register &= ~ (1 << offset); |
r17963 | r17964 | |
---|---|---|
288 | 288 | READ8_HANDLER( h6280_irq_status_r ) |
289 | 289 | { |
290 | 290 | int status; |
291 | h6280_Regs *cpustate = get_safe_token(&space | |
291 | h6280_Regs *cpustate = get_safe_token(&space.device()); | |
292 | 292 | |
293 | 293 | switch (offset&3) |
294 | 294 | { |
r17963 | r17964 | |
307 | 307 | |
308 | 308 | WRITE8_HANDLER( h6280_irq_status_w ) |
309 | 309 | { |
310 | h6280_Regs *cpustate = get_safe_token(&space | |
310 | h6280_Regs *cpustate = get_safe_token(&space.device()); | |
311 | 311 | cpustate->io_buffer=data; |
312 | 312 | switch (offset&3) |
313 | 313 | { |
r17963 | r17964 | |
326 | 326 | READ8_HANDLER( h6280_timer_r ) |
327 | 327 | { |
328 | 328 | /* only returns countdown */ |
329 | h6280_Regs *cpustate = get_safe_token(&space | |
329 | h6280_Regs *cpustate = get_safe_token(&space.device()); | |
330 | 330 | return ((cpustate->timer_value >> 10)&0x7F)|(cpustate->io_buffer&0x80); |
331 | 331 | } |
332 | 332 | |
333 | 333 | WRITE8_HANDLER( h6280_timer_w ) |
334 | 334 | { |
335 | h6280_Regs *cpustate = get_safe_token(&space | |
335 | h6280_Regs *cpustate = get_safe_token(&space.device()); | |
336 | 336 | cpustate->io_buffer=data; |
337 | 337 | switch (offset & 1) { |
338 | 338 | case 0: /* Counter preload */ |
r17963 | r17964 | |
---|---|---|
1396 | 1396 | |
1397 | 1397 | READ8_HANDLER( m6801_io_r ) |
1398 | 1398 | { |
1399 | m6800_state *cpustate = get_safe_token(&space | |
1399 | m6800_state *cpustate = get_safe_token(&space.device()); | |
1400 | 1400 | |
1401 | 1401 | UINT8 data = 0; |
1402 | 1402 | |
r17963 | r17964 | |
1427 | 1427 | break; |
1428 | 1428 | |
1429 | 1429 | case IO_P3DDR: |
1430 | logerror("M6801 '%s' Port 3 DDR is a write-only register\n", space | |
1430 | logerror("M6801 '%s' Port 3 DDR is a write-only register\n", space.device().tag()); | |
1431 | 1431 | break; |
1432 | 1432 | |
1433 | 1433 | case IO_P4DDR: |
r17963 | r17964 | |
1435 | 1435 | break; |
1436 | 1436 | |
1437 | 1437 | case IO_P3DATA: |
1438 | if (!space | |
1438 | if (!space.debugger_access()) | |
1439 | 1439 | { |
1440 | 1440 | if (cpustate->p3csr_is3_flag_read) |
1441 | 1441 | { |
1442 | //logerror("M6801 '%s' Cleared IS3\n", space | |
1442 | //logerror("M6801 '%s' Cleared IS3\n", space.device().tag()); | |
1443 | 1443 | cpustate->p3csr &= ~M6801_P3CSR_IS3_FLAG; |
1444 | 1444 | cpustate->p3csr_is3_flag_read = 0; |
1445 | 1445 | } |
r17963 | r17964 | |
1456 | 1456 | data = (cpustate->io->read_byte(M6801_PORT3) & (cpustate->port3_ddr ^ 0xff)) |
1457 | 1457 | | (cpustate->port3_data & cpustate->port3_ddr); |
1458 | 1458 | |
1459 | if (!space | |
1459 | if (!space.debugger_access()) | |
1460 | 1460 | { |
1461 | 1461 | cpustate->port3_latched = 0; |
1462 | 1462 | |
r17963 | r17964 | |
1481 | 1481 | break; |
1482 | 1482 | |
1483 | 1483 | case IO_CH: |
1484 | if(!(cpustate->pending_tcsr&TCSR_TOF) && !space | |
1484 | if(!(cpustate->pending_tcsr&TCSR_TOF) && !space.debugger_access()) | |
1485 | 1485 | { |
1486 | 1486 | cpustate->tcsr &= ~TCSR_TOF; |
1487 | 1487 | MODIFIED_tcsr; |
r17963 | r17964 | |
1494 | 1494 | break; |
1495 | 1495 | |
1496 | 1496 | case IO_OCRH: |
1497 | if(!(cpustate->pending_tcsr&TCSR_OCF) && !space | |
1497 | if(!(cpustate->pending_tcsr&TCSR_OCF) && !space.debugger_access()) | |
1498 | 1498 | { |
1499 | 1499 | cpustate->tcsr &= ~TCSR_OCF; |
1500 | 1500 | MODIFIED_tcsr; |
r17963 | r17964 | |
1503 | 1503 | break; |
1504 | 1504 | |
1505 | 1505 | case IO_OCRL: |
1506 | if(!(cpustate->pending_tcsr&TCSR_OCF) && !space | |
1506 | if(!(cpustate->pending_tcsr&TCSR_OCF) && !space.debugger_access()) | |
1507 | 1507 | { |
1508 | 1508 | cpustate->tcsr &= ~TCSR_OCF; |
1509 | 1509 | MODIFIED_tcsr; |
r17963 | r17964 | |
1512 | 1512 | break; |
1513 | 1513 | |
1514 | 1514 | case IO_ICRH: |
1515 | if(!(cpustate->pending_tcsr&TCSR_ICF) && !space | |
1515 | if(!(cpustate->pending_tcsr&TCSR_ICF) && !space.debugger_access()) | |
1516 | 1516 | { |
1517 | 1517 | cpustate->tcsr &= ~TCSR_ICF; |
1518 | 1518 | MODIFIED_tcsr; |
r17963 | r17964 | |
1525 | 1525 | break; |
1526 | 1526 | |
1527 | 1527 | case IO_P3CSR: |
1528 | if ((cpustate->p3csr & M6801_P3CSR_IS3_FLAG) && !space | |
1528 | if ((cpustate->p3csr & M6801_P3CSR_IS3_FLAG) && !space.debugger_access()) | |
1529 | 1529 | { |
1530 | 1530 | cpustate->p3csr_is3_flag_read = 1; |
1531 | 1531 | } |
r17963 | r17964 | |
1538 | 1538 | break; |
1539 | 1539 | |
1540 | 1540 | case IO_TRCSR: |
1541 | if (!space | |
1541 | if (!space.debugger_access()) | |
1542 | 1542 | { |
1543 | 1543 | if (cpustate->trcsr & M6800_TRCSR_TDRE) |
1544 | 1544 | { |
r17963 | r17964 | |
1560 | 1560 | break; |
1561 | 1561 | |
1562 | 1562 | case IO_RDR: |
1563 | if (!space | |
1563 | if (!space.debugger_access()) | |
1564 | 1564 | { |
1565 | 1565 | if (cpustate->trcsr_read_orfe) |
1566 | 1566 | { |
1567 | //logerror("M6801 '%s' Cleared ORFE\n", space | |
1567 | //logerror("M6801 '%s' Cleared ORFE\n", space.device().tag()); | |
1568 | 1568 | cpustate->trcsr_read_orfe = 0; |
1569 | 1569 | cpustate->trcsr &= ~M6800_TRCSR_ORFE; |
1570 | 1570 | } |
1571 | 1571 | |
1572 | 1572 | if (cpustate->trcsr_read_rdrf) |
1573 | 1573 | { |
1574 | //logerror("M6801 '%s' Cleared RDRF\n", space | |
1574 | //logerror("M6801 '%s' Cleared RDRF\n", space.device().tag()); | |
1575 | 1575 | cpustate->trcsr_read_rdrf = 0; |
1576 | 1576 | cpustate->trcsr &= ~M6800_TRCSR_RDRF; |
1577 | 1577 | } |
r17963 | r17964 | |
1600 | 1600 | case IO_ICR2H: |
1601 | 1601 | case IO_ICR2L: |
1602 | 1602 | default: |
1603 | logerror("M6801 '%s' PC %04x: warning - read from reserved internal register %02x\n",space | |
1603 | logerror("M6801 '%s' PC %04x: warning - read from reserved internal register %02x\n",space.device().tag(),space.device().safe_pc(),offset); | |
1604 | 1604 | } |
1605 | 1605 | |
1606 | 1606 | return data; |
r17963 | r17964 | |
1608 | 1608 | |
1609 | 1609 | WRITE8_HANDLER( m6801_io_w ) |
1610 | 1610 | { |
1611 | m6800_state *cpustate = get_safe_token(&space | |
1611 | m6800_state *cpustate = get_safe_token(&space.device()); | |
1612 | 1612 | |
1613 | 1613 | switch (offset) |
1614 | 1614 | { |
1615 | 1615 | case IO_P1DDR: |
1616 | //logerror("M6801 '%s' Port 1 Data Direction Register: %02x\n", space | |
1616 | //logerror("M6801 '%s' Port 1 Data Direction Register: %02x\n", space.device().tag(), data); | |
1617 | 1617 | |
1618 | 1618 | if (cpustate->port1_ddr != data) |
1619 | 1619 | { |
r17963 | r17964 | |
1626 | 1626 | break; |
1627 | 1627 | |
1628 | 1628 | case IO_P2DDR: |
1629 | //logerror("M6801 '%s' Port 2 Data Direction Register: %02x\n", space | |
1629 | //logerror("M6801 '%s' Port 2 Data Direction Register: %02x\n", space.device().tag(), data); | |
1630 | 1630 | |
1631 | 1631 | if (cpustate->port2_ddr != data) |
1632 | 1632 | { |
r17963 | r17964 | |
1634 | 1634 | write_port2(cpustate); |
1635 | 1635 | |
1636 | 1636 | if (cpustate->port2_ddr & 2) |
1637 | logerror("CPU '%s' PC %04x: warning - port 2 bit 1 set as output (OLVL) - not supported\n",space | |
1637 | logerror("CPU '%s' PC %04x: warning - port 2 bit 1 set as output (OLVL) - not supported\n",space.device().tag(),space.device().safe_pc()); | |
1638 | 1638 | } |
1639 | 1639 | break; |
1640 | 1640 | |
1641 | 1641 | case IO_P1DATA: |
1642 | //logerror("M6801 '%s' Port 1 Data Register: %02x\n", space | |
1642 | //logerror("M6801 '%s' Port 1 Data Register: %02x\n", space.device().tag(), data); | |
1643 | 1643 | |
1644 | 1644 | cpustate->port1_data = data; |
1645 | 1645 | if(cpustate->port1_ddr == 0xff) |
r17963 | r17964 | |
1649 | 1649 | break; |
1650 | 1650 | |
1651 | 1651 | case IO_P2DATA: |
1652 | //logerror("M6801 '%s' Port 2 Data Register: %02x\n", space | |
1652 | //logerror("M6801 '%s' Port 2 Data Register: %02x\n", space.device().tag(), data); | |
1653 | 1653 | |
1654 | 1654 | cpustate->port2_data = data; |
1655 | 1655 | cpustate->port2_written = 1; |
r17963 | r17964 | |
1657 | 1657 | break; |
1658 | 1658 | |
1659 | 1659 | case IO_P3DDR: |
1660 | //logerror("M6801 '%s' Port 3 Data Direction Register: %02x\n", space | |
1660 | //logerror("M6801 '%s' Port 3 Data Direction Register: %02x\n", space.device().tag(), data); | |
1661 | 1661 | |
1662 | 1662 | if (cpustate->port3_ddr != data) |
1663 | 1663 | { |
r17963 | r17964 | |
1670 | 1670 | break; |
1671 | 1671 | |
1672 | 1672 | case IO_P4DDR: |
1673 | //logerror("M6801 '%s' Port 4 Data Direction Register: %02x\n", space | |
1673 | //logerror("M6801 '%s' Port 4 Data Direction Register: %02x\n", space.device().tag(), data); | |
1674 | 1674 | |
1675 | 1675 | if (cpustate->port4_ddr != data) |
1676 | 1676 | { |
r17963 | r17964 | |
1683 | 1683 | break; |
1684 | 1684 | |
1685 | 1685 | case IO_P3DATA: |
1686 | //logerror("M6801 '%s' Port 3 Data Register: %02x\n", space | |
1686 | //logerror("M6801 '%s' Port 3 Data Register: %02x\n", space.device().tag(), data); | |
1687 | 1687 | |
1688 | 1688 | if (cpustate->p3csr_is3_flag_read) |
1689 | 1689 | { |
1690 | //logerror("M6801 '%s' Cleared IS3\n", space | |
1690 | //logerror("M6801 '%s' Cleared IS3\n", space.device().tag()); | |
1691 | 1691 | cpustate->p3csr &= ~M6801_P3CSR_IS3_FLAG; |
1692 | 1692 | cpustate->p3csr_is3_flag_read = 0; |
1693 | 1693 | } |
r17963 | r17964 | |
1710 | 1710 | break; |
1711 | 1711 | |
1712 | 1712 | case IO_P4DATA: |
1713 | //logerror("M6801 '%s' Port 4 Data Register: %02x\n", space | |
1713 | //logerror("M6801 '%s' Port 4 Data Register: %02x\n", space.device().tag(), data); | |
1714 | 1714 | |
1715 | 1715 | cpustate->port4_data = data; |
1716 | 1716 | if(cpustate->port4_ddr == 0xff) |
r17963 | r17964 | |
1720 | 1720 | break; |
1721 | 1721 | |
1722 | 1722 | case IO_TCSR: |
1723 | //logerror("M6801 '%s' Timer Control and Status Register: %02x\n", space | |
1723 | //logerror("M6801 '%s' Timer Control and Status Register: %02x\n", space.device().tag(), data); | |
1724 | 1724 | |
1725 | 1725 | cpustate->tcsr = data; |
1726 | 1726 | cpustate->pending_tcsr &= cpustate->tcsr; |
r17963 | r17964 | |
1730 | 1730 | break; |
1731 | 1731 | |
1732 | 1732 | case IO_CH: |
1733 | //logerror("M6801 '%s' Counter High Register: %02x\n", space | |
1733 | //logerror("M6801 '%s' Counter High Register: %02x\n", space.device().tag(), data); | |
1734 | 1734 | |
1735 | 1735 | cpustate->latch09 = data & 0xff; /* 6301 only */ |
1736 | 1736 | CT = 0xfff8; |
r17963 | r17964 | |
1739 | 1739 | break; |
1740 | 1740 | |
1741 | 1741 | case IO_CL: /* 6301 only */ |
1742 | //logerror("M6801 '%s' Counter Low Register: %02x\n", space | |
1742 | //logerror("M6801 '%s' Counter Low Register: %02x\n", space.device().tag(), data); | |
1743 | 1743 | |
1744 | 1744 | CT = (cpustate->latch09 << 8) | (data & 0xff); |
1745 | 1745 | TOH = CTH; |
r17963 | r17964 | |
1747 | 1747 | break; |
1748 | 1748 | |
1749 | 1749 | case IO_OCRH: |
1750 | //logerror("M6801 '%s' Output Compare High Register: %02x\n", space | |
1750 | //logerror("M6801 '%s' Output Compare High Register: %02x\n", space.device().tag(), data); | |
1751 | 1751 | |
1752 | 1752 | if( cpustate->output_compare.b.h != data) |
1753 | 1753 | { |
r17963 | r17964 | |
1757 | 1757 | break; |
1758 | 1758 | |
1759 | 1759 | case IO_OCRL: |
1760 | //logerror("M6801 '%s' Output Compare Low Register: %02x\n", space | |
1760 | //logerror("M6801 '%s' Output Compare Low Register: %02x\n", space.device().tag(), data); | |
1761 | 1761 | |
1762 | 1762 | if( cpustate->output_compare.b.l != data) |
1763 | 1763 | { |
r17963 | r17964 | |
1769 | 1769 | case IO_ICRH: |
1770 | 1770 | case IO_ICRL: |
1771 | 1771 | case IO_RDR: |
1772 | //logerror("CPU '%s' PC %04x: warning - write %02x to read only internal register %02x\n",space | |
1772 | //logerror("CPU '%s' PC %04x: warning - write %02x to read only internal register %02x\n",space.device().tag(),space.device().safe_pc(),data,offset); | |
1773 | 1773 | break; |
1774 | 1774 | |
1775 | 1775 | case IO_P3CSR: |
1776 | //logerror("M6801 '%s' Port 3 Control and Status Register: %02x\n", space | |
1776 | //logerror("M6801 '%s' Port 3 Control and Status Register: %02x\n", space.device().tag(), data); | |
1777 | 1777 | |
1778 | 1778 | cpustate->p3csr = data; |
1779 | 1779 | break; |
1780 | 1780 | |
1781 | 1781 | case IO_RMCR: |
1782 | //logerror("M6801 '%s' Rate and Mode Control Register: %02x\n", space | |
1782 | //logerror("M6801 '%s' Rate and Mode Control Register: %02x\n", space.device().tag(), data); | |
1783 | 1783 | |
1784 | 1784 | set_rmcr(cpustate, data); |
1785 | 1785 | break; |
1786 | 1786 | |
1787 | 1787 | case IO_TRCSR: |
1788 | //logerror("M6801 '%s' Transmit/Receive Control and Status Register: %02x\n", space | |
1788 | //logerror("M6801 '%s' Transmit/Receive Control and Status Register: %02x\n", space.device().tag(), data); | |
1789 | 1789 | |
1790 | 1790 | if ((data & M6800_TRCSR_TE) && !(cpustate->trcsr & M6800_TRCSR_TE)) |
1791 | 1791 | { |
r17963 | r17964 | |
1803 | 1803 | break; |
1804 | 1804 | |
1805 | 1805 | case IO_TDR: |
1806 | //logerror("M6800 '%s' Transmit Data Register: %02x\n", space | |
1806 | //logerror("M6800 '%s' Transmit Data Register: %02x\n", space.device().tag(), data); | |
1807 | 1807 | |
1808 | 1808 | if (cpustate->trcsr_read_tdre) |
1809 | 1809 | { |
r17963 | r17964 | |
1814 | 1814 | break; |
1815 | 1815 | |
1816 | 1816 | case IO_RCR: |
1817 | //logerror("M6801 '%s' RAM Control Register: %02x\n", space | |
1817 | //logerror("M6801 '%s' RAM Control Register: %02x\n", space.device().tag(), data); | |
1818 | 1818 | |
1819 | 1819 | cpustate->ram_ctrl = data; |
1820 | 1820 | break; |
r17963 | r17964 | |
1831 | 1831 | case IO_ICR2H: |
1832 | 1832 | case IO_ICR2L: |
1833 | 1833 | default: |
1834 | logerror("M6801 '%s' PC %04x: warning - write %02x to reserved internal register %02x\n",space | |
1834 | logerror("M6801 '%s' PC %04x: warning - write %02x to reserved internal register %02x\n",space.device().tag(),space.device().safe_pc(),data,offset); | |
1835 | 1835 | break; |
1836 | 1836 | } |
1837 | 1837 | } |
r17963 | r17964 | |
---|---|---|
66 | 66 | static ioport_port *resolve_port(const char *tag, device_t ¤t); |
67 | 67 | static device_t *resolve_device(int index, const char *tag, device_t ¤t); |
68 | 68 | static device_execute_interface *resolve_execute_interface(const char *tag, device_t ¤t); |
69 | static address_space | |
69 | static address_space &resolve_space(int index, const char *tag, device_t ¤t); | |
70 | 70 | }; |
71 | 71 | |
72 | 72 | |
r17963 | r17964 | |
131 | 131 | // given a device tag and a space index |
132 | 132 | //------------------------------------------------- |
133 | 133 | |
134 | address_space | |
134 | address_space &devcb_resolver::resolve_space(int index, const char *tag, device_t ¤t) | |
135 | 135 | { |
136 | 136 | // find our target device |
137 | 137 | device_t *targetdev = current.siblingdevice(tag); |
r17963 | r17964 | |
148 | 148 | if (result == NULL) |
149 | 149 | throw emu_fatalerror("Unable to find device '%s' space %d (requested by %s '%s')", tag, index, current.name(), current.tag()); |
150 | 150 | |
151 | return result; | |
151 | return *result; | |
152 | 152 | } |
153 | 153 | |
154 | 154 | |
r17963 | r17964 | |
201 | 201 | break; |
202 | 202 | |
203 | 203 | case DEVCB_TYPE_LEGACY_SPACE: |
204 | m_object.space = devcb_resolver::resolve_space(desc.index, desc.tag, device); | |
204 | m_object.space = &devcb_resolver::resolve_space(desc.index, desc.tag, device); | |
205 | 205 | m_helper.read8_space = desc.readspace; |
206 | 206 | *static_cast<devcb_read_line_delegate *>(this) = devcb_read_line_delegate(&devcb_resolved_read_line::from_read8, desc.name, this); |
207 | 207 | break; |
r17963 | r17964 | |
295 | 295 | break; |
296 | 296 | |
297 | 297 | case DEVCB_TYPE_LEGACY_SPACE: |
298 | m_object.space = devcb_resolver::resolve_space(desc.index, desc.tag, device); | |
298 | m_object.space = &devcb_resolver::resolve_space(desc.index, desc.tag, device); | |
299 | 299 | m_helper.write8_space = desc.writespace; |
300 | 300 | *static_cast<devcb_write_line_delegate *>(this) = devcb_write_line_delegate(&devcb_resolved_write_line::to_write8, desc.name, this); |
301 | 301 | break; |
r17963 | r17964 | |
403 | 403 | break; |
404 | 404 | |
405 | 405 | case DEVCB_TYPE_LEGACY_SPACE: |
406 | m_object.space = devcb_resolver::resolve_space(desc.index, desc.tag, device); | |
406 | m_object.space = &devcb_resolver::resolve_space(desc.index, desc.tag, device); | |
407 | 407 | *static_cast<devcb_read8_delegate *>(this) = devcb_read8_delegate(desc.readspace, desc.name, m_object.space); |
408 | 408 | break; |
409 | 409 | |
r17963 | r17964 | |
510 | 510 | break; |
511 | 511 | |
512 | 512 | case DEVCB_TYPE_LEGACY_SPACE: |
513 | m_object.space = devcb_resolver::resolve_space(desc.index, desc.tag, device); | |
513 | m_object.space = &devcb_resolver::resolve_space(desc.index, desc.tag, device); | |
514 | 514 | *static_cast<devcb_write8_delegate *>(this) = devcb_write8_delegate(desc.writespace, desc.name, m_object.space); |
515 | 515 | break; |
516 | 516 | |
r17963 | r17964 | |
628 | 628 | break; |
629 | 629 | |
630 | 630 | case DEVCB_TYPE_LEGACY_SPACE: |
631 | m_object.space = devcb_resolver::resolve_space(desc.index, desc.tag, device); | |
631 | m_object.space = &devcb_resolver::resolve_space(desc.index, desc.tag, device); | |
632 | 632 | *static_cast<devcb_read16_delegate *>(this) = devcb_read16_delegate(desc.readspace, desc.name, m_object.space); |
633 | 633 | break; |
634 | 634 | |
r17963 | r17964 | |
735 | 735 | break; |
736 | 736 | |
737 | 737 | case DEVCB_TYPE_LEGACY_SPACE: |
738 | m_object.space = devcb_resolver::resolve_space(desc.index, desc.tag, device); | |
738 | m_object.space = &devcb_resolver::resolve_space(desc.index, desc.tag, device); | |
739 | 739 | *static_cast<devcb_write16_delegate *>(this) = devcb_write16_delegate(desc.writespace, desc.name, m_object.space); |
740 | 740 | break; |
741 | 741 |
r17963 | r17964 | |
---|---|---|
164 | 164 | * |
165 | 165 | *************************************/ |
166 | 166 | |
167 | static void register_w(address_space | |
167 | static void register_w(address_space &space, offs_t offset, UINT8 data) | |
168 | 168 | { |
169 | 169 | int scanline; |
170 | 170 | int regnum = offset >> 2; |
r17963 | r17964 | |
184 | 184 | } |
185 | 185 | |
186 | 186 | /* log it */ |
187 | if (VERBOSE) logerror("%s:tms34061 %s = %04x\n", space | |
187 | if (VERBOSE) logerror("%s:tms34061 %s = %04x\n", space.machine().describe_context(), regnames[regnum], tms34061.regs[regnum]); | |
188 | 188 | |
189 | 189 | /* update the state of things */ |
190 | 190 | switch (regnum) |
r17963 | r17964 | |
235 | 235 | * |
236 | 236 | *************************************/ |
237 | 237 | |
238 | static UINT8 register_r(address_space | |
238 | static UINT8 register_r(address_space &space, offs_t offset) | |
239 | 239 | { |
240 | 240 | int regnum = offset >> 2; |
241 | 241 | UINT16 result; |
r17963 | r17964 | |
262 | 262 | } |
263 | 263 | |
264 | 264 | /* log it */ |
265 | if (VERBOSE) logerror("%s:tms34061 %s read = %04X\n", space | |
265 | if (VERBOSE) logerror("%s:tms34061 %s read = %04X\n", space.machine().describe_context(), regnames[regnum], result); | |
266 | 266 | return (offset & 0x02) ? (result >> 8) : result; |
267 | 267 | } |
268 | 268 | |
r17963 | r17964 | |
357 | 357 | } |
358 | 358 | |
359 | 359 | |
360 | static void xypixel_w(address_space | |
360 | static void xypixel_w(address_space &space, int offset, UINT8 data) | |
361 | 361 | { |
362 | 362 | /* determine the offset, then adjust it */ |
363 | 363 | offs_t pixeloffs = tms34061.regs[TMS34061_XYADDRESS]; |
r17963 | r17964 | |
369 | 369 | |
370 | 370 | /* mask to the VRAM size */ |
371 | 371 | pixeloffs &= tms34061.vrammask; |
372 | if (VERBOSE) logerror("%s:tms34061 xy (%04x) = %02x/%02x\n", space | |
372 | if (VERBOSE) logerror("%s:tms34061 xy (%04x) = %02x/%02x\n", space.machine().describe_context(), pixeloffs, data, tms34061.latchdata); | |
373 | 373 | |
374 | 374 | /* set the pixel data */ |
375 | 375 | tms34061.vram[pixeloffs] = data; |
r17963 | r17964 | |
377 | 377 | } |
378 | 378 | |
379 | 379 | |
380 | static UINT8 xypixel_r(address_space | |
380 | static UINT8 xypixel_r(address_space &space, int offset) | |
381 | 381 | { |
382 | 382 | /* determine the offset, then adjust it */ |
383 | 383 | offs_t pixeloffs = tms34061.regs[TMS34061_XYADDRESS]; |
r17963 | r17964 | |
402 | 402 | * |
403 | 403 | *************************************/ |
404 | 404 | |
405 | void tms34061_w(address_space | |
405 | void tms34061_w(address_space &space, int col, int row, int func, UINT8 data) | |
406 | 406 | { |
407 | 407 | offs_t offs; |
408 | 408 | |
r17963 | r17964 | |
425 | 425 | offs = ((row << tms34061.intf.rowshift) | col) & tms34061.vrammask; |
426 | 426 | if (tms34061.regs[TMS34061_CONTROL2] & 0x0040) |
427 | 427 | offs |= (tms34061.regs[TMS34061_CONTROL2] & 3) << 16; |
428 | if (VERBOSE) logerror("%s:tms34061 direct (%04x) = %02x/%02x\n", space | |
428 | if (VERBOSE) logerror("%s:tms34061 direct (%04x) = %02x/%02x\n", space.machine().describe_context(), offs, data, tms34061.latchdata); | |
429 | 429 | if (tms34061.vram[offs] != data || tms34061.latchram[offs] != tms34061.latchdata) |
430 | 430 | { |
431 | 431 | tms34061.vram[offs] = data; |
r17963 | r17964 | |
439 | 439 | if (tms34061.regs[TMS34061_CONTROL2] & 0x0040) |
440 | 440 | offs |= (tms34061.regs[TMS34061_CONTROL2] & 3) << 16; |
441 | 441 | offs &= tms34061.vrammask; |
442 | if (VERBOSE) logerror("%s:tms34061 shiftreg write (%04x)\n", space | |
442 | if (VERBOSE) logerror("%s:tms34061 shiftreg write (%04x)\n", space.machine().describe_context(), offs); | |
443 | 443 | |
444 | 444 | memcpy(&tms34061.vram[offs], tms34061.shiftreg, (size_t)1 << tms34061.intf.rowshift); |
445 | 445 | memset(&tms34061.latchram[offs], tms34061.latchdata, (size_t)1 << tms34061.intf.rowshift); |
r17963 | r17964 | |
451 | 451 | if (tms34061.regs[TMS34061_CONTROL2] & 0x0040) |
452 | 452 | offs |= (tms34061.regs[TMS34061_CONTROL2] & 3) << 16; |
453 | 453 | offs &= tms34061.vrammask; |
454 | if (VERBOSE) logerror("%s:tms34061 shiftreg read (%04x)\n", space | |
454 | if (VERBOSE) logerror("%s:tms34061 shiftreg read (%04x)\n", space.machine().describe_context(), offs); | |
455 | 455 | |
456 | 456 | tms34061.shiftreg = &tms34061.vram[offs]; |
457 | 457 | break; |
458 | 458 | |
459 | 459 | /* log anything else */ |
460 | 460 | default: |
461 | logerror("%s:Unsupported TMS34061 function %d\n", space | |
461 | logerror("%s:Unsupported TMS34061 function %d\n", space.machine().describe_context(), func); | |
462 | 462 | break; |
463 | 463 | } |
464 | 464 | } |
465 | 465 | |
466 | 466 | |
467 | UINT8 tms34061_r(address_space | |
467 | UINT8 tms34061_r(address_space &space, int col, int row, int func) | |
468 | 468 | { |
469 | 469 | int result = 0; |
470 | 470 | offs_t offs; |
r17963 | r17964 | |
512 | 512 | |
513 | 513 | /* log anything else */ |
514 | 514 | default: |
515 | logerror("%s:Unsupported TMS34061 function %d\n", space | |
515 | logerror("%s:Unsupported TMS34061 function %d\n", space.machine().describe_context(), | |
516 | 516 | func); |
517 | 517 | break; |
518 | 518 | } |
r17963 | r17964 | |
---|---|---|
1467 | 1467 | |
1468 | 1468 | READ16_DEVICE_HANDLER( hd63484_status_r ) |
1469 | 1469 | { |
1470 | // if (space->device().safe_pc() != 0xfced6 && space->device().safe_pc() != 0xfe1d6) | |
1471 | // logerror("%05x: HD63484 status read\n",space->device().safe_pc()); | |
1470 | // if (space.device().safe_pc() != 0xfced6 && space.device().safe_pc() != 0xfe1d6) | |
1471 | // logerror("%05x: HD63484 status read\n",space.device().safe_pc()); | |
1472 | 1472 | |
1473 | 1473 | return 0xff22 | (device->machine().rand() & 0x0004); /* write FIFO ready + command end + (read FIFO ready or read FIFO not ready) */ |
1474 | 1474 | } |
r17963 | r17964 | |
1495 | 1495 | hd63484->regno += 2; /* autoincrement */ |
1496 | 1496 | |
1497 | 1497 | #if LOG_COMMANDS |
1498 | // logerror("PC %05x: HD63484 register %02x write %04x\n", space | |
1498 | // logerror("PC %05x: HD63484 register %02x write %04x\n", space.device().safe_pc(), hd63484->regno, hd63484->reg[hd63484->regno/2]); | |
1499 | 1499 | #endif |
1500 | 1500 | |
1501 | 1501 | if (hd63484->regno == 0) /* FIFO */ |
r17963 | r17964 | |
1512 | 1512 | else if (hd63484->regno == 0) |
1513 | 1513 | { |
1514 | 1514 | #if LOG_COMMANDS |
1515 | // logerror("%05x: HD63484 read FIFO\n", space | |
1515 | // logerror("%05x: HD63484 read FIFO\n", space.device().safe_pc()); | |
1516 | 1516 | #endif |
1517 | 1517 | res = hd63484->readfifo; |
1518 | 1518 | } |
1519 | 1519 | else |
1520 | 1520 | { |
1521 | 1521 | #if LOG_COMMANDS |
1522 | // logerror("%05x: HD63484 read register %02x\n", space | |
1522 | // logerror("%05x: HD63484 read register %02x\n", space.device().safe_pc(), hd63484->regno); | |
1523 | 1523 | #endif |
1524 | 1524 | res = 0; |
1525 | 1525 | } |
r17963 | r17964 | |
---|---|---|
62 | 62 | void tms34061_start(running_machine &machine, const struct tms34061_interface *interface); |
63 | 63 | |
64 | 64 | /* reads/writes to the 34061 */ |
65 | UINT8 tms34061_r(address_space *space, int col, int row, int func); | |
66 | void tms34061_w(address_space *space, int col, int row, int func, UINT8 data); | |
65 | UINT8 tms34061_r(address_space &space, int col, int row, int func); | |
66 | void tms34061_w(address_space &space, int col, int row, int func, UINT8 data); | |
67 | 67 | |
68 | 68 | /* latch settings */ |
69 | 69 | READ8_HANDLER( tms34061_latch_r ); |
r17963 | r17964 | |
---|---|---|
329 | 329 | static VIDEO_START( pc_cga ) |
330 | 330 | { |
331 | 331 | int buswidth; |
332 | address_space | |
332 | address_space &space = *machine.firstcpu->space(AS_PROGRAM); | |
333 | 333 | address_space *spaceio = machine.firstcpu->space(AS_IO); |
334 | 334 | |
335 | space | |
335 | space.install_readwrite_bank(0xb8000, 0xbbfff, 0, 0x04000, "bank11" ); | |
336 | 336 | buswidth = machine.firstcpu->space_config(AS_PROGRAM)->m_databus_width; |
337 | 337 | UINT64 mask = 0; |
338 | 338 | switch(buswidth) |
r17963 | r17964 | |
370 | 370 | static VIDEO_START( pc_cga32k ) |
371 | 371 | { |
372 | 372 | int buswidth; |
373 | address_space | |
373 | address_space &space = *machine.firstcpu->space(AS_PROGRAM); | |
374 | 374 | address_space *spaceio = machine.firstcpu->space(AS_IO); |
375 | 375 | |
376 | 376 | |
377 | space | |
377 | space.install_readwrite_bank(0xb8000, 0xbffff, "bank11" ); | |
378 | 378 | buswidth = machine.firstcpu->space_config(AS_PROGRAM)->m_databus_width; |
379 | 379 | UINT64 mask = 0; |
380 | 380 | switch(buswidth) |
r17963 | r17964 | |
1136 | 1136 | |
1137 | 1137 | static WRITE8_HANDLER ( char_ram_w ) |
1138 | 1138 | { |
1139 | UINT8 *gfx = space | |
1139 | UINT8 *gfx = space.machine().root_device().memregion("gfx1")->base(); | |
1140 | 1140 | offset ^= BIT(offset, 12); |
1141 | 1141 | logerror("write char ram %04x %02x\n",offset,data); |
1142 | 1142 | gfx[offset + 0x0000] = data; |
r17963 | r17964 | |
1147 | 1147 | |
1148 | 1148 | static READ8_HANDLER ( char_ram_r ) |
1149 | 1149 | { |
1150 | UINT8 *gfx = space | |
1150 | UINT8 *gfx = space.machine().root_device().memregion("gfx1")->base(); | |
1151 | 1151 | offset ^= BIT(offset, 12); |
1152 | 1152 | return gfx[offset]; |
1153 | 1153 | } |
1154 | 1154 | |
1155 | 1155 | static READ8_HANDLER( pc_cga8_r ) |
1156 | 1156 | { |
1157 | mc6845_device *mc6845 = space | |
1157 | mc6845_device *mc6845 = space.machine().device<mc6845_device>(CGA_MC6845_NAME); | |
1158 | 1158 | int data = 0xff; |
1159 | 1159 | switch( offset ) |
1160 | 1160 | { |
r17963 | r17964 | |
1162 | 1162 | /* return last written mc6845 address value here? */ |
1163 | 1163 | break; |
1164 | 1164 | case 1: case 3: case 5: case 7: |
1165 | data = mc6845->register_r( | |
1165 | data = mc6845->register_r( space, offset ); | |
1166 | 1166 | break; |
1167 | 1167 | case 10: |
1168 | 1168 | data = cga.vsync | ( ( data & 0x40 ) >> 4 ) | cga.hsync; |
r17963 | r17964 | |
1182 | 1182 | |
1183 | 1183 | switch(offset) { |
1184 | 1184 | case 0: case 2: case 4: case 6: |
1185 | mc6845 = space->machine().device<mc6845_device>(CGA_MC6845_NAME); | |
1186 | mc6845->address_w( *space, offset, data ); | |
1185 | mc6845 = space.machine().device<mc6845_device>(CGA_MC6845_NAME); | |
1186 | mc6845->address_w( space, offset, data ); | |
1187 | 1187 | break; |
1188 | 1188 | case 1: case 3: case 5: case 7: |
1189 | mc6845 = space->machine().device<mc6845_device>(CGA_MC6845_NAME); | |
1190 | mc6845->register_w( *space, offset, data ); | |
1189 | mc6845 = space.machine().device<mc6845_device>(CGA_MC6845_NAME); | |
1190 | mc6845->register_w( space, offset, data ); | |
1191 | 1191 | break; |
1192 | 1192 | case 8: |
1193 | pc_cga_mode_control_w(space | |
1193 | pc_cga_mode_control_w(space.machine(), data); | |
1194 | 1194 | break; |
1195 | 1195 | case 9: |
1196 | pc_cga_color_select_w(space | |
1196 | pc_cga_color_select_w(space.machine(), data); | |
1197 | 1197 | break; |
1198 | 1198 | case 0x0d: |
1199 | pc_cga_plantronics_w(space | |
1199 | pc_cga_plantronics_w(space.machine(), data); | |
1200 | 1200 | break; |
1201 | 1201 | case 0x0f: |
1202 | 1202 | // Not sure if some all CGA cards have ability to upload char definition |
1203 | 1203 | // The original CGA card had a char rom |
1204 | UINT8 buswidth = space->machine().firstcpu->space_config(AS_PROGRAM)->m_databus_width; | |
1205 | address_space *space_prg = space->machine().firstcpu->space(AS_PROGRAM); | |
1204 | UINT8 buswidth = space.machine().firstcpu->space_config(AS_PROGRAM)->m_databus_width; | |
1205 | address_space *space_prg = space.machine().firstcpu->space(AS_PROGRAM); | |
1206 | 1206 | cga.p3df = data; |
1207 | 1207 | if (data & 1) { |
1208 | 1208 | UINT64 mask = 0; |
r17963 | r17964 | |
1485 | 1485 | static WRITE8_HANDLER ( pc1512_w ) |
1486 | 1486 | { |
1487 | 1487 | UINT8 *videoram = cga.videoram; |
1488 | mc6845_device *mc6845 = space | |
1488 | mc6845_device *mc6845 = space.machine().device<mc6845_device>(CGA_MC6845_NAME); | |
1489 | 1489 | |
1490 | 1490 | switch (offset) |
1491 | 1491 | { |
1492 | 1492 | case 0: case 2: case 4: case 6: |
1493 | 1493 | data &= 0x1F; |
1494 | mc6845->address_w( | |
1494 | mc6845->address_w( space, offset, data ); | |
1495 | 1495 | pc1512.mc6845_address = data; |
1496 | 1496 | break; |
1497 | 1497 | |
1498 | 1498 | case 1: case 3: case 5: case 7: |
1499 | 1499 | if ( ! pc1512.mc6845_locked_register[pc1512.mc6845_address] ) |
1500 | 1500 | { |
1501 | mc6845->register_w( | |
1501 | mc6845->register_w( space, offset, data ); | |
1502 | 1502 | if ( mc6845_writeonce_register[pc1512.mc6845_address] ) |
1503 | 1503 | { |
1504 | 1504 | pc1512.mc6845_locked_register[pc1512.mc6845_address] = 1; |
r17963 | r17964 | |
1514 | 1514 | } |
1515 | 1515 | else |
1516 | 1516 | { |
1517 | space | |
1517 | space.machine().root_device().membank("bank1")->set_base(videoram + videoram_offset[0]); | |
1518 | 1518 | } |
1519 | 1519 | cga.mode_control = data; |
1520 | 1520 | switch( cga.mode_control & 0x3F ) |
r17963 | r17964 | |
1572 | 1572 | pc1512.read = data; |
1573 | 1573 | if ( ( cga.mode_control & 0x12 ) == 0x12 ) |
1574 | 1574 | { |
1575 | space | |
1575 | space.machine().root_device().membank("bank1")->set_base(videoram + videoram_offset[data & 3]); | |
1576 | 1576 | } |
1577 | 1577 | break; |
1578 | 1578 | |
r17963 | r17964 | |
1635 | 1635 | cga.videoram_size = 0x10000; |
1636 | 1636 | cga.videoram = auto_alloc_array(machine, UINT8, 0x10000 ); |
1637 | 1637 | |
1638 | address_space | |
1638 | address_space &space = *machine.firstcpu->space( AS_PROGRAM ); | |
1639 | 1639 | address_space *io_space = machine.firstcpu->space( AS_IO ); |
1640 | 1640 | |
1641 | space | |
1641 | space.install_read_bank( 0xb8000, 0xbbfff, 0, 0x0C000, "bank1" ); | |
1642 | 1642 | machine.root_device().membank("bank1")->set_base(cga.videoram + videoram_offset[0]); |
1643 | space | |
1643 | space.install_legacy_write_handler( 0xb8000, 0xbbfff, 0, 0x0C000, FUNC(pc1512_videoram_w), 0xffff); | |
1644 | 1644 | |
1645 | 1645 | io_space->install_legacy_readwrite_handler( 0x3d0, 0x3df, FUNC(pc1512_r), FUNC(pc1512_w), 0xffff); |
1646 | 1646 |
r17963 | r17964 | |
---|---|---|
1462 | 1462 | vga.attribute.state = 0; |
1463 | 1463 | data = 0; |
1464 | 1464 | |
1465 | hsync = space->machine().primary_screen->hblank() & 1; | |
1466 | vsync = vga_vblank(space->machine()); //space->machine().primary_screen->vblank() & 1; | |
1465 | hsync = space.machine().primary_screen->hblank() & 1; | |
1466 | vsync = vga_vblank(space.machine()); //space.machine().primary_screen->vblank() & 1; | |
1467 | 1467 | |
1468 | 1468 | data |= (hsync | vsync) & 1; // DD - display disable register |
1469 | 1469 | data |= (vsync & 1) << 3; // VRetrace register |
r17963 | r17964 | |
1513 | 1513 | data); |
1514 | 1514 | } |
1515 | 1515 | |
1516 | crtc_reg_write(space->machine(),vga.crtc.index,data); | |
1517 | //space->machine().primary_screen->update_partial(space->machine().primary_screen->vpos()); | |
1516 | crtc_reg_write(space.machine(),vga.crtc.index,data); | |
1517 | //space.machine().primary_screen->update_partial(space.machine().primary_screen->vpos()); | |
1518 | 1518 | #if 0 |
1519 | 1519 | if((vga.crtc.index & 0xfe) != 0x0e) |
1520 | printf("%02x %02x %d\n",vga.crtc.index,data,space | |
1520 | printf("%02x %02x %d\n",vga.crtc.index,data,space.machine().primary_screen->vpos()); | |
1521 | 1521 | #endif |
1522 | 1522 | break; |
1523 | 1523 | |
r17963 | r17964 | |
1687 | 1687 | break; |
1688 | 1688 | |
1689 | 1689 | case 0xf: |
1690 | data = gc_reg_read(space | |
1690 | data = gc_reg_read(space.machine(),vga.gc.index); | |
1691 | 1691 | break; |
1692 | 1692 | } |
1693 | 1693 | return data; |
r17963 | r17964 | |
1700 | 1700 | data = vga_crtc_r(space, offset); |
1701 | 1701 | if(offset == 8) |
1702 | 1702 | { |
1703 | logerror("VGA: 0x3d8 read at %08x\n",space | |
1703 | logerror("VGA: 0x3d8 read at %08x\n",space.device().safe_pc()); | |
1704 | 1704 | data = 0; // TODO: PC-200 reads back CGA register here, everything else returns open bus OR CGA emulation of register 0x3d8 |
1705 | 1705 | } |
1706 | 1706 | |
r17963 | r17964 | |
1801 | 1801 | break; |
1802 | 1802 | case 2: |
1803 | 1803 | vga.miscellaneous_output=data; |
1804 | recompute_params(space | |
1804 | recompute_params(space.machine()); | |
1805 | 1805 | break; |
1806 | 1806 | case 3: |
1807 | 1807 | vga.oak.reg = data; |
r17963 | r17964 | |
1822 | 1822 | vga.sequencer.data[vga.sequencer.index] = data; |
1823 | 1823 | } |
1824 | 1824 | |
1825 | seq_reg_write(space->machine(),vga.sequencer.index,data); | |
1826 | recompute_params(space->machine()); | |
1825 | seq_reg_write(space.machine(),vga.sequencer.index,data); | |
1826 | recompute_params(space.machine()); | |
1827 | 1827 | break; |
1828 | 1828 | case 6: |
1829 | 1829 | vga.dac.mask=data; |
r17963 | r17964 | |
1863 | 1863 | vga.gc.index=data; |
1864 | 1864 | break; |
1865 | 1865 | case 0xf: |
1866 | gc_reg_write(space | |
1866 | gc_reg_write(space.machine(),vga.gc.index,data); | |
1867 | 1867 | break; |
1868 | 1868 | } |
1869 | 1869 | } |
r17963 | r17964 | |
1920 | 1920 | if(vga.sequencer.data[4] & 4) |
1921 | 1921 | { |
1922 | 1922 | int data; |
1923 | if (!space | |
1923 | if (!space.debugger_access()) | |
1924 | 1924 | { |
1925 | 1925 | vga.gc.latch[0]=vga.memory[(offset)]; |
1926 | 1926 | vga.gc.latch[1]=vga.memory[(offset)+0x10000]; |
r17963 | r17964 | |
2043 | 2043 | |
2044 | 2044 | } |
2045 | 2045 | |
2046 | void pc_vga_io_init(running_machine &machine, address_space | |
2046 | void pc_vga_io_init(running_machine &machine, address_space &mem_space, offs_t mem_offset, address_space &io_space, offs_t port_offset) | |
2047 | 2047 | { |
2048 | 2048 | int buswidth; |
2049 | 2049 | UINT64 mask = 0; |
r17963 | r17964 | |
2071 | 2071 | fatalerror("VGA: Bus width %d not supported\n", buswidth); |
2072 | 2072 | break; |
2073 | 2073 | } |
2074 | io_space->install_legacy_readwrite_handler(port_offset + 0x3b0, port_offset + 0x3bf, FUNC(vga_port_03b0_r), FUNC(vga_port_03b0_w), mask); | |
2075 | io_space->install_legacy_readwrite_handler(port_offset + 0x3c0, port_offset + 0x3cf, FUNC(vga_port_03c0_r), FUNC(vga_port_03c0_w), mask); | |
2076 | io_space->install_legacy_readwrite_handler(port_offset + 0x3d0, port_offset + 0x3df, FUNC(vga_port_03d0_r), FUNC(vga_port_03d0_w), mask); | |
2074 | io_space.install_legacy_readwrite_handler(port_offset + 0x3b0, port_offset + 0x3bf, FUNC(vga_port_03b0_r), FUNC(vga_port_03b0_w), mask); | |
2075 | io_space.install_legacy_readwrite_handler(port_offset + 0x3c0, port_offset + 0x3cf, FUNC(vga_port_03c0_r), FUNC(vga_port_03c0_w), mask); | |
2076 | io_space.install_legacy_readwrite_handler(port_offset + 0x3d0, port_offset + 0x3df, FUNC(vga_port_03d0_r), FUNC(vga_port_03d0_w), mask); | |
2077 | 2077 | |
2078 | mem_space | |
2078 | mem_space.install_legacy_readwrite_handler(mem_offset + 0x00000, mem_offset + 0x1ffff, FUNC(vga_mem_r), FUNC(vga_mem_w), mask); | |
2079 | 2079 | } |
2080 | 2080 | |
2081 | 2081 | VIDEO_START( vga ) |
r17963 | r17964 | |
2313 | 2313 | switch(offset) |
2314 | 2314 | { |
2315 | 2315 | case 5: |
2316 | res = tseng_crtc_reg_read(space | |
2316 | res = tseng_crtc_reg_read(space.machine(),vga.crtc.index); | |
2317 | 2317 | break; |
2318 | 2318 | case 8: |
2319 | 2319 | res = et4k.reg_3d8; |
r17963 | r17964 | |
2335 | 2335 | { |
2336 | 2336 | case 5: |
2337 | 2337 | vga.crtc.data[vga.crtc.index] = data; |
2338 | tseng_crtc_reg_write(space | |
2338 | tseng_crtc_reg_write(space.machine(),vga.crtc.index,data); | |
2339 | 2339 | break; |
2340 | 2340 | case 8: |
2341 | 2341 | et4k.reg_3d8 = data; |
r17963 | r17964 | |
2349 | 2349 | break; |
2350 | 2350 | } |
2351 | 2351 | } |
2352 | tseng_define_video_mode(space | |
2352 | tseng_define_video_mode(space.machine()); | |
2353 | 2353 | } |
2354 | 2354 | |
2355 | 2355 | |
r17963 | r17964 | |
2360 | 2360 | switch(offset) |
2361 | 2361 | { |
2362 | 2362 | case 0x05: |
2363 | res = tseng_seq_reg_read(space | |
2363 | res = tseng_seq_reg_read(space.machine(),vga.sequencer.index); | |
2364 | 2364 | break; |
2365 | 2365 | case 0x0d: |
2366 | 2366 | res = svga.bank_w & 0xf; |
r17963 | r17964 | |
2392 | 2392 | switch(offset) |
2393 | 2393 | { |
2394 | 2394 | case 0x05: |
2395 | tseng_seq_reg_write(space | |
2395 | tseng_seq_reg_write(space.machine(),vga.sequencer.index,data); | |
2396 | 2396 | break; |
2397 | 2397 | case 0x0d: |
2398 | 2398 | svga.bank_w = data & 0xf; |
r17963 | r17964 | |
2408 | 2408 | vga_port_03c0_w(space,offset,data); |
2409 | 2409 | break; |
2410 | 2410 | } |
2411 | tseng_define_video_mode(space | |
2411 | tseng_define_video_mode(space.machine()); | |
2412 | 2412 | } |
2413 | 2413 | |
2414 | 2414 | READ8_HANDLER(tseng_et4k_03d0_r) |
r17963 | r17964 | |
2420 | 2420 | switch(offset) |
2421 | 2421 | { |
2422 | 2422 | case 5: |
2423 | res = tseng_crtc_reg_read(space | |
2423 | res = tseng_crtc_reg_read(space.machine(),vga.crtc.index); | |
2424 | 2424 | break; |
2425 | 2425 | case 8: |
2426 | 2426 | res = et4k.reg_3d8; |
r17963 | r17964 | |
2442 | 2442 | { |
2443 | 2443 | case 5: |
2444 | 2444 | vga.crtc.data[vga.crtc.index] = data; |
2445 | tseng_crtc_reg_write(space | |
2445 | tseng_crtc_reg_write(space.machine(),vga.crtc.index,data); | |
2446 | 2446 | //if((vga.crtc.index & 0xfe) != 0x0e) |
2447 | // printf("%02x %02x %d\n",vga.crtc.index,data,space | |
2447 | // printf("%02x %02x %d\n",vga.crtc.index,data,space.machine().primary_screen->vpos()); | |
2448 | 2448 | break; |
2449 | 2449 | case 8: |
2450 | 2450 | et4k.reg_3d8 = data; |
r17963 | r17964 | |
2458 | 2458 | break; |
2459 | 2459 | } |
2460 | 2460 | } |
2461 | tseng_define_video_mode(space | |
2461 | tseng_define_video_mode(space.machine()); | |
2462 | 2462 | } |
2463 | 2463 | |
2464 | 2464 | READ8_HANDLER( tseng_mem_r ) |
r17963 | r17964 | |
2489 | 2489 | |
2490 | 2490 | ******************************************/ |
2491 | 2491 | |
2492 | void pc_svga_trident_io_init(running_machine &machine, address_space | |
2492 | void pc_svga_trident_io_init(running_machine &machine, address_space &mem_space, offs_t mem_offset, address_space &io_space, offs_t port_offset) | |
2493 | 2493 | { |
2494 | 2494 | int buswidth; |
2495 | 2495 | UINT64 mask = 0; |
r17963 | r17964 | |
2517 | 2517 | fatalerror("VGA: Bus width %d not supported\n", buswidth); |
2518 | 2518 | break; |
2519 | 2519 | } |
2520 | io_space->install_legacy_readwrite_handler(port_offset + 0x3b0, port_offset + 0x3bf, FUNC(vga_port_03b0_r), FUNC(vga_port_03b0_w), mask); | |
2521 | io_space->install_legacy_readwrite_handler(port_offset + 0x3c0, port_offset + 0x3cf, FUNC(trident_03c0_r), FUNC(trident_03c0_w), mask); | |
2522 | io_space->install_legacy_readwrite_handler(port_offset + 0x3d0, port_offset + 0x3df, FUNC(trident_03d0_r), FUNC(trident_03d0_w), mask); | |
2520 | io_space.install_legacy_readwrite_handler(port_offset + 0x3b0, port_offset + 0x3bf, FUNC(vga_port_03b0_r), FUNC(vga_port_03b0_w), mask); | |
2521 | io_space.install_legacy_readwrite_handler(port_offset + 0x3c0, port_offset + 0x3cf, FUNC(trident_03c0_r), FUNC(trident_03c0_w), mask); | |
2522 | io_space.install_legacy_readwrite_handler(port_offset + 0x3d0, port_offset + 0x3df, FUNC(trident_03d0_r), FUNC(trident_03d0_w), mask); | |
2523 | 2523 | |
2524 | mem_space | |
2524 | mem_space.install_legacy_readwrite_handler(mem_offset + 0x00000, mem_offset + 0x1ffff, FUNC(trident_mem_r), FUNC(trident_mem_w), mask); | |
2525 | 2525 | |
2526 | 2526 | // D3h = TGUI9660XGi |
2527 | 2527 | svga.id = 0xd3; // TODO: hardcoded for California Chase |
r17963 | r17964 | |
2582 | 2582 | switch(offset) |
2583 | 2583 | { |
2584 | 2584 | case 0x05: |
2585 | res = trident_seq_reg_read(space | |
2585 | res = trident_seq_reg_read(space.machine(),vga.sequencer.index); | |
2586 | 2586 | break; |
2587 | 2587 | default: |
2588 | 2588 | res = vga_port_03c0_r(space,offset); |
r17963 | r17964 | |
2597 | 2597 | switch(offset) |
2598 | 2598 | { |
2599 | 2599 | case 0x05: |
2600 | trident_seq_reg_write(space | |
2600 | trident_seq_reg_write(space.machine(),vga.sequencer.index,data); | |
2601 | 2601 | break; |
2602 | 2602 | default: |
2603 | 2603 | vga_port_03c0_w(space,offset,data); |
r17963 | r17964 | |
3014 | 3014 | switch(offset) |
3015 | 3015 | { |
3016 | 3016 | case 5: |
3017 | res = s3_crtc_reg_read(space | |
3017 | res = s3_crtc_reg_read(space.machine(),vga.crtc.index); | |
3018 | 3018 | break; |
3019 | 3019 | default: |
3020 | 3020 | res = vga_port_03b0_r(space,offset); |
r17963 | r17964 | |
3033 | 3033 | { |
3034 | 3034 | case 5: |
3035 | 3035 | vga.crtc.data[vga.crtc.index] = data; |
3036 | s3_crtc_reg_write(space | |
3036 | s3_crtc_reg_write(space.machine(),vga.crtc.index,data); | |
3037 | 3037 | break; |
3038 | 3038 | default: |
3039 | 3039 | vga_port_03b0_w(space,offset,data); |
r17963 | r17964 | |
3075 | 3075 | switch(offset) |
3076 | 3076 | { |
3077 | 3077 | case 5: |
3078 | res = s3_crtc_reg_read(space | |
3078 | res = s3_crtc_reg_read(space.machine(),vga.crtc.index); | |
3079 | 3079 | break; |
3080 | 3080 | default: |
3081 | 3081 | res = vga_port_03d0_r(space,offset); |
r17963 | r17964 | |
3094 | 3094 | { |
3095 | 3095 | case 5: |
3096 | 3096 | vga.crtc.data[vga.crtc.index] = data; |
3097 | s3_crtc_reg_write(space | |
3097 | s3_crtc_reg_write(space.machine(),vga.crtc.index,data); | |
3098 | 3098 | break; |
3099 | 3099 | default: |
3100 | 3100 | vga_port_03d0_w(space,offset,data); |
r17963 | r17964 | |
4835 | 4835 | } |
4836 | 4836 | } |
4837 | 4837 | |
4838 | void pc_vga_gamtor_io_init(running_machine &machine, address_space | |
4838 | void pc_vga_gamtor_io_init(running_machine &machine, address_space &mem_space, offs_t mem_offset, address_space &io_space, offs_t port_offset) | |
4839 | 4839 | { |
4840 | 4840 | int buswidth; |
4841 | 4841 | UINT64 mask = 0; |
r17963 | r17964 | |
4863 | 4863 | fatalerror("VGA: Bus width %d not supported\n", buswidth); |
4864 | 4864 | break; |
4865 | 4865 | } |
4866 | io_space->install_legacy_readwrite_handler(port_offset + 0x3b0, port_offset + 0x3bf, FUNC(vga_port_gamtor_03b0_r), FUNC(vga_port_gamtor_03b0_w), mask); | |
4867 | io_space->install_legacy_readwrite_handler(port_offset + 0x3c0, port_offset + 0x3cf, FUNC(vga_port_gamtor_03c0_r), FUNC(vga_port_gamtor_03c0_w), mask); | |
4868 | io_space->install_legacy_readwrite_handler(port_offset + 0x3d0, port_offset + 0x3df, FUNC(vga_port_gamtor_03d0_r), FUNC(vga_port_gamtor_03d0_w), mask); | |
4866 | io_space.install_legacy_readwrite_handler(port_offset + 0x3b0, port_offset + 0x3bf, FUNC(vga_port_gamtor_03b0_r), FUNC(vga_port_gamtor_03b0_w), mask); | |
4867 | io_space.install_legacy_readwrite_handler(port_offset + 0x3c0, port_offset + 0x3cf, FUNC(vga_port_gamtor_03c0_r), FUNC(vga_port_gamtor_03c0_w), mask); | |
4868 | io_space.install_legacy_readwrite_handler(port_offset + 0x3d0, port_offset + 0x3df, FUNC(vga_port_gamtor_03d0_r), FUNC(vga_port_gamtor_03d0_w), mask); | |
4869 | 4869 | |
4870 | mem_space | |
4870 | mem_space.install_legacy_readwrite_handler(mem_offset + 0x00000, mem_offset + 0x1ffff, FUNC(vga_gamtor_mem_r), FUNC(vga_gamtor_mem_w), mask); | |
4871 | 4871 | } |
4872 | 4872 | |
4873 | 4873 | static void ati_define_video_mode(running_machine &machine) |
r17963 | r17964 | |
5079 | 5079 | */ |
5080 | 5080 | READ16_HANDLER(mach8_status_r) |
5081 | 5081 | { |
5082 | return vga_vblank(space | |
5082 | return vga_vblank(space.machine()) << 1; | |
5083 | 5083 | } |
5084 | 5084 | |
5085 | 5085 | WRITE16_HANDLER(mach8_htotal_w) |
r17963 | r17964 | |
5112 | 5112 | READ16_HANDLER(mach8_substatus_r) |
5113 | 5113 | { |
5114 | 5114 | // TODO: |
5115 | if(vga_vblank(space | |
5115 | if(vga_vblank(space.machine()) != 0) // not correct, but will do for now | |
5116 | 5116 | ibm8514.substatus |= 0x01; |
5117 | 5117 | return ibm8514.substatus; |
5118 | 5118 | } |
r17963 | r17964 | |
---|---|---|
26 | 26 | }; |
27 | 27 | |
28 | 28 | void pc_vga_init(running_machine &machine, read8_space_func read_dipswitch, const struct pc_svga_interface *svga_intf); |
29 | void pc_vga_io_init(running_machine &machine, address_space *mem_space, offs_t mem_offset, address_space *io_space, offs_t port_offset); | |
30 | void pc_vga_gamtor_io_init(running_machine &machine, address_space *mem_space, offs_t mem_offset, address_space *io_space, offs_t port_offset); | |
31 | void pc_svga_trident_io_init(running_machine &machine, address_space *mem_space, offs_t mem_offset, address_space *io_space, offs_t port_offset); | |
29 | void pc_vga_io_init(running_machine &machine, address_space &mem_space, offs_t mem_offset, address_space &io_space, offs_t port_offset); | |
30 | void pc_vga_gamtor_io_init(running_machine &machine, address_space &mem_space, offs_t mem_offset, address_space &io_space, offs_t port_offset); | |
31 | void pc_svga_trident_io_init(running_machine &machine, address_space &mem_space, offs_t mem_offset, address_space &io_space, offs_t port_offset); | |
32 | 32 | void pc_vga_reset(running_machine &machine); |
33 | 33 | void *pc_vga_memory(void); |
34 | 34 | size_t pc_vga_memory_size(void); |
r17963 | r17964 | |
---|---|---|
3106 | 3106 | |
3107 | 3107 | READ16_HANDLER( spu_r ) |
3108 | 3108 | { |
3109 | spu_device *spu = space | |
3109 | spu_device *spu = space.machine().device<spu_device>("spu"); | |
3110 | 3110 | |
3111 | 3111 | if (spu == NULL ) |
3112 | 3112 | { |
r17963 | r17964 | |
3118 | 3118 | |
3119 | 3119 | WRITE16_HANDLER( spu_w ) |
3120 | 3120 | { |
3121 | spu_device *spu = space | |
3121 | spu_device *spu = space.machine().device<spu_device>("spu"); | |
3122 | 3122 | |
3123 | 3123 | if (spu == NULL) |
3124 | 3124 | { |
r17963 | r17964 | |
---|---|---|
1296 | 1296 | int pokey_num = (offset >> 3) & ~0x04; |
1297 | 1297 | int control = (offset & 0x20) >> 2; |
1298 | 1298 | int pokey_reg = (offset % 8) | control; |
1299 | pokey_device *pokey = space | |
1299 | pokey_device *pokey = space.machine().device<pokey_device>(devname[pokey_num]); | |
1300 | 1300 | |
1301 | 1301 | return pokey->read(pokey_reg); |
1302 | 1302 | } |
r17963 | r17964 | |
1307 | 1307 | int pokey_num = (offset >> 3) & ~0x04; |
1308 | 1308 | int control = (offset & 0x20) >> 2; |
1309 | 1309 | int pokey_reg = (offset % 8) | control; |
1310 | pokey_device *pokey = space | |
1310 | pokey_device *pokey = space.machine().device<pokey_device>(devname[pokey_num]); | |
1311 | 1311 | |
1312 | 1312 | pokey->write(pokey_reg, data); |
1313 | 1313 | } |
r17963 | r17964 | |
---|---|---|
83 | 83 | #define ENVVOL(chan) (VR0->SOUNDREGS[(0x20/4)*chan+0x04/4]&0xffffff) |
84 | 84 | |
85 | 85 | /* |
86 | #define GETSOUNDREG16(Chan,Offs) space->read_word(VR0->Intf.reg_base+0x20*Chan+Offs) | |
87 | #define GETSOUNDREG32(Chan,Offs) space->read_dword(VR0->Intf.reg_base+0x20*Chan+Offs) | |
86 | #define GETSOUNDREG16(Chan,Offs) space.read_word(VR0->Intf.reg_base+0x20*Chan+Offs) | |
87 | #define GETSOUNDREG32(Chan,Offs) space.read_dword(VR0->Intf.reg_base+0x20*Chan+Offs) | |
88 | 88 | |
89 | 89 | #define CURSADDR(chan) GETSOUNDREG32(chan,0x00) |
90 | 90 | #define DSADDR(chan) GETSOUNDREG16(chan,0x08) |
r17963 | r17964 | |
---|---|---|
166 | 166 | m_regs[offset] = data; |
167 | 167 | } |
168 | 168 | |
169 | void awacs_device::set_dma_base(address_space | |
169 | void awacs_device::set_dma_base(address_space &space, int offset0, int offset1) | |
170 | 170 | { |
171 | m_dma_space = space; | |
171 | m_dma_space = &space; | |
172 | 172 | m_dma_offset_0 = offset0; |
173 | 173 | m_dma_offset_1 = offset1; |
174 | 174 | } |
r17963 | r17964 | |
---|---|---|
43 | 43 | DECLARE_READ8_MEMBER(read); |
44 | 44 | DECLARE_WRITE8_MEMBER(write); |
45 | 45 | |
46 | void set_dma_base(address_space | |
46 | void set_dma_base(address_space &space, int offset0, int offset1); | |
47 | 47 | |
48 | 48 | sound_stream *m_stream; |
49 | 49 |
r17963 | r17964 | |
---|---|---|
77 | 77 | |
78 | 78 | COMBINE_DATA(&info->ctrl); |
79 | 79 | |
80 | // printf("CTRL: %04x -> %04x (PC=%x)\n", ctrl, info->ctrl, space | |
80 | // printf("CTRL: %04x -> %04x (PC=%x)\n", ctrl, info->ctrl, space.device().safe_pc()); | |
81 | 81 | |
82 | 82 | ctrl^=info->ctrl; |
83 | 83 | } |
r17963 | r17964 | |
132 | 132 | info->vpos[v] = info->frac[v] = info->lponce[v] = 0; |
133 | 133 | } |
134 | 134 | |
135 | //printf("v%02d: %04x to reg %02d (PC=%x)\n", v, info->sound_regs[offset], r, space | |
135 | //printf("v%02d: %04x to reg %02d (PC=%x)\n", v, info->sound_regs[offset], r, space.device().safe_pc()); | |
136 | 136 | } |
137 | 137 | |
138 | 138 | static STREAM_UPDATE( nile_update ) |
r17963 | r17964 | |
---|---|---|
85 | 85 | * |
86 | 86 | *************************************/ |
87 | 87 | |
88 | INLINE UINT16 read16be_with_read8_handler(read8_space_func handler, address_space | |
88 | INLINE UINT16 read16be_with_read8_handler(read8_space_func handler, address_space &space, offs_t offset, UINT16 mem_mask) | |
89 | 89 | { |
90 | 90 | UINT16 result = 0; |
91 | 91 | if (ACCESSING_BITS_8_15) |
r17963 | r17964 | |
96 | 96 | } |
97 | 97 | |
98 | 98 | |
99 | INLINE void write16be_with_write8_handler(write8_space_func handler, address_space | |
99 | INLINE void write16be_with_write8_handler(write8_space_func handler, address_space &space, offs_t offset, UINT16 data, UINT16 mem_mask) | |
100 | 100 | { |
101 | 101 | if (ACCESSING_BITS_8_15) |
102 | 102 | (*handler)(space, offset * 2 + 0, data >> 8); |
r17963 | r17964 | |
111 | 111 | * |
112 | 112 | *************************************/ |
113 | 113 | |
114 | INLINE UINT16 read16le_with_read8_handler(read8_space_func handler, address_space | |
114 | INLINE UINT16 read16le_with_read8_handler(read8_space_func handler, address_space &space, offs_t offset, UINT16 mem_mask) | |
115 | 115 | { |
116 | 116 | UINT16 result = 0; |
117 | 117 | if (ACCESSING_BITS_0_7) |
r17963 | r17964 | |
122 | 122 | } |
123 | 123 | |
124 | 124 | |
125 | INLINE void write16le_with_write8_handler(write8_space_func handler, address_space | |
125 | INLINE void write16le_with_write8_handler(write8_space_func handler, address_space &space, offs_t offset, UINT16 data, UINT16 mem_mask) | |
126 | 126 | { |
127 | 127 | if (ACCESSING_BITS_0_7) |
128 | 128 | (*handler)(space, offset * 2 + 0, data >> 0); |
r17963 | r17964 | |
137 | 137 | * |
138 | 138 | *************************************/ |
139 | 139 | |
140 | INLINE UINT32 read32be_with_read8_handler(read8_space_func handler, address_space | |
140 | INLINE UINT32 read32be_with_read8_handler(read8_space_func handler, address_space &space, offs_t offset, UINT32 mem_mask) | |
141 | 141 | { |
142 | 142 | UINT32 result = 0; |
143 | 143 | if (ACCESSING_BITS_16_31) |
r17963 | r17964 | |
148 | 148 | } |
149 | 149 | |
150 | 150 | |
151 | INLINE void write32be_with_write8_handler(write8_space_func handler, address_space | |
151 | INLINE void write32be_with_write8_handler(write8_space_func handler, address_space &space, offs_t offset, UINT32 data, UINT32 mem_mask) | |
152 | 152 | { |
153 | 153 | if (ACCESSING_BITS_16_31) |
154 | 154 | write16be_with_write8_handler(handler, space, offset * 2 + 0, data >> 16, mem_mask >> 16); |
r17963 | r17964 | |
163 | 163 | * |
164 | 164 | *************************************/ |
165 | 165 | |
166 | INLINE UINT32 read32le_with_read8_handler(read8_space_func handler, address_space | |
166 | INLINE UINT32 read32le_with_read8_handler(read8_space_func handler, address_space &space, offs_t offset, UINT32 mem_mask) | |
167 | 167 | { |
168 | 168 | UINT32 result = 0; |
169 | 169 | if (ACCESSING_BITS_0_15) |
r17963 | r17964 | |
174 | 174 | } |
175 | 175 | |
176 | 176 | |
177 | INLINE void write32le_with_write8_handler(write8_space_func handler, address_space | |
177 | INLINE void write32le_with_write8_handler(write8_space_func handler, address_space &space, offs_t offset, UINT32 data, UINT32 mem_mask) | |
178 | 178 | { |
179 | 179 | if (ACCESSING_BITS_0_15) |
180 | 180 | write16le_with_write8_handler(handler, space, offset * 2 + 0, data, mem_mask); |
r17963 | r17964 | |
189 | 189 | * |
190 | 190 | *************************************/ |
191 | 191 | |
192 | INLINE UINT32 read32be_with_16be_handler(read16_space_func handler, address_space | |
192 | INLINE UINT32 read32be_with_16be_handler(read16_space_func handler, address_space &space, offs_t offset, UINT32 mem_mask) | |
193 | 193 | { |
194 | 194 | UINT32 result = 0; |
195 | 195 | if (ACCESSING_BITS_16_31) |
r17963 | r17964 | |
200 | 200 | } |
201 | 201 | |
202 | 202 | |
203 | INLINE void write32be_with_16be_handler(write16_space_func handler, address_space | |
203 | INLINE void write32be_with_16be_handler(write16_space_func handler, address_space &space, offs_t offset, UINT32 data, UINT32 mem_mask) | |
204 | 204 | { |
205 | 205 | if (ACCESSING_BITS_16_31) |
206 | 206 | (*handler)(space, offset * 2 + 0, data >> 16, mem_mask >> 16); |
r17963 | r17964 | |
215 | 215 | * |
216 | 216 | *************************************/ |
217 | 217 | |
218 | INLINE UINT32 read32le_with_16le_handler(read16_space_func handler, address_space | |
218 | INLINE UINT32 read32le_with_16le_handler(read16_space_func handler, address_space &space, offs_t offset, UINT32 mem_mask) | |
219 | 219 | { |
220 | 220 | UINT32 result = 0; |
221 | 221 | if (ACCESSING_BITS_0_15) |
r17963 | r17964 | |
226 | 226 | } |
227 | 227 | |
228 | 228 | |
229 | INLINE void write32le_with_16le_handler(write16_space_func handler, address_space | |
229 | INLINE void write32le_with_16le_handler(write16_space_func handler, address_space &space, offs_t offset, UINT32 data, UINT32 mem_mask) | |
230 | 230 | { |
231 | 231 | if (ACCESSING_BITS_0_15) |
232 | 232 | (*handler)(space, offset * 2 + 0, data, mem_mask); |
r17963 | r17964 | |
241 | 241 | * |
242 | 242 | *************************************/ |
243 | 243 | |
244 | INLINE UINT32 read32be_with_16le_handler(read16_space_func handler, address_space | |
244 | INLINE UINT32 read32be_with_16le_handler(read16_space_func handler, address_space &space, offs_t offset, UINT32 mem_mask) | |
245 | 245 | { |
246 | 246 | UINT32 result = 0; |
247 | 247 | mem_mask = FLIPENDIAN_INT32(mem_mask); |
r17963 | r17964 | |
250 | 250 | } |
251 | 251 | |
252 | 252 | |
253 | INLINE void write32be_with_16le_handler(write16_space_func handler, address_space | |
253 | INLINE void write32be_with_16le_handler(write16_space_func handler, address_space &space, offs_t offset, UINT32 data, UINT32 mem_mask) | |
254 | 254 | { |
255 | 255 | data = FLIPENDIAN_INT32(data); |
256 | 256 | mem_mask = FLIPENDIAN_INT32(mem_mask); |
r17963 | r17964 | |
264 | 264 | * |
265 | 265 | *************************************/ |
266 | 266 | |
267 | INLINE UINT32 read32le_with_16be_handler(read16_space_func handler, address_space | |
267 | INLINE UINT32 read32le_with_16be_handler(read16_space_func handler, address_space &space, offs_t offset, UINT32 mem_mask) | |
268 | 268 | { |
269 | 269 | UINT32 result = 0; |
270 | 270 | mem_mask = FLIPENDIAN_INT32(mem_mask); |
r17963 | r17964 | |
273 | 273 | } |
274 | 274 | |
275 | 275 | |
276 | INLINE void write32le_with_16be_handler(write16_space_func handler, address_space | |
276 | INLINE void write32le_with_16be_handler(write16_space_func handler, address_space &space, offs_t offset, UINT32 data, UINT32 mem_mask) | |
277 | 277 | { |
278 | 278 | data = FLIPENDIAN_INT32(data); |
279 | 279 | mem_mask = FLIPENDIAN_INT32(mem_mask); |
r17963 | r17964 | |
287 | 287 | * |
288 | 288 | *************************************/ |
289 | 289 | |
290 | INLINE UINT64 read64be_with_read8_handler(read8_space_func handler, address_space | |
290 | INLINE UINT64 read64be_with_read8_handler(read8_space_func handler, address_space &space, offs_t offset, UINT64 mem_mask) | |
291 | 291 | { |
292 | 292 | UINT64 result = 0; |
293 | 293 | if (ACCESSING_BITS_32_63) |
r17963 | r17964 | |
298 | 298 | } |
299 | 299 | |
300 | 300 | |
301 | INLINE void write64be_with_write8_handler(write8_space_func handler, address_space | |
301 | INLINE void write64be_with_write8_handler(write8_space_func handler, address_space &space, offs_t offset, UINT64 data, UINT64 mem_mask) | |
302 | 302 | { |
303 | 303 | if (ACCESSING_BITS_32_63) |
304 | 304 | write32be_with_write8_handler(handler, space, offset * 2 + 0, data >> 32, mem_mask >> 32); |
r17963 | r17964 | |
313 | 313 | * |
314 | 314 | *************************************/ |
315 | 315 | |
316 | INLINE UINT64 read64le_with_read8_handler(read8_space_func handler, address_space | |
316 | INLINE UINT64 read64le_with_read8_handler(read8_space_func handler, address_space &space, offs_t offset, UINT64 mem_mask) | |
317 | 317 | { |
318 | 318 | UINT64 result = 0; |
319 | 319 | if (ACCESSING_BITS_0_31) |
r17963 | r17964 | |
324 | 324 | } |
325 | 325 | |
326 | 326 | |
327 | INLINE void write64le_with_write8_handler(write8_space_func handler, address_space | |
327 | INLINE void write64le_with_write8_handler(write8_space_func handler, address_space &space, offs_t offset, UINT64 data, UINT64 mem_mask) | |
328 | 328 | { |
329 | 329 | if (ACCESSING_BITS_0_31) |
330 | 330 | write32le_with_write8_handler(handler, space, offset * 2 + 0, data >> 0, mem_mask >> 0); |
r17963 | r17964 | |
339 | 339 | * |
340 | 340 | *************************************/ |
341 | 341 | |
342 | INLINE UINT32 read64be_with_16be_handler(read16_space_func handler, address_space | |
342 | INLINE UINT32 read64be_with_16be_handler(read16_space_func handler, address_space &space, offs_t offset, UINT64 mem_mask) | |
343 | 343 | { |
344 | 344 | UINT64 result = 0; |
345 | 345 | if (ACCESSING_BITS_32_63) |
r17963 | r17964 | |
350 | 350 | } |
351 | 351 | |
352 | 352 | |
353 | INLINE void write64be_with_16be_handler(write16_space_func handler, address_space | |
353 | INLINE void write64be_with_16be_handler(write16_space_func handler, address_space &space, offs_t offset, UINT64 data, UINT64 mem_mask) | |
354 | 354 | { |
355 | 355 | if (ACCESSING_BITS_32_63) |
356 | 356 | write32be_with_16be_handler(handler, space, offset * 2 + 0, data >> 32, mem_mask >> 32); |
r17963 | r17964 | |
365 | 365 | * |
366 | 366 | *************************************/ |
367 | 367 | |
368 | INLINE UINT32 read64le_with_16le_handler(read16_space_func handler, address_space | |
368 | INLINE UINT32 read64le_with_16le_handler(read16_space_func handler, address_space &space, offs_t offset, UINT64 mem_mask) | |
369 | 369 | { |
370 | 370 | UINT64 result = 0; |
371 | 371 | if (ACCESSING_BITS_0_31) |
r17963 | r17964 | |
376 | 376 | } |
377 | 377 | |
378 | 378 | |
379 | INLINE void write64le_with_16le_handler(write16_space_func handler, address_space | |
379 | INLINE void write64le_with_16le_handler(write16_space_func handler, address_space &space, offs_t offset, UINT64 data, UINT64 mem_mask) | |
380 | 380 | { |
381 | 381 | if (ACCESSING_BITS_0_31) |
382 | 382 | write32le_with_16le_handler(handler, space, offset * 2 + 0, data >> 0, mem_mask >> 0); |
r17963 | r17964 | |
391 | 391 | * |
392 | 392 | *************************************/ |
393 | 393 | |
394 | INLINE UINT32 read64be_with_16le_handler(read16_space_func handler, address_space | |
394 | INLINE UINT32 read64be_with_16le_handler(read16_space_func handler, address_space &space, offs_t offset, UINT64 mem_mask) | |
395 | 395 | { |
396 | 396 | UINT64 result = 0; |
397 | 397 | if (ACCESSING_BITS_32_63) |
r17963 | r17964 | |
402 | 402 | } |
403 | 403 | |
404 | 404 | |
405 | INLINE void write64be_with_16le_handler(write16_space_func handler, address_space | |
405 | INLINE void write64be_with_16le_handler(write16_space_func handler, address_space &space, offs_t offset, UINT64 data, UINT64 mem_mask) | |
406 | 406 | { |
407 | 407 | if (ACCESSING_BITS_32_63) |
408 | 408 | write32be_with_16le_handler(handler, space, offset * 2 + 0, data >> 32, mem_mask >> 32); |
r17963 | r17964 | |
417 | 417 | * |
418 | 418 | *************************************/ |
419 | 419 | |
420 | INLINE UINT32 read64le_with_16be_handler(read16_space_func handler, address_space | |
420 | INLINE UINT32 read64le_with_16be_handler(read16_space_func handler, address_space &space, offs_t offset, UINT64 mem_mask) | |
421 | 421 | { |
422 | 422 | UINT64 result = 0; |
423 | 423 | if (ACCESSING_BITS_0_31) |
r17963 | r17964 | |
428 | 428 | } |
429 | 429 | |
430 | 430 | |
431 | INLINE void write64le_with_16be_handler(write16_space_func handler, address_space | |
431 | INLINE void write64le_with_16be_handler(write16_space_func handler, address_space &space, offs_t offset, UINT64 data, UINT64 mem_mask) | |
432 | 432 | { |
433 | 433 | if (ACCESSING_BITS_0_31) |
434 | 434 | write32le_with_16be_handler(handler, space, offset * 2 + 0, data >> 0, mem_mask >> 0); |
r17963 | r17964 | |
443 | 443 | * |
444 | 444 | *************************************/ |
445 | 445 | |
446 | INLINE UINT64 read64be_with_32be_handler(read32_space_func handler, address_space | |
446 | INLINE UINT64 read64be_with_32be_handler(read32_space_func handler, address_space &space, offs_t offset, UINT64 mem_mask) | |
447 | 447 | { |
448 | 448 | UINT64 result = 0; |
449 | 449 | if (ACCESSING_BITS_32_63) |
r17963 | r17964 | |
454 | 454 | } |
455 | 455 | |
456 | 456 | |
457 | INLINE void write64be_with_32be_handler(write32_space_func handler, address_space | |
457 | INLINE void write64be_with_32be_handler(write32_space_func handler, address_space &space, offs_t offset, UINT64 data, UINT64 mem_mask) | |
458 | 458 | { |
459 | 459 | if (ACCESSING_BITS_32_63) |
460 | 460 | (*handler)(space, offset * 2 + 0, data >> 32, mem_mask >> 32); |
r17963 | r17964 | |
469 | 469 | * |
470 | 470 | *************************************/ |
471 | 471 | |
472 | INLINE UINT64 read64le_with_32le_handler(read32_space_func handler, address_space | |
472 | INLINE UINT64 read64le_with_32le_handler(read32_space_func handler, address_space &space, offs_t offset, UINT64 mem_mask) | |
473 | 473 | { |
474 | 474 | UINT64 result = 0; |
475 | 475 | if (ACCESSING_BITS_0_31) |
r17963 | r17964 | |
480 | 480 | } |
481 | 481 | |
482 | 482 | |
483 | INLINE void write64le_with_32le_handler(write32_space_func handler, address_space | |
483 | INLINE void write64le_with_32le_handler(write32_space_func handler, address_space &space, offs_t offset, UINT64 data, UINT64 mem_mask) | |
484 | 484 | { |
485 | 485 | if (ACCESSING_BITS_0_31) |
486 | 486 | (*handler)(space, offset * 2 + 0, data >> 0, mem_mask >> 0); |
r17963 | r17964 | |
495 | 495 | * |
496 | 496 | *************************************/ |
497 | 497 | |
498 | INLINE UINT64 read64be_with_32le_handler(read32_space_func handler, address_space | |
498 | INLINE UINT64 read64be_with_32le_handler(read32_space_func handler, address_space &space, offs_t offset, UINT64 mem_mask) | |
499 | 499 | { |
500 | 500 | UINT64 result; |
501 | 501 | mem_mask = FLIPENDIAN_INT64(mem_mask); |
r17963 | r17964 | |
504 | 504 | } |
505 | 505 | |
506 | 506 | |
507 | INLINE void write64be_with_32le_handler(write32_space_func handler, address_space | |
507 | INLINE void write64be_with_32le_handler(write32_space_func handler, address_space &space, offs_t offset, UINT64 data, UINT64 mem_mask) | |
508 | 508 | { |
509 | 509 | data = FLIPENDIAN_INT64(data); |
510 | 510 | mem_mask = FLIPENDIAN_INT64(mem_mask); |
r17963 | r17964 | |
518 | 518 | * |
519 | 519 | *************************************/ |
520 | 520 | |
521 | INLINE UINT64 read64le_with_32be_handler(read32_space_func handler, address_space | |
521 | INLINE UINT64 read64le_with_32be_handler(read32_space_func handler, address_space &space, offs_t offset, UINT64 mem_mask) | |
522 | 522 | { |
523 | 523 | UINT64 result; |
524 | 524 | mem_mask = FLIPENDIAN_INT64(mem_mask); |
r17963 | r17964 | |
527 | 527 | } |
528 | 528 | |
529 | 529 | |
530 | INLINE void write64le_with_32be_handler(write32_space_func handler, address_space | |
530 | INLINE void write64le_with_32be_handler(write32_space_func handler, address_space &space, offs_t offset, UINT64 data, UINT64 mem_mask) | |
531 | 531 | { |
532 | 532 | data = FLIPENDIAN_INT64(data); |
533 | 533 | mem_mask = FLIPENDIAN_INT64(mem_mask); |
r17963 | r17964 | |
---|---|---|
1022 | 1022 | // generate accessor table |
1023 | 1023 | virtual void accessors(data_accessors &accessors) const |
1024 | 1024 | { |
1025 | accessors.read_byte = reinterpret_cast<UINT8 (*)(address_space *, offs_t)>(&read_byte_static); | |
1026 | accessors.read_word = reinterpret_cast<UINT16 (*)(address_space *, offs_t)>(&read_word_static); | |
1027 | accessors.read_word_masked = reinterpret_cast<UINT16 (*)(address_space *, offs_t, UINT16)>(&read_word_masked_static); | |
1028 | accessors.read_dword = reinterpret_cast<UINT32 (*)(address_space *, offs_t)>(&read_dword_static); | |
1029 | accessors.read_dword_masked = reinterpret_cast<UINT32 (*)(address_space *, offs_t, UINT32)>(&read_dword_masked_static); | |
1030 | accessors.read_qword = reinterpret_cast<UINT64 (*)(address_space *, offs_t)>(&read_qword_static); | |
1031 | accessors.read_qword_masked = reinterpret_cast<UINT64 (*)(address_space *, offs_t, UINT64)>(&read_qword_masked_static); | |
1032 | accessors.write_byte = reinterpret_cast<void (*)(address_space *, offs_t, UINT8)>(&write_byte_static); | |
1033 | accessors.write_word = reinterpret_cast<void (*)(address_space *, offs_t, UINT16)>(&write_word_static); | |
1034 | accessors.write_word_masked = reinterpret_cast<void (*)(address_space *, offs_t, UINT16, UINT16)>(&write_word_masked_static); | |
1035 | accessors.write_dword = reinterpret_cast<void (*)(address_space *, offs_t, UINT32)>(&write_dword_static); | |
1036 | accessors.write_dword_masked = reinterpret_cast<void (*)(address_space *, offs_t, UINT32, UINT32)>(&write_dword_masked_static); | |
1037 | accessors.write_qword = reinterpret_cast<void (*)(address_space *, offs_t, UINT64)>(&write_qword_static); | |
1038 | accessors.write_qword_masked = reinterpret_cast<void (*)(address_space *, offs_t, UINT64, UINT64)>(&write_qword_masked_static); | |
1025 | accessors.read_byte = reinterpret_cast<UINT8 (*)(address_space &, offs_t)>(&read_byte_static); | |
1026 | accessors.read_word = reinterpret_cast<UINT16 (*)(address_space &, offs_t)>(&read_word_static); | |
1027 | accessors.read_word_masked = reinterpret_cast<UINT16 (*)(address_space &, offs_t, UINT16)>(&read_word_masked_static); | |
1028 | accessors.read_dword = reinterpret_cast<UINT32 (*)(address_space &, offs_t)>(&read_dword_static); | |
1029 | accessors.read_dword_masked = reinterpret_cast<UINT32 (*)(address_space &, offs_t, UINT32)>(&read_dword_masked_static); | |
1030 | accessors.read_qword = reinterpret_cast<UINT64 (*)(address_space &, offs_t)>(&read_qword_static); | |
1031 | accessors.read_qword_masked = reinterpret_cast<UINT64 (*)(address_space &, offs_t, UINT64)>(&read_qword_masked_static); | |
1032 | accessors.write_byte = reinterpret_cast<void (*)(address_space &, offs_t, UINT8)>(&write_byte_static); | |
1033 | accessors.write_word = reinterpret_cast<void (*)(address_space &, offs_t, UINT16)>(&write_word_static); | |
1034 | accessors.write_word_masked = reinterpret_cast<void (*)(address_space &, offs_t, UINT16, UINT16)>(&write_word_masked_static); | |
1035 | accessors.write_dword = reinterpret_cast<void (*)(address_space &, offs_t, UINT32)>(&write_dword_static); | |
1036 | accessors.write_dword_masked = reinterpret_cast<void (*)(address_space &, offs_t, UINT32, UINT32)>(&write_dword_masked_static); | |
1037 | accessors.write_qword = reinterpret_cast<void (*)(address_space &, offs_t, UINT64)>(&write_qword_static); | |
1038 | accessors.write_qword_masked = reinterpret_cast<void (*)(address_space &, offs_t, UINT64, UINT64)>(&write_qword_masked_static); | |
1039 | 1039 | } |
1040 | 1040 | |
1041 | 1041 | // return a pointer to the read bank, or NULL if none |
r17963 | r17964 | |
1441 | 1441 | void write_qword_unaligned(offs_t address, UINT64 data, UINT64 mask) { write_direct<UINT64, false>(address, data, mask); } |
1442 | 1442 | |
1443 | 1443 | // static access to these functions |
1444 | static UINT8 read_byte_static(this_type *space, offs_t address) { return (NATIVE_BITS == 8) ? space->read_native(address & ~NATIVE_MASK) : space->read_direct<UINT8, true>(address, 0xff); } | |
1445 | static UINT16 read_word_static(this_type *space, offs_t address) { return (NATIVE_BITS == 16) ? space->read_native(address & ~NATIVE_MASK) : space->read_direct<UINT16, true>(address, 0xffff); } | |
1446 | static UINT16 read_word_masked_static(this_type *space, offs_t address, UINT16 mask) { return space->read_direct<UINT16, true>(address, mask); } | |
1447 | static UINT32 read_dword_static(this_type *space, offs_t address) { return (NATIVE_BITS == 32) ? space->read_native(address & ~NATIVE_MASK) : space->read_direct<UINT32, true>(address, 0xffffffff); } | |
1448 | static UINT32 read_dword_masked_static(this_type *space, offs_t address, UINT32 mask) { return space->read_direct<UINT32, true>(address, mask); } | |
1449 | static UINT64 read_qword_static(this_type *space, offs_t address) { return (NATIVE_BITS == 64) ? space->read_native(address & ~NATIVE_MASK) : space->read_direct<UINT64, true>(address, U64(0xffffffffffffffff)); } | |
1450 | static UINT64 read_qword_masked_static(this_type *space, offs_t address, UINT64 mask) { return space->read_direct<UINT64, true>(address, mask); } | |
1451 | static void write_byte_static(this_type *space, offs_t address, UINT8 data) { if (NATIVE_BITS == 8) space->write_native(address & ~NATIVE_MASK, data); else space->write_direct<UINT8, true>(address, data, 0xff); } | |
1452 | static void write_word_static(this_type *space, offs_t address, UINT16 data) { if (NATIVE_BITS == 16) space->write_native(address & ~NATIVE_MASK, data); else space->write_direct<UINT16, true>(address, data, 0xffff); } | |
1453 | static void write_word_masked_static(this_type *space, offs_t address, UINT16 data, UINT16 mask) { space->write_direct<UINT16, true>(address, data, mask); } | |
1454 | static void write_dword_static(this_type *space, offs_t address, UINT32 data) { if (NATIVE_BITS == 32) space->write_native(address & ~NATIVE_MASK, data); else space->write_direct<UINT32, true>(address, data, 0xffffffff); } | |
1455 | static void write_dword_masked_static(this_type *space, offs_t address, UINT32 data, UINT32 mask) { space->write_direct<UINT32, true>(address, data, mask); } | |
1456 | static void write_qword_static(this_type *space, offs_t address, UINT64 data) { if (NATIVE_BITS == 64) space->write_native(address & ~NATIVE_MASK, data); else space->write_direct<UINT64, true>(address, data, U64(0xffffffffffffffff)); } | |
1457 | static void write_qword_masked_static(this_type *space, offs_t address, UINT64 data, UINT64 mask) { space->write_direct<UINT64, true>(address, data, mask); } | |
1444 | static UINT8 read_byte_static(this_type &space, offs_t address) { return (NATIVE_BITS == 8) ? space.read_native(address & ~NATIVE_MASK) : space.read_direct<UINT8, true>(address, 0xff); } | |
1445 | static UINT16 read_word_static(this_type &space, offs_t address) { return (NATIVE_BITS == 16) ? space.read_native(address & ~NATIVE_MASK) : space.read_direct<UINT16, true>(address, 0xffff); } | |
1446 | static UINT16 read_word_masked_static(this_type &space, offs_t address, UINT16 mask) { return space.read_direct<UINT16, true>(address, mask); } | |
1447 | static UINT32 read_dword_static(this_type &space, offs_t address) { return (NATIVE_BITS == 32) ? space.read_native(address & ~NATIVE_MASK) : space.read_direct<UINT32, true>(address, 0xffffffff); } | |
1448 | static UINT32 read_dword_masked_static(this_type &space, offs_t address, UINT32 mask) { return space.read_direct<UINT32, true>(address, mask); } | |
1449 | static UINT64 read_qword_static(this_type &space, offs_t address) { return (NATIVE_BITS == 64) ? space.read_native(address & ~NATIVE_MASK) : space.read_direct<UINT64, true>(address, U64(0xffffffffffffffff)); } | |
1450 | static UINT64 read_qword_masked_static(this_type &space, offs_t address, UINT64 mask) { return space.read_direct<UINT64, true>(address, mask); } | |
1451 | static void write_byte_static(this_type &space, offs_t address, UINT8 data) { if (NATIVE_BITS == 8) space.write_native(address & ~NATIVE_MASK, data); else space.write_direct<UINT8, true>(address, data, 0xff); } | |
1452 | static void write_word_static(this_type &space, offs_t address, UINT16 data) { if (NATIVE_BITS == 16) space.write_native(address & ~NATIVE_MASK, data); else space.write_direct<UINT16, true>(address, data, 0xffff); } | |
1453 | static void write_word_masked_static(this_type &space, offs_t address, UINT16 data, UINT16 mask) { space.write_direct<UINT16, true>(address, data, mask); } | |
1454 | static void write_dword_static(this_type &space, offs_t address, UINT32 data) { if (NATIVE_BITS == 32) space.write_native(address & ~NATIVE_MASK, data); else space.write_direct<UINT32, true>(address, data, 0xffffffff); } | |
1455 | static void write_dword_masked_static(this_type &space, offs_t address, UINT32 data, UINT32 mask) { space.write_direct<UINT32, true>(address, data, mask); } | |
1456 | static void write_qword_static(this_type &space, offs_t address, UINT64 data) { if (NATIVE_BITS == 64) space.write_native(address & ~NATIVE_MASK, data); else space.write_direct<UINT64, true>(address, data, U64(0xffffffffffffffff)); } | |
1457 | static void write_qword_masked_static(this_type &space, offs_t address, UINT64 data, UINT64 mask) { space.write_direct<UINT64, true>(address, data, mask); } | |
1458 | 1458 | |
1459 | 1459 | address_table_read m_read; // memory read lookup table |
1460 | 1460 | address_table_write m_write; // memory write lookup table |
r17963 | r17964 | |
4984 | 4984 | offs_t aoffset = offset * si.m_multiplier + si.m_offset; |
4985 | 4985 | UINT8 val; |
4986 | 4986 | if (m_sub_is_legacy[index]) |
4987 | val = m_sublegacy_info[index].handler.space8(m_sublegacy_info[index].object.space, aoffset); | |
4987 | val = m_sublegacy_info[index].handler.space8(*m_sublegacy_info[index].object.space, aoffset); | |
4988 | 4988 | else |
4989 | 4989 | val = m_subread[index].r8(space, aoffset, submask); |
4990 | 4990 | result |= val << si.m_shift; |
r17963 | r17964 | |
5015 | 5015 | switch (si.m_size) |
5016 | 5016 | { |
5017 | 5017 | case 8: |
5018 | val = m_sublegacy_info[index].handler.space8(m_sublegacy_info[index].object.space, aoffset); | |
5018 | val = m_sublegacy_info[index].handler.space8(*m_sublegacy_info[index].object.space, aoffset); | |
5019 | 5019 | break; |
5020 | 5020 | case 16: |
5021 | val = m_sublegacy_info[index].handler.space16(m_sublegacy_info[index].object.space, aoffset, submask); | |
5021 | val = m_sublegacy_info[index].handler.space16(*m_sublegacy_info[index].object.space, aoffset, submask); | |
5022 | 5022 | break; |
5023 | 5023 | } |
5024 | 5024 | } |
r17963 | r17964 | |
5062 | 5062 | switch (si.m_size) |
5063 | 5063 | { |
5064 | 5064 | case 8: |
5065 | val = m_sublegacy_info[index].handler.space8(m_sublegacy_info[index].object.space, aoffset); | |
5065 | val = m_sublegacy_info[index].handler.space8(*m_sublegacy_info[index].object.space, aoffset); | |
5066 | 5066 | break; |
5067 | 5067 | case 16: |
5068 | val = m_sublegacy_info[index].handler.space16(m_sublegacy_info[index].object.space, aoffset, submask); | |
5068 | val = m_sublegacy_info[index].handler.space16(*m_sublegacy_info[index].object.space, aoffset, submask); | |
5069 | 5069 | break; |
5070 | 5070 | case 32: |
5071 | val = m_sublegacy_info[index].handler.space32(m_sublegacy_info[index].object.space, aoffset, submask); | |
5071 | val = m_sublegacy_info[index].handler.space32(*m_sublegacy_info[index].object.space, aoffset, submask); | |
5072 | 5072 | break; |
5073 | 5073 | } |
5074 | 5074 | } |
r17963 | r17964 | |
5101 | 5101 | |
5102 | 5102 | UINT8 handler_entry_read::read_stub_legacy(address_space &space, offs_t offset, UINT8 mask) |
5103 | 5103 | { |
5104 | return m_legacy_info.handler.space8(m_legacy_info.object.space, offset); | |
5104 | return m_legacy_info.handler.space8(*m_legacy_info.object.space, offset); | |
5105 | 5105 | } |
5106 | 5106 | |
5107 | 5107 | UINT16 handler_entry_read::read_stub_legacy(address_space &space, offs_t offset, UINT16 mask) |
5108 | 5108 | { |
5109 | return m_legacy_info.handler.space16(m_legacy_info.object.space, offset, mask); | |
5109 | return m_legacy_info.handler.space16(*m_legacy_info.object.space, offset, mask); | |
5110 | 5110 | } |
5111 | 5111 | |
5112 | 5112 | UINT32 handler_entry_read::read_stub_legacy(address_space &space, offs_t offset, UINT32 mask) |
5113 | 5113 | { |
5114 | return m_legacy_info.handler.space32(m_legacy_info.object.space, offset, mask); | |
5114 | return m_legacy_info.handler.space32(*m_legacy_info.object.space, offset, mask); | |
5115 | 5115 | } |
5116 | 5116 | |
5117 | 5117 | UINT64 handler_entry_read::read_stub_legacy(address_space &space, offs_t offset, UINT64 mask) |
5118 | 5118 | { |
5119 | return m_legacy_info.handler.space64(m_legacy_info.object.space, offset, mask); | |
5119 | return m_legacy_info.handler.space64(*m_legacy_info.object.space, offset, mask); | |
5120 | 5120 | } |
5121 | 5121 | |
5122 | 5122 | |
r17963 | r17964 | |
5438 | 5438 | offs_t aoffset = offset * si.m_multiplier + si.m_offset; |
5439 | 5439 | UINT8 adata = data >> si.m_shift; |
5440 | 5440 | if (m_sub_is_legacy[index]) |
5441 | m_sublegacy_info[index].handler.space8(m_sublegacy_info[index].object.space, aoffset, adata); | |
5441 | m_sublegacy_info[index].handler.space8(*m_sublegacy_info[index].object.space, aoffset, adata); | |
5442 | 5442 | else |
5443 | 5443 | m_subwrite[index].w8(space, aoffset, adata, submask); |
5444 | 5444 | } |
r17963 | r17964 | |
5466 | 5466 | switch (si.m_size) |
5467 | 5467 | { |
5468 | 5468 | case 8: |
5469 | m_sublegacy_info[index].handler.space8(m_sublegacy_info[index].object.space, aoffset, adata); | |
5469 | m_sublegacy_info[index].handler.space8(*m_sublegacy_info[index].object.space, aoffset, adata); | |
5470 | 5470 | break; |
5471 | 5471 | case 16: |
5472 | m_sublegacy_info[index].handler.space16(m_sublegacy_info[index].object.space, aoffset, adata, submask); | |
5472 | m_sublegacy_info[index].handler.space16(*m_sublegacy_info[index].object.space, aoffset, adata, submask); | |
5473 | 5473 | break; |
5474 | 5474 | } |
5475 | 5475 | } |
r17963 | r17964 | |
5510 | 5510 | switch (si.m_size) |
5511 | 5511 | { |
5512 | 5512 | case 8: |
5513 | m_sublegacy_info[index].handler.space8(m_sublegacy_info[index].object.space, aoffset, adata); | |
5513 | m_sublegacy_info[index].handler.space8(*m_sublegacy_info[index].object.space, aoffset, adata); | |
5514 | 5514 | break; |
5515 | 5515 | case 16: |
5516 | m_sublegacy_info[index].handler.space16(m_sublegacy_info[index].object.space, aoffset, adata, submask); | |
5516 | m_sublegacy_info[index].handler.space16(*m_sublegacy_info[index].object.space, aoffset, adata, submask); | |
5517 | 5517 | break; |
5518 | 5518 | case 32: |
5519 | m_sublegacy_info[index].handler.space32(m_sublegacy_info[index].object.space, aoffset, adata, submask); | |
5519 | m_sublegacy_info[index].handler.space32(*m_sublegacy_info[index].object.space, aoffset, adata, submask); | |
5520 | 5520 | break; |
5521 | 5521 | } |
5522 | 5522 | } |
r17963 | r17964 | |
5547 | 5547 | |
5548 | 5548 | void handler_entry_write::write_stub_legacy(address_space &space, offs_t offset, UINT8 data, UINT8 mask) |
5549 | 5549 | { |
5550 | m_legacy_info.handler.space8(m_legacy_info.object.space, offset, data); | |
5550 | m_legacy_info.handler.space8(*m_legacy_info.object.space, offset, data); | |
5551 | 5551 | } |
5552 | 5552 | |
5553 | 5553 | void handler_entry_write::write_stub_legacy(address_space &space, offs_t offset, UINT16 data, UINT16 mask) |
5554 | 5554 | { |
5555 | m_legacy_info.handler.space16(m_legacy_info.object.space, offset, data, mask); | |
5555 | m_legacy_info.handler.space16(*m_legacy_info.object.space, offset, data, mask); | |
5556 | 5556 | } |
5557 | 5557 | |
5558 | 5558 | void handler_entry_write::write_stub_legacy(address_space &space, offs_t offset, UINT32 data, UINT32 mask) |
5559 | 5559 | { |
5560 | m_legacy_info.handler.space32(m_legacy_info.object.space, offset, data, mask); | |
5560 | m_legacy_info.handler.space32(*m_legacy_info.object.space, offset, data, mask); | |
5561 | 5561 | } |
5562 | 5562 | |
5563 | 5563 | void handler_entry_write::write_stub_legacy(address_space &space, offs_t offset, UINT64 data, UINT64 mask) |
5564 | 5564 | { |
5565 | m_legacy_info.handler.space64(m_legacy_info.object.space, offset, data, mask); | |
5565 | m_legacy_info.handler.space64(*m_legacy_info.object.space, offset, data, mask); | |
5566 | 5566 | } |
r17963 | r17964 | |
---|---|---|
112 | 112 | |
113 | 113 | |
114 | 114 | // legacy space read/write handlers |
115 | typedef UINT8 (*read8_space_func) (ATTR_UNUSED address_space *space, ATTR_UNUSED offs_t offset); | |
116 | typedef void (*write8_space_func) (ATTR_UNUSED address_space *space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT8 data); | |
117 | typedef UINT16 (*read16_space_func) (ATTR_UNUSED address_space *space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT16 mem_mask); | |
118 | typedef void (*write16_space_func)(ATTR_UNUSED address_space *space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT16 data, ATTR_UNUSED UINT16 mem_mask); | |
119 | typedef UINT32 (*read32_space_func) (ATTR_UNUSED address_space *space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT32 mem_mask); | |
120 | typedef void (*write32_space_func)(ATTR_UNUSED address_space *space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT32 data, ATTR_UNUSED UINT32 mem_mask); | |
121 | typedef UINT64 (*read64_space_func) (ATTR_UNUSED address_space *space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT64 mem_mask); | |
122 | typedef void (*write64_space_func)(ATTR_UNUSED address_space *space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT64 data, ATTR_UNUSED UINT64 mem_mask); | |
115 | typedef UINT8 (*read8_space_func) (ATTR_UNUSED address_space &space, ATTR_UNUSED offs_t offset); | |
116 | typedef void (*write8_space_func) (ATTR_UNUSED address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT8 data); | |
117 | typedef UINT16 (*read16_space_func) (ATTR_UNUSED address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT16 mem_mask); | |
118 | typedef void (*write16_space_func)(ATTR_UNUSED address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT16 data, ATTR_UNUSED UINT16 mem_mask); | |
119 | typedef UINT32 (*read32_space_func) (ATTR_UNUSED address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT32 mem_mask); | |
120 | typedef void (*write32_space_func)(ATTR_UNUSED address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT32 data, ATTR_UNUSED UINT32 mem_mask); | |
121 | typedef UINT64 (*read64_space_func) (ATTR_UNUSED address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT64 mem_mask); | |
122 | typedef void (*write64_space_func)(ATTR_UNUSED address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT64 data, ATTR_UNUSED UINT64 mem_mask); | |
123 | 123 | |
124 | 124 | // legacy device read/write handlers |
125 | 125 | typedef UINT8 (*read8_device_func) (ATTR_UNUSED device_t *device, ATTR_UNUSED address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT8 mem_mask); |
r17963 | r17964 | |
135 | 135 | // struct with function pointers for accessors; use is generally discouraged unless necessary |
136 | 136 | struct data_accessors |
137 | 137 | { |
138 | UINT8 (*read_byte)(address_space *space, offs_t byteaddress); | |
139 | UINT16 (*read_word)(address_space *space, offs_t byteaddress); | |
140 | UINT16 (*read_word_masked)(address_space *space, offs_t byteaddress, UINT16 mask); | |
141 | UINT32 (*read_dword)(address_space *space, offs_t byteaddress); | |
142 | UINT32 (*read_dword_masked)(address_space *space, offs_t byteaddress, UINT32 mask); | |
143 | UINT64 (*read_qword)(address_space *space, offs_t byteaddress); | |
144 | UINT64 (*read_qword_masked)(address_space *space, offs_t byteaddress, UINT64 mask); | |
138 | UINT8 (*read_byte)(address_space &space, offs_t byteaddress); | |
139 | UINT16 (*read_word)(address_space &space, offs_t byteaddress); | |
140 | UINT16 (*read_word_masked)(address_space &space, offs_t byteaddress, UINT16 mask); | |
141 | UINT32 (*read_dword)(address_space &space, offs_t byteaddress); | |
142 | UINT32 (*read_dword_masked)(address_space &space, offs_t byteaddress, UINT32 mask); | |
143 | UINT64 (*read_qword)(address_space &space, offs_t byteaddress); | |
144 | UINT64 (*read_qword_masked)(address_space &space, offs_t byteaddress, UINT64 mask); | |
145 | 145 | |
146 | void (*write_byte)(address_space *space, offs_t byteaddress, UINT8 data); | |
147 | void (*write_word)(address_space *space, offs_t byteaddress, UINT16 data); | |
148 | void (*write_word_masked)(address_space *space, offs_t byteaddress, UINT16 data, UINT16 mask); | |
149 | void (*write_dword)(address_space *space, offs_t byteaddress, UINT32 data); | |
150 | void (*write_dword_masked)(address_space *space, offs_t byteaddress, UINT32 data, UINT32 mask); | |
151 | void (*write_qword)(address_space *space, offs_t byteaddress, UINT64 data); | |
152 | void (*write_qword_masked)(address_space *space, offs_t byteaddress, UINT64 data, UINT64 mask); | |
146 | void (*write_byte)(address_space &space, offs_t byteaddress, UINT8 data); | |
147 | void (*write_word)(address_space &space, offs_t byteaddress, UINT16 data); | |
148 | void (*write_word_masked)(address_space &space, offs_t byteaddress, UINT16 data, UINT16 mask); | |
149 | void (*write_dword)(address_space &space, offs_t byteaddress, UINT32 data); | |
150 | void (*write_dword_masked)(address_space &space, offs_t byteaddress, UINT32 data, UINT32 mask); | |
151 | void (*write_qword)(address_space &space, offs_t byteaddress, UINT64 data); | |
152 | void (*write_qword_masked)(address_space &space, offs_t byteaddress, UINT64 data, UINT64 mask); | |
153 | 153 | }; |
154 | 154 | |
155 | 155 | |
r17963 | r17964 | |
876 | 876 | |
877 | 877 | |
878 | 878 | // space read/write handler function macros |
879 | #define READ8_HANDLER(name) UINT8 name(ATTR_UNUSED address_space *space, ATTR_UNUSED offs_t offset) | |
880 | #define WRITE8_HANDLER(name) void name(ATTR_UNUSED address_space *space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT8 data) | |
881 | #define READ16_HANDLER(name) UINT16 name(ATTR_UNUSED address_space *space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT16 mem_mask) | |
882 | #define WRITE16_HANDLER(name) void name(ATTR_UNUSED address_space *space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT16 data, ATTR_UNUSED UINT16 mem_mask) | |
883 | #define READ32_HANDLER(name) UINT32 name(ATTR_UNUSED address_space *space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT32 mem_mask) | |
884 | #define WRITE32_HANDLER(name) void name(ATTR_UNUSED address_space *space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT32 data, ATTR_UNUSED UINT32 mem_mask) | |
885 | #define READ64_HANDLER(name) UINT64 name(ATTR_UNUSED address_space *space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT64 mem_mask) | |
886 | #define WRITE64_HANDLER(name) void name(ATTR_UNUSED address_space *space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT64 data, ATTR_UNUSED UINT64 mem_mask) | |
879 | #define READ8_HANDLER(name) UINT8 name(ATTR_UNUSED address_space &space, ATTR_UNUSED offs_t offset) | |
880 | #define WRITE8_HANDLER(name) void name(ATTR_UNUSED address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT8 data) | |
881 | #define READ16_HANDLER(name) UINT16 name(ATTR_UNUSED address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT16 mem_mask) | |
882 | #define WRITE16_HANDLER(name) void name(ATTR_UNUSED address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT16 data, ATTR_UNUSED UINT16 mem_mask) | |
883 | #define READ32_HANDLER(name) UINT32 name(ATTR_UNUSED address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT32 mem_mask) | |
884 | #define WRITE32_HANDLER(name) void name(ATTR_UNUSED address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT32 data, ATTR_UNUSED UINT32 mem_mask) | |
885 | #define READ64_HANDLER(name) UINT64 name(ATTR_UNUSED address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT64 mem_mask) | |
886 | #define WRITE64_HANDLER(name) void name(ATTR_UNUSED address_space &space, ATTR_UNUSED offs_t offset, ATTR_UNUSED UINT64 data, ATTR_UNUSED UINT64 mem_mask) | |
887 | 887 | |
888 | 888 | |
889 | 889 | // device read/write handler function macros |
r17963 | r17964 | |
---|---|---|
420 | 420 | |
421 | 421 | READ8_HANDLER(pc16552d_0_r) |
422 | 422 | { |
423 | return duart_r(space | |
423 | return duart_r(space.machine(), 0, offset); | |
424 | 424 | } |
425 | 425 | |
426 | 426 | WRITE8_HANDLER(pc16552d_0_w) |
427 | 427 | { |
428 | duart_w(space | |
428 | duart_w(space.machine(), 0, offset, data); | |
429 | 429 | } |
430 | 430 | |
431 | 431 | READ8_HANDLER(pc16552d_1_r) |
432 | 432 | { |
433 | return duart_r(space | |
433 | return duart_r(space.machine(), 1, offset); | |
434 | 434 | } |
435 | 435 | |
436 | 436 | WRITE8_HANDLER(pc16552d_1_w) |
437 | 437 | { |
438 | duart_w(space | |
438 | duart_w(space.machine(), 1, offset, data); | |
439 | 439 | } |
r17963 | r17964 | |
---|---|---|
82 | 82 | } |
83 | 83 | } |
84 | 84 | |
85 | // mame_printf_debug("k056230_r: %d at %08X\n", offset, space | |
85 | // mame_printf_debug("k056230_r: %d at %08X\n", offset, space.device().safe_pc()); | |
86 | 86 | |
87 | 87 | return 0; |
88 | 88 | } |
r17963 | r17964 | |
132 | 132 | break; |
133 | 133 | } |
134 | 134 | } |
135 | // mame_printf_debug("k056230_w: %d, %02X at %08X\n", offset, data, space | |
135 | // mame_printf_debug("k056230_w: %d, %02X at %08X\n", offset, data, space.device().safe_pc()); | |
136 | 136 | } |
137 | 137 | |
138 | 138 | READ32_DEVICE_HANDLER_TRAMPOLINE(k056230, lanc_ram_r) |
139 | 139 | { |
140 | //mame_printf_debug("LANC_RAM_r: %08X, %08X at %08X\n", offset, mem_mask, space | |
140 | //mame_printf_debug("LANC_RAM_r: %08X, %08X at %08X\n", offset, mem_mask, space.device().safe_pc()); | |
141 | 141 | return m_ram[offset & 0x7ff]; |
142 | 142 | } |
143 | 143 | |
144 | 144 | WRITE32_DEVICE_HANDLER_TRAMPOLINE(k056230, lanc_ram_w) |
145 | 145 | { |
146 | //mame_printf_debug("LANC_RAM_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, space | |
146 | //mame_printf_debug("LANC_RAM_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, space.device().safe_pc()); | |
147 | 147 | COMBINE_DATA(m_ram + (offset & 0x7ff)); |
148 | 148 | } |
r17963 | r17964 | |
---|---|---|
393 | 393 | |
394 | 394 | UINT8 lsi53c810_device::lsi53c810_reg_r( int offset ) |
395 | 395 | { |
396 | // | |
396 | // logerror("53c810: read reg %d:0x%x (PC=%x)\n", offset, offset, space.device().safe_pc()); | |
397 | 397 | switch(offset) |
398 | 398 | { |
399 | 399 | case 0x00: /* SCNTL0 */ |
r17963 | r17964 | |
476 | 476 | |
477 | 477 | void lsi53c810_device::lsi53c810_reg_w(int offset, UINT8 data) |
478 | 478 | { |
479 | // | |
479 | // logerror("53c810: %02x to reg %d:0x%x (PC=%x)\n", data, offset, offset, space.device().safe_pc()); | |
480 | 480 | switch(offset) |
481 | 481 | { |
482 | 482 | case 0x00: /* SCNTL0 */ |
r17963 | r17964 | |
---|---|---|
96 | 96 | void amiga_fdc::dma_done() |
97 | 97 | { |
98 | 98 | dma_state = DMA_IDLE; |
99 | address_space | |
99 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
100 | 100 | amiga_custom_w(space, REG_INTREQ, 0x8000 | INTENA_DSKBLK, 0xffff); |
101 | 101 | } |
102 | 102 | |
r17963 | r17964 | |
233 | 233 | cur_live.bit_counter = 0; |
234 | 234 | } |
235 | 235 | dskbyt |= 0x1000; |
236 | address_space | |
236 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
237 | 237 | amiga_custom_w(space, REG_INTREQ, 0x8000 | INTENA_DSKSYN, 0xffff); |
238 | 238 | } else |
239 | 239 | dskbyt &= ~0x1000; |
r17963 | r17964 | |
---|---|---|
38 | 38 | |
39 | 39 | DEVICE_START( s3c2440 ) |
40 | 40 | { |
41 | address_space *space = device->machine().device( "maincpu")->memory().space( AS_PROGRAM); | |
42 | space->install_legacy_readwrite_handler( *device, 0x48000000, 0x4800003b, FUNC(s3c24xx_memcon_r), FUNC(s3c24xx_memcon_w)); | |
43 | space->install_legacy_readwrite_handler( *device, 0x49000000, 0x4900005b, FUNC(s3c24xx_usb_host_r), FUNC(s3c24xx_usb_host_w)); | |
44 | space->install_legacy_readwrite_handler( *device, 0x4a000000, 0x4a00001f, FUNC(s3c24xx_irq_r), FUNC(s3c24xx_irq_w)); | |
45 | space->install_legacy_readwrite_handler( *device, 0x4b000000, 0x4b000023, FUNC(s3c24xx_dma_0_r), FUNC(s3c24xx_dma_0_w)); | |
46 | space->install_legacy_readwrite_handler( *device, 0x4b000040, 0x4b000063, FUNC(s3c24xx_dma_1_r), FUNC(s3c24xx_dma_1_w)); | |
47 | space->install_legacy_readwrite_handler( *device, 0x4b000080, 0x4b0000a3, FUNC(s3c24xx_dma_2_r), FUNC(s3c24xx_dma_2_w)); | |
48 | space->install_legacy_readwrite_handler( *device, 0x4b0000c0, 0x4b0000e3, FUNC(s3c24xx_dma_3_r), FUNC(s3c24xx_dma_3_w)); | |
49 | space->install_legacy_readwrite_handler( *device, 0x4c000000, 0x4c00001b, FUNC(s3c24xx_clkpow_r), FUNC(s3c24xx_clkpow_w)); | |
50 | space->install_legacy_readwrite_handler( *device, 0x4d000000, 0x4d000063, FUNC(s3c2440_lcd_r), FUNC(s3c24xx_lcd_w)); | |
51 | space->install_legacy_readwrite_handler( *device, 0x4d000400, 0x4d0007ff, FUNC(s3c24xx_lcd_palette_r), FUNC(s3c24xx_lcd_palette_w)); | |
52 | space->install_legacy_readwrite_handler( *device, 0x4e000000, 0x4e00003f, FUNC(s3c24xx_nand_r), FUNC(s3c24xx_nand_w)); | |
53 | space->install_legacy_readwrite_handler( *device, 0x4f000000, 0x4f0000a3, FUNC(s3c24xx_cam_r), FUNC(s3c24xx_cam_w)); | |
54 | space->install_legacy_readwrite_handler( *device, 0x50000000, 0x5000002b, FUNC(s3c24xx_uart_0_r), FUNC(s3c24xx_uart_0_w)); | |
55 | space->install_legacy_readwrite_handler( *device, 0x50004000, 0x5000402b, FUNC(s3c24xx_uart_1_r), FUNC(s3c24xx_uart_1_w)); | |
56 | space->install_legacy_readwrite_handler( *device, 0x50008000, 0x5000802b, FUNC(s3c24xx_uart_2_r), FUNC(s3c24xx_uart_2_w)); | |
57 | space->install_legacy_readwrite_handler( *device, 0x51000000, 0x51000043, FUNC(s3c24xx_pwm_r), FUNC(s3c24xx_pwm_w)); | |
58 | space->install_legacy_readwrite_handler( *device, 0x52000140, 0x5200026f, FUNC(s3c24xx_usb_device_r), FUNC(s3c24xx_usb_device_w)); | |
59 | space->install_legacy_readwrite_handler( *device, 0x53000000, 0x5300000b, FUNC(s3c24xx_wdt_r), FUNC(s3c24xx_wdt_w)); | |
60 | space->install_legacy_readwrite_handler( *device, 0x54000000, 0x54000013, FUNC(s3c24xx_iic_r), FUNC(s3c24xx_iic_w)); | |
61 | space->install_legacy_readwrite_handler( *device, 0x55000000, 0x55000013, FUNC(s3c24xx_iis_r), FUNC(s3c24xx_iis_w)); | |
62 | space->install_legacy_readwrite_handler( *device, 0x56000000, 0x560000df, FUNC(s3c24xx_gpio_r), FUNC(s3c24xx_gpio_w)); | |
63 | space->install_legacy_readwrite_handler( *device, 0x57000040, 0x5700008b, FUNC(s3c24xx_rtc_r), FUNC(s3c24xx_rtc_w)); | |
64 | space->install_legacy_readwrite_handler( *device, 0x58000000, 0x58000017, FUNC(s3c24xx_adc_r), FUNC(s3c24xx_adc_w)); | |
65 | space->install_legacy_readwrite_handler( *device, 0x59000000, 0x59000017, FUNC(s3c24xx_spi_0_r), FUNC(s3c24xx_spi_0_w)); | |
66 | space->install_legacy_readwrite_handler( *device, 0x59000020, 0x59000037, FUNC(s3c24xx_spi_1_r), FUNC(s3c24xx_spi_1_w)); | |
67 | space->install_legacy_readwrite_handler( *device, 0x5a000000, 0x5a000043, FUNC(s3c24xx_sdi_r), FUNC(s3c24xx_sdi_w)); | |
68 | space->install_legacy_readwrite_handler( *device, 0x5b000000, 0x5b00001f, FUNC(s3c24xx_ac97_r), FUNC(s3c24xx_ac97_w)); | |
41 | address_space &space = *device->machine().device( "maincpu")->memory().space( AS_PROGRAM); | |
42 | space.install_legacy_readwrite_handler( *device, 0x48000000, 0x4800003b, FUNC(s3c24xx_memcon_r), FUNC(s3c24xx_memcon_w)); | |
43 | space.install_legacy_readwrite_handler( *device, 0x49000000, 0x4900005b, FUNC(s3c24xx_usb_host_r), FUNC(s3c24xx_usb_host_w)); | |
44 | space.install_legacy_readwrite_handler( *device, 0x4a000000, 0x4a00001f, FUNC(s3c24xx_irq_r), FUNC(s3c24xx_irq_w)); | |
45 | space.install_legacy_readwrite_handler( *device, 0x4b000000, 0x4b000023, FUNC(s3c24xx_dma_0_r), FUNC(s3c24xx_dma_0_w)); | |
46 | space.install_legacy_readwrite_handler( *device, 0x4b000040, 0x4b000063, FUNC(s3c24xx_dma_1_r), FUNC(s3c24xx_dma_1_w)); | |
47 | space.install_legacy_readwrite_handler( *device, 0x4b000080, 0x4b0000a3, FUNC(s3c24xx_dma_2_r), FUNC(s3c24xx_dma_2_w)); | |
48 | space.install_legacy_readwrite_handler( *device, 0x4b0000c0, 0x4b0000e3, FUNC(s3c24xx_dma_3_r), FUNC(s3c24xx_dma_3_w)); | |
49 | space.install_legacy_readwrite_handler( *device, 0x4c000000, 0x4c00001b, FUNC(s3c24xx_clkpow_r), FUNC(s3c24xx_clkpow_w)); | |
50 | space.install_legacy_readwrite_handler( *device, 0x4d000000, 0x4d000063, FUNC(s3c2440_lcd_r), FUNC(s3c24xx_lcd_w)); | |
51 | space.install_legacy_readwrite_handler( *device, 0x4d000400, 0x4d0007ff, FUNC(s3c24xx_lcd_palette_r), FUNC(s3c24xx_lcd_palette_w)); | |
52 | space.install_legacy_readwrite_handler( *device, 0x4e000000, 0x4e00003f, FUNC(s3c24xx_nand_r), FUNC(s3c24xx_nand_w)); | |
53 | space.install_legacy_readwrite_handler( *device, 0x4f000000, 0x4f0000a3, FUNC(s3c24xx_cam_r), FUNC(s3c24xx_cam_w)); | |
54 | space.install_legacy_readwrite_handler( *device, 0x50000000, 0x5000002b, FUNC(s3c24xx_uart_0_r), FUNC(s3c24xx_uart_0_w)); | |
55 | space.install_legacy_readwrite_handler( *device, 0x50004000, 0x5000402b, FUNC(s3c24xx_uart_1_r), FUNC(s3c24xx_uart_1_w)); | |
56 | space.install_legacy_readwrite_handler( *device, 0x50008000, 0x5000802b, FUNC(s3c24xx_uart_2_r), FUNC(s3c24xx_uart_2_w)); | |
57 | space.install_legacy_readwrite_handler( *device, 0x51000000, 0x51000043, FUNC(s3c24xx_pwm_r), FUNC(s3c24xx_pwm_w)); | |
58 | space.install_legacy_readwrite_handler( *device, 0x52000140, 0x5200026f, FUNC(s3c24xx_usb_device_r), FUNC(s3c24xx_usb_device_w)); | |
59 | space.install_legacy_readwrite_handler( *device, 0x53000000, 0x5300000b, FUNC(s3c24xx_wdt_r), FUNC(s3c24xx_wdt_w)); | |
60 | space.install_legacy_readwrite_handler( *device, 0x54000000, 0x54000013, FUNC(s3c24xx_iic_r), FUNC(s3c24xx_iic_w)); | |
61 | space.install_legacy_readwrite_handler( *device, 0x55000000, 0x55000013, FUNC(s3c24xx_iis_r), FUNC(s3c24xx_iis_w)); | |
62 | space.install_legacy_readwrite_handler( *device, 0x56000000, 0x560000df, FUNC(s3c24xx_gpio_r), FUNC(s3c24xx_gpio_w)); | |
63 | space.install_legacy_readwrite_handler( *device, 0x57000040, 0x5700008b, FUNC(s3c24xx_rtc_r), FUNC(s3c24xx_rtc_w)); | |
64 | space.install_legacy_readwrite_handler( *device, 0x58000000, 0x58000017, FUNC(s3c24xx_adc_r), FUNC(s3c24xx_adc_w)); | |
65 | space.install_legacy_readwrite_handler( *device, 0x59000000, 0x59000017, FUNC(s3c24xx_spi_0_r), FUNC(s3c24xx_spi_0_w)); | |
66 | space.install_legacy_readwrite_handler( *device, 0x59000020, 0x59000037, FUNC(s3c24xx_spi_1_r), FUNC(s3c24xx_spi_1_w)); | |
67 | space.install_legacy_readwrite_handler( *device, 0x5a000000, 0x5a000043, FUNC(s3c24xx_sdi_r), FUNC(s3c24xx_sdi_w)); | |
68 | space.install_legacy_readwrite_handler( *device, 0x5b000000, 0x5b00001f, FUNC(s3c24xx_ac97_r), FUNC(s3c24xx_ac97_w)); | |
69 | 69 | DEVICE_START_CALL(s3c24xx); |
70 | 70 | |
71 | 71 | s3c24xx_video_start( device, device->machine()); |
r17963 | r17964 | |
---|---|---|
301 | 301 | static UINT32 s3c24xx_lcd_dma_read( device_t *device) |
302 | 302 | { |
303 | 303 | s3c24xx_t *s3c24xx = get_token( device); |
304 | address_space | |
304 | address_space& space = *device->machine().device( "maincpu")->memory().space( AS_PROGRAM); | |
305 | 305 | UINT8 *vram, data[4]; |
306 | vram = (UINT8 *)space | |
306 | vram = (UINT8 *)space.get_read_ptr( s3c24xx->lcd.vramaddr_cur); | |
307 | 307 | for (int i = 0; i < 2; i++) |
308 | 308 | { |
309 | 309 | data[i*2+0] = *vram++; |
r17963 | r17964 | |
314 | 314 | { |
315 | 315 | s3c24xx->lcd.vramaddr_cur += s3c24xx->lcd.offsize << 1; |
316 | 316 | s3c24xx->lcd.pagewidth_cur = 0; |
317 | vram = (UINT8 *)space | |
317 | vram = (UINT8 *)space.get_read_ptr( s3c24xx->lcd.vramaddr_cur); | |
318 | 318 | } |
319 | 319 | } |
320 | 320 | if (s3c24xx->lcd.hwswp == 0) |
r17963 | r17964 | |
345 | 345 | static UINT32 s3c24xx_lcd_dma_read( device_t *device) |
346 | 346 | { |
347 | 347 | s3c24xx_t *s3c24xx = get_token( device); |
348 | address_space | |
348 | address_space& space = *device->machine().device( "maincpu")->memory().space( AS_PROGRAM); | |
349 | 349 | UINT8 *vram, data[4]; |
350 | vram = (UINT8 *)space | |
350 | vram = (UINT8 *)space.get_read_ptr( s3c24xx->lcd.vramaddr_cur); | |
351 | 351 | for (int i = 0; i < 2; i++) |
352 | 352 | { |
353 | 353 | if (s3c24xx->lcd.hwswp == 0) |
r17963 | r17964 | |
398 | 398 | { |
399 | 399 | s3c24xx->lcd.vramaddr_cur += s3c24xx->lcd.offsize << 1; |
400 | 400 | s3c24xx->lcd.pagewidth_cur = 0; |
401 | vram = (UINT8 *)space | |
401 | vram = (UINT8 *)space.get_read_ptr( s3c24xx->lcd.vramaddr_cur); | |
402 | 402 | } |
403 | 403 | else |
404 | 404 | { |
r17963 | r17964 | |
1611 | 1611 | s3c24xx_t *s3c24xx = get_token( device); |
1612 | 1612 | s3c24xx_dma_regs_t *regs = &s3c24xx->dma[ch].regs; |
1613 | 1613 | UINT32 curr_tc, curr_src, curr_dst; |
1614 | address_space | |
1614 | address_space &space = *device->machine().device( "maincpu")->memory().space( AS_PROGRAM); | |
1615 | 1615 | int dsz, inc_src, inc_dst, servmode, tsz; |
1616 | 1616 | const UINT32 ch_int[] = { S3C24XX_INT_DMA0, S3C24XX_INT_DMA1, S3C24XX_INT_DMA2, S3C24XX_INT_DMA3}; |
1617 | 1617 | verboselog( device->machine(), 5, "DMA %d trigger\n", ch); |
r17963 | r17964 | |
1636 | 1636 | { |
1637 | 1637 | switch (dsz) |
1638 | 1638 | { |
1639 | case 0 : space->write_byte( curr_dst, space->read_byte( curr_src)); break; | |
1640 | case 1 : space->write_word( curr_dst, space->read_word( curr_src)); break; | |
1641 | case 2 : space->write_dword( curr_dst, space->read_dword( curr_src)); break; | |
1639 | case 0 : space.write_byte( curr_dst, space.read_byte( curr_src)); break; | |
1640 | case 1 : space.write_word( curr_dst, space.read_word( curr_src)); break; | |
1641 | case 2 : space.write_dword( curr_dst, space.read_dword( curr_src)); break; | |
1642 | 1642 | } |
1643 | 1643 | if (inc_src == 0) curr_src += (1 << dsz); |
1644 | 1644 | if (inc_dst == 0) curr_dst += (1 << dsz); |
r17963 | r17964 | |
3701 | 3701 | int om1 = iface_core_pin_r( device, S3C24XX_CORE_PIN_OM1); |
3702 | 3702 | if ((om0 == 0) && (om1 == 0)) |
3703 | 3703 | { |
3704 | address_space *space = device->machine().device( "maincpu")->memory().space( AS_PROGRAM); | |
3705 | space->install_ram( 0x00000000, 0x00000fff, s3c24xx->steppingstone); | |
3706 | space->install_ram( 0x40000000, 0x40000fff, s3c24xx->steppingstone); | |
3704 | address_space &space = *device->machine().device( "maincpu")->memory().space( AS_PROGRAM); | |
3705 | space.install_ram( 0x00000000, 0x00000fff, s3c24xx->steppingstone); | |
3706 | space.install_ram( 0x40000000, 0x40000fff, s3c24xx->steppingstone); | |
3707 | 3707 | } |
3708 | 3708 | #endif |
3709 | 3709 | } |
r17963 | r17964 | |
---|---|---|
370 | 370 | /* at386 self test doesn't like this */ |
371 | 371 | at_8042_clear_keyboard_received(); |
372 | 372 | } |
373 | at_8042_check_keyboard(space | |
373 | at_8042_check_keyboard(space.machine()); | |
374 | 374 | break; |
375 | 375 | |
376 | 376 | case 1: |
r17963 | r17964 | |
398 | 398 | break; |
399 | 399 | |
400 | 400 | case 2: |
401 | if (kbdc8042.get_out2(space | |
401 | if (kbdc8042.get_out2(space.machine())) | |
402 | 402 | data |= 0x20; |
403 | 403 | else |
404 | 404 | data &= ~0x20; |
405 | 405 | break; |
406 | 406 | |
407 | 407 | case 4: |
408 | at_8042_check_keyboard(space | |
408 | at_8042_check_keyboard(space.machine()); | |
409 | 409 | |
410 | 410 | if (kbdc8042.keyboard.received || kbdc8042.mouse.received) |
411 | 411 | data |= 1; |
r17963 | r17964 | |
451 | 451 | /* normal case */ |
452 | 452 | kbdc8042.data = data; |
453 | 453 | kbdc8042.sending=1; |
454 | at_keyboard_write(space | |
454 | at_keyboard_write(space.machine(), data); | |
455 | 455 | break; |
456 | 456 | |
457 | 457 | case 1: |
r17963 | r17964 | |
465 | 465 | * | `----------- keyboard clock (output) |
466 | 466 | * `------------ keyboard data (output) |
467 | 467 | */ |
468 | at_8042_set_outport(space | |
468 | at_8042_set_outport(space.machine(), data, 0); | |
469 | 469 | break; |
470 | 470 | |
471 | 471 | case 2: |
472 | 472 | /* preceded by writing 0xD2 to port 60h */ |
473 | 473 | kbdc8042.data = data; |
474 | 474 | kbdc8042.sending=1; |
475 | at_keyboard_write(space | |
475 | at_keyboard_write(space.machine(), data); | |
476 | 476 | break; |
477 | 477 | |
478 | 478 | case 3: |
r17963 | r17964 | |
496 | 496 | case 1: |
497 | 497 | kbdc8042.speaker = data; |
498 | 498 | if (kbdc8042.set_spkr) |
499 | kbdc8042.set_spkr(space | |
499 | kbdc8042.set_spkr(space.machine(), kbdc8042.speaker); | |
500 | 500 | |
501 | 501 | break; |
502 | 502 | |
r17963 | r17964 | |
519 | 519 | kbdc8042.mouse.on = 1; |
520 | 520 | break; |
521 | 521 | case 0xa9: /* test mouse */ |
522 | at_8042_receive(space | |
522 | at_8042_receive(space.machine(), PS2_MOUSE_ON ? 0x00 : 0xff); | |
523 | 523 | break; |
524 | 524 | case 0xaa: /* selftest */ |
525 | at_8042_receive(space | |
525 | at_8042_receive(space.machine(), 0x55); | |
526 | 526 | break; |
527 | 527 | case 0xab: /* test keyboard */ |
528 | at_8042_receive(space | |
528 | at_8042_receive(space.machine(), KEYBOARD_ON ? 0x00 : 0xff); | |
529 | 529 | break; |
530 | 530 | case 0xad: /* disable keyboard interface */ |
531 | 531 | kbdc8042.keyboard.on = 0; |
r17963 | r17964 | |
543 | 543 | * | `----------- 1=primary display is MDA, 0=CGA |
544 | 544 | * `------------ 1=keyboard not inhibited; 0=inhibited |
545 | 545 | */ |
546 | at_8042_receive(space | |
546 | at_8042_receive(space.machine(), kbdc8042.inport); | |
547 | 547 | break; |
548 | 548 | case 0xc1: /* read input port 3..0 until write to 0x60 */ |
549 | 549 | kbdc8042.status_read_mode = 1; |
r17963 | r17964 | |
552 | 552 | kbdc8042.status_read_mode = 2; |
553 | 553 | break; |
554 | 554 | case 0xd0: /* read output port */ |
555 | at_8042_receive(space | |
555 | at_8042_receive(space.machine(), kbdc8042.outport); | |
556 | 556 | break; |
557 | 557 | case 0xd1: |
558 | 558 | /* write output port; next byte written to port 60h is placed on |
r17963 | r17964 | |
581 | 581 | break; |
582 | 582 | case 0xe0: |
583 | 583 | /* read test inputs; read T1/T0 test inputs into bit 1/0 */ |
584 | at_8042_receive(space | |
584 | at_8042_receive(space.machine(), 0x00); | |
585 | 585 | break; |
586 | 586 | |
587 | 587 | case 0xf0: |
r17963 | r17964 | |
597 | 597 | * the bits low set in the command byte. The only pulse that has |
598 | 598 | * an effect currently is bit 0, which pulses the CPU's reset line |
599 | 599 | */ |
600 | space->machine().firstcpu->set_input_line(INPUT_LINE_RESET, PULSE_LINE); | |
601 | at_8042_set_outport(space->machine(), kbdc8042.outport | 0x02, 0); | |
600 | space.machine().firstcpu->set_input_line(INPUT_LINE_RESET, PULSE_LINE); | |
601 | at_8042_set_outport(space.machine(), kbdc8042.outport | 0x02, 0); | |
602 | 602 | break; |
603 | 603 | } |
604 | 604 | kbdc8042.sending = 1; |
r17963 | r17964 | |
---|---|---|
81 | 81 | if (latch8->has_read) |
82 | 82 | { |
83 | 83 | /* temporary hack until all relevant systems are devices */ |
84 | address_space | |
84 | address_space &space = device->machine().driver_data()->generic_space(); | |
85 | 85 | int i; |
86 | 86 | for (i=0; i<8; i++) |
87 | 87 | { |
r17963 | r17964 | |
---|---|---|
176 | 176 | break; |
177 | 177 | |
178 | 178 | case 0xf: //Load Date |
179 | //space | |
179 | //space.machine().base_datetime(m_systime); | |
180 | 180 | break; |
181 | 181 | } |
182 | 182 | } |
r17963 | r17964 | |
---|---|---|
38 | 38 | |
39 | 39 | DEVICE_START( s3c2400 ) |
40 | 40 | { |
41 | address_space | |
41 | address_space &space = *device->machine().device( "maincpu")->memory().space( AS_PROGRAM); | |
42 | 42 | DEVICE_START_CALL(s3c24xx); |
43 | space->install_legacy_readwrite_handler( *device, 0x14000000, 0x1400003b, FUNC(s3c24xx_memcon_r), FUNC(s3c24xx_memcon_w)); | |
44 | space->install_legacy_readwrite_handler( *device, 0x14200000, 0x1420005b, FUNC(s3c24xx_usb_host_r), FUNC(s3c24xx_usb_host_w)); | |
45 | space->install_legacy_readwrite_handler( *device, 0x14400000, 0x14400017, FUNC(s3c24xx_irq_r), FUNC(s3c24xx_irq_w)); | |
46 | space->install_legacy_readwrite_handler( *device, 0x14600000, 0x1460001b, FUNC(s3c24xx_dma_0_r), FUNC(s3c24xx_dma_0_w)); | |
47 | space->install_legacy_readwrite_handler( *device, 0x14600020, 0x1460003b, FUNC(s3c24xx_dma_1_r), FUNC(s3c24xx_dma_1_w)); | |
48 | space->install_legacy_readwrite_handler( *device, 0x14600040, 0x1460005b, FUNC(s3c24xx_dma_2_r), FUNC(s3c24xx_dma_2_w)); | |
49 | space->install_legacy_readwrite_handler( *device, 0x14600060, 0x1460007b, FUNC(s3c24xx_dma_3_r), FUNC(s3c24xx_dma_3_w)); | |
50 | space->install_legacy_readwrite_handler( *device, 0x14800000, 0x14800017, FUNC(s3c24xx_clkpow_r), FUNC(s3c24xx_clkpow_w)); | |
51 | space->install_legacy_readwrite_handler( *device, 0x14a00000, 0x14a003ff, FUNC(s3c2400_lcd_r), FUNC(s3c24xx_lcd_w)); | |
52 | space->install_legacy_readwrite_handler( *device, 0x14a00400, 0x14a007ff, FUNC(s3c24xx_lcd_palette_r), FUNC(s3c24xx_lcd_palette_w)); | |
53 | space->install_legacy_readwrite_handler( *device, 0x15000000, 0x1500002b, FUNC(s3c24xx_uart_0_r), FUNC(s3c24xx_uart_0_w)); | |
54 | space->install_legacy_readwrite_handler( *device, 0x15004000, 0x1500402b, FUNC(s3c24xx_uart_1_r), FUNC(s3c24xx_uart_1_w)); | |
55 | space->install_legacy_readwrite_handler( *device, 0x15100000, 0x15100043, FUNC(s3c24xx_pwm_r), FUNC(s3c24xx_pwm_w)); | |
56 | space->install_legacy_readwrite_handler( *device, 0x15200140, 0x152001fb, FUNC(s3c24xx_usb_device_r), FUNC(s3c24xx_usb_device_w)); | |
57 | space->install_legacy_readwrite_handler( *device, 0x15300000, 0x1530000b, FUNC(s3c24xx_wdt_r), FUNC(s3c24xx_wdt_w)); | |
58 | space->install_legacy_readwrite_handler( *device, 0x15400000, 0x1540000f, FUNC(s3c24xx_iic_r), FUNC(s3c24xx_iic_w)); | |
59 | space->install_legacy_readwrite_handler( *device, 0x15508000, 0x15508013, FUNC(s3c24xx_iis_r), FUNC(s3c24xx_iis_w)); | |
60 | space->install_legacy_readwrite_handler( *device, 0x15600000, 0x1560005b, FUNC(s3c24xx_gpio_r), FUNC(s3c24xx_gpio_w)); | |
61 | space->install_legacy_readwrite_handler( *device, 0x15700040, 0x1570008b, FUNC(s3c24xx_rtc_r), FUNC(s3c24xx_rtc_w)); | |
62 | space->install_legacy_readwrite_handler( *device, 0x15800000, 0x15800007, FUNC(s3c24xx_adc_r), FUNC(s3c24xx_adc_w)); | |
63 | space->install_legacy_readwrite_handler( *device, 0x15900000, 0x15900017, FUNC(s3c24xx_spi_0_r), FUNC(s3c24xx_spi_0_w)); | |
64 | space->install_legacy_readwrite_handler( *device, 0x15a00000, 0x15a0003f, FUNC(s3c24xx_mmc_r), FUNC(s3c24xx_mmc_w)); | |
43 | space.install_legacy_readwrite_handler( *device, 0x14000000, 0x1400003b, FUNC(s3c24xx_memcon_r), FUNC(s3c24xx_memcon_w)); | |
44 | space.install_legacy_readwrite_handler( *device, 0x14200000, 0x1420005b, FUNC(s3c24xx_usb_host_r), FUNC(s3c24xx_usb_host_w)); | |
45 | space.install_legacy_readwrite_handler( *device, 0x14400000, 0x14400017, FUNC(s3c24xx_irq_r), FUNC(s3c24xx_irq_w)); | |
46 | space.install_legacy_readwrite_handler( *device, 0x14600000, 0x1460001b, FUNC(s3c24xx_dma_0_r), FUNC(s3c24xx_dma_0_w)); | |
47 | space.install_legacy_readwrite_handler( *device, 0x14600020, 0x1460003b, FUNC(s3c24xx_dma_1_r), FUNC(s3c24xx_dma_1_w)); | |
48 | space.install_legacy_readwrite_handler( *device, 0x14600040, 0x1460005b, FUNC(s3c24xx_dma_2_r), FUNC(s3c24xx_dma_2_w)); | |
49 | space.install_legacy_readwrite_handler( *device, 0x14600060, 0x1460007b, FUNC(s3c24xx_dma_3_r), FUNC(s3c24xx_dma_3_w)); | |
50 | space.install_legacy_readwrite_handler( *device, 0x14800000, 0x14800017, FUNC(s3c24xx_clkpow_r), FUNC(s3c24xx_clkpow_w)); | |
51 | space.install_legacy_readwrite_handler( *device, 0x14a00000, 0x14a003ff, FUNC(s3c2400_lcd_r), FUNC(s3c24xx_lcd_w)); | |
52 | space.install_legacy_readwrite_handler( *device, 0x14a00400, 0x14a007ff, FUNC(s3c24xx_lcd_palette_r), FUNC(s3c24xx_lcd_palette_w)); | |
53 | space.install_legacy_readwrite_handler( *device, 0x15000000, 0x1500002b, FUNC(s3c24xx_uart_0_r), FUNC(s3c24xx_uart_0_w)); | |
54 | space.install_legacy_readwrite_handler( *device, 0x15004000, 0x1500402b, FUNC(s3c24xx_uart_1_r), FUNC(s3c24xx_uart_1_w)); | |
55 | space.install_legacy_readwrite_handler( *device, 0x15100000, 0x15100043, FUNC(s3c24xx_pwm_r), FUNC(s3c24xx_pwm_w)); | |
56 | space.install_legacy_readwrite_handler( *device, 0x15200140, 0x152001fb, FUNC(s3c24xx_usb_device_r), FUNC(s3c24xx_usb_device_w)); | |
57 | space.install_legacy_readwrite_handler( *device, 0x15300000, 0x1530000b, FUNC(s3c24xx_wdt_r), FUNC(s3c24xx_wdt_w)); | |
58 | space.install_legacy_readwrite_handler( *device, 0x15400000, 0x1540000f, FUNC(s3c24xx_iic_r), FUNC(s3c24xx_iic_w)); | |
59 | space.install_legacy_readwrite_handler( *device, 0x15508000, 0x15508013, FUNC(s3c24xx_iis_r), FUNC(s3c24xx_iis_w)); | |
60 | space.install_legacy_readwrite_handler( *device, 0x15600000, 0x1560005b, FUNC(s3c24xx_gpio_r), FUNC(s3c24xx_gpio_w)); | |
61 | space.install_legacy_readwrite_handler( *device, 0x15700040, 0x1570008b, FUNC(s3c24xx_rtc_r), FUNC(s3c24xx_rtc_w)); | |
62 | space.install_legacy_readwrite_handler( *device, 0x15800000, 0x15800007, FUNC(s3c24xx_adc_r), FUNC(s3c24xx_adc_w)); | |
63 | space.install_legacy_readwrite_handler( *device, 0x15900000, 0x15900017, FUNC(s3c24xx_spi_0_r), FUNC(s3c24xx_spi_0_w)); | |
64 | space.install_legacy_readwrite_handler( *device, 0x15a00000, 0x15a0003f, FUNC(s3c24xx_mmc_r), FUNC(s3c24xx_mmc_w)); | |
65 | 65 | |
66 | 66 | s3c24xx_video_start( device, device->machine()); |
67 | 67 | } |
r17963 | r17964 | |
---|---|---|
166 | 166 | |
167 | 167 | if (!ACCESSING_BITS_0_7) return; |
168 | 168 | |
169 | // logerror("CPU #0 PC %06X: TMP68301 Reg %04X<-%04X & %04X\n",space | |
169 | // logerror("CPU #0 PC %06X: TMP68301 Reg %04X<-%04X & %04X\n",space.device().safe_pc(),offset*2,data,mem_mask^0xffff); | |
170 | 170 | |
171 | 171 | switch( offset * 2 ) |
172 | 172 | { |
r17963 | r17964 | |
177 | 177 | { |
178 | 178 | int i = ((offset*2) >> 5) & 3; |
179 | 179 | |
180 | tmp68301_update_timer( space | |
180 | tmp68301_update_timer( space.machine(), i ); | |
181 | 181 | } |
182 | 182 | break; |
183 | 183 | } |
r17963 | r17964 | |
---|---|---|
38 | 38 | |
39 | 39 | DEVICE_START( s3c2410 ) |
40 | 40 | { |
41 | address_space | |
41 | address_space &space = *device->machine().device( "maincpu")->memory().space( AS_PROGRAM); | |
42 | 42 | DEVICE_START_CALL(s3c24xx); |
43 | space->install_legacy_readwrite_handler( *device, 0x48000000, 0x4800003b, FUNC(s3c24xx_memcon_r), FUNC(s3c24xx_memcon_w)); | |
44 | space->install_legacy_readwrite_handler( *device, 0x49000000, 0x4900005b, FUNC(s3c24xx_usb_host_r), FUNC(s3c24xx_usb_host_w)); | |
45 | space->install_legacy_readwrite_handler( *device, 0x4a000000, 0x4a00001f, FUNC(s3c24xx_irq_r), FUNC(s3c24xx_irq_w)); | |
46 | space->install_legacy_readwrite_handler( *device, 0x4b000000, 0x4b000023, FUNC(s3c24xx_dma_0_r), FUNC(s3c24xx_dma_0_w)); | |
47 | space->install_legacy_readwrite_handler( *device, 0x4b000040, 0x4b000063, FUNC(s3c24xx_dma_1_r), FUNC(s3c24xx_dma_1_w)); | |
48 | space->install_legacy_readwrite_handler( *device, 0x4b000080, 0x4b0000a3, FUNC(s3c24xx_dma_2_r), FUNC(s3c24xx_dma_2_w)); | |
49 | space->install_legacy_readwrite_handler( *device, 0x4b0000c0, 0x4b0000e3, FUNC(s3c24xx_dma_3_r), FUNC(s3c24xx_dma_3_w)); | |
50 | space->install_legacy_readwrite_handler( *device, 0x4c000000, 0x4c000017, FUNC(s3c24xx_clkpow_r), FUNC(s3c24xx_clkpow_w)); | |
51 | space->install_legacy_readwrite_handler( *device, 0x4d000000, 0x4d000063, FUNC(s3c2410_lcd_r), FUNC(s3c24xx_lcd_w)); | |
52 | space->install_legacy_readwrite_handler( *device, 0x4d000400, 0x4d0007ff, FUNC(s3c24xx_lcd_palette_r), FUNC(s3c24xx_lcd_palette_w)); | |
53 | space->install_legacy_readwrite_handler( *device, 0x4e000000, 0x4e000017, FUNC(s3c24xx_nand_r), FUNC(s3c24xx_nand_w)); | |
54 | space->install_legacy_readwrite_handler( *device, 0x50000000, 0x5000002b, FUNC(s3c24xx_uart_0_r), FUNC(s3c24xx_uart_0_w)); | |
55 | space->install_legacy_readwrite_handler( *device, 0x50004000, 0x5000402b, FUNC(s3c24xx_uart_1_r), FUNC(s3c24xx_uart_1_w)); | |
56 | space->install_legacy_readwrite_handler( *device, 0x50008000, 0x5000802b, FUNC(s3c24xx_uart_2_r), FUNC(s3c24xx_uart_2_w)); | |
57 | space->install_legacy_readwrite_handler( *device, 0x51000000, 0x51000043, FUNC(s3c24xx_pwm_r), FUNC(s3c24xx_pwm_w)); | |
58 | space->install_legacy_readwrite_handler( *device, 0x52000140, 0x5200026f, FUNC(s3c24xx_usb_device_r), FUNC(s3c24xx_usb_device_w)); | |
59 | space->install_legacy_readwrite_handler( *device, 0x53000000, 0x5300000b, FUNC(s3c24xx_wdt_r), FUNC(s3c24xx_wdt_w)); | |
60 | space->install_legacy_readwrite_handler( *device, 0x54000000, 0x5400000f, FUNC(s3c24xx_iic_r), FUNC(s3c24xx_iic_w)); | |
61 | space->install_legacy_readwrite_handler( *device, 0x55000000, 0x55000013, FUNC(s3c24xx_iis_r), FUNC(s3c24xx_iis_w)); | |
62 | space->install_legacy_readwrite_handler( *device, 0x56000000, 0x560000bf, FUNC(s3c24xx_gpio_r), FUNC(s3c24xx_gpio_w)); | |
63 | space->install_legacy_readwrite_handler( *device, 0x57000040, 0x5700008b, FUNC(s3c24xx_rtc_r), FUNC(s3c24xx_rtc_w)); | |
64 | space->install_legacy_readwrite_handler( *device, 0x58000000, 0x58000013, FUNC(s3c24xx_adc_r), FUNC(s3c24xx_adc_w)); | |
65 | space->install_legacy_readwrite_handler( *device, 0x59000000, 0x59000017, FUNC(s3c24xx_spi_0_r), FUNC(s3c24xx_spi_0_w)); | |
66 | space->install_legacy_readwrite_handler( *device, 0x59000020, 0x59000037, FUNC(s3c24xx_spi_1_r), FUNC(s3c24xx_spi_1_w)); | |
67 | space->install_legacy_readwrite_handler( *device, 0x5a000000, 0x5a000043, FUNC(s3c24xx_sdi_r), FUNC(s3c24xx_sdi_w)); | |
43 | space.install_legacy_readwrite_handler( *device, 0x48000000, 0x4800003b, FUNC(s3c24xx_memcon_r), FUNC(s3c24xx_memcon_w)); | |
44 | space.install_legacy_readwrite_handler( *device, 0x49000000, 0x4900005b, FUNC(s3c24xx_usb_host_r), FUNC(s3c24xx_usb_host_w)); | |
45 | space.install_legacy_readwrite_handler( *device, 0x4a000000, 0x4a00001f, FUNC(s3c24xx_irq_r), FUNC(s3c24xx_irq_w)); | |
46 | space.install_legacy_readwrite_handler( *device, 0x4b000000, 0x4b000023, FUNC(s3c24xx_dma_0_r), FUNC(s3c24xx_dma_0_w)); | |
47 | space.install_legacy_readwrite_handler( *device, 0x4b000040, 0x4b000063, FUNC(s3c24xx_dma_1_r), FUNC(s3c24xx_dma_1_w)); | |
48 | space.install_legacy_readwrite_handler( *device, 0x4b000080, 0x4b0000a3, FUNC(s3c24xx_dma_2_r), FUNC(s3c24xx_dma_2_w)); | |
49 | space.install_legacy_readwrite_handler( *device, 0x4b0000c0, 0x4b0000e3, FUNC(s3c24xx_dma_3_r), FUNC(s3c24xx_dma_3_w)); | |
50 | space.install_legacy_readwrite_handler( *device, 0x4c000000, 0x4c000017, FUNC(s3c24xx_clkpow_r), FUNC(s3c24xx_clkpow_w)); | |
51 | space.install_legacy_readwrite_handler( *device, 0x4d000000, 0x4d000063, FUNC(s3c2410_lcd_r), FUNC(s3c24xx_lcd_w)); | |
52 | space.install_legacy_readwrite_handler( *device, 0x4d000400, 0x4d0007ff, FUNC(s3c24xx_lcd_palette_r), FUNC(s3c24xx_lcd_palette_w)); | |
53 | space.install_legacy_readwrite_handler( *device, 0x4e000000, 0x4e000017, FUNC(s3c24xx_nand_r), FUNC(s3c24xx_nand_w)); | |
54 | space.install_legacy_readwrite_handler( *device, 0x50000000, 0x5000002b, FUNC(s3c24xx_uart_0_r), FUNC(s3c24xx_uart_0_w)); | |
55 | space.install_legacy_readwrite_handler( *device, 0x50004000, 0x5000402b, FUNC(s3c24xx_uart_1_r), FUNC(s3c24xx_uart_1_w)); | |
56 | space.install_legacy_readwrite_handler( *device, 0x50008000, 0x5000802b, FUNC(s3c24xx_uart_2_r), FUNC(s3c24xx_uart_2_w)); | |
57 | space.install_legacy_readwrite_handler( *device, 0x51000000, 0x51000043, FUNC(s3c24xx_pwm_r), FUNC(s3c24xx_pwm_w)); | |
58 | space.install_legacy_readwrite_handler( *device, 0x52000140, 0x5200026f, FUNC(s3c24xx_usb_device_r), FUNC(s3c24xx_usb_device_w)); | |
59 | space.install_legacy_readwrite_handler( *device, 0x53000000, 0x5300000b, FUNC(s3c24xx_wdt_r), FUNC(s3c24xx_wdt_w)); | |
60 | space.install_legacy_readwrite_handler( *device, 0x54000000, 0x5400000f, FUNC(s3c24xx_iic_r), FUNC(s3c24xx_iic_w)); | |
61 | space.install_legacy_readwrite_handler( *device, 0x55000000, 0x55000013, FUNC(s3c24xx_iis_r), FUNC(s3c24xx_iis_w)); | |
62 | space.install_legacy_readwrite_handler( *device, 0x56000000, 0x560000bf, FUNC(s3c24xx_gpio_r), FUNC(s3c24xx_gpio_w)); | |
63 | space.install_legacy_readwrite_handler( *device, 0x57000040, 0x5700008b, FUNC(s3c24xx_rtc_r), FUNC(s3c24xx_rtc_w)); | |
64 | space.install_legacy_readwrite_handler( *device, 0x58000000, 0x58000013, FUNC(s3c24xx_adc_r), FUNC(s3c24xx_adc_w)); | |
65 | space.install_legacy_readwrite_handler( *device, 0x59000000, 0x59000017, FUNC(s3c24xx_spi_0_r), FUNC(s3c24xx_spi_0_w)); | |
66 | space.install_legacy_readwrite_handler( *device, 0x59000020, 0x59000037, FUNC(s3c24xx_spi_1_r), FUNC(s3c24xx_spi_1_w)); | |
67 | space.install_legacy_readwrite_handler( *device, 0x5a000000, 0x5a000043, FUNC(s3c24xx_sdi_r), FUNC(s3c24xx_sdi_w)); | |
68 | 68 | |
69 | 69 | s3c24xx_video_start( device, device->machine()); |
70 | 70 | } |
r17963 | r17964 | |
---|---|---|
366 | 366 | // Return the value of a page register |
367 | 367 | READ8_HANDLER( dgn_beta_page_r ) |
368 | 368 | { |
369 | dgn_beta_state *state = space | |
369 | dgn_beta_state *state = space.machine().driver_data<dgn_beta_state>(); | |
370 | 370 | return state->m_PageRegs[state->m_PIATaskReg][offset].value; |
371 | 371 | } |
372 | 372 | |
r17963 | r17964 | |
376 | 376 | |
377 | 377 | WRITE8_HANDLER( dgn_beta_page_w ) |
378 | 378 | { |
379 | dgn_beta_state *state = space | |
379 | dgn_beta_state *state = space.machine().driver_data<dgn_beta_state>(); | |
380 | 380 | state->m_PageRegs[state->m_PIATaskReg][offset].value=data; |
381 | 381 | |
382 | 382 | LOG_PAGE_WRITE(("PageRegWrite : task=$%X offset=$%X value=$%X\n",state->m_PIATaskReg,offset,data)); |
383 | 383 | |
384 | 384 | if (state->m_EnableMapRegs) |
385 | 385 | { |
386 | UpdateBanks(space | |
386 | UpdateBanks(space.machine(), offset,offset); | |
387 | 387 | if (offset==15) |
388 | UpdateBanks(space | |
388 | UpdateBanks(space.machine(), offset+1,offset+1); | |
389 | 389 | } |
390 | 390 | } |
391 | 391 | |
r17963 | r17964 | |
399 | 399 | |
400 | 400 | static WRITE8_HANDLER( dgnbeta_ram_b0_w ) |
401 | 401 | { |
402 | dgn_beta_bank_memory(space | |
402 | dgn_beta_bank_memory(space.machine(),offset,data,0); | |
403 | 403 | } |
404 | 404 | |
405 | 405 | static WRITE8_HANDLER( dgnbeta_ram_b1_w ) |
406 | 406 | { |
407 | dgn_beta_bank_memory(space | |
407 | dgn_beta_bank_memory(space.machine(),offset,data,1); | |
408 | 408 | } |
409 | 409 | |
410 | 410 | static WRITE8_HANDLER( dgnbeta_ram_b2_w ) |
411 | 411 | { |
412 | dgn_beta_bank_memory(space | |
412 | dgn_beta_bank_memory(space.machine(),offset,data,2); | |
413 | 413 | } |
414 | 414 | |
415 | 415 | static WRITE8_HANDLER( dgnbeta_ram_b3_w ) |
416 | 416 | { |
417 | dgn_beta_bank_memory(space | |
417 | dgn_beta_bank_memory(space.machine(),offset,data,3); | |
418 | 418 | } |
419 | 419 | |
420 | 420 | static WRITE8_HANDLER( dgnbeta_ram_b4_w ) |
421 | 421 | { |
422 | dgn_beta_bank_memory(space | |
422 | dgn_beta_bank_memory(space.machine(),offset,data,4); | |
423 | 423 | } |
424 | 424 | |
425 | 425 | static WRITE8_HANDLER( dgnbeta_ram_b5_w ) |
426 | 426 | { |
427 | dgn_beta_bank_memory(space | |
427 | dgn_beta_bank_memory(space.machine(),offset,data,5); | |
428 | 428 | } |
429 | 429 | |
430 | 430 | static WRITE8_HANDLER( dgnbeta_ram_b6_w ) |
431 | 431 | { |
432 | dgn_beta_bank_memory(space | |
432 | dgn_beta_bank_memory(space.machine(),offset,data,6); | |
433 | 433 | } |
434 | 434 | |
435 | 435 | static WRITE8_HANDLER( dgnbeta_ram_b7_w ) |
436 | 436 | { |
437 | dgn_beta_bank_memory(space | |
437 | dgn_beta_bank_memory(space.machine(),offset,data,7); | |
438 | 438 | } |
439 | 439 | |
440 | 440 | static WRITE8_HANDLER( dgnbeta_ram_b8_w ) |
441 | 441 | { |
442 | dgn_beta_bank_memory(space | |
442 | dgn_beta_bank_memory(space.machine(),offset,data,8); | |
443 | 443 | } |
444 | 444 | |
445 | 445 | static WRITE8_HANDLER( dgnbeta_ram_b9_w ) |
446 | 446 | { |
447 | dgn_beta_bank_memory(space | |
447 | dgn_beta_bank_memory(space.machine(),offset,data,9); | |
448 | 448 | } |
449 | 449 | |
450 | 450 | static WRITE8_HANDLER( dgnbeta_ram_bA_w ) |
451 | 451 | { |
452 | dgn_beta_bank_memory(space | |
452 | dgn_beta_bank_memory(space.machine(),offset,data,10); | |
453 | 453 | } |
454 | 454 | |
455 | 455 | static WRITE8_HANDLER( dgnbeta_ram_bB_w ) |
456 | 456 | { |
457 | dgn_beta_bank_memory(space | |
457 | dgn_beta_bank_memory(space.machine(),offset,data,11); | |
458 | 458 | } |
459 | 459 | |
460 | 460 | static WRITE8_HANDLER( dgnbeta_ram_bC_w ) |
461 | 461 | { |
462 | dgn_beta_bank_memory(space | |
462 | dgn_beta_bank_memory(space.machine(),offset,data,12); | |
463 | 463 | } |
464 | 464 | |
465 | 465 | static WRITE8_HANDLER( dgnbeta_ram_bD_w ) |
466 | 466 | { |
467 | dgn_beta_bank_memory(space | |
467 | dgn_beta_bank_memory(space.machine(),offset,data,13); | |
468 | 468 | } |
469 | 469 | |
470 | 470 | static WRITE8_HANDLER( dgnbeta_ram_bE_w ) |
471 | 471 | { |
472 | dgn_beta_bank_memory(space | |
472 | dgn_beta_bank_memory(space.machine(),offset,data,14); | |
473 | 473 | } |
474 | 474 | |
475 | 475 | static WRITE8_HANDLER( dgnbeta_ram_bF_w ) |
476 | 476 | { |
477 | dgn_beta_bank_memory(space | |
477 | dgn_beta_bank_memory(space.machine(),offset,data,15); | |
478 | 478 | } |
479 | 479 | |
480 | 480 | static WRITE8_HANDLER( dgnbeta_ram_bG_w ) |
481 | 481 | { |
482 | dgn_beta_bank_memory(space | |
482 | dgn_beta_bank_memory(space.machine(),offset,data,16); | |
483 | 483 | } |
484 | 484 | |
485 | 485 | /* |
r17963 | r17964 | |
934 | 934 | READ8_HANDLER(dgnbeta_wd2797_r) |
935 | 935 | { |
936 | 936 | int result = 0; |
937 | device_t *fdc = space | |
937 | device_t *fdc = space.machine().device(FDC_TAG); | |
938 | 938 | |
939 | 939 | switch(offset & 0x03) |
940 | 940 | { |
941 | 941 | case 0: |
942 | result = wd17xx_status_r(fdc, | |
942 | result = wd17xx_status_r(fdc, space, 0); | |
943 | 943 | LOG_DISK(("Disk status=%2.2X\n",result)); |
944 | 944 | break; |
945 | 945 | case 1: |
946 | result = wd17xx_track_r(fdc, | |
946 | result = wd17xx_track_r(fdc, space, 0); | |
947 | 947 | break; |
948 | 948 | case 2: |
949 | result = wd17xx_sector_r(fdc, | |
949 | result = wd17xx_sector_r(fdc, space, 0); | |
950 | 950 | break; |
951 | 951 | case 3: |
952 | result = wd17xx_data_r(fdc, | |
952 | result = wd17xx_data_r(fdc, space, 0); | |
953 | 953 | break; |
954 | 954 | default: |
955 | 955 | break; |
r17963 | r17964 | |
960 | 960 | |
961 | 961 | WRITE8_HANDLER(dgnbeta_wd2797_w) |
962 | 962 | { |
963 | dgn_beta_state *state = space->machine().driver_data<dgn_beta_state>(); | |
964 | device_t *fdc = space->machine().device(FDC_TAG); | |
963 | dgn_beta_state *state = space.machine().driver_data<dgn_beta_state>(); | |
964 | device_t *fdc = space.machine().device(FDC_TAG); | |
965 | 965 | |
966 | 966 | state->m_wd2797_written=1; |
967 | 967 | |
r17963 | r17964 | |
972 | 972 | /* But only for Type 3/4 commands */ |
973 | 973 | if(data & 0x80) |
974 | 974 | wd17xx_set_side(fdc,(data & 0x02) ? 1 : 0); |
975 | wd17xx_command_w(fdc, | |
975 | wd17xx_command_w(fdc, space, 0, data); | |
976 | 976 | break; |
977 | 977 | case 1: |
978 | wd17xx_track_w(fdc, | |
978 | wd17xx_track_w(fdc, space, 0, data); | |
979 | 979 | break; |
980 | 980 | case 2: |
981 | wd17xx_sector_w(fdc, | |
981 | wd17xx_sector_w(fdc, space, 0, data); | |
982 | 982 | break; |
983 | 983 | case 3: |
984 | wd17xx_data_w(fdc, | |
984 | wd17xx_data_w(fdc, space, 0, data); | |
985 | 985 | break; |
986 | 986 | }; |
987 | 987 | } |
r17963 | r17964 | |
---|---|---|
172 | 172 | { |
173 | 173 | // printf("written %x\n", data); |
174 | 174 | int bank = data & 0x03; |
175 | space | |
175 | space.machine().root_device().membank("8000")->set_base(space.machine().root_device().memregion("lslot")->base() + bank * 0x2000); | |
176 | 176 | } |
177 | 177 | |
178 | 178 | static WRITE8_HANDLER( w64_bank_w ) |
r17963 | r17964 | |
180 | 180 | // printf("write to %x\n", offset); |
181 | 181 | |
182 | 182 | if (offset < 8) |
183 | space | |
183 | space.machine().root_device().membank("a000")->set_base(space.machine().root_device().memregion("lslot")->base() + offset * 0x2000); | |
184 | 184 | else |
185 | space | |
185 | space.machine().root_device().membank("a000")->set_base(space.machine().root_device().memregion("maincpu")->base()); | |
186 | 186 | // FIXME: writes to 0x8-0xf should disable the cart |
187 | 187 | } |
188 | 188 | |
r17963 | r17964 | |
192 | 192 | // printf("write to %x\n", offset); |
193 | 193 | |
194 | 194 | if (offset < 8) |
195 | space | |
195 | space.machine().root_device().membank("a000")->set_base(space.machine().root_device().memregion("lslot")->base() + (7 - offset) * 0x2000); | |
196 | 196 | else |
197 | space | |
197 | space.machine().root_device().membank("a000")->set_base(space.machine().root_device().memregion("maincpu")->base()); | |
198 | 198 | // FIXME: writes to 0x8-0xf should disable the cart |
199 | 199 | } |
200 | 200 | |
r17963 | r17964 | |
202 | 202 | { |
203 | 203 | // printf("write to %x\n", 0x8000 + offset); |
204 | 204 | if (offset >= 0xff6 && offset <= 0xff9) |
205 | space | |
205 | space.machine().root_device().membank("8000")->set_base(space.machine().root_device().memregion("lslot")->base() + 0x0000 + (offset - 0xff6) * 0x1000); | |
206 | 206 | } |
207 | 207 | |
208 | 208 | static WRITE8_HANDLER( bbsb_bankh_w ) |
209 | 209 | { |
210 | 210 | // printf("write to %x\n", 0x9000 + offset); |
211 | 211 | if (offset >= 0xff6 && offset <= 0xff9) |
212 | space | |
212 | space.machine().root_device().membank("9000")->set_base(space.machine().root_device().memregion("lslot")->base() + 0x4000 + (offset - 0xff6) * 0x1000); | |
213 | 213 | } |
214 | 214 | |
215 | 215 | static WRITE8_HANDLER( oss_034m_w ) |
r17963 | r17964 | |
218 | 218 | { |
219 | 219 | case 0: |
220 | 220 | case 1: |
221 | space->machine().root_device().membank("a000")->set_base(space->machine().root_device().memregion("lslot")->base()); | |
222 | space->machine().root_device().membank("b000")->set_base(space->machine().root_device().memregion("lslot")->base() + 0x3000); | |
221 | space.machine().root_device().membank("a000")->set_base(space.machine().root_device().memregion("lslot")->base()); | |
222 | space.machine().root_device().membank("b000")->set_base(space.machine().root_device().memregion("lslot")->base() + 0x3000); | |
223 | 223 | break; |
224 | 224 | case 2: |
225 | 225 | case 6: |
226 | 226 | // docs says this should put 0xff in the 0xa000 bank -> let's point to the end of the cart |
227 | space->machine().root_device().membank("a000")->set_base(space->machine().root_device().memregion("lslot")->base() + 0x4000); | |
228 | space->machine().root_device().membank("b000")->set_base(space->machine().root_device().memregion("lslot")->base() + 0x3000); | |
227 | space.machine().root_device().membank("a000")->set_base(space.machine().root_device().memregion("lslot")->base() + 0x4000); | |
228 | space.machine().root_device().membank("b000")->set_base(space.machine().root_device().memregion("lslot")->base() + 0x3000); | |
229 | 229 | break; |
230 | 230 | case 3: |
231 | 231 | case 7: |
232 | space->machine().root_device().membank("a000")->set_base(space->machine().root_device().memregion("lslot")->base() + 0x1000); | |
233 | space->machine().root_device().membank("b000")->set_base(space->machine().root_device().memregion("lslot")->base() + 0x3000); | |
232 | space.machine().root_device().membank("a000")->set_base(space.machine().root_device().memregion("lslot")->base() + 0x1000); | |
233 | space.machine().root_device().membank("b000")->set_base(space.machine().root_device().memregion("lslot")->base() + 0x3000); | |
234 | 234 | break; |
235 | 235 | case 4: |
236 | 236 | case 5: |
237 | space->machine().root_device().membank("a000")->set_base(space->machine().root_device().memregion("lslot")->base() + 0x2000); | |
238 | space->machine().root_device().membank("b000")->set_base(space->machine().root_device().memregion("lslot")->base() + 0x3000); | |
237 | space.machine().root_device().membank("a000")->set_base(space.machine().root_device().memregion("lslot")->base() + 0x2000); | |
238 | space.machine().root_device().membank("b000")->set_base(space.machine().root_device().memregion("lslot")->base() + 0x3000); | |
239 | 239 | break; |
240 | 240 | default: |
241 | space->machine().root_device().membank("a000")->set_base(space->machine().root_device().memregion("maincpu")->base() + 0xa000); | |
242 | space->machine().root_device().membank("b000")->set_base(space->machine().root_device().memregion("maincpu")->base() + 0xb000); | |
241 | space.machine().root_device().membank("a000")->set_base(space.machine().root_device().memregion("maincpu")->base() + 0xa000); | |
242 | space.machine().root_device().membank("b000")->set_base(space.machine().root_device().memregion("maincpu")->base() + 0xb000); | |
243 | 243 | break; |
244 | 244 | } |
245 | 245 | } |
r17963 | r17964 | |
249 | 249 | switch (offset & 0x09) |
250 | 250 | { |
251 | 251 | case 0: |
252 | space->machine().root_device().membank("a000")->set_base(space->machine().root_device().memregion("lslot")->base() + 0x1000); | |
253 | space->machine().root_device().membank("b000")->set_base(space->machine().root_device().memregion("lslot")->base()); | |
252 | space.machine().root_device().membank("a000")->set_base(space.machine().root_device().memregion("lslot")->base() + 0x1000); | |
253 | space.machine().root_device().membank("b000")->set_base(space.machine().root_device().memregion("lslot")->base()); | |
254 | 254 | break; |
255 | 255 | case 1: |
256 | space->machine().root_device().membank("a000")->set_base(space->machine().root_device().memregion("lslot")->base() + 0x3000); | |
257 | space->machine().root_device().membank("b000")->set_base(space->machine().root_device().memregion("lslot")->base()); | |
256 | space.machine().root_device().membank("a000")->set_base(space.machine().root_device().memregion("lslot")->base() + 0x3000); | |
257 | space.machine().root_device().membank("b000")->set_base(space.machine().root_device().memregion("lslot")->base()); | |
258 | 258 | break; |
259 | 259 | case 8: |
260 | space->machine().root_device().membank("a000")->set_base(space->machine().root_device().memregion("maincpu")->base() + 0xa000); | |
261 | space->machine().root_device().membank("b000")->set_base(space->machine().root_device().memregion("maincpu")->base() + 0xb000); | |
260 | space.machine().root_device().membank("a000")->set_base(space.machine().root_device().memregion("maincpu")->base() + 0xa000); | |
261 | space.machine().root_device().membank("b000")->set_base(space.machine().root_device().memregion("maincpu")->base() + 0xb000); | |
262 | 262 | break; |
263 | 263 | case 9: |
264 | space->machine().root_device().membank("a000")->set_base(space->machine().root_device().memregion("lslot")->base() + 0x2000); | |
265 | space->machine().root_device().membank("b000")->set_base(space->machine().root_device().memregion("lslot")->base()); | |
264 | space.machine().root_device().membank("a000")->set_base(space.machine().root_device().memregion("lslot")->base() + 0x2000); | |
265 | space.machine().root_device().membank("b000")->set_base(space.machine().root_device().memregion("lslot")->base()); | |
266 | 266 | break; |
267 | 267 | } |
268 | 268 | } |
r17963 | r17964 | |
284 | 284 | static READ8_HANDLER( bbsb_bankl_r ) |
285 | 285 | { |
286 | 286 | // return data from the selected bank (0,1,2,3) |
287 | UINT8 *mem = space | |
287 | UINT8 *mem = space.machine().root_device().memregion("lslot")->base(); | |
288 | 288 | return &mem[0x0000 + bbsb_bankl * 0x1000]; |
289 | 289 | } |
290 | 290 | |
291 | 291 | static READ8_HANDLER( bbsb_bankh_r ) |
292 | 292 | { |
293 | 293 | // return data from the selected bank (4,5,6,7) |
294 | UINT8 *mem = space | |
294 | UINT8 *mem = space.machine().root_device().memregion("lslot")->base(); | |
295 | 295 | return &mem[0x4000 + bbsb_bankh * 0x1000]; |
296 | 296 | } |
297 | 297 | #endif |
r17963 | r17964 | |
658 | 658 | |
659 | 659 | static WRITE8_HANDLER( xegs_bankswitch ) |
660 | 660 | { |
661 | UINT8 *cart = space | |
661 | UINT8 *cart = space.machine().root_device().memregion("user1")->base(); | |
662 | 662 | data &= xegs_banks - 1; |
663 | space | |
663 | space.machine().root_device().membank("bank0")->set_base(cart + data * 0x2000); | |
664 | 664 | } |
665 | 665 | |
666 | 666 | MACHINE_START( xegs ) |
667 | 667 | { |
668 | address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); | |
669 | UINT8 *cart = space->machine().root_device().memregion("user1")->base(); | |
670 | UINT8 *cpu = space->machine().root_device().memregion("maincpu")->base(); | |
668 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
669 | UINT8 *cart = space.machine().root_device().memregion("user1")->base(); | |
670 | UINT8 *cpu = space.machine().root_device().memregion("maincpu")->base(); | |
671 | 671 | |
672 | 672 | atari_machine_start(machine); |
673 | space | |
673 | space.install_legacy_write_handler(0xd500, 0xd5ff, FUNC(xegs_bankswitch)); | |
674 | 674 | |
675 | 675 | if (xegs_cart) |
676 | 676 | { |
r17963 | r17964 | |
---|---|---|
327 | 327 | apple3_state *state = machine.driver_data<apple3_state>(); |
328 | 328 | UINT16 bank; |
329 | 329 | UINT8 page; |
330 | address_space | |
330 | address_space& space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
331 | 331 | |
332 | 332 | if (LOG_MEMORY) |
333 | 333 | { |
r17963 | r17964 | |
374 | 374 | /* install bank 8 (C000-CFFF) */ |
375 | 375 | if (state->m_via_0_a & 0x40) |
376 | 376 | { |
377 | space->install_read_handler(0xC000, 0xC0FF, read8_delegate(FUNC(apple3_state::apple3_c0xx_r),state)); | |
378 | space->install_write_handler(0xC000, 0xC0FF, write8_delegate(FUNC(apple3_state::apple3_c0xx_w),state)); | |
377 | space.install_read_handler(0xC000, 0xC0FF, read8_delegate(FUNC(apple3_state::apple3_c0xx_r),state)); | |
378 | space.install_write_handler(0xC000, 0xC0FF, write8_delegate(FUNC(apple3_state::apple3_c0xx_w),state)); | |
379 | 379 | } |
380 | 380 | else |
381 | 381 | { |
382 | space | |
382 | space.install_read_bank(0xC000, 0xC0FF, "bank8"); | |
383 | 383 | if (state->m_via_0_a & 0x08) |
384 | space | |
384 | space.unmap_write(0xC000, 0xC0FF); | |
385 | 385 | else |
386 | space | |
386 | space.install_write_bank(0xC000, 0xC0FF, "bank8"); | |
387 | 387 | apple3_setbank(machine,"bank8", ~0, 0x4000); |
388 | 388 | } |
389 | 389 | |
390 | 390 | /* install bank 9 (C100-C4FF) */ |
391 | 391 | if (state->m_via_0_a & 0x40) |
392 | 392 | { |
393 | space | |
393 | space.nop_readwrite(0xC100, 0xC4FF); | |
394 | 394 | } |
395 | 395 | else |
396 | 396 | { |
397 | space | |
397 | space.install_read_bank(0xC100, 0xC4FF, "bank9"); | |
398 | 398 | if (state->m_via_0_a & 0x08) |
399 | space | |
399 | space.unmap_write(0xC100, 0xC4FF); | |
400 | 400 | else |
401 | space | |
401 | space.install_write_bank(0xC100, 0xC4FF, "bank9"); | |
402 | 402 | apple3_setbank(machine,"bank9", ~0, 0x4100); |
403 | 403 | } |
404 | 404 | |
405 | 405 | /* install bank 10 (C500-C7FF) */ |
406 | space | |
406 | space.install_read_bank(0xC500, 0xC7FF, "bank10"); | |
407 | 407 | if (state->m_via_0_a & 0x08) |
408 | space | |
408 | space.unmap_write(0xC500, 0xC7FF); | |
409 | 409 | else |
410 | space | |
410 | space.install_write_bank(0xC500, 0xC7FF, "bank10"); | |
411 | 411 | apple3_setbank(machine,"bank10", ~0, 0x4500); |
412 | 412 | |
413 | 413 | /* install bank 11 (C800-CFFF) */ |
414 | 414 | if (state->m_via_0_a & 0x40) |
415 | 415 | { |
416 | space | |
416 | space.nop_readwrite(0xC800, 0xCFFF); | |
417 | 417 | } |
418 | 418 | else |
419 | 419 | { |
420 | space | |
420 | space.install_read_bank(0xC800, 0xCFFF, "bank11"); | |
421 | 421 | if (state->m_via_0_a & 0x08) |
422 | space | |
422 | space.unmap_write(0xC800, 0xCFFF); | |
423 | 423 | else |
424 | space | |
424 | space.install_write_bank(0xC800, 0xCFFF, "bank11"); | |
425 | 425 | apple3_setbank(machine,"bank11", ~0, 0x4800); |
426 | 426 | } |
427 | 427 | |
428 | 428 | /* install bank 6 (D000-EFFF) */ |
429 | space | |
429 | space.install_read_bank(0xD000, 0xEFFF, "bank6"); | |
430 | 430 | if (state->m_via_0_a & 0x08) |
431 | space | |
431 | space.unmap_write(0xD000, 0xEFFF); | |
432 | 432 | else |
433 | space | |
433 | space.install_write_bank(0xD000, 0xEFFF, "bank6"); | |
434 | 434 | apple3_setbank(machine,"bank6", ~0, 0x5000); |
435 | 435 | |
436 | 436 | /* install bank 7 (F000-FFFF) */ |
437 | space | |
437 | space.install_read_bank(0xF000, 0xFFFF, "bank7"); | |
438 | 438 | if (state->m_via_0_a & 0x09) |
439 | space | |
439 | space.unmap_write(0xF000, 0xFFFF); | |
440 | 440 | else |
441 | space | |
441 | space.install_write_bank(0xF000, 0xFFFF, "bank7"); | |
442 | 442 | if (state->m_via_0_a & 0x01) |
443 | 443 | state->membank("bank7")->set_base(machine.root_device().memregion("maincpu")->base()); |
444 | 444 | else |
r17963 | r17964 | |
446 | 446 | |
447 | 447 | /* reinstall VIA handlers */ |
448 | 448 | { |
449 | via6522_device *via_0 = space->machine().device<via6522_device>("via6522_0"); | |
450 | via6522_device *via_1 = space->machine().device<via6522_device>("via6522_1"); | |
449 | via6522_device *via_0 = space.machine().device<via6522_device>("via6522_0"); | |
450 | via6522_device *via_1 = space.machine().device<via6522_device>("via6522_1"); | |
451 | 451 | |
452 | space->install_readwrite_handler(0xFFD0, 0xFFDF, 0, 0, read8_delegate(FUNC(via6522_device::read),via_0), write8_delegate(FUNC(via6522_device::write),via_0)); | |
453 | space->install_readwrite_handler(0xFFE0, 0xFFEF, 0, 0, read8_delegate(FUNC(via6522_device::read),via_1), write8_delegate(FUNC(via6522_device::write),via_1)); | |
452 | space.install_readwrite_handler(0xFFD0, 0xFFDF, 0, 0, read8_delegate(FUNC(via6522_device::read),via_0), write8_delegate(FUNC(via6522_device::write),via_0)); | |
453 | space.install_readwrite_handler(0xFFE0, 0xFFEF, 0, 0, read8_delegate(FUNC(via6522_device::read),via_1), write8_delegate(FUNC(via6522_device::write),via_1)); | |
454 | 454 | } |
455 | 455 | } |
456 | 456 |
r17963 | r17964 | |
---|---|---|
565 | 565 | #if 0 |
566 | 566 | mbee_state *state = device->machine().driver_data<mbee_state>(); |
567 | 567 | |
568 | //address_space | |
568 | //address_space &space = *device->machine().device("maincpu")->memory().space(AS_PROGRAM); | |
569 | 569 | /* The printer status connects to the pio ASTB pin, and the printer changing to not |
570 | 570 | busy should signal an interrupt routine at B61C, (next line) but this doesn't work. |
571 | 571 | The line below does what the interrupt should be doing. */ |
572 | 572 | /* But it would break any program loaded to that area of memory, such as CP/M programs */ |
573 | 573 | |
574 | 574 | //state->m_z80pio->strobe_a(centronics_busy_r(state->m_printer)); /* signal int when not busy (L->H) */ |
575 | //space | |
575 | //space.write_byte(0x109, centronics_busy_r(state->m_printer)); | |
576 | 576 | |
577 | 577 | |
578 | 578 | /* once per frame, pulse the PIO B bit 7 - it is in the schematic as an option, |
r17963 | r17964 | |
754 | 754 | { |
755 | 755 | mbee_state *state = image.device().machine().driver_data<mbee_state>(); |
756 | 756 | device_t *cpu = image.device().machine().device("maincpu"); |
757 | address_space | |
757 | address_space &space = *image.device().machine().device("maincpu")->memory().space(AS_PROGRAM); | |
758 | 758 | UINT16 i, j; |
759 | 759 | UINT8 data, sw = image.device().machine().root_device().ioport("CONFIG")->read() & 1; /* reading the dipswitch: 1 = autorun */ |
760 | 760 | |
r17963 | r17964 | |
772 | 772 | } |
773 | 773 | |
774 | 774 | if ((j < state->m_size) || (j > 0xefff)) |
775 | space | |
775 | space.write_byte(j, data); | |
776 | 776 | else |
777 | 777 | { |
778 | 778 | image.message("Not enough memory in this microbee"); |
r17963 | r17964 | |
782 | 782 | |
783 | 783 | if (sw) |
784 | 784 | { |
785 | space | |
785 | space.write_word(0xa2,0x801e); /* fix warm-start vector to get around some copy-protections */ | |
786 | 786 | cpu->state().set_pc(0x801e); |
787 | 787 | } |
788 | 788 | else |
789 | space | |
789 | space.write_word(0xa2,0x8517); | |
790 | 790 | } |
791 | 791 | else if (!mame_stricmp(image.filetype(), "com")) |
792 | 792 | { |
r17963 | r17964 | |
802 | 802 | } |
803 | 803 | |
804 | 804 | if ((j < state->m_size) || (j > 0xefff)) |
805 | space | |
805 | space.write_byte(j, data); | |
806 | 806 | else |
807 | 807 | { |
808 | 808 | image.message("Not enough memory in this microbee"); |
r17963 | r17964 | |
---|---|---|
353 | 353 | { |
354 | 354 | if ((offset & 0xff) >= 0xe0) |
355 | 355 | { |
356 | return k051649_test_r (space | |
356 | return k051649_test_r (space.machine().device("k051649"), space, offset & 0xff); | |
357 | 357 | } |
358 | 358 | return 0xff; |
359 | 359 | } |
360 | 360 | else |
361 | 361 | { |
362 | return k051649_waveform_r (space | |
362 | return k051649_waveform_r (space.machine().device("k051649"), space, offset & 0x7f); | |
363 | 363 | } |
364 | 364 | } |
365 | 365 | |
r17963 | r17964 | |
1234 | 1234 | |
1235 | 1235 | static READ8_HANDLER (msx_diskrom_page1_r) |
1236 | 1236 | { |
1237 | msx_state *state = space->machine().driver_data<msx_state>(); | |
1238 | device_t *fdc = space->machine().device("wd179x"); | |
1237 | msx_state *state = space.machine().driver_data<msx_state>(); | |
1238 | device_t *fdc = space.machine().device("wd179x"); | |
1239 | 1239 | switch (offset) |
1240 | 1240 | { |
1241 | case 0: return wd17xx_status_r (fdc, *space, 0); | |
1242 | case 1: return wd17xx_track_r (fdc, *space, 0); | |
1243 | case 2: return wd17xx_sector_r (fdc, *space, 0); | |
1244 | case 3: return wd17xx_data_r (fdc, *space, 0); | |
1241 | case 0: return wd17xx_status_r (fdc, space, 0); | |
1242 | case 1: return wd17xx_track_r (fdc, space, 0); | |
1243 | case 2: return wd17xx_sector_r (fdc, space, 0); | |
1244 | case 3: return wd17xx_data_r (fdc, space, 0); | |
1245 | 1245 | case 7: return state->m_dsk_stat; |
1246 | 1246 | default: |
1247 | 1247 | return state->m_state[1]->m_mem[offset + 0x3ff8]; |
r17963 | r17964 | |
1250 | 1250 | |
1251 | 1251 | static READ8_HANDLER (msx_diskrom_page2_r) |
1252 | 1252 | { |
1253 | msx_state *state = space->machine().driver_data<msx_state>(); | |
1254 | device_t *fdc = space->machine().device("wd179x"); | |
1253 | msx_state *state = space.machine().driver_data<msx_state>(); | |
1254 | device_t *fdc = space.machine().device("wd179x"); | |
1255 | 1255 | if (offset >= 0x7f8) |
1256 | 1256 | { |
1257 | 1257 | switch (offset) |
1258 | 1258 | { |
1259 | 1259 | case 0x7f8: |
1260 | return wd17xx_status_r (fdc, | |
1260 | return wd17xx_status_r (fdc, space, 0); | |
1261 | 1261 | case 0x7f9: |
1262 | return wd17xx_track_r (fdc, | |
1262 | return wd17xx_track_r (fdc, space, 0); | |
1263 | 1263 | case 0x7fa: |
1264 | return wd17xx_sector_r (fdc, | |
1264 | return wd17xx_sector_r (fdc, space, 0); | |
1265 | 1265 | case 0x7fb: |
1266 | return wd17xx_data_r (fdc, | |
1266 | return wd17xx_data_r (fdc, space, 0); | |
1267 | 1267 | case 0x7ff: |
1268 | 1268 | return state->m_dsk_stat; |
1269 | 1269 | default: |
r17963 | r17964 | |
1363 | 1363 | |
1364 | 1364 | static READ8_HANDLER (msx_diskrom2_page1_r) |
1365 | 1365 | { |
1366 | msx_state *state = space->machine().driver_data<msx_state>(); | |
1367 | device_t *fdc = space->machine().device("wd179x"); | |
1366 | msx_state *state = space.machine().driver_data<msx_state>(); | |
1367 | device_t *fdc = space.machine().device("wd179x"); | |
1368 | 1368 | switch (offset) |
1369 | 1369 | { |
1370 | case 0: return wd17xx_status_r(fdc, *space, 0); | |
1371 | case 1: return wd17xx_track_r(fdc, *space, 0); | |
1372 | case 2: return wd17xx_sector_r(fdc, *space, 0); | |
1373 | case 3: return wd17xx_data_r(fdc, *space, 0); | |
1370 | case 0: return wd17xx_status_r(fdc, space, 0); | |
1371 | case 1: return wd17xx_track_r(fdc, space, 0); | |
1372 | case 2: return wd17xx_sector_r(fdc, space, 0); | |
1373 | case 3: return wd17xx_data_r(fdc, space, 0); | |
1374 | 1374 | case 4: return state->m_dsk_stat; |
1375 | 1375 | default: |
1376 | 1376 | return state->m_state[1]->m_mem[offset + 0x3ff8]; |
r17963 | r17964 | |
1379 | 1379 | |
1380 | 1380 | static READ8_HANDLER (msx_diskrom2_page2_r) |
1381 | 1381 | { |
1382 | msx_state *state = space->machine().driver_data<msx_state>(); | |
1383 | device_t *fdc = space->machine().device("wd179x"); | |
1382 | msx_state *state = space.machine().driver_data<msx_state>(); | |
1383 | device_t *fdc = space.machine().device("wd179x"); | |
1384 | 1384 | if (offset >= 0x7b8) |
1385 | 1385 | { |
1386 | 1386 | switch (offset) |
1387 | 1387 | { |
1388 | 1388 | case 0x7b8: |
1389 | return wd17xx_status_r (fdc, | |
1389 | return wd17xx_status_r (fdc, space, 0); | |
1390 | 1390 | case 0x7b9: |
1391 | return wd17xx_track_r (fdc, | |
1391 | return wd17xx_track_r (fdc, space, 0); | |
1392 | 1392 | case 0x7ba: |
1393 | return wd17xx_sector_r (fdc, | |
1393 | return wd17xx_sector_r (fdc, space, 0); | |
1394 | 1394 | case 0x7bb: |
1395 | return wd17xx_data_r (fdc, | |
1395 | return wd17xx_data_r (fdc, space, 0); | |
1396 | 1396 | case 0x7bc: |
1397 | 1397 | return state->m_dsk_stat; |
1398 | 1398 | default: |
r17963 | r17964 | |
2184 | 2184 | |
2185 | 2185 | static READ8_HANDLER (soundcartridge_scc) |
2186 | 2186 | { |
2187 | msx_state *state = space | |
2187 | msx_state *state = space.machine().driver_data<msx_state>(); | |
2188 | 2188 | int reg; |
2189 | 2189 | |
2190 | 2190 | |
r17963 | r17964 | |
2198 | 2198 | |
2199 | 2199 | if (reg < 0x80) |
2200 | 2200 | { |
2201 | return k051649_waveform_r (space | |
2201 | return k051649_waveform_r (space.machine().device("k051649"), space, reg); | |
2202 | 2202 | } |
2203 | 2203 | else if (reg < 0xa0) |
2204 | 2204 | { |
r17963 | r17964 | |
2207 | 2207 | else if (reg < 0xc0) |
2208 | 2208 | { |
2209 | 2209 | /* read wave 5 */ |
2210 | return k051649_waveform_r (space | |
2210 | return k051649_waveform_r (space.machine().device("k051649"), space, 0x80 + (reg & 0x1f)); | |
2211 | 2211 | } |
2212 | 2212 | else if (reg < 0xe0) |
2213 | 2213 | { |
2214 | return k051649_test_r (space | |
2214 | return k051649_test_r (space.machine().device("k051649"), space, reg); | |
2215 | 2215 | } |
2216 | 2216 | |
2217 | 2217 | return 0xff; |
r17963 | r17964 | |
2219 | 2219 | |
2220 | 2220 | static READ8_HANDLER (soundcartridge_sccp) |
2221 | 2221 | { |
2222 | msx_state *state = space | |
2222 | msx_state *state = space.machine().driver_data<msx_state>(); | |
2223 | 2223 | int reg; |
2224 | 2224 | |
2225 | 2225 | if (offset >= 0x7e0) |
r17963 | r17964 | |
2232 | 2232 | |
2233 | 2233 | if (reg < 0xa0) |
2234 | 2234 | { |
2235 | return k052539_waveform_r (space | |
2235 | return k052539_waveform_r (space.machine().device("k051649"), space, reg); | |
2236 | 2236 | } |
2237 | 2237 | else if (reg >= 0xc0 && reg < 0xe0) |
2238 | 2238 | { |
2239 | return k051649_test_r (space | |
2239 | return k051649_test_r (space.machine().device("k051649"), space, reg); | |
2240 | 2240 | } |
2241 | 2241 | |
2242 | 2242 | return 0xff; |
r17963 | r17964 | |
---|---|---|
99 | 99 | MACHINE_START( pc1350 ) |
100 | 100 | { |
101 | 101 | pc1350_state *state = machine.driver_data<pc1350_state>(); |
102 | address_space | |
102 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
103 | 103 | |
104 | 104 | state->m_power = 1; |
105 | 105 | machine.scheduler().timer_set(attotime::from_seconds(1), FUNC(pc1350_power_up)); |
106 | 106 | |
107 | space | |
107 | space.install_readwrite_bank(0x6000, 0x6fff, "bank1"); | |
108 | 108 | state->membank("bank1")->set_base(&machine.device<ram_device>(RAM_TAG)->pointer()[0x0000]); |
109 | 109 | |
110 | 110 | if (machine.device<ram_device>(RAM_TAG)->size() >= 0x3000) |
111 | 111 | { |
112 | space | |
112 | space.install_readwrite_bank(0x4000, 0x5fff, "bank2"); | |
113 | 113 | state->membank("bank2")->set_base(&machine.device<ram_device>(RAM_TAG)->pointer()[0x1000]); |
114 | 114 | } |
115 | 115 | else |
116 | 116 | { |
117 | space | |
117 | space.nop_readwrite(0x4000, 0x5fff); | |
118 | 118 | } |
119 | 119 | |
120 | 120 | if (machine.device<ram_device>(RAM_TAG)->size() >= 0x5000) |
121 | 121 | { |
122 | space | |
122 | space.install_readwrite_bank(0x2000, 0x3fff, "bank3"); | |
123 | 123 | state->membank("bank3")->set_base(&machine.device<ram_device>(RAM_TAG)->pointer()[0x3000]); |
124 | 124 | } |
125 | 125 | else |
126 | 126 | { |
127 | space | |
127 | space.nop_readwrite(0x2000, 0x3fff); | |
128 | 128 | } |
129 | 129 | |
130 | 130 | device_t *main_cpu = machine.device("maincpu"); |
r17963 | r17964 | |
---|---|---|
395 | 395 | static const int timer_to_cycles_fast[8] = { 2, 8, 32, 64, 128, 256, 1024, 4096 }; |
396 | 396 | static const int timer_to_cycles_slow[8] = { 128, 256, 512, 1024, 2048, 4096, 8192, 16384 }; |
397 | 397 | |
398 | //logerror( "%0X: Write to hardware address: %02X, %02X\n", space | |
398 | //logerror( "%0X: Write to hardware address: %02X, %02X\n", space.device() .safe_pc( ), offset, data ); | |
399 | 399 | |
400 | 400 | switch( offset ) |
401 | 401 | { |
r17963 | r17964 | |
1416 | 1416 | static TIMER_CALLBACK( pokemini_prc_counter_callback ) |
1417 | 1417 | { |
1418 | 1418 | pokemini_state *state = machine.driver_data<pokemini_state>(); |
1419 | address_space | |
1419 | address_space &space = *machine.device( "maincpu")->memory().space( AS_PROGRAM ); | |
1420 | 1420 | state->m_prc.count++; |
1421 | 1421 | |
1422 | 1422 | /* Check for overflow */ |
r17963 | r17964 | |
1440 | 1440 | UINT8 tile = state->m_p_ram[ 0x360 + ( y * state->m_prc.map_size_x ) + x ]; |
1441 | 1441 | int i; |
1442 | 1442 | for( i = 0; i < 8; i++ ) { |
1443 | state->m_p_ram[ ( y * 96 ) + ( x * 8 ) + i ] = space | |
1443 | state->m_p_ram[ ( y * 96 ) + ( x * 8 ) + i ] = space.read_byte( state->m_prc.bg_tiles + ( tile * 8 ) + i ); | |
1444 | 1444 | } |
1445 | 1445 | } |
1446 | 1446 | } |
r17963 | r17964 | |
1471 | 1471 | int rel_x = ( spr_flag & 0x01 ) ? 15 - i : i; |
1472 | 1472 | UINT32 s = spr_base + ( ( rel_x & 0x08 ) << 2 ) + ( rel_x & 0x07 ); |
1473 | 1473 | |
1474 | mask = ~ ( space->read_byte( s ) | ( space->read_byte( s + 8 ) << 8 ) ); | |
1475 | gfx = space->read_byte( s + 16 ) | ( space->read_byte( s + 24 ) << 8 ); | |
1474 | mask = ~ ( space.read_byte( s ) | ( space.read_byte( s + 8 ) << 8 ) ); | |
1475 | gfx = space.read_byte( s + 16 ) | ( space.read_byte( s + 24 ) << 8 ); | |
1476 | 1476 | |
1477 | 1477 | /* Are the colors inverted? */ |
1478 | 1478 | if ( spr_flag & 0x04 ) |
r17963 | r17964 | |
---|---|---|
24 | 24 | |
25 | 25 | void northbridge_device::device_start() |
26 | 26 | { |
27 | address_space | |
27 | address_space& space = *machine().device(":maincpu")->memory().space(AS_PROGRAM); | |
28 | 28 | |
29 | 29 | machine().root_device().membank("bank10")->set_base(m_ram->pointer()); |
30 | 30 | |
31 | 31 | if (m_ram->size() > 0x0a0000) |
32 | 32 | { |
33 | 33 | offs_t ram_limit = 0x100000 + m_ram->size() - 0x0a0000; |
34 | space->install_read_bank(0x100000, ram_limit - 1, "bank1"); | |
35 | space->install_write_bank(0x100000, ram_limit - 1, "bank1"); | |
34 | space.install_read_bank(0x100000, ram_limit - 1, "bank1"); | |
35 | space.install_write_bank(0x100000, ram_limit - 1, "bank1"); | |
36 | 36 | machine().root_device().membank("bank1")->set_base(m_ram->pointer() + 0xa0000); |
37 | 37 | } |
38 | 38 | } |
r17963 | r17964 | |
---|---|---|
28 | 28 | static void pmd851_update_memory(running_machine &machine) |
29 | 29 | { |
30 | 30 | pmd85_state *state = machine.driver_data<pmd85_state>(); |
31 | address_space | |
31 | address_space& space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
32 | 32 | UINT8 *ram = machine.device<ram_device>(RAM_TAG)->pointer(); |
33 | 33 | |
34 | 34 | if (state->m_startup_mem_map) |
35 | 35 | { |
36 | 36 | UINT8 *mem = state->memregion("maincpu")->base(); |
37 | 37 | |
38 | space->unmap_write(0x0000, 0x0fff); | |
39 | space->nop_write(0x1000, 0x1fff); | |
40 | space->unmap_write(0x2000, 0x2fff); | |
41 | space->nop_write(0x3000, 0x3fff); | |
38 | space.unmap_write(0x0000, 0x0fff); | |
39 | space.nop_write(0x1000, 0x1fff); | |
40 | space.unmap_write(0x2000, 0x2fff); | |
41 | space.nop_write(0x3000, 0x3fff); | |
42 | 42 | |
43 | space->nop_read(0x1000, 0x1fff); | |
44 | space->nop_read(0x3000, 0x3fff); | |
43 | space.nop_read(0x1000, 0x1fff); | |
44 | space.nop_read(0x3000, 0x3fff); | |
45 | 45 | |
46 | 46 | state->membank("bank1")->set_base(mem + 0x010000); |
47 | 47 | state->membank("bank3")->set_base(mem + 0x010000); |
r17963 | r17964 | |
53 | 53 | } |
54 | 54 | else |
55 | 55 | { |
56 | space->install_write_bank(0x0000, 0x0fff, "bank1"); | |
57 | space->install_write_bank(0x1000, 0x1fff, "bank2"); | |
58 | space->install_write_bank(0x2000, 0x2fff, "bank3"); | |
59 | space->install_write_bank(0x3000, 0x3fff, "bank4"); | |
60 | space->install_write_bank(0x4000, 0x7fff, "bank5"); | |
56 | space.install_write_bank(0x0000, 0x0fff, "bank1"); | |
57 | space.install_write_bank(0x1000, 0x1fff, "bank2"); | |
58 | space.install_write_bank(0x2000, 0x2fff, "bank3"); | |
59 | space.install_write_bank(0x3000, 0x3fff, "bank4"); | |
60 | space.install_write_bank(0x4000, 0x7fff, "bank5"); | |
61 | 61 | |
62 | space->install_read_bank(0x1000, 0x1fff, "bank2"); | |
63 | space->install_read_bank(0x3000, 0x3fff, "bank4"); | |
62 | space.install_read_bank(0x1000, 0x1fff, "bank2"); | |
63 | space.install_read_bank(0x3000, 0x3fff, "bank4"); | |
64 | 64 | |
65 | 65 | state->membank("bank1")->set_base(ram); |
66 | 66 | state->membank("bank2")->set_base(ram + 0x1000); |
r17963 | r17964 | |
73 | 73 | static void pmd852a_update_memory(running_machine &machine) |
74 | 74 | { |
75 | 75 | pmd85_state *state = machine.driver_data<pmd85_state>(); |
76 | address_space | |
76 | address_space& space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
77 | 77 | UINT8 *ram = machine.device<ram_device>(RAM_TAG)->pointer(); |
78 | 78 | |
79 | 79 | if (state->m_startup_mem_map) |
80 | 80 | { |
81 | 81 | UINT8 *mem = state->memregion("maincpu")->base(); |
82 | 82 | |
83 | space->unmap_write(0x0000, 0x0fff); | |
84 | space->unmap_write(0x2000, 0x2fff); | |
83 | space.unmap_write(0x0000, 0x0fff); | |
84 | space.unmap_write(0x2000, 0x2fff); | |
85 | 85 | |
86 | 86 | state->membank("bank1")->set_base(mem + 0x010000); |
87 | 87 | state->membank("bank2")->set_base(ram + 0x9000); |
r17963 | r17964 | |
97 | 97 | } |
98 | 98 | else |
99 | 99 | { |
100 | space->install_write_bank(0x0000, 0x0fff, "bank1"); | |
101 | space->install_write_bank(0x2000, 0x2fff, "bank3"); | |
100 | space.install_write_bank(0x0000, 0x0fff, "bank1"); | |
101 | space.install_write_bank(0x2000, 0x2fff, "bank3"); | |
102 | 102 | |
103 | 103 | state->membank("bank1")->set_base(ram); |
104 | 104 | state->membank("bank2")->set_base(ram + 0x1000); |
r17963 | r17964 | |
149 | 149 | static void alfa_update_memory(running_machine &machine) |
150 | 150 | { |
151 | 151 | pmd85_state *state = machine.driver_data<pmd85_state>(); |
152 | address_space | |
152 | address_space& space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
153 | 153 | UINT8 *ram = machine.device<ram_device>(RAM_TAG)->pointer(); |
154 | 154 | |
155 | 155 | if (state->m_startup_mem_map) |
156 | 156 | { |
157 | 157 | UINT8 *mem = state->memregion("maincpu")->base(); |
158 | 158 | |
159 | space->unmap_write(0x0000, 0x0fff); | |
160 | space->unmap_write(0x1000, 0x33ff); | |
161 | space->nop_write(0x3400, 0x3fff); | |
159 | space.unmap_write(0x0000, 0x0fff); | |
160 | space.unmap_write(0x1000, 0x33ff); | |
161 | space.nop_write(0x3400, 0x3fff); | |
162 | 162 | |
163 | 163 | state->membank("bank1")->set_base(mem + 0x010000); |
164 | 164 | state->membank("bank2")->set_base(mem + 0x011000); |
r17963 | r17964 | |
169 | 169 | } |
170 | 170 | else |
171 | 171 | { |
172 | space->install_write_bank(0x0000, 0x0fff, "bank1"); | |
173 | space->install_write_bank(0x1000, 0x33ff, "bank2"); | |
174 | space->install_write_bank(0x3400, 0x3fff, "bank3"); | |
172 | space.install_write_bank(0x0000, 0x0fff, "bank1"); | |
173 | space.install_write_bank(0x1000, 0x33ff, "bank2"); | |
174 | space.install_write_bank(0x3400, 0x3fff, "bank3"); | |
175 | 175 | |
176 | 176 | state->membank("bank1")->set_base(ram); |
177 | 177 | state->membank("bank2")->set_base(ram + 0x1000); |
r17963 | r17964 | |
183 | 183 | static void mato_update_memory(running_machine &machine) |
184 | 184 | { |
185 | 185 | pmd85_state *state = machine.driver_data<pmd85_state>(); |
186 | address_space | |
186 | address_space& space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
187 | 187 | UINT8 *ram = machine.device<ram_device>(RAM_TAG)->pointer(); |
188 | 188 | |
189 | 189 | if (state->m_startup_mem_map) |
190 | 190 | { |
191 | 191 | UINT8 *mem = state->memregion("maincpu")->base(); |
192 | 192 | |
193 | space | |
193 | space.unmap_write(0x0000, 0x3fff); | |
194 | 194 | |
195 | 195 | state->membank("bank1")->set_base(mem + 0x010000); |
196 | 196 | state->membank("bank2")->set_base(ram + 0xc000); |
r17963 | r17964 | |
199 | 199 | } |
200 | 200 | else |
201 | 201 | { |
202 | space | |
202 | space.install_write_bank(0x0000, 0x3fff, "bank1"); | |
203 | 203 | |
204 | 204 | state->membank("bank1")->set_base(ram); |
205 | 205 | state->membank("bank2")->set_base(ram + 0x4000); |
r17963 | r17964 | |
209 | 209 | static void c2717_update_memory(running_machine &machine) |
210 | 210 | { |
211 | 211 | pmd85_state *state = machine.driver_data<pmd85_state>(); |
212 | address_space | |
212 | address_space& space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
213 | 213 | UINT8 *mem = state->memregion("maincpu")->base(); |
214 | 214 | UINT8 *ram = machine.device<ram_device>(RAM_TAG)->pointer(); |
215 | 215 | |
216 | 216 | if (state->m_startup_mem_map) |
217 | 217 | { |
218 | space | |
218 | space.unmap_write(0x0000, 0x3fff); | |
219 | 219 | |
220 | 220 | state->membank("bank1")->set_base(mem + 0x010000); |
221 | 221 | state->membank("bank2")->set_base(ram + 0x4000); |
r17963 | r17964 | |
224 | 224 | } |
225 | 225 | else |
226 | 226 | { |
227 | space | |
227 | space.install_write_bank(0x0000, 0x3fff, "bank1"); | |
228 | 228 | state->membank("bank1")->set_base(ram); |
229 | 229 | state->membank("bank2")->set_base(ram + 0x4000); |
230 | 230 | } |
r17963 | r17964 | |
---|---|---|
123 | 123 | // single byte or word transfer |
124 | 124 | device_t* device = (device_t*)ptr; |
125 | 125 | upd71071_t* dmac = get_safe_token(device); |
126 | address_space | |
126 | address_space& space = *device->machine().device(dmac->intf->cputag)->memory().space(AS_PROGRAM); | |
127 | 127 | int channel = param; |
128 | 128 | UINT16 data = 0; // data to transfer |
129 | 129 | |
r17963 | r17964 | |
134 | 134 | case 0x04: // I/O -> memory |
135 | 135 | if(dmac->intf->dma_read[channel]) |
136 | 136 | data = dmac->intf->dma_read[channel](device->machine()); |
137 | space | |
137 | space.write_byte(dmac->reg.address_current[channel],data & 0xff); | |
138 | 138 | if(dmac->reg.mode_control[channel] & 0x20) // Address direction |
139 | 139 | dmac->reg.address_current[channel]--; |
140 | 140 | else |
r17963 | r17964 | |
152 | 152 | dmac->reg.count_current[channel]--; |
153 | 153 | break; |
154 | 154 | case 0x08: // memory -> I/O |
155 | data = space | |
155 | data = space.read_byte(dmac->reg.address_current[channel]); | |
156 | 156 | if(dmac->intf->dma_read[channel]) |
157 | 157 | dmac->intf->dma_write[channel](device->machine(),data); |
158 | 158 | if(dmac->reg.mode_control[channel] & 0x20) // Address direction |
r17963 | r17964 | |
---|---|---|
316 | 316 | static void init_at_common(running_machine &machine) |
317 | 317 | { |
318 | 318 | at_state *state = machine.driver_data<at_state>(); |
319 | address_space | |
319 | address_space& space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
320 | 320 | |
321 | 321 | // The CS4031 chipset does this itself |
322 | 322 | if (machine.device("cs4031") == NULL) |
r17963 | r17964 | |
327 | 327 | if (machine.device<ram_device>(RAM_TAG)->size() > 0x0a0000) |
328 | 328 | { |
329 | 329 | offs_t ram_limit = 0x100000 + machine.device<ram_device>(RAM_TAG)->size() - 0x0a0000; |
330 | space->install_read_bank(0x100000, ram_limit - 1, "bank1"); | |
331 | space->install_write_bank(0x100000, ram_limit - 1, "bank1"); | |
330 | space.install_read_bank(0x100000, ram_limit - 1, "bank1"); | |
331 | space.install_write_bank(0x100000, ram_limit - 1, "bank1"); | |
332 | 332 | state->membank("bank1")->set_base(machine.device<ram_device>(RAM_TAG)->pointer() + 0xa0000); |
333 | 333 | } |
334 | 334 | } |
r17963 | r17964 | |
---|---|---|
268 | 268 | orion_state *state = machine.driver_data<orion_state>(); |
269 | 269 | UINT8 bank_select; |
270 | 270 | UINT8 segment_select; |
271 | address_space | |
271 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
272 | 272 | |
273 | 273 | bank_select = (state->m_orionz80_dispatcher & 0x0c) >> 2; |
274 | 274 | segment_select = state->m_orionz80_dispatcher & 0x03; |
275 | 275 | |
276 | space | |
276 | space.install_write_bank(0x0000, 0x3fff, "bank1"); | |
277 | 277 | if ((state->m_orionz80_dispatcher & 0x80)==0) |
278 | 278 | { // dispatcher on |
279 | 279 | state->membank("bank1")->set_base(machine.device<ram_device>(RAM_TAG)->pointer() + 0x10000 * bank_select + segment_select * 0x4000 ); |
r17963 | r17964 | |
287 | 287 | |
288 | 288 | if ((state->m_orionz80_dispatcher & 0x20) == 0) |
289 | 289 | { |
290 | space->install_write_handler(0xf400, 0xf4ff, write8_delegate(FUNC(orion_state::orion128_system_w),state)); | |
291 | space->install_write_handler(0xf500, 0xf5ff, write8_delegate(FUNC(orion_state::orion128_romdisk_w),state)); | |
292 | space->install_write_handler(0xf700, 0xf7ff, write8_delegate(FUNC(orion_state::orionz80_floppy_rtc_w),state)); | |
293 | space->install_read_handler(0xf400, 0xf4ff, read8_delegate(FUNC(orion_state::orion128_system_r),state)); | |
294 | space->install_read_handler(0xf500, 0xf5ff, read8_delegate(FUNC(orion_state::orion128_romdisk_r),state)); | |
295 | space->install_read_handler(0xf700, 0xf7ff, read8_delegate(FUNC(orion_state::orionz80_floppy_rtc_r),state)); | |
290 | space.install_write_handler(0xf400, 0xf4ff, write8_delegate(FUNC(orion_state::orion128_system_w),state)); | |
291 | space.install_write_handler(0xf500, 0xf5ff, write8_delegate(FUNC(orion_state::orion128_romdisk_w),state)); | |
292 | space.install_write_handler(0xf700, 0xf7ff, write8_delegate(FUNC(orion_state::orionz80_floppy_rtc_w),state)); | |
293 | space.install_read_handler(0xf400, 0xf4ff, read8_delegate(FUNC(orion_state::orion128_system_r),state)); | |
294 | space.install_read_handler(0xf500, 0xf5ff, read8_delegate(FUNC(orion_state::orion128_romdisk_r),state)); | |
295 | space.install_read_handler(0xf700, 0xf7ff, read8_delegate(FUNC(orion_state::orionz80_floppy_rtc_r),state)); | |
296 | 296 | |
297 | space->install_write_handler(0xf800, 0xf8ff, write8_delegate(FUNC(orion_state::orion128_video_mode_w),state)); | |
298 | space->install_write_handler(0xf900, 0xf9ff, write8_delegate(FUNC(orion_state::orionz80_memory_page_w),state)); | |
299 | space->install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(orion_state::orion128_video_page_w),state)); | |
300 | space->install_write_handler(0xfb00, 0xfbff, write8_delegate(FUNC(orion_state::orionz80_dispatcher_w),state)); | |
301 | space->unmap_write(0xfc00, 0xfeff); | |
302 | space->install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(orion_state::orionz80_sound_w),state)); | |
297 | space.install_write_handler(0xf800, 0xf8ff, write8_delegate(FUNC(orion_state::orion128_video_mode_w),state)); | |
298 | space.install_write_handler(0xf900, 0xf9ff, write8_delegate(FUNC(orion_state::orionz80_memory_page_w),state)); | |
299 | space.install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(orion_state::orion128_video_page_w),state)); | |
300 | space.install_write_handler(0xfb00, 0xfbff, write8_delegate(FUNC(orion_state::orionz80_dispatcher_w),state)); | |
301 | space.unmap_write(0xfc00, 0xfeff); | |
302 | space.install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(orion_state::orionz80_sound_w),state)); | |
303 | 303 | |
304 | 304 | state->membank("bank3")->set_base(machine.device<ram_device>(RAM_TAG)->pointer() + 0xf000); |
305 | 305 | state->membank("bank5")->set_base(machine.root_device().memregion("maincpu")->base() + 0xf800); |
r17963 | r17964 | |
328 | 328 | |
329 | 329 | MACHINE_RESET_MEMBER(orion_state,orionz80) |
330 | 330 | { |
331 | address_space | |
331 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
332 | 332 | |
333 | space->unmap_write(0x0000, 0x3fff); | |
334 | space->install_write_bank(0x4000, 0xefff, "bank2"); | |
335 | space->install_write_bank(0xf000, 0xf3ff, "bank3"); | |
333 | space.unmap_write(0x0000, 0x3fff); | |
334 | space.install_write_bank(0x4000, 0xefff, "bank2"); | |
335 | space.install_write_bank(0xf000, 0xf3ff, "bank3"); | |
336 | 336 | |
337 | space->install_write_handler(0xf400, 0xf4ff, write8_delegate(FUNC(orion_state::orion128_system_w),this)); | |
338 | space->install_write_handler(0xf500, 0xf5ff, write8_delegate(FUNC(orion_state::orion128_romdisk_w),this)); | |
339 | space->install_write_handler(0xf700, 0xf7ff, write8_delegate(FUNC(orion_state::orionz80_floppy_rtc_w),this)); | |
340 | space->install_read_handler(0xf400, 0xf4ff, read8_delegate(FUNC(orion_state::orion128_system_r),this)); | |
341 | space->install_read_handler(0xf500, 0xf5ff, read8_delegate(FUNC(orion_state::orion128_romdisk_r),this)); | |
342 | space->install_read_handler(0xf700, 0xf7ff, read8_delegate(FUNC(orion_state::orionz80_floppy_rtc_r),this)); | |
337 | space.install_write_handler(0xf400, 0xf4ff, write8_delegate(FUNC(orion_state::orion128_system_w),this)); | |
338 | space.install_write_handler(0xf500, 0xf5ff, write8_delegate(FUNC(orion_state::orion128_romdisk_w),this)); | |
339 | space.install_write_handler(0xf700, 0xf7ff, write8_delegate(FUNC(orion_state::orionz80_floppy_rtc_w),this)); | |
340 | space.install_read_handler(0xf400, 0xf4ff, read8_delegate(FUNC(orion_state::orion128_system_r),this)); | |
341 | space.install_read_handler(0xf500, 0xf5ff, read8_delegate(FUNC(orion_state::orion128_romdisk_r),this)); | |
342 | space.install_read_handler(0xf700, 0xf7ff, read8_delegate(FUNC(orion_state::orionz80_floppy_rtc_r),this)); | |
343 | 343 | |
344 | space->install_write_handler(0xf800, 0xf8ff, write8_delegate(FUNC(orion_state::orion128_video_mode_w),this)); | |
345 | space->install_write_handler(0xf900, 0xf9ff, write8_delegate(FUNC(orion_state::orionz80_memory_page_w),this)); | |
346 | space->install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(orion_state::orion128_video_page_w),this)); | |
347 | space->install_write_handler(0xfb00, 0xfbff, write8_delegate(FUNC(orion_state::orionz80_dispatcher_w),this)); | |
348 | space->unmap_write(0xfc00, 0xfeff); | |
349 | space->install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(orion_state::orionz80_sound_w),this)); | |
344 | space.install_write_handler(0xf800, 0xf8ff, write8_delegate(FUNC(orion_state::orion128_video_mode_w),this)); | |
345 | space.install_write_handler(0xf900, 0xf9ff, write8_delegate(FUNC(orion_state::orionz80_memory_page_w),this)); | |
346 | space.install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(orion_state::orion128_video_page_w),this)); | |
347 | space.install_write_handler(0xfb00, 0xfbff, write8_delegate(FUNC(orion_state::orionz80_dispatcher_w),this)); | |
348 | space.unmap_write(0xfc00, 0xfeff); | |
349 | space.install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(orion_state::orionz80_sound_w),this)); | |
350 | 350 | |
351 | 351 | |
352 | 352 | membank("bank1")->set_base(machine().root_device().memregion("maincpu")->base() + 0xf800); |
r17963 | r17964 | |
413 | 413 | static void orionpro_bank_switch(running_machine &machine) |
414 | 414 | { |
415 | 415 | orion_state *state = machine.driver_data<orion_state>(); |
416 | address_space | |
416 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
417 | 417 | int page = state->m_orionpro_page & 7; // we have only 8 pages |
418 | 418 | int is128 = (state->m_orionpro_dispatcher & 0x80) ? 1 : 0; |
419 | 419 | UINT8 *ram = machine.device<ram_device>(RAM_TAG)->pointer(); |
r17963 | r17964 | |
422 | 422 | { |
423 | 423 | page = state->m_orionpro_128_page & 7; |
424 | 424 | } |
425 | space->install_write_bank(0x0000, 0x1fff, "bank1"); | |
426 | space->install_write_bank(0x2000, 0x3fff, "bank2"); | |
427 | space->install_write_bank(0x4000, 0x7fff, "bank3"); | |
428 | space->install_write_bank(0x8000, 0xbfff, "bank4"); | |
429 | space->install_write_bank(0xc000, 0xefff, "bank5"); | |
430 | space->install_write_bank(0xf000, 0xf3ff, "bank6"); | |
431 | space->install_write_bank(0xf400, 0xf7ff, "bank7"); | |
432 | space->install_write_bank(0xf800, 0xffff, "bank8"); | |
425 | space.install_write_bank(0x0000, 0x1fff, "bank1"); | |
426 | space.install_write_bank(0x2000, 0x3fff, "bank2"); | |
427 | space.install_write_bank(0x4000, 0x7fff, "bank3"); | |
428 | space.install_write_bank(0x8000, 0xbfff, "bank4"); | |
429 | space.install_write_bank(0xc000, 0xefff, "bank5"); | |
430 | space.install_write_bank(0xf000, 0xf3ff, "bank6"); | |
431 | space.install_write_bank(0xf400, 0xf7ff, "bank7"); | |
432 | space.install_write_bank(0xf800, 0xffff, "bank8"); | |
433 | 433 | |
434 | 434 | |
435 | 435 | if ((state->m_orionpro_dispatcher & 0x01)==0x00) |
r17963 | r17964 | |
444 | 444 | } |
445 | 445 | if ((state->m_orionpro_dispatcher & 0x10)==0x10) |
446 | 446 | { // ROM1 enabled |
447 | space | |
447 | space.unmap_write(0x0000, 0x1fff); | |
448 | 448 | state->membank("bank1")->set_base(machine.root_device().memregion("maincpu")->base() + 0x20000); |
449 | 449 | } |
450 | 450 | if ((state->m_orionpro_dispatcher & 0x08)==0x08) |
451 | 451 | { // ROM2 enabled |
452 | space | |
452 | space.unmap_write(0x2000, 0x3fff); | |
453 | 453 | state->membank("bank2")->set_base(machine.root_device().memregion("maincpu")->base() + 0x22000 + (state->m_orionpro_rom2_segment & 7) * 0x2000); |
454 | 454 | } |
455 | 455 | |
r17963 | r17964 | |
477 | 477 | { |
478 | 478 | state->membank("bank6")->set_base(ram + 0x10000 * 0 + 0xf000); |
479 | 479 | |
480 | space->install_write_handler(0xf400, 0xf4ff, write8_delegate(FUNC(orion_state::orion128_system_w),state)); | |
481 | space->install_write_handler(0xf500, 0xf5ff, write8_delegate(FUNC(orion_state::orion128_romdisk_w),state)); | |
482 | space->unmap_write(0xf600, 0xf6ff); | |
483 | space->install_write_handler(0xf700, 0xf7ff, write8_delegate(FUNC(orion_state::orion128_floppy_w),state)); | |
484 | space->install_read_handler(0xf400, 0xf4ff, read8_delegate(FUNC(orion_state::orion128_system_r),state)); | |
485 | space->install_read_handler(0xf500, 0xf5ff, read8_delegate(FUNC(orion_state::orion128_romdisk_r),state)); | |
486 | space->unmap_read(0xf600, 0xf6ff); | |
487 | space->install_read_handler(0xf700, 0xf7ff, read8_delegate(FUNC(orion_state::orion128_floppy_r),state)); | |
480 | space.install_write_handler(0xf400, 0xf4ff, write8_delegate(FUNC(orion_state::orion128_system_w),state)); | |
481 | space.install_write_handler(0xf500, 0xf5ff, write8_delegate(FUNC(orion_state::orion128_romdisk_w),state)); | |
482 | space.unmap_write(0xf600, 0xf6ff); | |
483 | space.install_write_handler(0xf700, 0xf7ff, write8_delegate(FUNC(orion_state::orion128_floppy_w),state)); | |
484 | space.install_read_handler(0xf400, 0xf4ff, read8_delegate(FUNC(orion_state::orion128_system_r),state)); | |
485 | space.install_read_handler(0xf500, 0xf5ff, read8_delegate(FUNC(orion_state::orion128_romdisk_r),state)); | |
486 | space.unmap_read(0xf600, 0xf6ff); | |
487 | space.install_read_handler(0xf700, 0xf7ff, read8_delegate(FUNC(orion_state::orion128_floppy_r),state)); | |
488 | 488 | |
489 | space->install_write_handler(0xf800, 0xf8ff, write8_delegate(FUNC(orion_state::orion128_video_mode_w),state)); | |
490 | space->install_write_handler(0xf900, 0xf9ff, write8_delegate(FUNC(orion_state::orionpro_memory_page_w),state)); | |
491 | space->install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(orion_state::orion128_video_page_w),state)); | |
492 | space->unmap_write(0xfb00, 0xfeff); | |
493 | space->install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(orion_state::orionz80_sound_w),state)); | |
489 | space.install_write_handler(0xf800, 0xf8ff, write8_delegate(FUNC(orion_state::orion128_video_mode_w),state)); | |
490 | space.install_write_handler(0xf900, 0xf9ff, write8_delegate(FUNC(orion_state::orionpro_memory_page_w),state)); | |
491 | space.install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(orion_state::orion128_video_page_w),state)); | |
492 | space.unmap_write(0xfb00, 0xfeff); | |
493 | space.install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(orion_state::orionz80_sound_w),state)); | |
494 | 494 | |
495 | 495 | |
496 | 496 | state->membank("bank8")->set_base(ram + 0x10000 * 0 + 0xf800); |
r17963 | r17964 | |
---|---|---|
187 | 187 | void cpc_ssa1_device::device_start() |
188 | 188 | { |
189 | 189 | device_t* cpu = machine().device("maincpu"); |
190 | address_space | |
190 | address_space& space = *cpu->memory().space(AS_IO); | |
191 | 191 | m_slot = dynamic_cast<cpc_expansion_slot_device *>(owner()); |
192 | 192 | |
193 | 193 | m_rom = memregion("sp0256")->base(); |
194 | 194 | |
195 | 195 | // m_sp0256_device = subdevice("sp0256"); |
196 | 196 | |
197 | space->install_readwrite_handler(0xfaee,0xfaee,0,0,read8_delegate(FUNC(cpc_ssa1_device::ssa1_r),this),write8_delegate(FUNC(cpc_ssa1_device::ssa1_w),this)); | |
198 | space->install_readwrite_handler(0xfbee,0xfbee,0,0,read8_delegate(FUNC(cpc_ssa1_device::ssa1_r),this),write8_delegate(FUNC(cpc_ssa1_device::ssa1_w),this)); | |
197 | space.install_readwrite_handler(0xfaee,0xfaee,0,0,read8_delegate(FUNC(cpc_ssa1_device::ssa1_r),this),write8_delegate(FUNC(cpc_ssa1_device::ssa1_w),this)); | |
198 | space.install_readwrite_handler(0xfbee,0xfbee,0,0,read8_delegate(FUNC(cpc_ssa1_device::ssa1_r),this),write8_delegate(FUNC(cpc_ssa1_device::ssa1_w),this)); | |
199 | 199 | } |
200 | 200 | |
201 | 201 | void cpc_dkspeech_device::device_start() |
202 | 202 | { |
203 | 203 | device_t* cpu = machine().device("maincpu"); |
204 | address_space | |
204 | address_space& space = *cpu->memory().space(AS_IO); | |
205 | 205 | m_slot = dynamic_cast<cpc_expansion_slot_device *>(owner()); |
206 | 206 | |
207 | 207 | m_rom = memregion("sp0256")->base(); |
208 | 208 | |
209 | 209 | // m_sp0256_device = subdevice("sp0256"); |
210 | 210 | |
211 | space | |
211 | space.install_readwrite_handler(0xfbfe,0xfbfe,0,0,read8_delegate(FUNC(cpc_dkspeech_device::dkspeech_r),this),write8_delegate(FUNC(cpc_dkspeech_device::dkspeech_w),this)); | |
212 | 212 | } |
213 | 213 | |
214 | 214 | //------------------------------------------------- |
r17963 | r17964 | |
---|---|---|
72 | 72 | static void a7800_driver_init(running_machine &machine, int ispal, int lines) |
73 | 73 | { |
74 | 74 | a7800_state *state = machine.driver_data<a7800_state>(); |
75 | address_space | |
75 | address_space& space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
76 | 76 | state->m_ROM = state->memregion("maincpu")->base(); |
77 | 77 | state->m_ispal = ispal; |
78 | 78 | state->m_lines = lines; |
r17963 | r17964 | |
85 | 85 | state->membank("bank7")->set_base(&state->m_ROM[0x2000]); /* MAINRAM */ |
86 | 86 | |
87 | 87 | /* Brutal hack put in as a consequence of new memory system; fix this */ |
88 | space | |
88 | space.install_readwrite_bank(0x0480, 0x04FF,"bank10"); | |
89 | 89 | state->membank("bank10")->set_base(state->m_ROM + 0x0480); |
90 | space | |
90 | space.install_readwrite_bank(0x1800, 0x27FF, "bank11"); | |
91 | 91 | state->membank("bank11")->set_base(state->m_ROM + 0x1800); |
92 | 92 | } |
93 | 93 | |
r17963 | r17964 | |
107 | 107 | void a7800_state::machine_reset() |
108 | 108 | { |
109 | 109 | UINT8 *memory; |
110 | address_space | |
110 | address_space& space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
111 | 111 | |
112 | 112 | m_ctrl_lock = 0; |
113 | 113 | m_ctrl_reg = 0; |
r17963 | r17964 | |
124 | 124 | if (m_cart_type & 0x01) |
125 | 125 | { |
126 | 126 | pokey_device *pokey = machine().device<pokey_device>("pokey"); |
127 | space | |
127 | space.install_readwrite_handler(0x4000, 0x7FFF, read8_delegate(FUNC(pokey_device::read),pokey), write8_delegate(FUNC(pokey_device::write),pokey)); | |
128 | 128 | } |
129 | 129 | } |
130 | 130 |
r17963 | r17964 | |
---|---|---|
515 | 515 | { |
516 | 516 | UINT8 *dst = memregion("gfx2")->base(); |
517 | 517 | int i; |
518 | address_space | |
518 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
519 | 519 | |
520 | 520 | for (i = 0; i < 256; i++) |
521 | 521 | { |
r17963 | r17964 | |
556 | 556 | switch (read_dsw(machine()) & 3) |
557 | 557 | { |
558 | 558 | case 0: // 1K only :) |
559 | space | |
559 | space.nop_readwrite(0x0400, 0xbbff); | |
560 | 560 | break; |
561 | 561 | case 1: // +7K TANEX |
562 | space->install_ram(0x0400, 0x1fff,NULL); | |
563 | space->nop_readwrite(0x2000, 0xbbff); | |
562 | space.install_ram(0x0400, 0x1fff,NULL); | |
563 | space.nop_readwrite(0x2000, 0xbbff); | |
564 | 564 | break; |
565 | 565 | default: // +7K TANEX + 40K TANRAM |
566 | space | |
566 | space.install_ram(0x0400, 0xbbff, NULL); | |
567 | 567 | break; |
568 | 568 | } |
569 | 569 |
r17963 | r17964 | |
---|---|---|
165 | 165 | /*****************************************************************************/ |
166 | 166 | READ8_HANDLER( hector_disc2_io00_port_r) |
167 | 167 | { |
168 | hec2hrp_state *state = space | |
168 | hec2hrp_state *state = space.machine().driver_data<hec2hrp_state>(); | |
169 | 169 | /* Switch Disc 2 to RAM to let full RAM acces */ |
170 | 170 | state->membank("bank3")->set_entry(DISCII_BANK_RAM); |
171 | 171 | return 0; |
172 | 172 | } |
173 | 173 | WRITE8_HANDLER( hector_disc2_io00_port_w) |
174 | 174 | { |
175 | hec2hrp_state *state = space | |
175 | hec2hrp_state *state = space.machine().driver_data<hec2hrp_state>(); | |
176 | 176 | /* Switch Disc 2 to RAM to let full RAM acces */ |
177 | 177 | state->membank("bank3")->set_entry(DISCII_BANK_RAM); |
178 | 178 | } |
r17963 | r17964 | |
187 | 187 | } |
188 | 188 | READ8_HANDLER( hector_disc2_io30_port_r) |
189 | 189 | { |
190 | hec2hrp_state *state = space | |
190 | hec2hrp_state *state = space.machine().driver_data<hec2hrp_state>(); | |
191 | 191 | return state->m_hector_disc2_data_r_ready; |
192 | 192 | } |
193 | 193 | WRITE8_HANDLER( hector_disc2_io30_port_w) |
r17963 | r17964 | |
197 | 197 | |
198 | 198 | READ8_HANDLER( hector_disc2_io40_port_r) |
199 | 199 | { |
200 | hec2hrp_state *state = space | |
200 | hec2hrp_state *state = space.machine().driver_data<hec2hrp_state>(); | |
201 | 201 | /* Read data send by Hector, by Disc2*/ |
202 | 202 | state->m_hector_disc2_data_r_ready = 0x00; /* Clear memory info read ready*/ |
203 | 203 | return state->m_hector_disc2_data_read; /* send the data !*/ |
r17963 | r17964 | |
205 | 205 | |
206 | 206 | WRITE8_HANDLER( hector_disc2_io40_port_w) /* Write data send by Disc2, to Hector*/ |
207 | 207 | { |
208 | hec2hrp_state *state = space | |
208 | hec2hrp_state *state = space.machine().driver_data<hec2hrp_state>(); | |
209 | 209 | state->m_hector_disc2_data_write = data; /* Memorization data*/ |
210 | 210 | state->m_hector_disc2_data_w_ready = 0x80; /* Memorization data write ready in D7*/ |
211 | 211 | } |
212 | 212 | |
213 | 213 | READ8_HANDLER( hector_disc2_io50_port_r) /*Read memory info write ready*/ |
214 | 214 | { |
215 | hec2hrp_state *state = space | |
215 | hec2hrp_state *state = space.machine().driver_data<hec2hrp_state>(); | |
216 | 216 | return state->m_hector_disc2_data_w_ready; |
217 | 217 | } |
218 | 218 | |
219 | 219 | WRITE8_HANDLER( hector_disc2_io50_port_w) /* I/O Port to the stuff of Disc2*/ |
220 | 220 | { |
221 | hec2hrp_state *state = space->machine().driver_data<hec2hrp_state>(); | |
222 | device_t *fdc = space->machine().device("upd765"); | |
221 | hec2hrp_state *state = space.machine().driver_data<hec2hrp_state>(); | |
222 | device_t *fdc = space.machine().device("upd765"); | |
223 | 223 | |
224 | 224 | /* FDC Motor Control - Bit 0/1 defines the state of the FDD 0/1 motor */ |
225 | floppy_mon_w(floppy_get_device(space->machine(), 0), BIT(data, 0)); // Moteur floppy A: | |
226 | floppy_mon_w(floppy_get_device(space->machine(), 1), BIT(data, 1)); // Moteur floppy B: | |
227 | floppy_drive_set_ready_state(floppy_get_device(space->machine(), 0), FLOPPY_DRIVE_READY,!BIT(data, 0)); | |
228 | floppy_drive_set_ready_state(floppy_get_device(space->machine(), 1), FLOPPY_DRIVE_READY,!BIT(data, 1)); | |
225 | floppy_mon_w(floppy_get_device(space.machine(), 0), BIT(data, 0)); // Moteur floppy A: | |
226 | floppy_mon_w(floppy_get_device(space.machine(), 1), BIT(data, 1)); // Moteur floppy B: | |
227 | floppy_drive_set_ready_state(floppy_get_device(space.machine(), 0), FLOPPY_DRIVE_READY,!BIT(data, 0)); | |
228 | floppy_drive_set_ready_state(floppy_get_device(space.machine(), 1), FLOPPY_DRIVE_READY,!BIT(data, 1)); | |
229 | 229 | |
230 | 230 | /* Write bit TC uPD765 on D4 of port I/O 50 */ |
231 | 231 | upd765_tc_w(fdc, BIT(data, 4)); // Seems not used... |
r17963 | r17964 | |
236 | 236 | |
237 | 237 | /* if RNMI is OK, try to lauch an NMI*/ |
238 | 238 | if (state->m_hector_disc2_RNMI) |
239 | valid_interrupt(space | |
239 | valid_interrupt(space.machine()); | |
240 | 240 | } |
241 | 241 | |
242 | 242 | //Here we must take the exchange with uPD against AM_DEVREADWRITE |
r17963 | r17964 | |
245 | 245 | // AM_RANGE(0x061,0x061) AM_DEVREADWRITE("upd765",upd765_data_r,upd765_data_w) |
246 | 246 | READ8_HANDLER( hector_disc2_io61_port_r) |
247 | 247 | { |
248 | hec2hrp_state *state = space | |
248 | hec2hrp_state *state = space.machine().driver_data<hec2hrp_state>(); | |
249 | 249 | UINT8 data; |
250 | device_t *fdc = space->machine().device("upd765"); | |
251 | data = upd765_data_r(fdc,*space, 0); //Get the result | |
250 | device_t *fdc = space.machine().device("upd765"); | |
251 | data = upd765_data_r(fdc,space, 0); //Get the result | |
252 | 252 | |
253 | 253 | // if ST0 == 0x28 (drive A:) or 0x29 (drive B:) => add 0x40 |
254 | 254 | // and correct the ST1 and ST2 (patch) |
r17963 | r17964 | |
280 | 280 | } |
281 | 281 | WRITE8_HANDLER( hector_disc2_io61_port_w) |
282 | 282 | { |
283 | hec2hrp_state *state = space | |
283 | hec2hrp_state *state = space.machine().driver_data<hec2hrp_state>(); | |
284 | 284 | /* Data useful to patch the RESULT in case of write command */ |
285 | 285 | state->m_hector_cmd[9]=state->m_hector_cmd[8]; //hector_cmd_8 = Cde number when state->m_hector_nb_cde = 9 |
286 | 286 | state->m_hector_cmd[8]=state->m_hector_cmd[7]; //hector_cmd_7 = Drive |
r17963 | r17964 | |
308 | 308 | state->m_print=0; |
309 | 309 | #endif |
310 | 310 | |
311 | device_t *fdc = space->machine().device("upd765"); | |
312 | upd765_data_w(fdc,*space, 0, data); | |
311 | device_t *fdc = space.machine().device("upd765"); | |
312 | upd765_data_w(fdc,space, 0, data); | |
313 | 313 | } |
314 | 314 | |
315 | 315 | // AM_RANGE(0x070,0x07f) AM_DEVREADWRITE("upd765",upd765_dack_r,upd765_dack_w) |
316 | 316 | READ8_HANDLER( hector_disc2_io70_port_r) // Gestion du DMA |
317 | 317 | { |
318 | 318 | UINT8 data; |
319 | device_t *fdc = space->machine().device("upd765"); | |
320 | data = upd765_dack_r(fdc,*space, 0); | |
319 | device_t *fdc = space.machine().device("upd765"); | |
320 | data = upd765_dack_r(fdc,space, 0); | |
321 | 321 | return data; |
322 | 322 | } |
323 | 323 | WRITE8_HANDLER( hector_disc2_io70_port_w) |
324 | 324 | { |
325 | device_t *fdc = space->machine().device("upd765"); | |
326 | upd765_dack_w(fdc,*space, 0, data); | |
325 | device_t *fdc = space.machine().device("upd765"); | |
326 | upd765_dack_w(fdc,space, 0, data); | |
327 | 327 | } |
r17963 | r17964 | |
---|---|---|
258 | 258 | |
259 | 259 | SNAPSHOT_LOAD( poly88 ) |
260 | 260 | { |
261 | address_space | |
261 | address_space &space = *image.device().machine().device("maincpu")->memory().space(AS_PROGRAM); | |
262 | 262 | UINT8* data= auto_alloc_array(image.device().machine(), UINT8, snapshot_size); |
263 | 263 | UINT16 recordNum; |
264 | 264 | UINT16 recordLen; |
r17963 | r17964 | |
290 | 290 | switch(recordType) { |
291 | 291 | case 0 : |
292 | 292 | /* 00 Absolute */ |
293 | memcpy(space | |
293 | memcpy(space.get_read_ptr(address ), data + pos ,recordLen); | |
294 | 294 | break; |
295 | 295 | case 1 : |
296 | 296 | /* 01 Comment */ |
r17963 | r17964 | |
---|---|---|
22 | 22 | MEMORY BANKING |
23 | 23 | ***************************************************************************/ |
24 | 24 | |
25 | static void samcoupe_update_bank(address_space | |
25 | static void samcoupe_update_bank(address_space &space, int bank_num, UINT8 *memory, int is_readonly) | |
26 | 26 | { |
27 | 27 | char bank[10]; |
28 | 28 | sprintf(bank,"bank%d",bank_num); |
29 | samcoupe_state *state = space | |
29 | samcoupe_state *state = space.machine().driver_data<samcoupe_state>(); | |
30 | 30 | if (memory) |
31 | 31 | { |
32 | 32 | state->membank(bank)->set_base(memory); |
33 | space | |
33 | space.install_read_bank (((bank_num-1) * 0x4000), ((bank_num-1) * 0x4000) + 0x3FFF, bank); | |
34 | 34 | if (is_readonly) { |
35 | space | |
35 | space.unmap_write(((bank_num-1) * 0x4000), ((bank_num-1) * 0x4000) + 0x3FFF); | |
36 | 36 | } else { |
37 | space | |
37 | space.install_write_bank(((bank_num-1) * 0x4000), ((bank_num-1) * 0x4000) + 0x3FFF, bank); | |
38 | 38 | } |
39 | 39 | } else { |
40 | space | |
40 | space.nop_readwrite(((bank_num-1) * 0x4000), ((bank_num-1) * 0x4000) + 0x3FFF); | |
41 | 41 | } |
42 | 42 | } |
43 | 43 | |
44 | 44 | |
45 | static void samcoupe_install_ext_mem(address_space | |
45 | static void samcoupe_install_ext_mem(address_space &space) | |
46 | 46 | { |
47 | samcoupe_state *state = space | |
47 | samcoupe_state *state = space.machine().driver_data<samcoupe_state>(); | |
48 | 48 | UINT8 *mem; |
49 | 49 | |
50 | 50 | /* bank 3 */ |
51 | if (state->m_lext >> 6 < space->machine().device<ram_device>(RAM_TAG)->size() >> 20) | |
52 | mem = &space->machine().device<ram_device>(RAM_TAG)->pointer()[(space->machine().device<ram_device>(RAM_TAG)->size() & 0xfffff) + (state->m_lext >> 6) * 0x100000 + (state->m_lext & 0x3f) * 0x4000]; | |
51 | if (state->m_lext >> 6 < space.machine().device<ram_device>(RAM_TAG)->size() >> 20) | |
52 | mem = &space.machine().device<ram_device>(RAM_TAG)->pointer()[(space.machine().device<ram_device>(RAM_TAG)->size() & 0xfffff) + (state->m_lext >> 6) * 0x100000 + (state->m_lext & 0x3f) * 0x4000]; | |
53 | 53 | else |
54 | 54 | mem = NULL; |
55 | 55 | |
56 | 56 | samcoupe_update_bank(space, 3, mem, FALSE); |
57 | 57 | |
58 | 58 | /* bank 4 */ |
59 | if (state->m_hext >> 6 < space->machine().device<ram_device>(RAM_TAG)->size() >> 20) | |
60 | mem = &space->machine().device<ram_device>(RAM_TAG)->pointer()[(space->machine().device<ram_device>(RAM_TAG)->size() & 0xfffff) + (state->m_hext >> 6) * 0x100000 + (state->m_hext & 0x3f) * 0x4000]; | |
59 | if (state->m_hext >> 6 < space.machine().device<ram_device>(RAM_TAG)->size() >> 20) | |
60 | mem = &space.machine().device<ram_device>(RAM_TAG)->pointer()[(space.machine().device<ram_device>(RAM_TAG)->size() & 0xfffff) + (state->m_hext >> 6) * 0x100000 + (state->m_hext & 0x3f) * 0x4000]; | |
61 | 61 | else |
62 | 62 | mem = NULL; |
63 | 63 | |
r17963 | r17964 | |
65 | 65 | } |
66 | 66 | |
67 | 67 | |
68 | void samcoupe_update_memory(address_space | |
68 | void samcoupe_update_memory(address_space &space) | |
69 | 69 | { |
70 | samcoupe_state *state = space->machine().driver_data<samcoupe_state>(); | |
71 | const int PAGE_MASK = ((space->machine().device<ram_device>(RAM_TAG)->size() & 0xfffff) / 0x4000) - 1; | |
70 | samcoupe_state *state = space.machine().driver_data<samcoupe_state>(); | |
71 | const int PAGE_MASK = ((space.machine().device<ram_device>(RAM_TAG)->size() & 0xfffff) / 0x4000) - 1; | |
72 | 72 | UINT8 *rom = state->memregion("maincpu")->base(); |
73 | 73 | UINT8 *memory; |
74 | 74 | int is_readonly; |
r17963 | r17964 | |
77 | 77 | if (state->m_lmpr & LMPR_RAM0) /* Is ram paged in at bank 1 */ |
78 | 78 | { |
79 | 79 | if ((state->m_lmpr & 0x1F) <= PAGE_MASK) |
80 | memory = &space | |
80 | memory = &space.machine().device<ram_device>(RAM_TAG)->pointer()[(state->m_lmpr & PAGE_MASK) * 0x4000]; | |
81 | 81 | else |
82 | 82 | memory = NULL; /* Attempt to page in non existant ram region */ |
83 | 83 | is_readonly = FALSE; |
r17963 | r17964 | |
92 | 92 | |
93 | 93 | /* BANK2 */ |
94 | 94 | if (((state->m_lmpr + 1) & 0x1f) <= PAGE_MASK) |
95 | memory = &space | |
95 | memory = &space.machine().device<ram_device>(RAM_TAG)->pointer()[((state->m_lmpr + 1) & PAGE_MASK) * 0x4000]; | |
96 | 96 | else |
97 | 97 | memory = NULL; /* Attempt to page in non existant ram region */ |
98 | 98 | samcoupe_update_bank(space, 2, memory, FALSE); |
r17963 | r17964 | |
106 | 106 | { |
107 | 107 | /* BANK3 */ |
108 | 108 | if ((state->m_hmpr & 0x1F) <= PAGE_MASK ) |
109 | memory = &space | |
109 | memory = &space.machine().device<ram_device>(RAM_TAG)->pointer()[(state->m_hmpr & PAGE_MASK)*0x4000]; | |
110 | 110 | else |
111 | 111 | memory = NULL; /* Attempt to page in non existant ram region */ |
112 | 112 | samcoupe_update_bank(space, 3, memory, FALSE); |
r17963 | r17964 | |
121 | 121 | else |
122 | 122 | { |
123 | 123 | if (((state->m_hmpr + 1) & 0x1f) <= PAGE_MASK) |
124 | memory = &space | |
124 | memory = &space.machine().device<ram_device>(RAM_TAG)->pointer()[((state->m_hmpr + 1) & PAGE_MASK) * 0x4000]; | |
125 | 125 | else |
126 | 126 | memory = NULL; /* Attempt to page in non existant ram region */ |
127 | 127 | is_readonly = FALSE; |
r17963 | r17964 | |
131 | 131 | |
132 | 132 | /* video memory location */ |
133 | 133 | if (state->m_vmpr & 0x40) /* if bit set in 2 bank screen mode */ |
134 | state->m_videoram = &space | |
134 | state->m_videoram = &space.machine().device<ram_device>(RAM_TAG)->pointer()[((state->m_vmpr & 0x1e) & PAGE_MASK) * 0x4000]; | |
135 | 135 | else |
136 | state->m_videoram = &space | |
136 | state->m_videoram = &space.machine().device<ram_device>(RAM_TAG)->pointer()[((state->m_vmpr & 0x1f) & PAGE_MASK) * 0x4000]; | |
137 | 137 | } |
138 | 138 | |
139 | 139 | |
140 | 140 | WRITE8_MEMBER(samcoupe_state::samcoupe_ext_mem_w) |
141 | 141 | { |
142 | address_space | |
142 | address_space &space_program = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
143 | 143 | |
144 | 144 | if (offset & 1) |
145 | 145 | m_hext = data; |
r17963 | r17964 | |
160 | 160 | |
161 | 161 | static READ8_DEVICE_HANDLER( samcoupe_rtc_r ) |
162 | 162 | { |
163 | address_space | |
163 | address_space &spaceio = *device->machine().device("maincpu")->memory().space(AS_IO); | |
164 | 164 | msm6242_device *rtc = dynamic_cast<msm6242_device*>(device); |
165 | return rtc->read( | |
165 | return rtc->read(spaceio,offset >> 12); | |
166 | 166 | } |
167 | 167 | |
168 | 168 | |
169 | 169 | static WRITE8_DEVICE_HANDLER( samcoupe_rtc_w ) |
170 | 170 | { |
171 | address_space | |
171 | address_space &spaceio = *device->machine().device("maincpu")->memory().space(AS_IO); | |
172 | 172 | msm6242_device *rtc = dynamic_cast<msm6242_device*>(device); |
173 | rtc->write( | |
173 | rtc->write(spaceio,offset >> 12, data); | |
174 | 174 | } |
175 | 175 | |
176 | 176 | |
r17963 | r17964 | |
244 | 244 | |
245 | 245 | void samcoupe_state::machine_reset() |
246 | 246 | { |
247 | address_space *space = machine().device("maincpu")->memory().space(AS_PROGRAM); | |
248 | address_space *spaceio = machine().device("maincpu")->memory().space(AS_IO); | |
247 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
248 | address_space &spaceio = *machine().device("maincpu")->memory().space(AS_IO); | |
249 | 249 | |
250 | 250 | /* initialize state */ |
251 | 251 | m_lmpr = 0x0f; /* ROM0 paged in, ROM1 paged out RAM Banks */ |
r17963 | r17964 | |
263 | 263 | { |
264 | 264 | /* install RTC */ |
265 | 265 | device_t *rtc = machine().device("sambus_clock"); |
266 | spaceio | |
266 | spaceio.install_legacy_readwrite_handler(*rtc, 0xef, 0xef, 0xffff, 0xff00, FUNC(samcoupe_rtc_r), FUNC(samcoupe_rtc_w)); | |
267 | 267 | } |
268 | 268 | else |
269 | 269 | { |
270 | 270 | /* no RTC support */ |
271 | spaceio | |
271 | spaceio.unmap_readwrite(0xef, 0xef, 0xffff, 0xff00); | |
272 | 272 | } |
273 | 273 | |
274 | 274 | /* initialize memory */ |
r17963 | r17964 | |
---|---|---|
892 | 892 | |
893 | 893 | MACHINE_RESET_MEMBER(trs80_state,lnw80) |
894 | 894 | { |
895 | address_space | |
895 | address_space &space = *m_maincpu->space(AS_PROGRAM); | |
896 | 896 | m_cassette_data = 0; |
897 | 897 | m_reg_load = 1; |
898 | lnw80_fe_w( | |
898 | lnw80_fe_w(space, 0, 0); | |
899 | 899 | } |
900 | 900 |
r17963 | r17964 | |
---|---|---|
47 | 47 | static void primo_update_memory(running_machine &machine) |
48 | 48 | { |
49 | 49 | primo_state *state = machine.driver_data<primo_state>(); |
50 | address_space | |
50 | address_space& space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
51 | 51 | switch (state->m_port_FD & 0x03) |
52 | 52 | { |
53 | 53 | case 0x00: /* Original ROM */ |
54 | space | |
54 | space.unmap_write(0x0000, 0x3fff); | |
55 | 55 | state->membank("bank1")->set_base(machine.root_device().memregion("maincpu")->base()+0x10000); |
56 | 56 | break; |
57 | 57 | case 0x01: /* EPROM extension 1 */ |
58 | space | |
58 | space.unmap_write(0x0000, 0x3fff); | |
59 | 59 | state->membank("bank1")->set_base(machine.root_device().memregion("maincpu")->base()+0x14000); |
60 | 60 | break; |
61 | 61 | case 0x02: /* RAM */ |
62 | space | |
62 | space.install_write_bank(0x0000, 0x3fff, "bank1"); | |
63 | 63 | state->membank("bank1")->set_base(machine.root_device().memregion("maincpu")->base()); |
64 | 64 | break; |
65 | 65 | case 0x03: /* EPROM extension 2 */ |
66 | space | |
66 | space.unmap_write(0x0000, 0x3fff); | |
67 | 67 | state->membank("bank1")->set_base(state->memregion("maincpu")->base()+0x18000); |
68 | 68 | break; |
69 | 69 | } |
r17963 | r17964 | |
---|---|---|
47 | 47 | device_t* cpu = machine().device("maincpu"); |
48 | 48 | char mac[7]; |
49 | 49 | UINT32 num = rand(); |
50 | address_space | |
50 | address_space& space = *cpu->memory().space(AS_PROGRAM); | |
51 | 51 | m_slot = dynamic_cast<x68k_expansion_slot_device *>(owner()); |
52 | 52 | memset(m_prom, 0x57, 16); |
53 | 53 | sprintf(mac+2, "\x1b%c%c%c", (num >> 16) & 0xff, (num >> 8) & 0xff, num & 0xff); |
54 | 54 | mac[0] = 0; mac[1] = 0; // avoid gcc warning |
55 | 55 | memcpy(m_prom, mac, 6); |
56 | 56 | m_dp8390->set_mac(mac); |
57 | space | |
57 | space.install_readwrite_handler(0xece000,0xece3ff,read16_delegate(FUNC(x68k_neptune_device::x68k_neptune_port_r),this),write16_delegate(FUNC(x68k_neptune_device::x68k_neptune_port_w),this),0xffffffff); | |
58 | 58 | } |
59 | 59 | |
60 | 60 | void x68k_neptune_device::device_reset() { |
r17963 | r17964 | |
---|---|---|
153 | 153 | pc1640.port61=data; |
154 | 154 | if (data==0x30) pc1640.port62=(pc1640.port65&0x10)>>4; |
155 | 155 | else if (data==0x34) pc1640.port62=pc1640.port65&0xf; |
156 | pit8253_gate2_w(space->machine().device("pit8253"), BIT(data, 0)); | |
157 | pc_speaker_set_spkrdata( space->machine(), data & 0x02 ); | |
156 | pit8253_gate2_w(space.machine().device("pit8253"), BIT(data, 0)); | |
157 | pc_speaker_set_spkrdata( space.machine(), data & 0x02 ); | |
158 | 158 | pc_keyb_set_clock(data&0x40); |
159 | 159 | break; |
160 | 160 | case 4: |
r17963 | r17964 | |
191 | 191 | |
192 | 192 | case 2: |
193 | 193 | data = pc1640.port62; |
194 | if (pit8253_get_output(space | |
194 | if (pit8253_get_output(space.machine().device("pit8253"), 2)) | |
195 | 195 | data |= 0x20; |
196 | 196 | break; |
197 | 197 | } |
r17963 | r17964 | |
200 | 200 | |
201 | 201 | READ8_HANDLER( pc200_port378_r ) |
202 | 202 | { |
203 | device_t *lpt = space->machine().device("lpt_1"); | |
204 | UINT8 data = pc_lpt_r(lpt, *space, offset); | |
203 | device_t *lpt = space.machine().device("lpt_1"); | |
204 | UINT8 data = pc_lpt_r(lpt, space, offset); | |
205 | 205 | |
206 | 206 | if (offset == 1) |
207 | data = (data & ~7) | (space | |
207 | data = (data & ~7) | (space.machine().root_device().ioport("DSW0")->read() & 7); | |
208 | 208 | if (offset == 2) |
209 | data = (data & ~0xe0) | (space | |
209 | data = (data & ~0xe0) | (space.machine().root_device().ioport("DSW0")->read() & 0xc0); | |
210 | 210 | |
211 | 211 | return data; |
212 | 212 | } |
213 | 213 | |
214 | 214 | READ8_HANDLER( pc200_port278_r ) |
215 | 215 | { |
216 | device_t *lpt = space->machine().device("lpt_2"); | |
217 | UINT8 data = pc_lpt_r(lpt, *space, offset); | |
216 | device_t *lpt = space.machine().device("lpt_2"); | |
217 | UINT8 data = pc_lpt_r(lpt, space, offset); | |
218 | 218 | |
219 | 219 | if (offset == 1) |
220 | data = (data & ~7) | (space | |
220 | data = (data & ~7) | (space.machine().root_device().ioport("DSW0")->read() & 7); | |
221 | 221 | if (offset == 2) |
222 | data = (data & ~0xe0) | (space | |
222 | data = (data & ~0xe0) | (space.machine().root_device().ioport("DSW0")->read() & 0xc0); | |
223 | 223 | |
224 | 224 | return data; |
225 | 225 | } |
r17963 | r17964 | |
227 | 227 | |
228 | 228 | READ8_HANDLER( pc1640_port378_r ) |
229 | 229 | { |
230 | device_t *lpt = space->machine().device("lpt_1"); | |
231 | UINT8 data = pc_lpt_r(lpt, *space, offset); | |
230 | device_t *lpt = space.machine().device("lpt_1"); | |
231 | UINT8 data = pc_lpt_r(lpt, space, offset); | |
232 | 232 | |
233 | 233 | if (offset == 1) |
234 | data=(data & ~7) | (space | |
234 | data=(data & ~7) | (space.machine().root_device().ioport("DSW0")->read() & 7); | |
235 | 235 | if (offset == 2) |
236 | 236 | { |
237 | 237 | switch (pc1640.dipstate) |
238 | 238 | { |
239 | 239 | case 0: |
240 | data = (data&~0xe0) | (space | |
240 | data = (data&~0xe0) | (space.machine().root_device().ioport("DSW0")->read() & 0xe0); | |
241 | 241 | break; |
242 | 242 | case 1: |
243 | data = (data&~0xe0) | ((space | |
243 | data = (data&~0xe0) | ((space.machine().root_device().ioport("DSW0")->read() & 0xe000)>>8); | |
244 | 244 | break; |
245 | 245 | case 2: |
246 | data = (data&~0xe0) | ((space | |
246 | data = (data&~0xe0) | ((space.machine().root_device().ioport("DSW0")->read() & 0xe00)>>4); | |
247 | 247 | break; |
248 | 248 | |
249 | 249 | } |
r17963 | r17964 | |
254 | 254 | READ8_HANDLER( pc1640_port3d0_r ) |
255 | 255 | { |
256 | 256 | if (offset==0xa) pc1640.dipstate=0; |
257 | return space | |
257 | return space.read_byte(0x3d0+offset); | |
258 | 258 | } |
259 | 259 | |
260 | 260 | READ8_HANDLER( pc1640_port4278_r ) |
r17963 | r17964 | |
273 | 273 | |
274 | 274 | READ8_HANDLER( pc1640_mouse_x_r ) |
275 | 275 | { |
276 | return pc1640.mouse.x - space | |
276 | return pc1640.mouse.x - space.machine().root_device().ioport("pc_mouse_x")->read(); | |
277 | 277 | } |
278 | 278 | |
279 | 279 | READ8_HANDLER( pc1640_mouse_y_r ) |
280 | 280 | { |
281 | return pc1640.mouse.y - space | |
281 | return pc1640.mouse.y - space.machine().root_device().ioport("pc_mouse_y")->read(); | |
282 | 282 | } |
283 | 283 | |
284 | 284 | WRITE8_HANDLER( pc1640_mouse_x_w ) |
285 | 285 | { |
286 | pc1640.mouse.x = data + space | |
286 | pc1640.mouse.x = data + space.machine().root_device().ioport("pc_mouse_x")->read(); | |
287 | 287 | } |
288 | 288 | |
289 | 289 | WRITE8_HANDLER( pc1640_mouse_y_w ) |
290 | 290 | { |
291 | pc1640.mouse.y = data + space | |
291 | pc1640.mouse.y = data + space.machine().root_device().ioport("pc_mouse_y")->read(); | |
292 | 292 | } |
293 | 293 | |
294 | 294 | INPUT_PORTS_START( amstrad_keyboard ) |
r17963 | r17964 | |
---|---|---|
223 | 223 | |
224 | 224 | void wswan_state::machine_reset() |
225 | 225 | { |
226 | address_space | |
226 | address_space &space = *machine().device( "maincpu")->memory().space( AS_PROGRAM ); | |
227 | 227 | |
228 | 228 | /* Intialize ports */ |
229 | 229 | memcpy( m_ws_portram, ws_portram_init, 256 ); |
r17963 | r17964 | |
231 | 231 | /* Initialize VDP */ |
232 | 232 | memset( &m_vdp, 0, sizeof( m_vdp ) ); |
233 | 233 | |
234 | m_vdp.vram = (UINT8*)space->get_read_ptr(0); | |
235 | m_vdp.palette_vram = (UINT8*)space->get_read_ptr(( m_system_type == TYPE_WSC ) ? 0xFE00 : 0 ); | |
234 | m_vdp.vram = (UINT8*)space.get_read_ptr(0); | |
235 | m_vdp.palette_vram = (UINT8*)space.get_read_ptr(( m_system_type == TYPE_WSC ) ? 0xFE00 : 0 ); | |
236 | 236 | m_vdp.current_line = 145; /* Randomly chosen, beginning of VBlank period to give cart some time to boot up */ |
237 | 237 | m_vdp.color_mode = 0; |
238 | 238 | m_vdp.colors_16 = 0; |
r17963 | r17964 | |
1459 | 1459 | /* Handle Sound DMA */ |
1460 | 1460 | if ( ( state->m_sound_dma.enable & 0x88 ) == 0x80 ) |
1461 | 1461 | { |
1462 | address_space | |
1462 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM ); | |
1463 | 1463 | /* TODO: Output sound DMA byte */ |
1464 | state->wswan_port_w( | |
1464 | state->wswan_port_w( space, 0x89, space.read_byte(state->m_sound_dma.source ) ); | |
1465 | 1465 | state->m_sound_dma.size--; |
1466 | 1466 | state->m_sound_dma.source = ( state->m_sound_dma.source + 1 ) & 0x0FFFFF; |
1467 | 1467 | if ( state->m_sound_dma.size == 0 ) |
r17963 | r17964 | |
---|---|---|
184 | 184 | */ |
185 | 185 | DIRECT_UPDATE_MEMBER(z80ne_state::z80ne_reset_delay_count) |
186 | 186 | { |
187 | address_space | |
187 | address_space &space = *machine().device("z80ne")->memory().space(AS_PROGRAM); | |
188 | 188 | /* |
189 | 189 | * TODO: when debugger is active, his memory access causes this callback |
190 | 190 | * |
191 | 191 | */ |
192 | if(!space | |
192 | if(!space.debugger_access()) | |
193 | 193 | m_reset_delay_counter--; |
194 | 194 | |
195 | 195 | if (!m_reset_delay_counter) |
r17963 | r17964 | |
213 | 213 | static void reset_lx382_banking(running_machine &machine) |
214 | 214 | { |
215 | 215 | z80ne_state *state = machine.driver_data<z80ne_state>(); |
216 | address_space | |
216 | address_space &space = *machine.device("z80ne")->memory().space(AS_PROGRAM); | |
217 | 217 | |
218 | 218 | /* switch to ROM bank at address 0x0000 */ |
219 | 219 | state->membank("bank1")->set_entry(1); |
r17963 | r17964 | |
221 | 221 | |
222 | 222 | /* after the first 3 bytes have been read from ROM, switch the RAM back in */ |
223 | 223 | state->m_reset_delay_counter = 2; |
224 | space | |
224 | space.set_direct_update_handler(direct_update_delegate(FUNC(z80ne_state::z80ne_reset_delay_count), state)); | |
225 | 225 | } |
226 | 226 | |
227 | 227 | static void reset_lx390_banking(running_machine &machine) |
228 | 228 | { |
229 | 229 | z80ne_state *state = machine.driver_data<z80ne_state>(); |
230 | address_space | |
230 | address_space &space = *machine.device("z80ne")->memory().space(AS_PROGRAM); | |
231 | 231 | state->m_reset_delay_counter = 0; |
232 | 232 | |
233 | 233 | switch (machine.root_device().ioport("CONFIG")->read() & 0x07) { |
r17963 | r17964 | |
240 | 240 | state->membank("bank4")->set_entry(0); /* RAM at 0xF000 */ |
241 | 241 | /* after the first 3 bytes have been read from ROM, switch the RAM back in */ |
242 | 242 | state->m_reset_delay_counter = 2; |
243 | space | |
243 | space.set_direct_update_handler(direct_update_delegate(FUNC(z80ne_state::z80ne_reset_delay_count), state)); | |
244 | 244 | break; |
245 | 245 | case 0x02: /* EP548 16k BASIC */ |
246 | 246 | if (VERBOSE) |
r17963 | r17964 | |
288 | 288 | MACHINE_RESET_MEMBER(z80ne_state,z80ne_base) |
289 | 289 | { |
290 | 290 | int i; |
291 | address_space | |
291 | address_space &space = *machine().device("z80ne")->memory().space(AS_PROGRAM); | |
292 | 292 | |
293 | 293 | LOG(("In MACHINE_RESET z80ne_base\n")); |
294 | 294 | |
r17963 | r17964 | |
336 | 336 | ay31015_set_transmitter_clock( m_ay31015, m_cass_data.speed * 16.0); |
337 | 337 | |
338 | 338 | m_nmi_delay_counter = 0; |
339 | lx385_ctrl_w( | |
339 | lx385_ctrl_w(space, 0, 0); | |
340 | 340 | |
341 | 341 | } |
342 | 342 |
r17963 | r17964 | |
---|---|---|
801 | 801 | |
802 | 802 | static READ8_HANDLER( gssnd_r ) |
803 | 803 | { |
804 | apple2gs_state *state = space | |
804 | apple2gs_state *state = space.machine().driver_data<apple2gs_state>(); | |
805 | 805 | UINT8 ret = 0; |
806 | 806 | |
807 | 807 | switch (offset) |
r17963 | r17964 | |
819 | 819 | } |
820 | 820 | else |
821 | 821 | { |
822 | state->m_sndglu_dummy_read = state->m_es5503->read( | |
822 | state->m_sndglu_dummy_read = state->m_es5503->read(space, state->m_sndglu_addr); | |
823 | 823 | } |
824 | 824 | |
825 | 825 | if (state->m_sndglu_ctrl & 0x20) // auto-increment |
r17963 | r17964 | |
842 | 842 | |
843 | 843 | static WRITE8_HANDLER( gssnd_w ) |
844 | 844 | { |
845 | apple2gs_state *state = space | |
845 | apple2gs_state *state = space.machine().driver_data<apple2gs_state>(); | |
846 | 846 | switch (offset) |
847 | 847 | { |
848 | 848 | case 0: // control |
r17963 | r17964 | |
855 | 855 | case 1: // data write |
856 | 856 | if (state->m_sndglu_ctrl & 0x40) // docram access |
857 | 857 | { |
858 | UINT8 *docram = space | |
858 | UINT8 *docram = space.machine().root_device().memregion("es5503")->base(); | |
859 | 859 | docram[state->m_sndglu_addr] = data; |
860 | 860 | } |
861 | 861 | else |
862 | 862 | { |
863 | state->m_es5503->write( | |
863 | state->m_es5503->write(space, state->m_sndglu_addr, data); | |
864 | 864 | } |
865 | 865 | |
866 | 866 | if (state->m_sndglu_ctrl & 0x20) // auto-increment |
r17963 | r17964 | |
1013 | 1013 | case 0x3D: /* C03D - SOUNDDATA */ |
1014 | 1014 | case 0x3E: /* C03E - SOUNDADRL */ |
1015 | 1015 | case 0x3F: /* C03F - SOUNDADRH */ |
1016 | result = gssnd_r( | |
1016 | result = gssnd_r(space, offset & 0x03); | |
1017 | 1017 | break; |
1018 | 1018 | |
1019 | 1019 | case 0x41: /* C041 - INTEN */ |
r17963 | r17964 | |
1174 | 1174 | case 0x3D: /* C03D - SOUNDDATA */ |
1175 | 1175 | case 0x3E: /* C03E - SOUNDADRL */ |
1176 | 1176 | case 0x3F: /* C03F - SOUNDADRH */ |
1177 | gssnd_w( | |
1177 | gssnd_w(space, offset & 0x03, data); | |
1178 | 1178 | break; |
1179 | 1179 | |
1180 | 1180 | case 0x41: /* C041 - INTEN */ |
r17963 | r17964 | |
1747 | 1747 | |
1748 | 1748 | |
1749 | 1749 | |
1750 | static READ8_HANDLER( apple2gs_00Cxxx_r ) { return apple2gs_xxCxxx_r(*space, space->machine(), offset | 0x00C000); } | |
1751 | static READ8_HANDLER( apple2gs_01Cxxx_r ) { return apple2gs_xxCxxx_r(*space, space->machine(), offset | 0x01C000); } | |
1752 | static READ8_HANDLER( apple2gs_E0Cxxx_r ) { return apple2gs_xxCxxx_r(*space, space->machine(), offset | 0xE0C000); } | |
1753 | static READ8_HANDLER( apple2gs_E1Cxxx_r ) { return apple2gs_xxCxxx_r(*space, space->machine(), offset | 0xE1C000); } | |
1750 | static READ8_HANDLER( apple2gs_00Cxxx_r ) { return apple2gs_xxCxxx_r(space, space.machine(), offset | 0x00C000); } | |
1751 | static READ8_HANDLER( apple2gs_01Cxxx_r ) { return apple2gs_xxCxxx_r(space, space.machine(), offset | 0x01C000); } | |
1752 | static READ8_HANDLER( apple2gs_E0Cxxx_r ) { return apple2gs_xxCxxx_r(space, space.machine(), offset | 0xE0C000); } | |
1753 | static READ8_HANDLER( apple2gs_E1Cxxx_r ) { return apple2gs_xxCxxx_r(space, space.machine(), offset | 0xE1C000); } | |
1754 | 1754 | |
1755 | static WRITE8_HANDLER( apple2gs_00Cxxx_w ) { apple2gs_xxCxxx_w(*space, space->machine(), offset | 0x00C000, data); } | |
1756 | static WRITE8_HANDLER( apple2gs_01Cxxx_w ) { apple2gs_xxCxxx_w(*space, space->machine(), offset | 0x01C000, data); } | |
1757 | static WRITE8_HANDLER( apple2gs_E0Cxxx_w ) { apple2gs_xxCxxx_w(*space, space->machine(), offset | 0xE0C000, data); } | |
1758 | static WRITE8_HANDLER( apple2gs_E1Cxxx_w ) { apple2gs_xxCxxx_w(*space, space->machine(), offset | 0xE1C000, data); } | |
1755 | static WRITE8_HANDLER( apple2gs_00Cxxx_w ) { apple2gs_xxCxxx_w(space, space.machine(), offset | 0x00C000, data); } | |
1756 | static WRITE8_HANDLER( apple2gs_01Cxxx_w ) { apple2gs_xxCxxx_w(space, space.machine(), offset | 0x01C000, data); } | |
1757 | static WRITE8_HANDLER( apple2gs_E0Cxxx_w ) { apple2gs_xxCxxx_w(space, space.machine(), offset | 0xE0C000, data); } | |
1758 | static WRITE8_HANDLER( apple2gs_E1Cxxx_w ) { apple2gs_xxCxxx_w(space, space.machine(), offset | 0xE1C000, data); } | |
1759 | 1759 | |
1760 | 1760 | static WRITE8_HANDLER( apple2gs_Exxxxx_w ) |
1761 | 1761 | { |
1762 | apple2gs_state *state = space | |
1762 | apple2gs_state *state = space.machine().driver_data<apple2gs_state>(); | |
1763 | 1763 | state->m_slowmem[offset] = data; |
1764 | 1764 | } |
1765 | 1765 | |
r17963 | r17964 | |
1770 | 1770 | |
1771 | 1771 | static WRITE8_HANDLER( apple2gs_slowmem_w ) |
1772 | 1772 | { |
1773 | apple2gs_state *state = space | |
1773 | apple2gs_state *state = space.machine().driver_data<apple2gs_state>(); | |
1774 | 1774 | state->m_slowmem[offset] = data; |
1775 | 1775 | |
1776 | 1776 | if ((offset >= 0x19e00) && (offset < 0x19fff)) |
1777 | 1777 | { |
1778 | 1778 | int color = (offset - 0x19e00) >> 1; |
1779 | 1779 | |
1780 | palette_set_color_rgb(space | |
1780 | palette_set_color_rgb(space.machine(), color + 16, | |
1781 | 1781 | ((state->m_slowmem[0x19E00 + (color * 2) + 1] >> 0) & 0x0F) * 17, |
1782 | 1782 | ((state->m_slowmem[0x19E00 + (color * 2) + 0] >> 4) & 0x0F) * 17, |
1783 | 1783 | ((state->m_slowmem[0x19E00 + (color * 2) + 0] >> 0) & 0x0F) * 17); |
r17963 | r17964 | |
1788 | 1788 | // which doesn't drive the bus results in reading back the bank number. |
1789 | 1789 | static READ8_HANDLER(apple2gs_bank_echo_r) |
1790 | 1790 | { |
1791 | apple2gs_state *state = space | |
1791 | apple2gs_state *state = space.machine().driver_data<apple2gs_state>(); | |
1792 | 1792 | |
1793 | 1793 | return state->m_echo_bank + (offset>>16); |
1794 | 1794 | } |
r17963 | r17964 | |
1796 | 1796 | static void apple2gs_setup_memory(running_machine &machine) |
1797 | 1797 | { |
1798 | 1798 | apple2gs_state *state = machine.driver_data<apple2gs_state>(); |
1799 | address_space | |
1799 | address_space& space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
1800 | 1800 | offs_t begin, end; |
1801 | 1801 | apple2_memmap_config cfg; |
1802 | 1802 | |
r17963 | r17964 | |
1812 | 1812 | int ramsize = machine.device<ram_device>(RAM_TAG)->size(); |
1813 | 1813 | |
1814 | 1814 | // ROM 03 hardware: the quoted "1 MB" for a base machine doesn't include banks e0/e1, so map accordingly |
1815 | space | |
1815 | space.install_readwrite_bank(0x010000, ramsize - 1, "bank1"); | |
1816 | 1816 | state->membank("bank1")->set_base(machine.device<ram_device>(RAM_TAG)->pointer() + 0x010000); |
1817 | 1817 | |
1818 | space | |
1818 | space.install_legacy_read_handler( ramsize, 0xdfffff, FUNC(apple2gs_bank_echo_r)); | |
1819 | 1819 | state->m_echo_bank = (ramsize >> 16); |
1820 | 1820 | } |
1821 | 1821 | else |
r17963 | r17964 | |
1823 | 1823 | int ramsize = machine.device<ram_device>(RAM_TAG)->size()-0x30000; |
1824 | 1824 | |
1825 | 1825 | // ROM 00/01 hardware: the quoted "256K" for a base machine *does* include banks e0/e1. |
1826 | space | |
1826 | space.install_readwrite_bank(0x010000, ramsize - 1 + 0x10000, "bank1"); | |
1827 | 1827 | state->membank("bank1")->set_base(machine.device<ram_device>(RAM_TAG)->pointer() + 0x010000); |
1828 | 1828 | |
1829 | space | |
1829 | space.install_legacy_read_handler( ramsize + 0x10000, 0xdfffff, FUNC(apple2gs_bank_echo_r)); | |
1830 | 1830 | state->m_echo_bank = (ramsize+0x10000) >> 16; |
1831 | 1831 | } |
1832 | 1832 | |
1833 | 1833 | /* install hi memory */ |
1834 | space->install_read_bank(0xe00000, 0xe1ffff, "bank2"); | |
1835 | space->install_legacy_write_handler(0xe00000, 0xe1ffff, FUNC(apple2gs_slowmem_w)); | |
1836 | space->install_legacy_write_handler(0xe00400, 0xe007ff, FUNC(apple2gs_E004xx_w)); | |
1837 | space->install_legacy_write_handler(0xe02000, 0xe03fff, FUNC(apple2gs_E02xxx_w)); | |
1838 | space->install_legacy_write_handler(0xe10400, 0xe107ff, FUNC(apple2gs_E104xx_w)); | |
1839 | space->install_legacy_write_handler(0xe12000, 0xe13fff, FUNC(apple2gs_E12xxx_w)); | |
1834 | space.install_read_bank(0xe00000, 0xe1ffff, "bank2"); | |
1835 | space.install_legacy_write_handler(0xe00000, 0xe1ffff, FUNC(apple2gs_slowmem_w)); | |
1836 | space.install_legacy_write_handler(0xe00400, 0xe007ff, FUNC(apple2gs_E004xx_w)); | |
1837 | space.install_legacy_write_handler(0xe02000, 0xe03fff, FUNC(apple2gs_E02xxx_w)); | |
1838 | space.install_legacy_write_handler(0xe10400, 0xe107ff, FUNC(apple2gs_E104xx_w)); | |
1839 | space.install_legacy_write_handler(0xe12000, 0xe13fff, FUNC(apple2gs_E12xxx_w)); | |
1840 | 1840 | state->membank("bank2")->set_base(state->m_slowmem); |
1841 | 1841 | |
1842 | 1842 | /* install alternate ROM bank */ |
1843 | 1843 | begin = 0x1000000 - machine.root_device().memregion("maincpu")->bytes(); |
1844 | 1844 | end = 0xffffff; |
1845 | space | |
1845 | space.install_read_bank(begin, end, "bank3"); | |
1846 | 1846 | state->membank("bank3")->set_base(machine.root_device().memregion("maincpu")->base()); |
1847 | 1847 | |
1848 | 1848 | /* install new xxC000-xxCFFF handlers */ |
1849 | space->install_legacy_read_handler(0x00c000, 0x00cfff, FUNC(apple2gs_00Cxxx_r)); | |
1850 | space->install_legacy_write_handler(0x00c000, 0x00cfff, FUNC(apple2gs_00Cxxx_w)); | |
1851 | space->install_legacy_read_handler(0x01c000, 0x01cfff, FUNC(apple2gs_01Cxxx_r)); | |
1852 | space->install_legacy_write_handler(0x01c000, 0x01cfff, FUNC(apple2gs_01Cxxx_w)); | |
1853 | space->install_legacy_read_handler(0xe0c000, 0xe0cfff, FUNC(apple2gs_E0Cxxx_r)); | |
1854 | space->install_legacy_write_handler(0xe0c000, 0xe0cfff, FUNC(apple2gs_E0Cxxx_w)); | |
1855 | space->install_legacy_read_handler(0xe1c000, 0xe1cfff, FUNC(apple2gs_E1Cxxx_r)); | |
1856 | space->install_legacy_write_handler(0xe1c000, 0xe1cfff, FUNC(apple2gs_E1Cxxx_w)); | |
1857 | space->set_direct_update_handler(direct_update_delegate(FUNC(apple2gs_state::apple2gs_opbase), state)); | |
1849 | space.install_legacy_read_handler(0x00c000, 0x00cfff, FUNC(apple2gs_00Cxxx_r)); | |
1850 | space.install_legacy_write_handler(0x00c000, 0x00cfff, FUNC(apple2gs_00Cxxx_w)); | |
1851 | space.install_legacy_read_handler(0x01c000, 0x01cfff, FUNC(apple2gs_01Cxxx_r)); | |
1852 | space.install_legacy_write_handler(0x01c000, 0x01cfff, FUNC(apple2gs_01Cxxx_w)); | |
1853 | space.install_legacy_read_handler(0xe0c000, 0xe0cfff, FUNC(apple2gs_E0Cxxx_r)); | |
1854 | space.install_legacy_write_handler(0xe0c000, 0xe0cfff, FUNC(apple2gs_E0Cxxx_w)); | |
1855 | space.install_legacy_read_handler(0xe1c000, 0xe1cfff, FUNC(apple2gs_E1Cxxx_r)); | |
1856 | space.install_legacy_write_handler(0xe1c000, 0xe1cfff, FUNC(apple2gs_E1Cxxx_w)); | |
1857 | space.set_direct_update_handler(direct_update_delegate(FUNC(apple2gs_state::apple2gs_opbase), state)); | |
1858 | 1858 | |
1859 | 1859 | |
1860 | 1860 | /* install aux memory writes (for shadowing) */ |
1861 | space->install_write_handler(0x010400, 0x0107FF, write8_delegate(FUNC(apple2gs_state::apple2gs_aux0400_w), state)); | |
1862 | space->install_write_handler(0x012000, 0x013FFF, write8_delegate(FUNC(apple2gs_state::apple2gs_aux2000_w), state)); | |
1863 | space->install_write_handler(0x014000, 0x019FFF, write8_delegate(FUNC(apple2gs_state::apple2gs_aux4000_w), state)); | |
1861 | space.install_write_handler(0x010400, 0x0107FF, write8_delegate(FUNC(apple2gs_state::apple2gs_aux0400_w), state)); | |
1862 | space.install_write_handler(0x012000, 0x013FFF, write8_delegate(FUNC(apple2gs_state::apple2gs_aux2000_w), state)); | |
1863 | space.install_write_handler(0x014000, 0x019FFF, write8_delegate(FUNC(apple2gs_state::apple2gs_aux4000_w), state)); | |
1864 | 1864 | |
1865 | 1865 | /* setup the Apple II memory system */ |
1866 | 1866 | memset(&cfg, 0, sizeof(cfg)); |
r17963 | r17964 | |
1879 | 1879 | |
1880 | 1880 | static READ8_HANDLER( apple2gs_read_vector ) |
1881 | 1881 | { |
1882 | return space | |
1882 | return space.read_byte(offset | 0xFF0000); | |
1883 | 1883 | } |
1884 | 1884 | |
1885 | 1885 | MACHINE_RESET_MEMBER(apple2gs_state,apple2gs) |
r17963 | r17964 | |
---|---|---|
94 | 94 | |
95 | 95 | if (m_bank_base > 0) |
96 | 96 | { |
97 | address_space | |
97 | address_space &space = *m_maincpu->space(AS_PROGRAM); | |
98 | 98 | |
99 | 99 | /* first clear everything out */ |
100 | space->nop_read(0x00000000, 0x3FFFFFFF); | |
101 | space->nop_read(0x00000000, 0x3FFFFFFF); | |
100 | space.nop_read(0x00000000, 0x3FFFFFFF); | |
101 | space.nop_read(0x00000000, 0x3FFFFFFF); | |
102 | 102 | } |
103 | 103 | |
104 | 104 | for (bank = 0; bank < MPC105_MEMORYBANK_COUNT; bank++) |
r17963 | r17964 | |
---|---|---|
93 | 93 | |
94 | 94 | void iq151_staper_device::io_read(offs_t offset, UINT8 &data) |
95 | 95 | { |
96 | address_space | |
96 | address_space& space = *machine().device("maincpu")->memory().space(AS_IO); | |
97 | 97 | |
98 | 98 | if (offset >= 0xf8 && offset < 0xfc) |
99 | data = m_ppi->read( | |
99 | data = m_ppi->read(space, offset & 0x03); | |
100 | 100 | } |
101 | 101 | |
102 | 102 | //------------------------------------------------- |
r17963 | r17964 | |
105 | 105 | |
106 | 106 | void iq151_staper_device::io_write(offs_t offset, UINT8 data) |
107 | 107 | { |
108 | address_space | |
108 | address_space& space = *machine().device("maincpu")->memory().space(AS_IO); | |
109 | 109 | |
110 | 110 | if (offset >= 0xf8 && offset < 0xfc) |
111 | m_ppi->write( | |
111 | m_ppi->write(space, offset & 0x03, data); | |
112 | 112 | } |
113 | 113 | |
114 | 114 |
r17963 | r17964 | |
---|---|---|
36 | 36 | static void init_nes_core( running_machine &machine ) |
37 | 37 | { |
38 | 38 | nes_state *state = machine.driver_data<nes_state>(); |
39 | address_space | |
39 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
40 | 40 | static const char *const bank_names[] = { "bank1", "bank2", "bank3", "bank4" }; |
41 | 41 | int prg_banks = (state->m_prg_chunks == 1) ? (2 * 2) : (state->m_prg_chunks * 2); |
42 | 42 | int i; |
r17963 | r17964 | |
46 | 46 | // other pointers got set in the loading routine |
47 | 47 | |
48 | 48 | /* Brutal hack put in as a consequence of the new memory system; we really need to fix the NES code */ |
49 | space | |
49 | space.install_readwrite_bank(0x0000, 0x07ff, 0, 0x1800, "bank10"); | |
50 | 50 | |
51 | 51 | machine.device("ppu")->memory().space(AS_PROGRAM)->install_legacy_readwrite_handler(0, 0x1fff, FUNC(nes_chr_r), FUNC(nes_chr_w)); |
52 | 52 | machine.device("ppu")->memory().space(AS_PROGRAM)->install_legacy_readwrite_handler(0x2000, 0x3eff, FUNC(nes_nt_r), FUNC(nes_nt_w)); |
r17963 | r17964 | |
68 | 68 | if (state->m_fds_ram == NULL) |
69 | 69 | state->m_fds_ram = auto_alloc_array(machine, UINT8, 0x8000); |
70 | 70 | |
71 | space->install_read_handler(0x4030, 0x403f, read8_delegate(FUNC(nes_state::nes_fds_r),state)); | |
72 | space->install_read_bank(0x6000, 0xdfff, "bank2"); | |
73 | space->install_read_bank(0xe000, 0xffff, "bank1"); | |
71 | space.install_read_handler(0x4030, 0x403f, read8_delegate(FUNC(nes_state::nes_fds_r),state)); | |
72 | space.install_read_bank(0x6000, 0xdfff, "bank2"); | |
73 | space.install_read_bank(0xe000, 0xffff, "bank1"); | |
74 | 74 | |
75 | space->install_write_handler(0x4020, 0x402f, write8_delegate(FUNC(nes_state::nes_fds_w),state)); | |
76 | space->install_write_bank(0x6000, 0xdfff, "bank2"); | |
75 | space.install_write_handler(0x4020, 0x402f, write8_delegate(FUNC(nes_state::nes_fds_w),state)); | |
76 | space.install_write_bank(0x6000, 0xdfff, "bank2"); | |
77 | 77 | |
78 | 78 | state->membank("bank1")->set_base(&state->m_rom[0xe000]); |
79 | 79 | state->membank("bank2")->set_base(state->m_fds_ram); |
r17963 | r17964 | |
84 | 84 | pcb_handlers_setup(machine); |
85 | 85 | |
86 | 86 | /* Set up the memory handlers for the mapper */ |
87 | space->install_read_bank(0x8000, 0x9fff, "bank1"); | |
88 | space->install_read_bank(0xa000, 0xbfff, "bank2"); | |
89 | space->install_read_bank(0xc000, 0xdfff, "bank3"); | |
90 | space->install_read_bank(0xe000, 0xffff, "bank4"); | |
91 | space->install_readwrite_bank(0x6000, 0x7fff, "bank5"); | |
87 | space.install_read_bank(0x8000, 0x9fff, "bank1"); | |
88 | space.install_read_bank(0xa000, 0xbfff, "bank2"); | |
89 | space.install_read_bank(0xc000, 0xdfff, "bank3"); | |
90 | space.install_read_bank(0xe000, 0xffff, "bank4"); | |
91 | space.install_readwrite_bank(0x6000, 0x7fff, "bank5"); | |
92 | 92 | |
93 | 93 | /* configure banks 1-4 */ |
94 | 94 | for (i = 0; i < 4; i++) |
r17963 | r17964 | |
161 | 161 | |
162 | 162 | // there are still some quirk about writes to bank5... I hope to fix them soon. (mappers 34,45,52,246 have both mid_w and WRAM-->check) |
163 | 163 | if (state->m_mmc_write_mid) |
164 | space | |
164 | space.install_legacy_write_handler(0x6000, 0x7fff, state->m_mmc_write_mid,state->m_mmc_write_mid_name); | |
165 | 165 | if (state->m_mmc_write) |
166 | space | |
166 | space.install_legacy_write_handler(0x8000, 0xffff, state->m_mmc_write, state->m_mmc_write_name); | |
167 | 167 | |
168 | 168 | // In fact, we also allow single pcbs to overwrite the bank read handlers defined above, |
169 | 169 | // because some pcbs (mainly pirate ones) require protection values to be read instead of |
170 | 170 | // the expected ROM banks: these handlers, though, must take care of the ROM access as well |
171 | 171 | if (state->m_mmc_read_mid) |
172 | space | |
172 | space.install_legacy_read_handler(0x6000, 0x7fff, state->m_mmc_read_mid,state->m_mmc_read_mid_name); | |
173 | 173 | if (state->m_mmc_read) |
174 | space | |
174 | space.install_legacy_read_handler(0x8000, 0xffff, state->m_mmc_read,state->m_mmc_read_name); | |
175 | 175 | |
176 | 176 | // install additional handlers |
177 | 177 | if (state->m_pcb_id == BTL_SMB2B || state->m_mapper == 50) |
178 | 178 | { |
179 | space->install_legacy_write_handler(0x4020, 0x403f, FUNC(smb2jb_extra_w)); | |
180 | space->install_legacy_write_handler(0x40a0, 0x40bf, FUNC(smb2jb_extra_w)); | |
179 | space.install_legacy_write_handler(0x4020, 0x403f, FUNC(smb2jb_extra_w)); | |
180 | space.install_legacy_write_handler(0x40a0, 0x40bf, FUNC(smb2jb_extra_w)); | |
181 | 181 | } |
182 | 182 | |
183 | 183 | if (state->m_pcb_id == KAISER_KS7017) |
184 | 184 | { |
185 | space->install_legacy_read_handler(0x4030, 0x4030, FUNC(ks7017_extra_r)); | |
186 | space->install_legacy_write_handler(0x4020, 0x40ff, FUNC(ks7017_extra_w)); | |
185 | space.install_legacy_read_handler(0x4030, 0x4030, FUNC(ks7017_extra_r)); | |
186 | space.install_legacy_write_handler(0x4020, 0x40ff, FUNC(ks7017_extra_w)); | |
187 | 187 | } |
188 | 188 | |
189 | 189 | if (state->m_pcb_id == UNL_603_5052) |
190 | 190 | { |
191 | space->install_legacy_read_handler(0x4020, 0x40ff, FUNC(unl_6035052_extra_r)); | |
192 | space->install_legacy_write_handler(0x4020, 0x40ff, FUNC(unl_6035052_extra_w)); | |
191 | space.install_legacy_read_handler(0x4020, 0x40ff, FUNC(unl_6035052_extra_r)); | |
192 | space.install_legacy_write_handler(0x4020, 0x40ff, FUNC(unl_6035052_extra_w)); | |
193 | 193 | } |
194 | 194 | |
195 | 195 | if (state->m_pcb_id == WAIXING_SH2) |
r17963 | r17964 | |
---|---|---|
223 | 223 | m_maincpu->set_input_line(INPUT_LINE_IRQ0, m_fdc_irq | m_dma_irq); |
224 | 224 | } |
225 | 225 | |
226 | static UINT8 memory_read_byte(address_space *space, offs_t address) { return space->read_byte(address); } | |
227 | static void memory_write_byte(address_space *space, offs_t address, UINT8 data) { space->write_byte(address, data); } | |
226 | static UINT8 memory_read_byte(address_space &space, offs_t address) { return space.read_byte(address); } | |
227 | static void memory_write_byte(address_space &space, offs_t address, UINT8 data) { space.write_byte(address, data); } | |
228 | 228 | |
229 | 229 | static Z80DMA_INTERFACE( dma_intf ) |
230 | 230 | { |
r17963 | r17964 | |
---|---|---|
167 | 167 | |
168 | 168 | WRITE8_HANDLER( nes_chr_w ) |
169 | 169 | { |
170 | nes_state *state = space | |
170 | nes_state *state = space.machine().driver_data<nes_state>(); | |
171 | 171 | int bank = offset >> 10; |
172 | 172 | |
173 | 173 | if (state->m_chr_map[bank].source == CHRRAM) |
r17963 | r17964 | |
178 | 178 | |
179 | 179 | READ8_HANDLER( nes_chr_r ) |
180 | 180 | { |
181 | nes_state *state = space | |
181 | nes_state *state = space.machine().driver_data<nes_state>(); | |
182 | 182 | int bank = offset >> 10; |
183 | 183 | |
184 | 184 | // a few CNROM boards contained copy protection schemes through |
r17963 | r17964 | |
193 | 193 | |
194 | 194 | WRITE8_HANDLER( nes_nt_w ) |
195 | 195 | { |
196 | nes_state *state = space | |
196 | nes_state *state = space.machine().driver_data<nes_state>(); | |
197 | 197 | int page = ((offset & 0xc00) >> 10); |
198 | 198 | |
199 | 199 | if (state->m_nt_page[page].writable == 0) |
r17963 | r17964 | |
204 | 204 | |
205 | 205 | READ8_HANDLER( nes_nt_r ) |
206 | 206 | { |
207 | nes_state *state = space | |
207 | nes_state *state = space.machine().driver_data<nes_state>(); | |
208 | 208 | int page = ((offset & 0xc00) >> 10); |
209 | 209 | |
210 | 210 | if (state->m_nt_page[page].source == MMC5FILL) |
r17963 | r17964 | |
219 | 219 | |
220 | 220 | WRITE8_HANDLER( nes_low_mapper_w ) |
221 | 221 | { |
222 | nes_state *state = space | |
222 | nes_state *state = space.machine().driver_data<nes_state>(); | |
223 | 223 | |
224 | 224 | if (state->m_mmc_write_low) |
225 | 225 | (*state->m_mmc_write_low)(space, offset, data); |
r17963 | r17964 | |
229 | 229 | |
230 | 230 | READ8_HANDLER( nes_low_mapper_r ) |
231 | 231 | { |
232 | nes_state *state = space | |
232 | nes_state *state = space.machine().driver_data<nes_state>(); | |
233 | 233 | |
234 | 234 | if (state->m_mmc_read_low) |
235 | 235 | return (*state->m_mmc_read_low)(space, offset); |
r17963 | r17964 | |
---|---|---|
17 | 17 | { |
18 | 18 | UINT8 data = 0xf; |
19 | 19 | int delta; |
20 | attotime new_time = space->machine().time(); | |
21 | ioport_port *joystick_port = space->machine().root_device().ioport("pc_joy"); | |
20 | attotime new_time = space.machine().time(); | |
21 | ioport_port *joystick_port = space.machine().root_device().ioport("pc_joy"); | |
22 | 22 | delta = ((new_time - JOY_time) * 256 * 1000).seconds; |
23 | 23 | |
24 | 24 | if (joystick_port != NULL) |
r17963 | r17964 | |
32 | 32 | //} |
33 | 33 | //else |
34 | 34 | { |
35 | if (space->machine().root_device().ioport("pc_joy_1")->read() < delta) data &= ~0x01; | |
36 | if (space->machine().root_device().ioport("pc_joy_2")->read() < delta) data &= ~0x02; | |
37 | if (space->machine().root_device().ioport("pc_joy_3")->read() < delta) data &= ~0x04; | |
38 | if (space->machine().root_device().ioport("pc_joy_4")->read() < delta) data &= ~0x08; | |
35 | if (space.machine().root_device().ioport("pc_joy_1")->read() < delta) data &= ~0x01; | |
36 | if (space.machine().root_device().ioport("pc_joy_2")->read() < delta) data &= ~0x02; | |
37 | if (space.machine().root_device().ioport("pc_joy_3")->read() < delta) data &= ~0x04; | |
38 | if (space.machine().root_device().ioport("pc_joy_4")->read() < delta) data &= ~0x08; | |
39 | 39 | } |
40 | 40 | } |
41 | 41 | else |
r17963 | r17964 | |
50 | 50 | |
51 | 51 | WRITE8_HANDLER ( pc_JOY_w ) |
52 | 52 | { |
53 | JOY_time = space | |
53 | JOY_time = space.machine().time(); | |
54 | 54 | } |
55 | 55 | |
56 | 56 | INPUT_PORTS_START( pc_joystick_none ) |
r17963 | r17964 | |
---|---|---|
826 | 826 | ***************************************************************************/ |
827 | 827 | |
828 | 828 | static DEVICE_RESET( apollo_rtc ) { |
829 | address_space | |
829 | address_space &space = *device->machine().device(MAINCPU)->memory().space(AS_PROGRAM); | |
830 | 830 | apollo_state *state = device->machine().driver_data<apollo_state>(); |
831 | UINT8 year = state->apollo_rtc_r( | |
831 | UINT8 year = state->apollo_rtc_r(space, 9); | |
832 | 832 | |
833 | 833 | // change year according to configuration settings |
834 | 834 | if (year < 20 && apollo_config(APOLLO_CONF_DATE_1990)) |
835 | 835 | { |
836 | 836 | year+=80; |
837 | state->apollo_rtc_w( | |
837 | state->apollo_rtc_w(space, 9, year); | |
838 | 838 | } |
839 | 839 | else if (year >= 80 && !apollo_config(APOLLO_CONF_DATE_1990)) |
840 | 840 | { |
841 | 841 | year -=80; |
842 | state->apollo_rtc_w( | |
842 | state->apollo_rtc_w(space, 9, year); | |
843 | 843 | } |
844 | 844 | |
845 | 845 | //SLOG1(("reset apollo_rtc year=%d", year)); |
r17963 | r17964 | |
872 | 872 | static TIMER_CALLBACK( apollo_rtc_timer ) |
873 | 873 | { |
874 | 874 | apollo_state *state = machine.driver_data<apollo_state>(); |
875 | address_space | |
875 | address_space &space = *machine.device(MAINCPU)->memory().space(AS_PROGRAM); | |
876 | 876 | |
877 | 877 | // FIXME: reading register 0x0c will clear all interrupt flags |
878 | if ((state->apollo_rtc_r( | |
878 | if ((state->apollo_rtc_r(space, 0x0c) & 0x80)) | |
879 | 879 | { |
880 | 880 | //SLOG2(("apollo_rtc_timer - set_irq_line %d", APOLLO_IRQ_RTC)); |
881 | apollo_pic_set_irq_line(&space | |
881 | apollo_pic_set_irq_line(&space.device(), APOLLO_IRQ_RTC, 1); | |
882 | 882 | } |
883 | 883 | } |
884 | 884 | |
r17963 | r17964 | |
1343 | 1343 | |
1344 | 1344 | WRITE8_MEMBER(apollo_state::apollo_fdc_w){ |
1345 | 1345 | SLOG1(("writing FDC upd765 at offset %X = %02x", offset, data)); |
1346 | pc_fdc_w( | |
1346 | pc_fdc_w(space, offset, data); | |
1347 | 1347 | } |
1348 | 1348 | |
1349 | 1349 | READ8_MEMBER(apollo_state::apollo_fdc_r){ |
1350 | UINT8 data = pc_fdc_r( | |
1350 | UINT8 data = pc_fdc_r(space, offset); | |
1351 | 1351 | SLOG1(("reading FDC upd765 at offset %X = %02x", offset, data)); |
1352 | 1352 | return data; |
1353 | 1353 | } |
r17963 | r17964 | |
---|---|---|
26 | 26 | pc_joy_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
27 | 27 | virtual ioport_constructor device_input_ports() const; |
28 | 28 | |
29 | DECLARE_READ8_MEMBER(joy_port_r) { return pc_JOY_r(&space, offset); } | |
30 | DECLARE_WRITE8_MEMBER(joy_port_w) { pc_JOY_w(&space, offset, data); } | |
29 | DECLARE_READ8_MEMBER(joy_port_r) { return pc_JOY_r(space, offset); } | |
30 | DECLARE_WRITE8_MEMBER(joy_port_w) { pc_JOY_w(space, offset, data); } | |
31 | 31 | protected: |
32 | 32 | virtual void device_start() {} |
33 | 33 | }; |
r17963 | r17964 | |
---|---|---|
327 | 327 | |
328 | 328 | MACHINE_RESET_MEMBER(kaypro_state,kaypro2x) |
329 | 329 | { |
330 | address_space *space = m_maincpu->space(AS_PROGRAM); | |
331 | kaypro2x_system_port_w(*space, 0, 0x80); | |
330 | address_space &space = *m_maincpu->space(AS_PROGRAM); | |
331 | kaypro2x_system_port_w(space, 0, 0x80); | |
332 | 332 | MACHINE_RESET_CALL_MEMBER(kay_kbd); |
333 | 333 | } |
334 | 334 | |
r17963 | r17964 | |
346 | 346 | QUICKLOAD_LOAD( kayproii ) |
347 | 347 | { |
348 | 348 | kaypro_state *state = image.device().machine().driver_data<kaypro_state>(); |
349 | address_space | |
349 | address_space &space = *state->m_maincpu->space(AS_PROGRAM); | |
350 | 350 | UINT8 *RAM = state->memregion("rambank")->base(); |
351 | 351 | UINT16 i; |
352 | 352 | UINT8 data; |
r17963 | r17964 | |
359 | 359 | RAM[i+0x100] = data; |
360 | 360 | } |
361 | 361 | |
362 | state->common_pio_system_w( | |
362 | state->common_pio_system_w(space, 0, state->m_system_port & 0x7f); // switch TPA in | |
363 | 363 | RAM[0x80]=0; // clear out command tail |
364 | 364 | RAM[0x81]=0; |
365 | 365 | state->m_maincpu->set_pc(0x100); // start program |
r17963 | r17964 | |
369 | 369 | QUICKLOAD_LOAD( kaypro2x ) |
370 | 370 | { |
371 | 371 | kaypro_state *state = image.device().machine().driver_data<kaypro_state>(); |
372 | address_space | |
372 | address_space &space = *state->m_maincpu->space(AS_PROGRAM); | |
373 | 373 | UINT8 *RAM = state->memregion("rambank")->base(); |
374 | 374 | UINT16 i; |
375 | 375 | UINT8 data; |
r17963 | r17964 | |
381 | 381 | RAM[i+0x100] = data; |
382 | 382 | } |
383 | 383 | |
384 | state->kaypro2x_system_port_w( | |
384 | state->kaypro2x_system_port_w(space, 0, state->m_system_port & 0x7f); | |
385 | 385 | RAM[0x80]=0; |
386 | 386 | RAM[0x81]=0; |
387 | 387 | state->m_maincpu->set_pc(0x100); |
r17963 | r17964 | |
---|---|---|
2001 | 2001 | DEVICE_START( s3c44b0 ) |
2002 | 2002 | { |
2003 | 2003 | running_machine &machine = device->machine(); |
2004 | address_space | |
2004 | address_space &space = *machine.device( "maincpu")->memory().space( AS_PROGRAM); | |
2005 | 2005 | s3c44b0_t *s3c44b0 = get_token( device); |
2006 | 2006 | s3c44b0->iface = (const s3c44b0_interface *)device->static_config(); |
2007 | s3c44b0->space = space; | |
2007 | s3c44b0->space = &space; | |
2008 | 2008 | s3c44b0->cpu = downcast<cpu_device *>(device->machine().device( "maincpu")); |
2009 | 2009 | for (int i = 0; i < 6; i++) s3c44b0->pwm.timer[i] = machine.scheduler().timer_alloc(FUNC(s3c44b0_pwm_timer_exp), (void*)device); |
2010 | 2010 | for (int i = 0; i < 2; i++) s3c44b0->uart[i].timer = machine.scheduler().timer_alloc(FUNC(s3c44b0_uart_timer_exp), (void*)device); |
r17963 | r17964 | |
2016 | 2016 | s3c44b0->adc.timer = machine.scheduler().timer_alloc(FUNC(s3c44b0_adc_timer_exp), (void*)device); |
2017 | 2017 | s3c44b0->iic.timer = machine.scheduler().timer_alloc(FUNC(s3c44b0_iic_timer_exp), (void*)device); |
2018 | 2018 | s3c44b0->iis.timer = machine.scheduler().timer_alloc(FUNC(s3c44b0_iis_timer_exp), (void*)device); |
2019 | space->install_legacy_readwrite_handler( *device, 0x01c00000, 0x01c0000b, 0, 0, FUNC(s3c44b0_cpuwrap_r), FUNC(s3c44b0_cpuwrap_w)); | |
2020 | space->install_legacy_readwrite_handler( *device, 0x01d00000, 0x01d0002b, 0, 0, FUNC(s3c44b0_uart_0_r), FUNC(s3c44b0_uart_0_w)); | |
2021 | space->install_legacy_readwrite_handler( *device, 0x01d04000, 0x01d0402b, 0, 0, FUNC(s3c44b0_uart_1_r), FUNC(s3c44b0_uart_1_w)); | |
2022 | space->install_legacy_readwrite_handler( *device, 0x01d14000, 0x01d14013, 0, 0, FUNC(s3c44b0_sio_r), FUNC(s3c44b0_sio_w)); | |
2023 | space->install_legacy_readwrite_handler( *device, 0x01d18000, 0x01d18013, 0, 0, FUNC(s3c44b0_iis_r), FUNC(s3c44b0_iis_w)); | |
2024 | space->install_legacy_readwrite_handler( *device, 0x01d20000, 0x01d20057, 0, 0, FUNC(s3c44b0_gpio_r), FUNC(s3c44b0_gpio_w)); | |
2025 | space->install_legacy_readwrite_handler( *device, 0x01d30000, 0x01d3000b, 0, 0, FUNC(s3c44b0_wdt_r), FUNC(s3c44b0_wdt_w)); | |
2026 | space->install_legacy_readwrite_handler( *device, 0x01d40000, 0x01d4000b, 0, 0, FUNC(s3c44b0_adc_r), FUNC(s3c44b0_adc_w)); | |
2027 | space->install_legacy_readwrite_handler( *device, 0x01d50000, 0x01d5004f, 0, 0, FUNC(s3c44b0_pwm_r), FUNC(s3c44b0_pwm_w)); | |
2028 | space->install_legacy_readwrite_handler( *device, 0x01d60000, 0x01d6000f, 0, 0, FUNC(s3c44b0_iic_r), FUNC(s3c44b0_iic_w)); | |
2029 | space->install_legacy_readwrite_handler( *device, 0x01d80000, 0x01d8000f, 0, 0, FUNC(s3c44b0_clkpow_r), FUNC(s3c44b0_clkpow_w)); | |
2030 | space->install_legacy_readwrite_handler( *device, 0x01e00000, 0x01e0003f, 0, 0, FUNC(s3c44b0_irq_r), FUNC(s3c44b0_irq_w)); | |
2031 | space->install_legacy_readwrite_handler( *device, 0x01e80000, 0x01e8001b, 0, 0, FUNC(s3c44b0_zdma_0_r), FUNC(s3c44b0_zdma_0_w)); | |
2032 | space->install_legacy_readwrite_handler( *device, 0x01e80020, 0x01e8003b, 0, 0, FUNC(s3c44b0_zdma_1_r), FUNC(s3c44b0_zdma_1_w)); | |
2033 | space->install_legacy_readwrite_handler( *device, 0x01f00000, 0x01f00047, 0, 0, FUNC(s3c44b0_lcd_r), FUNC(s3c44b0_lcd_w)); | |
2034 | space->install_legacy_readwrite_handler( *device, 0x01f80000, 0x01f8001b, 0, 0, FUNC(s3c44b0_bdma_0_r), FUNC(s3c44b0_bdma_0_w)); | |
2035 | space->install_legacy_readwrite_handler( *device, 0x01f80020, 0x01f8003b, 0, 0, FUNC(s3c44b0_bdma_1_r), FUNC(s3c44b0_bdma_1_w)); | |
2019 | space.install_legacy_readwrite_handler( *device, 0x01c00000, 0x01c0000b, 0, 0, FUNC(s3c44b0_cpuwrap_r), FUNC(s3c44b0_cpuwrap_w)); | |
2020 | space.install_legacy_readwrite_handler( *device, 0x01d00000, 0x01d0002b, 0, 0, FUNC(s3c44b0_uart_0_r), FUNC(s3c44b0_uart_0_w)); | |
2021 | space.install_legacy_readwrite_handler( *device, 0x01d04000, 0x01d0402b, 0, 0, FUNC(s3c44b0_uart_1_r), FUNC(s3c44b0_uart_1_w)); | |
2022 | space.install_legacy_readwrite_handler( *device, 0x01d14000, 0x01d14013, 0, 0, FUNC(s3c44b0_sio_r), FUNC(s3c44b0_sio_w)); | |
2023 | space.install_legacy_readwrite_handler( *device, 0x01d18000, 0x01d18013, 0, 0, FUNC(s3c44b0_iis_r), FUNC(s3c44b0_iis_w)); | |
2024 | space.install_legacy_readwrite_handler( *device, 0x01d20000, 0x01d20057, 0, 0, FUNC(s3c44b0_gpio_r), FUNC(s3c44b0_gpio_w)); | |
2025 | space.install_legacy_readwrite_handler( *device, 0x01d30000, 0x01d3000b, 0, 0, FUNC(s3c44b0_wdt_r), FUNC(s3c44b0_wdt_w)); | |
2026 | space.install_legacy_readwrite_handler( *device, 0x01d40000, 0x01d4000b, 0, 0, FUNC(s3c44b0_adc_r), FUNC(s3c44b0_adc_w)); | |
2027 | space.install_legacy_readwrite_handler( *device, 0x01d50000, 0x01d5004f, 0, 0, FUNC(s3c44b0_pwm_r), FUNC(s3c44b0_pwm_w)); | |
2028 | space.install_legacy_readwrite_handler( *device, 0x01d60000, 0x01d6000f, 0, 0, FUNC(s3c44b0_iic_r), FUNC(s3c44b0_iic_w)); | |
2029 | space.install_legacy_readwrite_handler( *device, 0x01d80000, 0x01d8000f, 0, 0, FUNC(s3c44b0_clkpow_r), FUNC(s3c44b0_clkpow_w)); | |
2030 | space.install_legacy_readwrite_handler( *device, 0x01e00000, 0x01e0003f, 0, 0, FUNC(s3c44b0_irq_r), FUNC(s3c44b0_irq_w)); | |
2031 | space.install_legacy_readwrite_handler( *device, 0x01e80000, 0x01e8001b, 0, 0, FUNC(s3c44b0_zdma_0_r), FUNC(s3c44b0_zdma_0_w)); | |
2032 | space.install_legacy_readwrite_handler( *device, 0x01e80020, 0x01e8003b, 0, 0, FUNC(s3c44b0_zdma_1_r), FUNC(s3c44b0_zdma_1_w)); | |
2033 | space.install_legacy_readwrite_handler( *device, 0x01f00000, 0x01f00047, 0, 0, FUNC(s3c44b0_lcd_r), FUNC(s3c44b0_lcd_w)); | |
2034 | space.install_legacy_readwrite_handler( *device, 0x01f80000, 0x01f8001b, 0, 0, FUNC(s3c44b0_bdma_0_r), FUNC(s3c44b0_bdma_0_w)); | |
2035 | space.install_legacy_readwrite_handler( *device, 0x01f80020, 0x01f8003b, 0, 0, FUNC(s3c44b0_bdma_1_r), FUNC(s3c44b0_bdma_1_w)); | |
2036 | 2036 | } |
2037 | 2037 | |
2038 | 2038 | const device_type S3C44B0 = &device_creator<s3c44b0_device>; |
r17963 | r17964 | |
---|---|---|
47 | 47 | |
48 | 48 | static WRITE8_HANDLER( mapper6_l_w ) |
49 | 49 | { |
50 | nes_state *state = space | |
50 | nes_state *state = space.machine().driver_data<nes_state>(); | |
51 | 51 | LOG_MMC(("mapper6_l_w, offset: %04x, data: %02x\n", offset, data)); |
52 | 52 | |
53 | 53 | switch (offset) |
54 | 54 | { |
55 | 55 | case 0x1fe: |
56 | 56 | state->m_mmc_latch1 = data & 0x80; |
57 | set_nt_mirroring(space | |
57 | set_nt_mirroring(space.machine(), BIT(data, 4) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW); | |
58 | 58 | break; |
59 | 59 | case 0x1ff: |
60 | set_nt_mirroring(space | |
60 | set_nt_mirroring(space.machine(), BIT(data, 4) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
61 | 61 | break; |
62 | 62 | |
63 | 63 | case 0x401: |
r17963 | r17964 | |
75 | 75 | |
76 | 76 | static WRITE8_HANDLER( mapper6_w ) |
77 | 77 | { |
78 | nes_state *state = space | |
78 | nes_state *state = space.machine().driver_data<nes_state>(); | |
79 | 79 | LOG_MMC(("mapper6_w, offset: %04x, data: %02x\n", offset, data)); |
80 | 80 | |
81 | 81 | if (!state->m_mmc_latch1) // when in "FFE mode" we are forced to use CHRRAM/EXRAM bank? |
82 | 82 | { |
83 | prg16_89ab(space->machine(), data >> 2); | |
84 | // chr8(space->machine(), data & 0x03, ???); | |
83 | prg16_89ab(space.machine(), data >> 2); | |
84 | // chr8(space.machine(), data & 0x03, ???); | |
85 | 85 | // due to lack of info on the exact behavior, we simply act as if mmc_latch1=1 |
86 | 86 | if (state->m_mmc_chr_source == CHRROM) |
87 | chr8(space | |
87 | chr8(space.machine(), data & 0x03, CHRROM); | |
88 | 88 | } |
89 | 89 | else if (state->m_mmc_chr_source == CHRROM) // otherwise, we can use CHRROM (when present) |
90 | chr8(space | |
90 | chr8(space.machine(), data, CHRROM); | |
91 | 91 | } |
92 | 92 | |
93 | 93 | /************************************************************* |
r17963 | r17964 | |
105 | 105 | { |
106 | 106 | LOG_MMC(("mapper8_w, offset: %04x, data: %02x\n", offset, data)); |
107 | 107 | |
108 | chr8(space->machine(), data & 0x07, CHRROM); | |
109 | prg16_89ab(space->machine(), data >> 3); | |
108 | chr8(space.machine(), data & 0x07, CHRROM); | |
109 | prg16_89ab(space.machine(), data >> 3); | |
110 | 110 | } |
111 | 111 | |
112 | 112 | /************************************************************* |
r17963 | r17964 | |
123 | 123 | |
124 | 124 | static WRITE8_HANDLER( mapper17_l_w ) |
125 | 125 | { |
126 | nes_state *state = space | |
126 | nes_state *state = space.machine().driver_data<nes_state>(); | |
127 | 127 | LOG_MMC(("mapper17_l_w, offset: %04x, data: %02x\n", offset, data)); |
128 | 128 | |
129 | 129 | switch (offset) |
130 | 130 | { |
131 | 131 | case 0x1fe: |
132 | set_nt_mirroring(space | |
132 | set_nt_mirroring(space.machine(), BIT(data, 4) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW); | |
133 | 133 | break; |
134 | 134 | case 0x1ff: |
135 | set_nt_mirroring(space | |
135 | set_nt_mirroring(space.machine(), BIT(data, 4) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
136 | 136 | break; |
137 | 137 | |
138 | 138 | case 0x401: |
r17963 | r17964 | |
147 | 147 | break; |
148 | 148 | |
149 | 149 | case 0x404: |
150 | prg8_89(space | |
150 | prg8_89(space.machine(), data); | |
151 | 151 | break; |
152 | 152 | case 0x405: |
153 | prg8_ab(space | |
153 | prg8_ab(space.machine(), data); | |
154 | 154 | break; |
155 | 155 | case 0x406: |
156 | prg8_cd(space | |
156 | prg8_cd(space.machine(), data); | |
157 | 157 | break; |
158 | 158 | case 0x407: |
159 | prg8_ef(space | |
159 | prg8_ef(space.machine(), data); | |
160 | 160 | break; |
161 | 161 | |
162 | 162 | case 0x410: |
r17963 | r17964 | |
167 | 167 | case 0x415: |
168 | 168 | case 0x416: |
169 | 169 | case 0x417: |
170 | chr1_x(space | |
170 | chr1_x(space.machine(), offset & 7, data, CHRROM); | |
171 | 171 | break; |
172 | 172 | } |
173 | 173 | } |
r17963 | r17964 | |
---|---|---|
125 | 125 | static void partner_iomap_bank(running_machine &machine,UINT8 *rom) |
126 | 126 | { |
127 | 127 | partner_state *state = machine.driver_data<partner_state>(); |
128 | address_space | |
128 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
129 | 129 | switch(state->m_win_mem_page) { |
130 | 130 | case 2 : |
131 | 131 | // FDD |
132 | space->install_write_handler(0xdc00, 0xddff, write8_delegate(FUNC(partner_state::partner_floppy_w),state)); | |
133 | space->install_read_handler (0xdc00, 0xddff, read8_delegate(FUNC(partner_state::partner_floppy_r),state)); | |
132 | space.install_write_handler(0xdc00, 0xddff, write8_delegate(FUNC(partner_state::partner_floppy_w),state)); | |
133 | space.install_read_handler (0xdc00, 0xddff, read8_delegate(FUNC(partner_state::partner_floppy_r),state)); | |
134 | 134 | break; |
135 | 135 | case 4 : |
136 | 136 | // Timer |
r17963 | r17964 | |
143 | 143 | static void partner_bank_switch(running_machine &machine) |
144 | 144 | { |
145 | 145 | partner_state *state = machine.driver_data<partner_state>(); |
146 | address_space | |
146 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
147 | 147 | UINT8 *rom = state->memregion("maincpu")->base(); |
148 | 148 | UINT8 *ram = machine.device<ram_device>(RAM_TAG)->pointer(); |
149 | 149 | |
150 | space->install_write_bank(0x0000, 0x07ff, "bank1"); | |
151 | space->install_write_bank(0x0800, 0x3fff, "bank2"); | |
152 | space->install_write_bank(0x4000, 0x5fff, "bank3"); | |
153 | space->install_write_bank(0x6000, 0x7fff, "bank4"); | |
154 | space->install_write_bank(0x8000, 0x9fff, "bank5"); | |
155 | space->install_write_bank(0xa000, 0xb7ff, "bank6"); | |
156 | space->install_write_bank(0xb800, 0xbfff, "bank7"); | |
157 | space->install_write_bank(0xc000, 0xc7ff, "bank8"); | |
158 | space->install_write_bank(0xc800, 0xcfff, "bank9"); | |
159 | space->install_write_bank(0xd000, 0xd7ff, "bank10"); | |
160 | space->unmap_write(0xdc00, 0xddff); | |
161 | space->install_read_bank (0xdc00, 0xddff, "bank11"); | |
162 | space->unmap_write(0xe000, 0xe7ff); | |
163 | space->unmap_write(0xe800, 0xffff); | |
150 | space.install_write_bank(0x0000, 0x07ff, "bank1"); | |
151 | space.install_write_bank(0x0800, 0x3fff, "bank2"); | |
152 | space.install_write_bank(0x4000, 0x5fff, "bank3"); | |
153 | space.install_write_bank(0x6000, 0x7fff, "bank4"); | |
154 | space.install_write_bank(0x8000, 0x9fff, "bank5"); | |
155 | space.install_write_bank(0xa000, 0xb7ff, "bank6"); | |
156 | space.install_write_bank(0xb800, 0xbfff, "bank7"); | |
157 | space.install_write_bank(0xc000, 0xc7ff, "bank8"); | |
158 | space.install_write_bank(0xc800, 0xcfff, "bank9"); | |
159 | space.install_write_bank(0xd000, 0xd7ff, "bank10"); | |
160 | space.unmap_write(0xdc00, 0xddff); | |
161 | space.install_read_bank (0xdc00, 0xddff, "bank11"); | |
162 | space.unmap_write(0xe000, 0xe7ff); | |
163 | space.unmap_write(0xe800, 0xffff); | |
164 | 164 | |
165 | 165 | // BANK 1 (0x0000 - 0x07ff) |
166 | 166 | if (state->m_mem_page==0) { |
167 | space | |
167 | space.unmap_write(0x0000, 0x07ff); | |
168 | 168 | state->membank("bank1")->set_base(rom + 0x10000); |
169 | 169 | } else { |
170 | 170 | if (state->m_mem_page==7) { |
r17963 | r17964 | |
187 | 187 | } else { |
188 | 188 | if (state->m_mem_page==10) { |
189 | 189 | //window 1 |
190 | space | |
190 | space.unmap_write(0x4000, 0x5fff); | |
191 | 191 | partner_window_1(machine, 3, 0, rom); |
192 | 192 | } else { |
193 | 193 | state->membank("bank3")->set_base(ram + 0x4000); |
r17963 | r17964 | |
206 | 206 | case 5: |
207 | 207 | case 10: |
208 | 208 | //window 2 |
209 | space | |
209 | space.unmap_write(0x8000, 0x9fff); | |
210 | 210 | partner_window_2(machine, 5, 0, rom); |
211 | 211 | break; |
212 | 212 | case 8: |
213 | 213 | case 9: |
214 | 214 | //window 1 |
215 | space | |
215 | space.unmap_write(0x8000, 0x9fff); | |
216 | 216 | partner_window_1(machine, 5, 0, rom); |
217 | 217 | break; |
218 | 218 | case 7: |
r17963 | r17964 | |
228 | 228 | case 5: |
229 | 229 | case 10: |
230 | 230 | //window 2 |
231 | space | |
231 | space.unmap_write(0xa000, 0xb7ff); | |
232 | 232 | partner_window_2(machine, 6, 0, rom); |
233 | 233 | break; |
234 | 234 | case 6: |
235 | 235 | case 8: |
236 | 236 | //BASIC |
237 | space | |
237 | space.unmap_write(0xa000, 0xb7ff); | |
238 | 238 | state->membank("bank6")->set_base(rom + 0x12000); // BASIC |
239 | 239 | break; |
240 | 240 | case 7: |
r17963 | r17964 | |
251 | 251 | case 5: |
252 | 252 | case 10: |
253 | 253 | //window 2 |
254 | space | |
254 | space.unmap_write(0xb800, 0xbfff); | |
255 | 255 | partner_window_2(machine, 7, 0x1800, rom); |
256 | 256 | break; |
257 | 257 | case 6: |
258 | 258 | case 8: |
259 | 259 | //BASIC |
260 | space | |
260 | space.unmap_write(0xb800, 0xbfff); | |
261 | 261 | state->membank("bank7")->set_base(rom + 0x13800); // BASIC |
262 | 262 | break; |
263 | 263 | case 7: |
r17963 | r17964 | |
275 | 275 | break; |
276 | 276 | case 8: |
277 | 277 | case 10: |
278 | space | |
278 | space.unmap_write(0xc000, 0xc7ff); | |
279 | 279 | state->membank("bank8")->set_base(rom + 0x10000); |
280 | 280 | break; |
281 | 281 | default: |
r17963 | r17964 | |
291 | 291 | case 8: |
292 | 292 | case 9: |
293 | 293 | // window 2 |
294 | space | |
294 | space.unmap_write(0xc800, 0xcfff); | |
295 | 295 | partner_window_2(machine, 9, 0, rom); |
296 | 296 | break; |
297 | 297 | case 10: |
298 | space | |
298 | space.unmap_write(0xc800, 0xcfff); | |
299 | 299 | state->membank("bank9")->set_base(rom + 0x10800); |
300 | 300 | break; |
301 | 301 | default: |
r17963 | r17964 | |
311 | 311 | case 8: |
312 | 312 | case 9: |
313 | 313 | // window 2 |
314 | space | |
314 | space.unmap_write(0xd000, 0xd7ff); | |
315 | 315 | partner_window_2(machine, 10, 0x0800, rom); |
316 | 316 | break; |
317 | 317 | default: |
r17963 | r17964 | |
366 | 366 | i8257_hlda_w(device, state); |
367 | 367 | } |
368 | 368 | |
369 | static UINT8 memory_read_byte(address_space *space, offs_t address) { return space->read_byte(address); } | |
370 | static void memory_write_byte(address_space *space, offs_t address, UINT8 data) { space->write_byte(address, data); } | |
369 | static UINT8 memory_read_byte(address_space &space, offs_t address) { return space.read_byte(address); } | |
370 | static void memory_write_byte(address_space &space, offs_t address, UINT8 data) { space.write_byte(address, data); } | |
371 | 371 | |
372 | 372 | I8257_INTERFACE( partner_dma ) |
373 | 373 | { |
r17963 | r17964 | |
---|---|---|
275 | 275 | int selected_drive; |
276 | 276 | int floppy_count; |
277 | 277 | |
278 | floppy_count = floppy_get_count(space | |
278 | floppy_count = floppy_get_count(space.machine()); | |
279 | 279 | |
280 | 280 | if (floppy_count > (fdc->digital_output_register & 0x03)) |
281 | floppy_drive_set_ready_state(floppy_get_device(space | |
281 | floppy_drive_set_ready_state(floppy_get_device(space.machine(), fdc->digital_output_register & 0x03), 1, 0); | |
282 | 282 | |
283 | 283 | fdc->digital_output_register = data; |
284 | 284 | |
r17963 | r17964 | |
286 | 286 | |
287 | 287 | /* set floppy drive motor state */ |
288 | 288 | if (floppy_count > 0) |
289 | floppy_mon_w(floppy_get_device(space | |
289 | floppy_mon_w(floppy_get_device(space.machine(), 0), !BIT(data, 4)); | |
290 | 290 | if (floppy_count > 1) |
291 | floppy_mon_w(floppy_get_device(space | |
291 | floppy_mon_w(floppy_get_device(space.machine(), 1), !BIT(data, 5)); | |
292 | 292 | if (floppy_count > 2) |
293 | floppy_mon_w(floppy_get_device(space | |
293 | floppy_mon_w(floppy_get_device(space.machine(), 2), !BIT(data, 6)); | |
294 | 294 | if (floppy_count > 3) |
295 | floppy_mon_w(floppy_get_device(space | |
295 | floppy_mon_w(floppy_get_device(space.machine(), 3), !BIT(data, 7)); | |
296 | 296 | |
297 | 297 | if ((data>>4) & (1<<selected_drive)) |
298 | 298 | { |
299 | 299 | if (floppy_count > selected_drive) |
300 | floppy_drive_set_ready_state(floppy_get_device(space | |
300 | floppy_drive_set_ready_state(floppy_get_device(space.machine(), selected_drive), 1, 0); | |
301 | 301 | } |
302 | 302 | |
303 | 303 | /* changing the DMA enable bit, will affect the terminal count state |
304 | 304 | from reaching the fdc - if dma is enabled this will send it through |
305 | 305 | otherwise it will be ignored */ |
306 | pc_fdc_set_tc_state(space | |
306 | pc_fdc_set_tc_state(space.machine(), fdc->tc_state); | |
307 | 307 | |
308 | 308 | /* changing the DMA enable bit, will affect the dma drq state |
309 | 309 | from reaching us - if dma is enabled this will send it through |
310 | 310 | otherwise it will be ignored */ |
311 | pc_fdc_hw_dma_drq(pc_get_device(space | |
311 | pc_fdc_hw_dma_drq(pc_get_device(space.machine()), fdc->dma_state); | |
312 | 312 | |
313 | 313 | /* changing the DMA enable bit, will affect the irq state |
314 | 314 | from reaching us - if dma is enabled this will send it through |
315 | 315 | otherwise it will be ignored */ |
316 | pc_fdc_hw_interrupt(pc_get_device(space | |
316 | pc_fdc_hw_interrupt(pc_get_device(space.machine()), fdc->int_state); | |
317 | 317 | |
318 | 318 | /* reset? */ |
319 | 319 | if ((fdc->digital_output_register & PC_FDC_FLAGS_DOR_FDC_ENABLED)==0) |
r17963 | r17964 | |
336 | 336 | what is not yet clear is if this is a result of the drives ready state |
337 | 337 | changing... |
338 | 338 | */ |
339 | upd765_ready_w(pc_get_device(space | |
339 | upd765_ready_w(pc_get_device(space.machine()),1); | |
340 | 340 | |
341 | 341 | /* set FDC at reset */ |
342 | upd765_reset_w(pc_get_device(space | |
342 | upd765_reset_w(pc_get_device(space.machine()), 1); | |
343 | 343 | } |
344 | 344 | else |
345 | 345 | { |
346 | pc_fdc_set_tc_state(space | |
346 | pc_fdc_set_tc_state(space.machine(), 0); | |
347 | 347 | |
348 | 348 | /* release reset on fdc */ |
349 | upd765_reset_w(pc_get_device(space | |
349 | upd765_reset_w(pc_get_device(space.machine()), 0); | |
350 | 350 | } |
351 | 351 | } |
352 | 352 | |
r17963 | r17964 | |
381 | 381 | { |
382 | 382 | int floppy_count; |
383 | 383 | |
384 | floppy_count = floppy_get_count(space | |
384 | floppy_count = floppy_get_count(space.machine()); | |
385 | 385 | |
386 | 386 | /* set floppy drive motor state */ |
387 | 387 | if (floppy_count > 0) |
388 | floppy_mon_w(floppy_get_device(space | |
388 | floppy_mon_w(floppy_get_device(space.machine(), 0), BIT(data, 0) ? CLEAR_LINE : ASSERT_LINE); | |
389 | 389 | |
390 | 390 | if ( data & 0x01 ) |
391 | 391 | { |
392 | 392 | if ( floppy_count ) |
393 | floppy_drive_set_ready_state(floppy_get_device(space | |
393 | floppy_drive_set_ready_state(floppy_get_device(space.machine(), 0), 1, 0); | |
394 | 394 | } |
395 | 395 | |
396 | 396 | /* Is the watchdog timer disabled */ |
r17963 | r17964 | |
399 | 399 | fdc->watchdog->adjust( attotime::never ); |
400 | 400 | if ( fdc->fdc_interface.pc_fdc_interrupt ) |
401 | 401 | { |
402 | fdc->fdc_interface.pc_fdc_interrupt(space | |
402 | fdc->fdc_interface.pc_fdc_interrupt(space.machine(), 0 ); | |
403 | 403 | } |
404 | 404 | } else { |
405 | 405 | /* Check for 1->0 watchdog trigger */ |
r17963 | r17964 | |
431 | 431 | what is not yet clear is if this is a result of the drives ready state |
432 | 432 | changing... |
433 | 433 | */ |
434 | upd765_ready_w(pc_get_device(space | |
434 | upd765_ready_w(pc_get_device(space.machine()),1); | |
435 | 435 | |
436 | 436 | /* set FDC at reset */ |
437 | upd765_reset_w(pc_get_device(space | |
437 | upd765_reset_w(pc_get_device(space.machine()), 1); | |
438 | 438 | } |
439 | 439 | else |
440 | 440 | { |
441 | pc_fdc_set_tc_state(space | |
441 | pc_fdc_set_tc_state(space.machine(), 0); | |
442 | 442 | |
443 | 443 | /* release reset on fdc */ |
444 | upd765_reset_w(pc_get_device(space | |
444 | upd765_reset_w(pc_get_device(space.machine()), 0); | |
445 | 445 | } |
446 | 446 | |
447 | 447 | logerror("pcjr_fdc_dor_w: changing dor from %02x to %02x\n", fdc->digital_output_register, data); |
r17963 | r17964 | |
498 | 498 | case 3: /* tape drive select? */ |
499 | 499 | break; |
500 | 500 | case 4: |
501 | data = upd765_status_r(pc_get_device(space | |
501 | data = upd765_status_r(pc_get_device(space.machine()), space, 0); | |
502 | 502 | break; |
503 | 503 | case 5: |
504 | data = upd765_data_r(pc_get_device(space | |
504 | data = upd765_data_r(pc_get_device(space.machine()), space, offset); | |
505 | 505 | break; |
506 | 506 | case 6: /* FDC reserved */ |
507 | 507 | break; |
508 | 508 | case 7: |
509 | device_t *dev = floppy_get_device(space | |
509 | device_t *dev = floppy_get_device(space.machine(), fdc->digital_output_register & 0x03); | |
510 | 510 | data = fdc->digital_input_register; |
511 | 511 | if(dev) data |= (!floppy_dskchg_r(dev)<<7); |
512 | 512 | break; |
513 | 513 | } |
514 | 514 | |
515 | 515 | if (LOG_FDC) |
516 | logerror("pc_fdc_r(): pc=0x%08x offset=%d result=0x%02X\n", (unsigned) space | |
516 | logerror("pc_fdc_r(): pc=0x%08x offset=%d result=0x%02X\n", (unsigned) space.machine().firstcpu->pc(), offset, data); | |
517 | 517 | return data; |
518 | 518 | } |
519 | 519 | |
r17963 | r17964 | |
522 | 522 | WRITE8_HANDLER ( pc_fdc_w ) |
523 | 523 | { |
524 | 524 | if (LOG_FDC) |
525 | logerror("pc_fdc_w(): pc=0x%08x offset=%d data=0x%02X\n", (unsigned) space | |
525 | logerror("pc_fdc_w(): pc=0x%08x offset=%d data=0x%02X\n", (unsigned) space.machine().firstcpu->pc(), offset, data); | |
526 | 526 | |
527 | pc_fdc_check_data_rate(space | |
527 | pc_fdc_check_data_rate(space.machine()); // check every time a command may start | |
528 | 528 | switch(offset) |
529 | 529 | { |
530 | 530 | case 0: /* n/a */ |
r17963 | r17964 | |
537 | 537 | /* tape drive select? */ |
538 | 538 | break; |
539 | 539 | case 4: |
540 | pc_fdc_data_rate_w(space | |
540 | pc_fdc_data_rate_w(space.machine(), data); | |
541 | 541 | break; |
542 | 542 | case 5: |
543 | upd765_data_w(pc_get_device(space | |
543 | upd765_data_w(pc_get_device(space.machine()), space, 0, data); | |
544 | 544 | break; |
545 | 545 | case 6: |
546 | 546 | /* FDC reserved */ |
r17963 | r17964 | |
555 | 555 | * 1 0 250 kbps |
556 | 556 | * 1 1 1000 kbps |
557 | 557 | */ |
558 | pc_fdc_data_rate_w(space | |
558 | pc_fdc_data_rate_w(space.machine(), data & 3); | |
559 | 559 | break; |
560 | 560 | } |
561 | 561 | } |
r17963 | r17964 | |
563 | 563 | WRITE8_HANDLER ( pcjr_fdc_w ) |
564 | 564 | { |
565 | 565 | if (LOG_FDC) |
566 | logerror("pcjr_fdc_w(): pc=0x%08x offset=%d data=0x%02X\n", (unsigned) space | |
566 | logerror("pcjr_fdc_w(): pc=0x%08x offset=%d data=0x%02X\n", (unsigned) space.machine().firstcpu->pc(), offset, data); | |
567 | 567 | |
568 | 568 | switch(offset) |
569 | 569 | { |
r17963 | r17964 | |
---|---|---|
55 | 55 | #endif |
56 | 56 | |
57 | 57 | static void Mise_A_Jour_Etat(running_machine &machine, int Adresse, int Value ); |
58 | static void Update_Sound(address_space | |
58 | static void Update_Sound(address_space &space, UINT8 data); | |
59 | 59 | |
60 | 60 | static cassette_image_device *cassette_device_image(running_machine &machine); |
61 | 61 | |
r17963 | r17964 | |
115 | 115 | |
116 | 116 | /* FDC Motor Control - Bit 0/1 defines the state of the FDD 0/1 motor */ |
117 | 117 | floppy_mon_w(floppy_get_device(machine, 0), 0); // Moteur floppy A: |
118 | //floppy_mon_w(floppy_get_device(space | |
118 | //floppy_mon_w(floppy_get_device(space.machine(), 1), BIT(data, 7)); // Moteur floppy B:, not implanted on the real machine | |
119 | 119 | |
120 | 120 | //Set the drive ready ! |
121 | 121 | floppy_drive_set_ready_state(floppy_get_device(machine, 0), FLOPPY_DRIVE_READY, 0);// Disc 0 ready ! |
r17963 | r17964 | |
307 | 307 | WRITE8_MEMBER(hec2hrp_state::hector_sn_2000_w) |
308 | 308 | { |
309 | 309 | Mise_A_Jour_Etat(machine(), 0x2000+ offset, data); |
310 | Update_Sound( | |
310 | Update_Sound(space, data); | |
311 | 311 | } |
312 | 312 | WRITE8_MEMBER(hec2hrp_state::hector_sn_2800_w) |
313 | 313 | { |
314 | 314 | Mise_A_Jour_Etat(machine(), 0x2800+ offset, data); |
315 | Update_Sound( | |
315 | Update_Sound(space, data); | |
316 | 316 | } |
317 | 317 | READ8_MEMBER(hec2hrp_state::hector_cassette_r) |
318 | 318 | { |
r17963 | r17964 | |
364 | 364 | { |
365 | 365 | /* Update sn76477 only when necessary!*/ |
366 | 366 | Mise_A_Jour_Etat( machine(), 0x3000, data & 7 ); |
367 | Update_Sound( | |
367 | Update_Sound(space, data & 7); | |
368 | 368 | } |
369 | 369 | m_oldstate3000 = data & 7; |
370 | 370 | } |
r17963 | r17964 | |
790 | 790 | state->m_ValMixer = 0; |
791 | 791 | } |
792 | 792 | |
793 | static void Update_Sound(address_space | |
793 | static void Update_Sound(address_space &space, UINT8 data) | |
794 | 794 | { |
795 | hec2hrp_state *state = space | |
795 | hec2hrp_state *state = space.machine().driver_data<hec2hrp_state>(); | |
796 | 796 | /* keep device*/ |
797 | device_t *sn76477 = space | |
797 | device_t *sn76477 = space.machine().device("sn76477"); | |
798 | 798 | |
799 | 799 | /* MIXER*/ |
800 | 800 | sn76477_mixer_a_w(sn76477, ((state->m_ValMixer & 0x04)==4) ? 1 : 0); |
r17963 | r17964 | |
---|---|---|
142 | 142 | |
143 | 143 | READ64_HANDLER( bebox_cpu0_imask_r ) |
144 | 144 | { |
145 | bebox_state *state = space | |
145 | bebox_state *state = space.machine().driver_data<bebox_state>(); | |
146 | 146 | return ((UINT64) state->m_cpu_imask[0]) << 32; |
147 | 147 | } |
148 | 148 | |
149 | 149 | READ64_HANDLER( bebox_cpu1_imask_r ) |
150 | 150 | { |
151 | bebox_state *state = space | |
151 | bebox_state *state = space.machine().driver_data<bebox_state>(); | |
152 | 152 | return ((UINT64) state->m_cpu_imask[1]) << 32; |
153 | 153 | } |
154 | 154 | |
155 | 155 | READ64_HANDLER( bebox_interrupt_sources_r ) |
156 | 156 | { |
157 | bebox_state *state = space | |
157 | bebox_state *state = space.machine().driver_data<bebox_state>(); | |
158 | 158 | return ((UINT64) state->m_interrupts) << 32; |
159 | 159 | } |
160 | 160 | |
161 | 161 | WRITE64_HANDLER( bebox_cpu0_imask_w ) |
162 | 162 | { |
163 | bebox_state *state = space | |
163 | bebox_state *state = space.machine().driver_data<bebox_state>(); | |
164 | 164 | UINT32 old_imask = state->m_cpu_imask[0]; |
165 | 165 | |
166 | 166 | bebox_mbreg32_w(&state->m_cpu_imask[0], data, mem_mask); |
r17963 | r17964 | |
170 | 170 | if (LOG_CPUIMASK) |
171 | 171 | { |
172 | 172 | logerror("BeBox CPU #0 pc=0x%08X imask=0x%08x\n", |
173 | (unsigned) space | |
173 | (unsigned) space.device().safe_pc( ), state->m_cpu_imask[0]); | |
174 | 174 | } |
175 | bebox_update_interrupts(space | |
175 | bebox_update_interrupts(space.machine()); | |
176 | 176 | } |
177 | 177 | } |
178 | 178 | |
179 | 179 | WRITE64_HANDLER( bebox_cpu1_imask_w ) |
180 | 180 | { |
181 | bebox_state *state = space | |
181 | bebox_state *state = space.machine().driver_data<bebox_state>(); | |
182 | 182 | UINT32 old_imask = state->m_cpu_imask[1]; |
183 | 183 | |
184 | 184 | bebox_mbreg32_w(&state->m_cpu_imask[1], data, mem_mask); |
r17963 | r17964 | |
188 | 188 | if (LOG_CPUIMASK) |
189 | 189 | { |
190 | 190 | logerror("BeBox CPU #1 pc=0x%08X imask=0x%08x\n", |
191 | (unsigned) space | |
191 | (unsigned) space.device() .safe_pc( ), state->m_cpu_imask[1]); | |
192 | 192 | } |
193 | bebox_update_interrupts(space | |
193 | bebox_update_interrupts(space.machine()); | |
194 | 194 | } |
195 | 195 | } |
196 | 196 | |
197 | 197 | READ64_HANDLER( bebox_crossproc_interrupts_r ) |
198 | 198 | { |
199 | bebox_state *state = space | |
199 | bebox_state *state = space.machine().driver_data<bebox_state>(); | |
200 | 200 | UINT32 result; |
201 | 201 | result = state->m_crossproc_interrupts; |
202 | 202 | |
203 | 203 | /* return a different result depending on which CPU is accessing this handler */ |
204 | if (space != space | |
204 | if (&space != space.machine().device("ppc1")->memory().space(AS_PROGRAM)) | |
205 | 205 | result |= 0x02000000; |
206 | 206 | else |
207 | 207 | result &= ~0x02000000; |
r17963 | r17964 | |
211 | 211 | |
212 | 212 | WRITE64_HANDLER( bebox_crossproc_interrupts_w ) |
213 | 213 | { |
214 | bebox_state *state = space | |
214 | bebox_state *state = space.machine().driver_data<bebox_state>(); | |
215 | 215 | static const struct |
216 | 216 | { |
217 | 217 | UINT32 mask; |
r17963 | r17964 | |
249 | 249 | */ |
250 | 250 | } |
251 | 251 | |
252 | space | |
252 | space.machine().device(cputags[crossproc_map[i].cpunum])->execute().set_input_line(crossproc_map[i].inputline, line); | |
253 | 253 | } |
254 | 254 | } |
255 | 255 | } |
r17963 | r17964 | |
260 | 260 | |
261 | 261 | if (b & 0x20) |
262 | 262 | { |
263 | space | |
263 | space.machine().device("ppc2")->execute().set_input_line(INPUT_LINE_RESET, (b & 0x80) ? CLEAR_LINE : ASSERT_LINE); | |
264 | 264 | } |
265 | 265 | } |
266 | 266 | |
r17963 | r17964 | |
453 | 453 | |
454 | 454 | READ64_HANDLER( bebox_interrupt_ack_r ) |
455 | 455 | { |
456 | bebox_state *state = space | |
456 | bebox_state *state = space.machine().driver_data<bebox_state>(); | |
457 | 457 | int result; |
458 | 458 | result = pic8259_acknowledge( state->m_devices.pic8259_master ); |
459 | bebox_set_irq_bit(space | |
459 | bebox_set_irq_bit(space.machine(), 5, 0); /* HACK */ | |
460 | 460 | return ((UINT64) result) << 56; |
461 | 461 | } |
462 | 462 | |
r17963 | r17964 | |
514 | 514 | return machine.device("ide"); |
515 | 515 | } |
516 | 516 | |
517 | READ8_HANDLER( bebox_800001F0_r ) { return ide_controller_r(ide_device(space->machine()), offset + 0x1F0, 1); } | |
518 | WRITE8_HANDLER( bebox_800001F0_w ) { ide_controller_w(ide_device(space->machine()), offset + 0x1F0, 1, data); } | |
517 | READ8_HANDLER( bebox_800001F0_r ) { return ide_controller_r(ide_device(space.machine()), offset + 0x1F0, 1); } | |
518 | WRITE8_HANDLER( bebox_800001F0_w ) { ide_controller_w(ide_device(space.machine()), offset + 0x1F0, 1, data); } | |
519 | 519 | |
520 | 520 | READ64_HANDLER( bebox_800003F0_r ) |
521 | 521 | { |
r17963 | r17964 | |
524 | 524 | if (((mem_mask >> 8) & 0xFF) == 0) |
525 | 525 | { |
526 | 526 | result &= ~(0xFF << 8); |
527 | result |= ide_controller_r(ide_device(space | |
527 | result |= ide_controller_r(ide_device(space.machine()), 0x3F6, 1) << 8; | |
528 | 528 | } |
529 | 529 | |
530 | 530 | if (((mem_mask >> 0) & 0xFF) == 0) |
531 | 531 | { |
532 | 532 | result &= ~(0xFF << 0); |
533 | result |= ide_controller_r(ide_device(space | |
533 | result |= ide_controller_r(ide_device(space.machine()), 0x3F7, 1) << 0; | |
534 | 534 | } |
535 | 535 | return result; |
536 | 536 | } |
r17963 | r17964 | |
541 | 541 | write64be_with_write8_handler(pc_fdc_w, space, offset, data, mem_mask | 0xFFFF); |
542 | 542 | |
543 | 543 | if (((mem_mask >> 8) & 0xFF) == 0) |
544 | ide_controller_w(ide_device(space | |
544 | ide_controller_w(ide_device(space.machine()), 0x3F6, 1, (data >> 8) & 0xFF); | |
545 | 545 | |
546 | 546 | if (((mem_mask >> 0) & 0xFF) == 0) |
547 | ide_controller_w(ide_device(space | |
547 | ide_controller_w(ide_device(space.machine()), 0x3F7, 1, (data >> 0) & 0xFF); | |
548 | 548 | } |
549 | 549 | |
550 | 550 | |
r17963 | r17964 | |
588 | 588 | |
589 | 589 | READ8_HANDLER(bebox_page_r) |
590 | 590 | { |
591 | bebox_state *state = space | |
591 | bebox_state *state = space.machine().driver_data<bebox_state>(); | |
592 | 592 | UINT8 data = state->m_at_pages[offset % 0x10]; |
593 | 593 | |
594 | 594 | switch(offset % 8) |
r17963 | r17964 | |
612 | 612 | |
613 | 613 | WRITE8_HANDLER(bebox_page_w) |
614 | 614 | { |
615 | bebox_state *state = space | |
615 | bebox_state *state = space.machine().driver_data<bebox_state>(); | |
616 | 616 | state->m_at_pages[offset % 0x10] = data; |
617 | 617 | |
618 | 618 | switch(offset % 8) |
r17963 | r17964 | |
639 | 639 | |
640 | 640 | WRITE8_HANDLER(bebox_80000480_w) |
641 | 641 | { |
642 | bebox_state *state = space | |
642 | bebox_state *state = space.machine().driver_data<bebox_state>(); | |
643 | 643 | switch(offset % 8) |
644 | 644 | { |
645 | 645 | case 1: |
r17963 | r17964 | |
679 | 679 | |
680 | 680 | static READ8_HANDLER( bebox_dma_read_byte ) |
681 | 681 | { |
682 | bebox_state *state = space | |
682 | bebox_state *state = space.machine().driver_data<bebox_state>(); | |
683 | 683 | offs_t page_offset = (((offs_t) state->m_dma_offset[0][state->m_dma_channel]) << 16) |
684 | 684 | & 0x7FFF0000; |
685 | return space | |
685 | return space.read_byte(page_offset + offset); | |
686 | 686 | } |
687 | 687 | |
688 | 688 | |
689 | 689 | static WRITE8_HANDLER( bebox_dma_write_byte ) |
690 | 690 | { |
691 | bebox_state *state = space | |
691 | bebox_state *state = space.machine().driver_data<bebox_state>(); | |
692 | 692 | offs_t page_offset = (((offs_t) state->m_dma_offset[0][state->m_dma_channel]) << 16) |
693 | 693 | & 0x7FFF0000; |
694 | space | |
694 | space.write_byte(page_offset + offset, data); | |
695 | 695 | } |
696 | 696 | |
697 | 697 | |
r17963 | r17964 | |
789 | 789 | |
790 | 790 | READ8_HANDLER( bebox_flash_r ) |
791 | 791 | { |
792 | fujitsu_29f016a_device *flash = space | |
792 | fujitsu_29f016a_device *flash = space.machine().device<fujitsu_29f016a_device>("flash"); | |
793 | 793 | offset = (offset & ~7) | (7 - (offset & 7)); |
794 | 794 | return flash->read(offset); |
795 | 795 | } |
r17963 | r17964 | |
797 | 797 | |
798 | 798 | WRITE8_HANDLER( bebox_flash_w ) |
799 | 799 | { |
800 | fujitsu_29f016a_device *flash = space | |
800 | fujitsu_29f016a_device *flash = space.machine().device<fujitsu_29f016a_device>("flash"); | |
801 | 801 | offset = (offset & ~7) | (7 - (offset & 7)); |
802 | 802 | flash->write(offset, data); |
803 | 803 | } |
r17963 | r17964 | |
840 | 840 | |
841 | 841 | static READ64_HANDLER( scsi53c810_r ) |
842 | 842 | { |
843 | bebox_state *state = space | |
843 | bebox_state *state = space.machine().driver_data<bebox_state>(); | |
844 | 844 | int reg = offset*8; |
845 | 845 | UINT64 r = 0; |
846 | 846 | if (!(mem_mask & U64(0xff00000000000000))) { |
r17963 | r17964 | |
874 | 874 | |
875 | 875 | static WRITE64_HANDLER( scsi53c810_w ) |
876 | 876 | { |
877 | bebox_state *state = space | |
877 | bebox_state *state = space.machine().driver_data<bebox_state>(); | |
878 | 878 | int reg = offset*8; |
879 | 879 | if (!(mem_mask & U64(0xff00000000000000))) { |
880 | 880 | state->m_lsi53c810->lsi53c810_reg_w(reg+0, data >> 56); |
r17963 | r17964 | |
955 | 955 | /* brutal ugly hack; at some point the PCI code should be handling this stuff */ |
956 | 956 | if (state->m_scsi53c810_data[5] != 0xFFFFFFF0) |
957 | 957 | { |
958 | address_space | |
958 | address_space &space = *device->machine().device("ppc1")->memory().space(AS_PROGRAM); | |
959 | 959 | |
960 | 960 | addr = (state->m_scsi53c810_data[5] | 0xC0000000) & ~0xFF; |
961 | space->install_legacy_read_handler(addr, addr + 0xFF, FUNC(scsi53c810_r)); | |
962 | space->install_legacy_write_handler(addr, addr + 0xFF, FUNC(scsi53c810_w)); | |
961 | space.install_legacy_read_handler(addr, addr + 0xFF, FUNC(scsi53c810_r)); | |
962 | space.install_legacy_write_handler(addr, addr + 0xFF, FUNC(scsi53c810_w)); | |
963 | 963 | } |
964 | 964 | } |
965 | 965 | break; |
r17963 | r17964 | |
---|---|---|
697 | 697 | } |
698 | 698 | |
699 | 699 | /* hand 0 == left, 1 == right, 2 == ECS hand controller 1, 3 == ECS hand controller 2 */ |
700 | UINT8 intv_control_r(address_space | |
700 | UINT8 intv_control_r(address_space &space, int hand) | |
701 | 701 | { |
702 | 702 | static const char* const keypad_name[] = { "KEYPAD1", "KEYPAD2", "KEYPAD3", "KEYPAD4" }; |
703 | 703 | static const UINT8 keypad_table[] = |
r17963 | r17964 | |
728 | 728 | UINT8 rv = 0xFF; |
729 | 729 | |
730 | 730 | /* keypad */ |
731 | x = space | |
731 | x = space.machine().root_device().ioport(keypad_name[hand])->read(); | |
732 | 732 | for (y = 0; y < 16; y++) |
733 | 733 | { |
734 | 734 | if (x & (1 << y)) |
r17963 | r17964 | |
737 | 737 | } |
738 | 738 | } |
739 | 739 | |
740 | switch ((space | |
740 | switch ((space.machine().root_device().ioport("OPTIONS")->read() >> hand) & 1) | |
741 | 741 | { |
742 | 742 | case 0: /* disc == digital */ |
743 | 743 | default: |
744 | 744 | |
745 | x = space | |
745 | x = space.machine().root_device().ioport(disc_name[hand])->read(); | |
746 | 746 | for (y = 0; y < 16; y++) |
747 | 747 | { |
748 | 748 | if (x & (1 << y)) |
r17963 | r17964 | |
754 | 754 | |
755 | 755 | case 1: /* disc == _fake_ analog */ |
756 | 756 | |
757 | x = space->machine().root_device().ioport(discx_name[hand])->read(); | |
758 | y = space->machine().root_device().ioport(discy_name[hand])->read(); | |
757 | x = space.machine().root_device().ioport(discx_name[hand])->read(); | |
758 | y = space.machine().root_device().ioport(discy_name[hand])->read(); | |
759 | 759 | rv &= discyx_table[y / 32][x / 32]; |
760 | 760 | } |
761 | 761 | |
r17963 | r17964 | |
764 | 764 | |
765 | 765 | READ8_MEMBER( intv_state::intv_left_control_r ) |
766 | 766 | { |
767 | return intv_control_r( | |
767 | return intv_control_r(space, 0); | |
768 | 768 | } |
769 | 769 | |
770 | 770 | READ8_MEMBER( intv_state::intv_right_control_r ) |
771 | 771 | { |
772 | return intv_control_r( | |
772 | return intv_control_r(space, 1); | |
773 | 773 | } |
774 | 774 | |
775 | 775 | READ8_MEMBER( intv_state::intv_ecs_porta_r ) |
776 | 776 | { |
777 | 777 | if (ioport("ECS_CNTRLSEL")->read() == 0) |
778 | return intv_control_r( | |
778 | return intv_control_r(space, 2); | |
779 | 779 | else |
780 | 780 | return 0xff; // not sure what to return here, maybe it should be last output? |
781 | 781 | } |
r17963 | r17964 | |
786 | 786 | { |
787 | 787 | case 0x00: // hand controller |
788 | 788 | { |
789 | return intv_control_r( | |
789 | return intv_control_r(space, 3); | |
790 | 790 | } |
791 | 791 | case 0x01: // synthesizer keyboard |
792 | 792 | { |
r17963 | r17964 | |
---|---|---|
233 | 233 | { |
234 | 234 | // printf("install_bank: %s @ %x->%x mask %x mirror %x\n", tag, start, end, mask, mirror); |
235 | 235 | m_maincpu = machine().device<cpu_device>(m_cputag); |
236 | address_space *space = m_maincpu->space(AS_PROGRAM); | |
237 | space->install_readwrite_bank(start, end, mask, mirror, tag ); | |
236 | address_space &space = *m_maincpu->space(AS_PROGRAM); | |
237 | space.install_readwrite_bank(start, end, mask, mirror, tag ); | |
238 | 238 | machine().root_device().membank(tag)->set_base(data); |
239 | 239 | } |
240 | 240 |
r17963 | r17964 | |
---|---|---|
71 | 71 | /* a read from this location disables the rom */ |
72 | 72 | static READ8_HANDLER( tf20_rom_disable ) |
73 | 73 | { |
74 | tf20_state *tf20 = get_safe_token(space->device().owner()); | |
75 | address_space *prg = space->device().memory().space(AS_PROGRAM); | |
74 | tf20_state *tf20 = get_safe_token(space.device().owner()); | |
75 | address_space *prg = space.device().memory().space(AS_PROGRAM); | |
76 | 76 | |
77 | 77 | /* switch in ram */ |
78 | 78 | prg->install_ram(0x0000, 0x7fff, tf20->ram->pointer()); |
r17963 | r17964 | |
82 | 82 | |
83 | 83 | static READ8_HANDLER( tf20_dip_r ) |
84 | 84 | { |
85 | logerror("%s: tf20_dip_r\n", space | |
85 | logerror("%s: tf20_dip_r\n", space.machine().describe_context()); | |
86 | 86 | |
87 | return space | |
87 | return space.machine().root_device().ioport("tf20_dip")->read(); | |
88 | 88 | } |
89 | 89 | |
90 | 90 | static TIMER_CALLBACK( tf20_upd765_tc_reset ) |
r17963 | r17964 | |
105 | 105 | |
106 | 106 | static WRITE8_HANDLER( tf20_fdc_control_w ) |
107 | 107 | { |
108 | tf20_state *tf20 = get_safe_token(space->device().owner()); | |
109 | logerror("%s: tf20_fdc_control_w %02x\n", space->machine().describe_context(), data); | |
108 | tf20_state *tf20 = get_safe_token(space.device().owner()); | |
109 | logerror("%s: tf20_fdc_control_w %02x\n", space.machine().describe_context(), data); | |
110 | 110 | |
111 | 111 | /* bit 0, motor on signal */ |
112 | 112 | floppy_mon_w(tf20->floppy_0, !BIT(data, 0)); |
r17963 | r17964 | |
---|---|---|
504 | 504 | static int snes_find_addon_chip( running_machine &machine ) |
505 | 505 | { |
506 | 506 | snes_state *state = machine.driver_data<snes_state>(); |
507 | address_space | |
507 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
508 | 508 | int supported_type = 1; |
509 | 509 | int dsp_prg_offset = 0; |
510 | 510 | |
r17963 | r17964 | |
686 | 686 | static void snes_cart_log_info( running_machine &machine, int total_blocks, int supported ) |
687 | 687 | { |
688 | 688 | snes_state *state = machine.driver_data<snes_state>(); |
689 | address_space | |
689 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
690 | 690 | char title[21], rom_id[4], company_id[2]; |
691 | 691 | int i, company, has_ram = 0, has_sram = 0; |
692 | 692 | |
r17963 | r17964 | |
763 | 763 | int supported_type = 1; |
764 | 764 | running_machine &machine = image.device().machine(); |
765 | 765 | snes_state *state = machine.driver_data<snes_state>(); |
766 | address_space | |
766 | address_space &space = *machine.device( "maincpu")->memory().space( AS_PROGRAM ); | |
767 | 767 | int total_blocks, read_blocks, has_bsx_slot = 0, st_bios = 0; |
768 | 768 | UINT32 offset, int_header_offs; |
769 | 769 | UINT8 *ROM = state->memregion("cart")->base(); |
r17963 | r17964 | |
---|---|---|
238 | 238 | |
239 | 239 | WRITE8_HANDLER( c64_roml_w ) |
240 | 240 | { |
241 | legacy_c64_state *state = space | |
241 | legacy_c64_state *state = space.machine().driver_data<legacy_c64_state>(); | |
242 | 242 | |
243 | 243 | state->m_memory[offset + 0x8000] = data; |
244 | 244 | |
r17963 | r17964 | |
248 | 248 | |
249 | 249 | WRITE8_HANDLER( c64_write_io ) |
250 | 250 | { |
251 | legacy_c64_state *state = space->machine().driver_data<legacy_c64_state>(); | |
252 | device_t *cia_0 = space->machine().device("cia_0"); | |
253 | device_t *cia_1 = space->machine().device("cia_1"); | |
254 | sid6581_device *sid = space->machine().device<sid6581_device>("sid6581"); | |
255 | device_t *vic2 = space->machine().device("vic2"); | |
251 | legacy_c64_state *state = space.machine().driver_data<legacy_c64_state>(); | |
252 | device_t *cia_0 = space.machine().device("cia_0"); | |
253 | device_t *cia_1 = space.machine().device("cia_1"); | |
254 | sid6581_device *sid = space.machine().device<sid6581_device>("sid6581"); | |
255 | device_t *vic2 = space.machine().device("vic2"); | |
256 | 256 | |
257 | 257 | state->m_io_mirror[offset] = data; |
258 | 258 | if (offset < 0x400) |
259 | vic2_port_w(vic2, | |
259 | vic2_port_w(vic2, space, offset & 0x3ff, data); | |
260 | 260 | else if (offset < 0x800) |
261 | sid->write( | |
261 | sid->write(space, offset & 0x3ff, data); | |
262 | 262 | else if (offset < 0xc00) |
263 | 263 | state->m_colorram[offset & 0x3ff] = data | 0xf0; |
264 | 264 | else if (offset < 0xd00) |
265 | mos6526_w(cia_0, | |
265 | mos6526_w(cia_0, space, offset, data); | |
266 | 266 | else if (offset < 0xe00) |
267 | 267 | { |
268 | 268 | if (state->m_cia1_on) |
269 | mos6526_w(cia_1, | |
269 | mos6526_w(cia_1, space, offset, data); | |
270 | 270 | else |
271 | DBG_LOG(space | |
271 | DBG_LOG(space.machine(), 1, "io write", ("%.3x %.2x\n", offset, data)); | |
272 | 272 | } |
273 | 273 | else if (offset < 0xf00) |
274 | DBG_LOG(space | |
274 | DBG_LOG(space.machine(), 1, "io write", ("%.3x %.2x\n", offset, data)); /* i/o 1 */ | |
275 | 275 | else |
276 | DBG_LOG(space | |
276 | DBG_LOG(space.machine(), 1, "io write", ("%.3x %.2x\n", offset, data)); /* i/o 2 */ | |
277 | 277 | } |
278 | 278 | |
279 | 279 | WRITE8_HANDLER( c64_ioarea_w ) |
280 | 280 | { |
281 | legacy_c64_state *state = space | |
281 | legacy_c64_state *state = space.machine().driver_data<legacy_c64_state>(); | |
282 | 282 | if (state->m_io_enabled) |
283 | 283 | c64_write_io(space, offset, data); |
284 | 284 | else |
r17963 | r17964 | |
287 | 287 | |
288 | 288 | READ8_HANDLER( c64_read_io ) |
289 | 289 | { |
290 | legacy_c64_state *state = space->machine().driver_data<legacy_c64_state>(); | |
291 | device_t *cia_0 = space->machine().device("cia_0"); | |
292 | device_t *cia_1 = space->machine().device("cia_1"); | |
293 | sid6581_device *sid = space->machine().device<sid6581_device>("sid6581"); | |
294 | device_t *vic2 = space->machine().device("vic2"); | |
290 | legacy_c64_state *state = space.machine().driver_data<legacy_c64_state>(); | |
291 | device_t *cia_0 = space.machine().device("cia_0"); | |
292 | device_t *cia_1 = space.machine().device("cia_1"); | |
293 | sid6581_device *sid = space.machine().device<sid6581_device>("sid6581"); | |
294 | device_t *vic2 = space.machine().device("vic2"); | |
295 | 295 | |
296 | 296 | if (offset < 0x400) |
297 | return vic2_port_r(vic2, | |
297 | return vic2_port_r(vic2, space, offset & 0x3ff); | |
298 | 298 | |
299 | 299 | else if (offset < 0x800) |
300 | return sid->read( | |
300 | return sid->read(space, offset & 0x3ff); | |
301 | 301 | |
302 | 302 | else if (offset < 0xc00) |
303 | 303 | return state->m_colorram[offset & 0x3ff]; |
r17963 | r17964 | |
305 | 305 | else if (offset < 0xd00) |
306 | 306 | { |
307 | 307 | if (offset & 1) |
308 | cia_set_port_mask_value(cia_0, 1, space | |
308 | cia_set_port_mask_value(cia_0, 1, space.machine().root_device().ioport("CTRLSEL")->read() & 0x80 ? c64_keyline[9] : c64_keyline[8] ); | |
309 | 309 | else |
310 | 310 | cia_set_port_mask_value(cia_0, 0, state->ioport("CTRLSEL")->read() & 0x80 ? c64_keyline[8] : c64_keyline[9] ); |
311 | 311 | |
312 | return mos6526_r(cia_0, | |
312 | return mos6526_r(cia_0, space, offset); | |
313 | 313 | } |
314 | 314 | |
315 | 315 | else if (state->m_cia1_on && (offset < 0xe00)) |
316 | return mos6526_r(cia_1, | |
316 | return mos6526_r(cia_1, space, offset); | |
317 | 317 | |
318 | DBG_LOG(space | |
318 | DBG_LOG(space.machine(), 1, "io read", ("%.3x\n", offset)); | |
319 | 319 | |
320 | 320 | return 0xff; |
321 | 321 | } |
322 | 322 | |
323 | 323 | READ8_HANDLER( c64_ioarea_r ) |
324 | 324 | { |
325 | legacy_c64_state *state = space | |
325 | legacy_c64_state *state = space.machine().driver_data<legacy_c64_state>(); | |
326 | 326 | return state->m_io_enabled ? c64_read_io(space, offset) : state->m_io_ram_r_ptr[offset]; |
327 | 327 | } |
328 | 328 | |
r17963 | r17964 | |
727 | 727 | |
728 | 728 | READ8_HANDLER( c64_colorram_read ) |
729 | 729 | { |
730 | legacy_c64_state *state = space | |
730 | legacy_c64_state *state = space.machine().driver_data<legacy_c64_state>(); | |
731 | 731 | return state->m_colorram[offset & 0x3ff]; |
732 | 732 | } |
733 | 733 | |
734 | 734 | WRITE8_HANDLER( c64_colorram_write ) |
735 | 735 | { |
736 | legacy_c64_state *state = space | |
736 | legacy_c64_state *state = space.machine().driver_data<legacy_c64_state>(); | |
737 | 737 | state->m_colorram[offset & 0x3ff] = data | 0xf0; |
738 | 738 | } |
739 | 739 | |
r17963 | r17964 | |
1377 | 1377 | |
1378 | 1378 | int bank = ((data >> 3) & 0x0e) | BIT(data, 7); |
1379 | 1379 | |
1380 | map_cartridge_roml(space | |
1380 | map_cartridge_roml(space.machine(), bank * 0x2000); | |
1381 | 1381 | } |
1382 | 1382 | |
1383 | 1383 | static void load_hugo_cartridge(device_image_interface &image) |
r17963 | r17964 | |
1407 | 1407 | |
1408 | 1408 | static WRITE8_HANDLER( easy_calc_result_bank_w ) |
1409 | 1409 | { |
1410 | map_cartridge_romh(space | |
1410 | map_cartridge_romh(space.machine(), 0x2000 + (!offset * 0x2000)); | |
1411 | 1411 | } |
1412 | 1412 | |
1413 | 1413 | static void load_easy_calc_result_cartridge(device_image_interface &image) |
r17963 | r17964 | |
1454 | 1454 | |
1455 | 1455 | */ |
1456 | 1456 | |
1457 | legacy_c64_state *state = space | |
1457 | legacy_c64_state *state = space.machine().driver_data<legacy_c64_state>(); | |
1458 | 1458 | UINT8 *cart = state->memregion("user1")->base(); |
1459 | 1459 | |
1460 | 1460 | if (data == 0xff) |
r17963 | r17964 | |
1486 | 1486 | { |
1487 | 1487 | state->m_roml = state->m_c64_roml; |
1488 | 1488 | |
1489 | map_cartridge_roml(space->machine(), address); | |
1490 | map_cartridge_romh(space->machine(), address + 0x2000); | |
1489 | map_cartridge_roml(space.machine(), address); | |
1490 | map_cartridge_romh(space.machine(), address + 0x2000); | |
1491 | 1491 | } |
1492 | 1492 | } |
1493 | 1493 | |
1494 | c64_bankswitch(space | |
1494 | c64_bankswitch(space.machine(), 0); | |
1495 | 1495 | } |
1496 | 1496 | |
1497 | 1497 | static void load_pagefox_cartridge(device_image_interface &image) |
r17963 | r17964 | |
1506 | 1506 | |
1507 | 1507 | static WRITE8_HANDLER( multiscreen_bank_w ) |
1508 | 1508 | { |
1509 | legacy_c64_state *state = space | |
1509 | legacy_c64_state *state = space.machine().driver_data<legacy_c64_state>(); | |
1510 | 1510 | UINT8 *cart = state->memregion("user1")->base(); |
1511 | 1511 | int bank = data & 0x0f; |
1512 | 1512 | offs_t address = bank * 0x4000; |
r17963 | r17964 | |
1517 | 1517 | state->m_roml = cart + address; |
1518 | 1518 | state->m_roml_writable = 1; |
1519 | 1519 | |
1520 | map_cartridge_romh(space | |
1520 | map_cartridge_romh(space.machine(), 0x2000); | |
1521 | 1521 | } |
1522 | 1522 | else |
1523 | 1523 | { |
r17963 | r17964 | |
1525 | 1525 | state->m_roml = state->m_c64_roml; |
1526 | 1526 | state->m_roml_writable = 0; |
1527 | 1527 | |
1528 | map_cartridge_roml(space->machine(), address); | |
1529 | map_cartridge_romh(space->machine(), address + 0x2000); | |
1528 | map_cartridge_roml(space.machine(), address); | |
1529 | map_cartridge_romh(space.machine(), address + 0x2000); | |
1530 | 1530 | } |
1531 | 1531 | |
1532 | c64_bankswitch(space | |
1532 | c64_bankswitch(space.machine(), 0); | |
1533 | 1533 | } |
1534 | 1534 | |
1535 | 1535 | static void load_multiscreen_cartridge(device_image_interface &image) |
r17963 | r17964 | |
1545 | 1545 | |
1546 | 1546 | static WRITE8_HANDLER( simons_basic_bank_w ) |
1547 | 1547 | { |
1548 | set_game_line(space | |
1548 | set_game_line(space.machine(), !BIT(data, 0)); | |
1549 | 1549 | } |
1550 | 1550 | |
1551 | 1551 | static void load_simons_basic_cartridge(device_image_interface &image) |
r17963 | r17964 | |
1561 | 1561 | |
1562 | 1562 | static READ8_HANDLER( super_explode_r ) |
1563 | 1563 | { |
1564 | legacy_c64_state *state = space | |
1564 | legacy_c64_state *state = space.machine().driver_data<legacy_c64_state>(); | |
1565 | 1565 | |
1566 | 1566 | return state->m_roml[0x1f00 | offset]; |
1567 | 1567 | } |
1568 | 1568 | |
1569 | 1569 | static WRITE8_HANDLER( super_explode_bank_w ) |
1570 | 1570 | { |
1571 | map_cartridge_roml(space | |
1571 | map_cartridge_roml(space.machine(), BIT(data, 7) * 0x2000); | |
1572 | 1572 | } |
1573 | 1573 | |
1574 | 1574 | static void load_super_explode_cartridge(device_image_interface &image) |
r17963 | r17964 | |
1577 | 1577 | |
1578 | 1578 | map_cartridge_roml(image.device().machine(), 0x0000); |
1579 | 1579 | |
1580 | address_space *space = image.device().machine().firstcpu->space(AS_PROGRAM); | |
1581 | space->install_legacy_read_handler(0xdf00, 0xdfff, FUNC(super_explode_r)); | |
1580 | address_space &space = *image.device().machine().firstcpu->space(AS_PROGRAM); | |
1581 | space.install_legacy_read_handler(0xdf00, 0xdfff, FUNC(super_explode_r)); | |
1582 | 1582 | |
1583 | 1583 | install_io2_handler(super_explode_bank_w); |
1584 | 1584 | } |
r17963 | r17964 | |
1700 | 1700 | |
1701 | 1701 | static WRITE8_HANDLER( fc3_bank_w ) |
1702 | 1702 | { |
1703 | legacy_c64_state *state = space | |
1703 | legacy_c64_state *state = space.machine().driver_data<legacy_c64_state>(); | |
1704 | 1704 | // Type # 3 |
1705 | 1705 | // working: |
1706 | 1706 | // not working: |
r17963 | r17964 | |
1730 | 1730 | |
1731 | 1731 | static WRITE8_HANDLER( ocean1_bank_w ) |
1732 | 1732 | { |
1733 | legacy_c64_state *state = space | |
1733 | legacy_c64_state *state = space.machine().driver_data<legacy_c64_state>(); | |
1734 | 1734 | // Type # 5 |
1735 | 1735 | // working: Double Dragon, Ghostbusters, Terminator 2 |
1736 | 1736 | // not working: Pang, Robocop 2, Toki |
r17963 | r17964 | |
1765 | 1765 | |
1766 | 1766 | static WRITE8_HANDLER( funplay_bank_w ) |
1767 | 1767 | { |
1768 | legacy_c64_state *state = space | |
1768 | legacy_c64_state *state = space.machine().driver_data<legacy_c64_state>(); | |
1769 | 1769 | // Type # 7 |
1770 | 1770 | // working: |
1771 | 1771 | // not working: |
r17963 | r17964 | |
1795 | 1795 | |
1796 | 1796 | static WRITE8_HANDLER( supergames_bank_w ) |
1797 | 1797 | { |
1798 | legacy_c64_state *state = space | |
1798 | legacy_c64_state *state = space.machine().driver_data<legacy_c64_state>(); | |
1799 | 1799 | // Type # 8 |
1800 | 1800 | // working: |
1801 | 1801 | // not working: |
r17963 | r17964 | |
1834 | 1834 | |
1835 | 1835 | static WRITE8_HANDLER( c64gs_bank_w ) |
1836 | 1836 | { |
1837 | legacy_c64_state *state = space | |
1837 | legacy_c64_state *state = space.machine().driver_data<legacy_c64_state>(); | |
1838 | 1838 | // Type # 15 |
1839 | 1839 | // working: |
1840 | 1840 | // not working: The Last Ninja Remix |
r17963 | r17964 | |
1858 | 1858 | |
1859 | 1859 | static READ8_HANDLER( dinamic_bank_r ) |
1860 | 1860 | { |
1861 | legacy_c64_state *state = space | |
1861 | legacy_c64_state *state = space.machine().driver_data<legacy_c64_state>(); | |
1862 | 1862 | // Type # 17 |
1863 | 1863 | // working: Satan |
1864 | 1864 | // not working: |
r17963 | r17964 | |
1883 | 1883 | |
1884 | 1884 | static READ8_HANDLER( zaxxon_bank_r ) |
1885 | 1885 | { |
1886 | legacy_c64_state *state = space | |
1886 | legacy_c64_state *state = space.machine().driver_data<legacy_c64_state>(); | |
1887 | 1887 | // Type # 18 |
1888 | 1888 | // working: |
1889 | 1889 | // not working: |
r17963 | r17964 | |
1906 | 1906 | |
1907 | 1907 | static WRITE8_HANDLER( domark_bank_w ) |
1908 | 1908 | { |
1909 | legacy_c64_state *state = space | |
1909 | legacy_c64_state *state = space.machine().driver_data<legacy_c64_state>(); | |
1910 | 1910 | // Type # 19 |
1911 | 1911 | // working: |
1912 | 1912 | // not working: |
r17963 | r17964 | |
1929 | 1929 | |
1930 | 1930 | static WRITE8_HANDLER( comal80_bank_w ) |
1931 | 1931 | { |
1932 | legacy_c64_state *state = space | |
1932 | legacy_c64_state *state = space.machine().driver_data<legacy_c64_state>(); | |
1933 | 1933 | // Type # 21 |
1934 | 1934 | // working: Comal 80 |
1935 | 1935 | // not working: |
r17963 | r17964 | |
1959 | 1959 | static void setup_c64_custom_mappers(running_machine &machine) |
1960 | 1960 | { |
1961 | 1961 | legacy_c64_state *state = machine.driver_data<legacy_c64_state>(); |
1962 | address_space | |
1962 | address_space &space = *machine.device( "maincpu")->memory().space( AS_PROGRAM ); | |
1963 | 1963 | |
1964 | 1964 | switch (state->m_cart.mapper) |
1965 | 1965 | { |
r17963 | r17964 | |
1968 | 1968 | case KCS_PC: /* Type # 2 not working */ |
1969 | 1969 | break; |
1970 | 1970 | case FINAL_CART_III: /* Type # 3 not working - 4 16k banks, loaded at 0x8000, banks chosen by writing to 0xdfff */ |
1971 | space | |
1971 | space.install_legacy_write_handler( 0xdfff, 0xdfff, FUNC(fc3_bank_w) ); | |
1972 | 1972 | break; |
1973 | 1973 | case SIMONS_BASIC: /* Type # 4 not working */ |
1974 | 1974 | break; |
1975 | 1975 | case OCEAN_1: /* Type # 5 - up to 64 8k banks, loaded at 0x8000 or 0xa000, banks chosen by writing to 0xde00 */ |
1976 | space | |
1976 | space.install_legacy_write_handler( 0xde00, 0xde00, FUNC(ocean1_bank_w) ); | |
1977 | 1977 | break; |
1978 | 1978 | case EXPERT: /* Type # 6 not working */ |
1979 | 1979 | break; |
1980 | 1980 | case FUN_PLAY: /* Type # 7 - 16 8k banks, loaded at 0x8000, banks chosen by writing to 0xde00 */ |
1981 | space | |
1981 | space.install_legacy_write_handler( 0xde00, 0xde00, FUNC(funplay_bank_w) ); | |
1982 | 1982 | break; |
1983 | 1983 | case SUPER_GAMES: /* Type # 8 not working */ |
1984 | space | |
1984 | space.install_legacy_write_handler( 0xdf00, 0xdf00, FUNC(supergames_bank_w) ); | |
1985 | 1985 | break; |
1986 | 1986 | case ATOMIC_POWER: /* Type # 9 not working */ |
1987 | 1987 | break; |
r17963 | r17964 | |
1996 | 1996 | case MAGIC_FORMEL: /* Type # 14 not working */ |
1997 | 1997 | break; |
1998 | 1998 | case C64GS: /* Type # 15 - up to 64 8k banks, loaded at 0x8000, banks chosen by writing to 0xde00 + bank */ |
1999 | space | |
1999 | space.install_legacy_write_handler( 0xde00, 0xdeff, FUNC(c64gs_bank_w) ); | |
2000 | 2000 | break; |
2001 | 2001 | case DINAMIC: /* Type # 17 - 16 8k banks, loaded at 0x8000, banks chosen by reading to 0xde00 + bank */ |
2002 | space | |
2002 | space.install_legacy_read_handler( 0xde00, 0xdeff, FUNC(dinamic_bank_r) ); | |
2003 | 2003 | break; |
2004 | 2004 | case ZAXXON: /* Type # 18 */ |
2005 | space | |
2005 | space.install_legacy_read_handler( 0x8000, 0x9fff, FUNC(zaxxon_bank_r) ); | |
2006 | 2006 | break; |
2007 | 2007 | case DOMARK: /* Type # 19 */ |
2008 | space | |
2008 | space.install_legacy_write_handler( 0xde00, 0xde00, FUNC(domark_bank_w) ); | |
2009 | 2009 | break; |
2010 | 2010 | case SUPER_SNAP_5: /* Type # 20 not working */ |
2011 | 2011 | break; |
2012 | 2012 | case COMAL_80: /* Type # 21 - 4 16k banks, loaded at 0x8000, banks chosen by writing to 0xde00 */ |
2013 | space | |
2013 | space.install_legacy_write_handler( 0xde00, 0xde00, FUNC(comal80_bank_w) ); | |
2014 | 2014 | break; |
2015 | 2015 | case GENERIC_CRT: /* Type # 0 - single bank, no bankswitch, loaded at start with correct size and place */ |
2016 | 2016 | default: |
r17963 | r17964 | |
---|---|---|
237 | 237 | |
238 | 238 | static void dma_transfer_start(device_t* device, int channel, int dir) |
239 | 239 | { |
240 | address_space | |
240 | address_space &space = *device->machine().firstcpu->space(AS_PROGRAM); | |
241 | 241 | hd63450_t* dmac = get_safe_token(device); |
242 | 242 | dmac->in_progress[channel] = 1; |
243 | 243 | dmac->reg[channel].csr &= ~0xe0; |
r17963 | r17964 | |
245 | 245 | dmac->reg[channel].csr &= ~0x30; // Reset Error and Normal termination bits |
246 | 246 | if((dmac->reg[channel].ocr & 0x0c) != 0x00) // Array chain or Link array chain |
247 | 247 | { |
248 | dmac->reg[channel].mar = space->read_word(dmac->reg[channel].bar) << 16; | |
249 | dmac->reg[channel].mar |= space->read_word(dmac->reg[channel].bar+2); | |
250 | dmac->reg[channel].mtc = space->read_word(dmac->reg[channel].bar+4); | |
248 | dmac->reg[channel].mar = space.read_word(dmac->reg[channel].bar) << 16; | |
249 | dmac->reg[channel].mar |= space.read_word(dmac->reg[channel].bar+2); | |
250 | dmac->reg[channel].mtc = space.read_word(dmac->reg[channel].bar+4); | |
251 | 251 | if(dmac->reg[channel].btc > 0) |
252 | 252 | dmac->reg[channel].btc--; |
253 | 253 | } |
r17963 | r17964 | |
314 | 314 | |
315 | 315 | void hd63450_single_transfer(device_t* device, int x) |
316 | 316 | { |
317 | address_space | |
317 | address_space &space = *device->machine().firstcpu->space(AS_PROGRAM); | |
318 | 318 | int data; |
319 | 319 | int datasize = 1; |
320 | 320 | hd63450_t* dmac = get_safe_token(device); |
r17963 | r17964 | |
328 | 328 | data = dmac->intf->dma_read[x](device->machine(),dmac->reg[x].mar); |
329 | 329 | if(data == -1) |
330 | 330 | return; // not ready to receive data |
331 | space | |
331 | space.write_byte(dmac->reg[x].mar,data); | |
332 | 332 | datasize = 1; |
333 | 333 | } |
334 | 334 | else |
r17963 | r17964 | |
336 | 336 | switch(dmac->reg[x].ocr & 0x30) // operation size |
337 | 337 | { |
338 | 338 | case 0x00: // 8 bit |
339 | data = space->read_byte(dmac->reg[x].dar); // read from device address | |
340 | space->write_byte(dmac->reg[x].mar, data); // write to memory address | |
339 | data = space.read_byte(dmac->reg[x].dar); // read from device address | |
340 | space.write_byte(dmac->reg[x].mar, data); // write to memory address | |
341 | 341 | datasize = 1; |
342 | 342 | break; |
343 | 343 | case 0x10: // 16 bit |
344 | data = space->read_word(dmac->reg[x].dar); // read from device address | |
345 | space->write_word(dmac->reg[x].mar, data); // write to memory address | |
344 | data = space.read_word(dmac->reg[x].dar); // read from device address | |
345 | space.write_word(dmac->reg[x].mar, data); // write to memory address | |
346 | 346 | datasize = 2; |
347 | 347 | break; |
348 | 348 | case 0x20: // 32 bit |
349 | data = space->read_word(dmac->reg[x].dar) << 16; // read from device address | |
350 | data |= space->read_word(dmac->reg[x].dar+2); | |
351 | space->write_word(dmac->reg[x].mar, (data & 0xffff0000) >> 16); // write to memory address | |
352 | space->write_word(dmac->reg[x].mar+2, data & 0x0000ffff); | |
349 | data = space.read_word(dmac->reg[x].dar) << 16; // read from device address | |
350 | data |= space.read_word(dmac->reg[x].dar+2); | |
351 | space.write_word(dmac->reg[x].mar, (data & 0xffff0000) >> 16); // write to memory address | |
352 | space.write_word(dmac->reg[x].mar+2, data & 0x0000ffff); | |
353 | 353 | datasize = 4; |
354 | 354 | break; |
355 | 355 | case 0x30: // 8 bit packed (?) |
356 | data = space->read_byte(dmac->reg[x].dar); // read from device address | |
357 | space->write_byte(dmac->reg[x].mar, data); // write to memory address | |
356 | data = space.read_byte(dmac->reg[x].dar); // read from device address | |
357 | space.write_byte(dmac->reg[x].mar, data); // write to memory address | |
358 | 358 | datasize = 1; |
359 | 359 | break; |
360 | 360 | } |
r17963 | r17964 | |
365 | 365 | { |
366 | 366 | if(dmac->intf->dma_write[x]) |
367 | 367 | { |
368 | data = space | |
368 | data = space.read_byte(dmac->reg[x].mar); | |
369 | 369 | dmac->intf->dma_write[x](device->machine(), dmac->reg[x].mar,data); |
370 | 370 | datasize = 1; |
371 | 371 | } |
r17963 | r17964 | |
374 | 374 | switch(dmac->reg[x].ocr & 0x30) // operation size |
375 | 375 | { |
376 | 376 | case 0x00: // 8 bit |
377 | data = space->read_byte(dmac->reg[x].mar); // read from memory address | |
378 | space->write_byte(dmac->reg[x].dar, data); // write to device address | |
377 | data = space.read_byte(dmac->reg[x].mar); // read from memory address | |
378 | space.write_byte(dmac->reg[x].dar, data); // write to device address | |
379 | 379 | datasize = 1; |
380 | 380 | break; |
381 | 381 | case 0x10: // 16 bit |
382 | data = space->read_word(dmac->reg[x].mar); // read from memory address | |
383 | space->write_word(dmac->reg[x].dar, data); // write to device address | |
382 | data = space.read_word(dmac->reg[x].mar); // read from memory address | |
383 | space.write_word(dmac->reg[x].dar, data); // write to device address | |
384 | 384 | datasize = 2; |
385 | 385 | break; |
386 | 386 | case 0x20: // 32 bit |
387 | data = space->read_word(dmac->reg[x].mar) << 16; // read from memory address | |
388 | data |= space->read_word(dmac->reg[x].mar+2); // read from memory address | |
389 | space->write_word(dmac->reg[x].dar, (data & 0xffff0000) >> 16); // write to device address | |
390 | space->write_word(dmac->reg[x].dar+2, data & 0x0000ffff); // write to device address | |
387 | data = space.read_word(dmac->reg[x].mar) << 16; // read from memory address | |
388 | data |= space.read_word(dmac->reg[x].mar+2); // read from memory address | |
389 | space.write_word(dmac->reg[x].dar, (data & 0xffff0000) >> 16); // write to device address | |
390 | space.write_word(dmac->reg[x].dar+2, data & 0x0000ffff); // write to device address | |
391 | 391 | datasize = 4; |
392 | 392 | break; |
393 | 393 | case 0x30: // 8 bit packed (?) |
394 | data = space->read_byte(dmac->reg[x].mar); // read from memory address | |
395 | space->write_byte(dmac->reg[x].dar, data); // write to device address | |
394 | data = space.read_byte(dmac->reg[x].mar); // read from memory address | |
395 | space.write_byte(dmac->reg[x].dar, data); // write to device address | |
396 | 396 | datasize = 1; |
397 | 397 | break; |
398 | 398 | } |
r17963 | r17964 | |
424 | 424 | { |
425 | 425 | dmac->reg[x].btc--; |
426 | 426 | dmac->reg[x].bar+=6; |
427 | dmac->reg[x].mar = space->read_word(dmac->reg[x].bar) << 16; | |
428 | dmac->reg[x].mar |= space->read_word(dmac->reg[x].bar+2); | |
429 | dmac->reg[x].mtc = space->read_word(dmac->reg[x].bar+4); | |
427 | dmac->reg[x].mar = space.read_word(dmac->reg[x].bar) << 16; | |
428 | dmac->reg[x].mar |= space.read_word(dmac->reg[x].bar+2); | |
429 | dmac->reg[x].mtc = space.read_word(dmac->reg[x].bar+4); | |
430 | 430 | return; |
431 | 431 | } |
432 | 432 | dmac->timer[x]->adjust(attotime::zero); |
r17963 | r17964 | |
---|---|---|
1405 | 1405 | mess_init_pc_common(machine(), 0, NULL, pc_set_irq_line); |
1406 | 1406 | } |
1407 | 1407 | |
1408 | static READ8_HANDLER( input_port_0_r ) { return space | |
1408 | static READ8_HANDLER( input_port_0_r ) { return space.machine().root_device().ioport("IN0")->read(); } | |
1409 | 1409 | |
1410 | 1410 | DRIVER_INIT_MEMBER(pc_state,pc1640) |
1411 | 1411 | { |
r17963 | r17964 | |
1422 | 1422 | mess_init_pc_common(machine(), PCCOMMON_KEYBOARD_PC, pc_set_keyb_int, pc_set_irq_line); |
1423 | 1423 | |
1424 | 1424 | pc_vga_init(machine(), ::input_port_0_r, NULL); |
1425 | pc_vga_io_init(machine(), machine().device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, machine().device("maincpu")->memory().space(AS_IO), 0x0000); | |
1425 | pc_vga_io_init(machine(), *machine().device("maincpu")->memory().space(AS_PROGRAM), 0xa0000, *machine().device("maincpu")->memory().space(AS_IO), 0x0000); | |
1426 | 1426 | } |
1427 | 1427 | |
1428 | 1428 | static IRQ_CALLBACK(pc_irq_callback) |
r17963 | r17964 | |
---|---|---|
27 | 27 | void pecom_state::machine_reset() |
28 | 28 | { |
29 | 29 | UINT8 *rom = machine().root_device().memregion(CDP1802_TAG)->base(); |
30 | address_space | |
30 | address_space &space = *machine().device(CDP1802_TAG)->memory().space(AS_PROGRAM); | |
31 | 31 | |
32 | 32 | |
33 | space->unmap_write(0x0000, 0x3fff); | |
34 | space->install_write_bank(0x4000, 0x7fff, "bank2"); | |
35 | space->unmap_write(0xf000, 0xf7ff); | |
36 | space->unmap_write(0xf800, 0xffff); | |
37 | space->install_read_bank (0xf000, 0xf7ff, "bank3"); | |
38 | space->install_read_bank (0xf800, 0xffff, "bank4"); | |
33 | space.unmap_write(0x0000, 0x3fff); | |
34 | space.install_write_bank(0x4000, 0x7fff, "bank2"); | |
35 | space.unmap_write(0xf000, 0xf7ff); | |
36 | space.unmap_write(0xf800, 0xffff); | |
37 | space.install_read_bank (0xf000, 0xf7ff, "bank3"); | |
38 | space.install_read_bank (0xf800, 0xffff, "bank4"); | |
39 | 39 | membank("bank1")->set_base(rom + 0x8000); |
40 | 40 | membank("bank2")->set_base(machine().device<ram_device>(RAM_TAG)->pointer() + 0x4000); |
41 | 41 | membank("bank3")->set_base(rom + 0xf000); |
r17963 | r17964 | |
---|---|---|
147 | 147 | |
148 | 148 | static READ32_HANDLER( atapi_r ) |
149 | 149 | { |
150 | running_machine &machine = space | |
150 | running_machine &machine = space.machine(); | |
151 | 151 | int reg, data; |
152 | 152 | |
153 | 153 | if (mem_mask == 0x0000ffff) // word-wide command read |
r17963 | r17964 | |
261 | 261 | } |
262 | 262 | #endif |
263 | 263 | |
264 | mame_printf_debug("ATAPI: read reg %d = %x (PC=%x)\n", reg, data, space | |
264 | mame_printf_debug("ATAPI: read reg %d = %x (PC=%x)\n", reg, data, space.device().safe_pc()); | |
265 | 265 | } |
266 | 266 | |
267 | 267 | // printf( "atapi_r( %08x, %08x ) %08x\n", offset, mem_mask, data ); |
r17963 | r17964 | |
270 | 270 | |
271 | 271 | static WRITE32_HANDLER( atapi_w ) |
272 | 272 | { |
273 | running_machine &machine = space | |
273 | running_machine &machine = space.machine(); | |
274 | 274 | int reg; |
275 | 275 | |
276 | 276 | // printf( "atapi_w( %08x, %08x, %08x )\n", offset, mem_mask, data ); |
r17963 | r17964 | |
369 | 369 | |
370 | 370 | case 0x45: // PLAY |
371 | 371 | atapi_regs[ATAPI_REG_CMDSTATUS] = ATAPI_STAT_BSY; |
372 | atapi_timer->adjust( downcast<cpu_device *>(&space | |
372 | atapi_timer->adjust( downcast<cpu_device *>(&space.device())->cycles_to_attotime(ATAPI_CYCLES_PER_SECTOR ) ); | |
373 | 373 | break; |
374 | 374 | } |
375 | 375 | |
r17963 | r17964 | |
420 | 420 | } |
421 | 421 | #endif |
422 | 422 | atapi_regs[reg] = data; |
423 | // mame_printf_debug("ATAPI: reg %d = %x (offset %x mask %x PC=%x)\n", reg, data, offset, mem_mask, space | |
423 | // mame_printf_debug("ATAPI: reg %d = %x (offset %x mask %x PC=%x)\n", reg, data, offset, mem_mask, space.device().safe_pc()); | |
424 | 424 | |
425 | 425 | if (reg == ATAPI_REG_CMDSTATUS) |
426 | 426 | { |
427 | printf("ATAPI command %x issued! (PC=%x)\n", data, space | |
427 | printf("ATAPI command %x issued! (PC=%x)\n", data, space.device().safe_pc()); | |
428 | 428 | |
429 | 429 | switch (data) |
430 | 430 | { |
r17963 | r17964 | |
491 | 491 | atapi_regs[ATAPI_REG_COUNTLOW] = 0; |
492 | 492 | atapi_regs[ATAPI_REG_COUNTHIGH] = 2; |
493 | 493 | |
494 | gdrom_raise_irq(space | |
494 | gdrom_raise_irq(space.machine()); | |
495 | 495 | break; |
496 | 496 | |
497 | 497 | case 0xef: // SET FEATURES |
r17963 | r17964 | |
512 | 512 | atapi_data_ptr = 0; |
513 | 513 | atapi_data_len = 0; |
514 | 514 | |
515 | gdrom_raise_irq(space | |
515 | gdrom_raise_irq(space.machine()); | |
516 | 516 | break; |
517 | 517 | |
518 | 518 | default: |
r17963 | r17964 | |
603 | 603 | off=offset << 1; |
604 | 604 | } |
605 | 605 | |
606 | // printf("gdrom_r: @ %x (off %x), mask %llx (PC %x)\n", offset, off, mem_mask, space | |
606 | // printf("gdrom_r: @ %x (off %x), mask %llx (PC %x)\n", offset, off, mem_mask, space.device().safe_pc()); | |
607 | 607 | |
608 | 608 | if (offset == 3) |
609 | 609 | { |
r17963 | r17964 | |
632 | 632 | off=offset << 1; |
633 | 633 | } |
634 | 634 | |
635 | // printf("GDROM: [%08x=%x]write %llx to %x, mask %llx (PC %x)\n", 0x5f7000+off*4, dat, data, offset, mem_mask, space | |
635 | // printf("GDROM: [%08x=%x]write %llx to %x, mask %llx (PC %x)\n", 0x5f7000+off*4, dat, data, offset, mem_mask, space.device().safe_pc()); | |
636 | 636 | |
637 | 637 | if (off >= 0x20) |
638 | 638 | { |
r17963 | r17964 | |
667 | 667 | |
668 | 668 | READ64_HANDLER( dc_mess_g1_ctrl_r ) |
669 | 669 | { |
670 | dc_state *state = space | |
670 | dc_state *state = space.machine().driver_data<dc_state>(); | |
671 | 671 | int reg; |
672 | 672 | UINT64 shift; |
673 | 673 | |
674 | reg = decode_reg32_64(space | |
674 | reg = decode_reg32_64(space.machine(), offset, mem_mask, &shift); | |
675 | 675 | mame_printf_verbose("G1CTRL: Unmapped read %08x\n", 0x5f7400+reg*4); |
676 | 676 | return (UINT64)state->g1bus_regs[reg] << shift; |
677 | 677 | } |
678 | 678 | |
679 | 679 | WRITE64_HANDLER( dc_mess_g1_ctrl_w ) |
680 | 680 | { |
681 | dc_state *state = space | |
681 | dc_state *state = space.machine().driver_data<dc_state>(); | |
682 | 682 | int reg; |
683 | 683 | UINT64 shift; |
684 | 684 | UINT32 dat; //, old |
685 | 685 | |
686 | reg = decode_reg32_64(space | |
686 | reg = decode_reg32_64(space.machine(), offset, mem_mask, &shift); | |
687 | 687 | dat = (UINT32)(data >> shift); |
688 | 688 | // old = state->g1bus_regs[reg]; |
689 | 689 | |
r17963 | r17964 | |
701 | 701 | } |
702 | 702 | |
703 | 703 | atapi_xferbase = state->g1bus_regs[SB_GDSTAR]; |
704 | atapi_timer->adjust(space | |
704 | atapi_timer->adjust(space.machine().device<cpu_device>("maincpu")->cycles_to_attotime((ATAPI_CYCLES_PER_SECTOR * (atapi_xferlen/2048)))); | |
705 | 705 | } |
706 | 706 | break; |
707 | 707 | } |
r17963 | r17964 | |
---|---|---|
78 | 78 | { |
79 | 79 | case 0x0000: |
80 | 80 | case 0x0004: |
81 | //verboselog( space | |
81 | //verboselog( space.machine(), 3, "CPU Control 0 Read: %08x (%08x)\n", pMC->nCPUControl0, mem_mask ); | |
82 | 82 | return pMC->nCPUControl0; |
83 | 83 | case 0x0008: |
84 | 84 | case 0x000c: |
85 | //verboselog( space | |
85 | //verboselog( space.machine(), 2, "CPU Control 1 Read: %08x (%08x)\n", pMC->nCPUControl1, mem_mask ); | |
86 | 86 | return pMC->nCPUControl1; |
87 | 87 | case 0x0010: |
88 | 88 | case 0x0014: |
89 | //verboselog( space | |
89 | //verboselog( space.machine(), 2, "Watchdog Timer Read: %08x (%08x)\n", pMC->nWatchdog, mem_mask ); | |
90 | 90 | return pMC->nWatchdog; |
91 | 91 | case 0x0018: |
92 | 92 | case 0x001c: |
93 | //verboselog( space | |
93 | //verboselog( space.machine(), 2, "System ID Read: %08x (%08x)\n", pMC->nSysID, mem_mask ); | |
94 | 94 | return pMC->nSysID; |
95 | 95 | case 0x0028: |
96 | 96 | case 0x002c: |
97 | //verboselog( space | |
97 | //verboselog( space.machine(), 2, "RPSS Divider Read: %08x (%08x)\n", pMC->nRPSSDiv, mem_mask ); | |
98 | 98 | return pMC->nRPSSDiv; |
99 | 99 | case 0x0030: |
100 | 100 | case 0x0034: |
101 | //verboselog( space | |
101 | //verboselog( space.machine(), 2, "R4000 EEPROM Read\n" ); | |
102 | 102 | return 0; |
103 | 103 | case 0x0040: |
104 | 104 | case 0x0044: |
105 | //verboselog( space | |
105 | //verboselog( space.machine(), 2, "Refresh Count Preload Read: %08x (%08x)\n", pMC->nRefCntPreload, mem_mask ); | |
106 | 106 | return pMC->nRefCntPreload; |
107 | 107 | case 0x0048: |
108 | 108 | case 0x004c: |
109 | //verboselog( space | |
109 | //verboselog( space.machine(), 2, "Refresh Count Read: %08x (%08x)\n", pMC->nRefCnt, mem_mask ); | |
110 | 110 | return pMC->nRefCnt; |
111 | 111 | case 0x0080: |
112 | 112 | case 0x0084: |
113 | //verboselog( space | |
113 | //verboselog( space.machine(), 2, "GIO64 Arbitration Param Read: %08x (%08x)\n", pMC->nGIO64ArbParam, mem_mask ); | |
114 | 114 | return pMC->nGIO64ArbParam; |
115 | 115 | case 0x0088: |
116 | 116 | case 0x008c: |
117 | //verboselog( space | |
117 | //verboselog( space.machine(), 2, "Arbiter CPU Time Read: %08x (%08x)\n", pMC->nArbCPUTime, mem_mask ); | |
118 | 118 | return pMC->nArbCPUTime; |
119 | 119 | case 0x0098: |
120 | 120 | case 0x009c: |
121 | //verboselog( space | |
121 | //verboselog( space.machine(), 2, "Arbiter Long Burst Time Read: %08x (%08x)\n", pMC->nArbBurstTime, mem_mask ); | |
122 | 122 | return pMC->nArbBurstTime; |
123 | 123 | case 0x00c0: |
124 | 124 | case 0x00c4: |
125 | //verboselog( space | |
125 | //verboselog( space.machine(), 3, "Memory Configuration Register 0 Read: %08x (%08x)\n", pMC->nMemCfg0, mem_mask ); | |
126 | 126 | return pMC->nMemCfg0; |
127 | 127 | case 0x00c8: |
128 | 128 | case 0x00cc: |
129 | //verboselog( space | |
129 | //verboselog( space.machine(), 3, "Memory Configuration Register 1 Read: %08x (%08x)\n", pMC->nMemCfg1, mem_mask ); | |
130 | 130 | return pMC->nMemCfg1; |
131 | 131 | case 0x00d0: |
132 | 132 | case 0x00d4: |
133 | //verboselog( space | |
133 | //verboselog( space.machine(), 2, "CPU Memory Access Config Params Read: %08x (%08x)\n", pMC->nCPUMemAccCfg, mem_mask ); | |
134 | 134 | return pMC->nCPUMemAccCfg; |
135 | 135 | case 0x00d8: |
136 | 136 | case 0x00dc: |
137 | //verboselog( space | |
137 | //verboselog( space.machine(), 2, "GIO Memory Access Config Params Read: %08x (%08x)\n", pMC->nGIOMemAccCfg, mem_mask ); | |
138 | 138 | return pMC->nGIOMemAccCfg; |
139 | 139 | case 0x00e0: |
140 | 140 | case 0x00e4: |
141 | //verboselog( space | |
141 | //verboselog( space.machine(), 2, "CPU Error Address Read: %08x (%08x)\n", pMC->nCPUErrorAddr, mem_mask ); | |
142 | 142 | return pMC->nCPUErrorAddr; |
143 | 143 | case 0x00e8: |
144 | 144 | case 0x00ec: |
145 | //verboselog( space | |
145 | //verboselog( space.machine(), 2, "CPU Error Status Read: %08x (%08x)\n", pMC->nCPUErrorStatus, mem_mask ); | |
146 | 146 | return pMC->nCPUErrorStatus; |
147 | 147 | case 0x00f0: |
148 | 148 | case 0x00f4: |
149 | //verboselog( space | |
149 | //verboselog( space.machine(), 2, "GIO Error Address Read: %08x (%08x)\n", pMC->nGIOErrorAddr, mem_mask ); | |
150 | 150 | return pMC->nGIOErrorAddr; |
151 | 151 | case 0x00f8: |
152 | 152 | case 0x00fc: |
153 | //verboselog( space | |
153 | //verboselog( space.machine(), 2, "GIO Error Status Read: %08x (%08x)\n", pMC->nGIOErrorStatus, mem_mask ); | |
154 | 154 | return pMC->nGIOErrorStatus; |
155 | 155 | case 0x0100: |
156 | 156 | case 0x0104: |
157 | //verboselog( space | |
157 | //verboselog( space.machine(), 2, "System Semaphore Read: %08x (%08x)\n", pMC->nSysSemaphore, mem_mask ); | |
158 | 158 | return pMC->nSysSemaphore; |
159 | 159 | case 0x0108: |
160 | 160 | case 0x010c: |
161 | //verboselog( space | |
161 | //verboselog( space.machine(), 2, "GIO Lock Read: %08x (%08x)\n", pMC->nGIOLock, mem_mask ); | |
162 | 162 | return pMC->nGIOLock; |
163 | 163 | case 0x0110: |
164 | 164 | case 0x0114: |
165 | //verboselog( space | |
165 | //verboselog( space.machine(), 2, "EISA Lock Read: %08x (%08x)\n", pMC->nEISALock, mem_mask ); | |
166 | 166 | return pMC->nEISALock; |
167 | 167 | case 0x0150: |
168 | 168 | case 0x0154: |
169 | //verboselog( space | |
169 | //verboselog( space.machine(), 2, "GIO64 Translation Address Mask Read: %08x (%08x)\n", pMC->nGIO64TransMask, mem_mask ); | |
170 | 170 | return pMC->nGIO64TransMask; |
171 | 171 | case 0x0158: |
172 | 172 | case 0x015c: |
173 | //verboselog( space | |
173 | //verboselog( space.machine(), 2, "GIO64 Translation Address Substitution Bits Read: %08x (%08x)\n", pMC->nGIO64Subst, mem_mask ); | |
174 | 174 | return pMC->nGIO64Subst; |
175 | 175 | case 0x0160: |
176 | 176 | case 0x0164: |
177 | //verboselog( space | |
177 | //verboselog( space.machine(), 2, "DMA Interrupt Cause: %08x (%08x)\n", pMC->nDMAIntrCause, mem_mask ); | |
178 | 178 | return pMC->nDMAIntrCause; |
179 | 179 | case 0x0168: |
180 | 180 | case 0x016c: |
181 | //verboselog( space | |
181 | //verboselog( space.machine(), 2, "DMA Control Read: %08x (%08x)\n", pMC->nDMAControl, mem_mask ); | |
182 | 182 | return pMC->nDMAControl; |
183 | 183 | case 0x0180: |
184 | 184 | case 0x0184: |
185 | //verboselog( space | |
185 | //verboselog( space.machine(), 2, "DMA TLB Entry 0 High Read: %08x (%08x)\n", pMC->nDMATLBEntry0Hi, mem_mask ); | |
186 | 186 | return pMC->nDMATLBEntry0Hi; |
187 | 187 | case 0x0188: |
188 | 188 | case 0x018c: |
189 | //verboselog( space | |
189 | //verboselog( space.machine(), 2, "DMA TLB Entry 0 Low Read: %08x (%08x)\n", pMC->nDMATLBEntry0Lo, mem_mask ); | |
190 | 190 | return pMC->nDMATLBEntry0Lo; |
191 | 191 | case 0x0190: |
192 | 192 | case 0x0194: |
193 | //verboselog( space | |
193 | //verboselog( space.machine(), 2, "DMA TLB Entry 1 High Read: %08x (%08x)\n", pMC->nDMATLBEntry1Hi, mem_mask ); | |
194 | 194 | return pMC->nDMATLBEntry1Hi; |
195 | 195 | case 0x0198: |
196 | 196 | case 0x019c: |
197 | //verboselog( space | |
197 | //verboselog( space.machine(), 2, "DMA TLB Entry 1 Low Read: %08x (%08x)\n", pMC->nDMATLBEntry1Lo, mem_mask ); | |
198 | 198 | return pMC->nDMATLBEntry1Lo; |
199 | 199 | case 0x01a0: |
200 | 200 | case 0x01a4: |
201 | //verboselog( space | |
201 | //verboselog( space.machine(), 2, "DMA TLB Entry 2 High Read: %08x (%08x)\n", pMC->nDMATLBEntry2Hi, mem_mask ); | |
202 | 202 | return pMC->nDMATLBEntry2Hi; |
203 | 203 | case 0x01a8: |
204 | 204 | case 0x01ac: |
205 | //verboselog( space | |
205 | //verboselog( space.machine(), 2, "DMA TLB Entry 2 Low Read: %08x (%08x)\n", pMC->nDMATLBEntry2Lo, mem_mask ); | |
206 | 206 | return pMC->nDMATLBEntry2Lo; |
207 | 207 | case 0x01b0: |
208 | 208 | case 0x01b4: |
209 | //verboselog( space | |
209 | //verboselog( space.machine(), 2, "DMA TLB Entry 3 High Read: %08x (%08x)\n", pMC->nDMATLBEntry3Hi, mem_mask ); | |
210 | 210 | return pMC->nDMATLBEntry3Hi; |
211 | 211 | case 0x01b8: |
212 | 212 | case 0x01bc: |
213 | //verboselog( space | |
213 | //verboselog( space.machine(), 2, "DMA TLB Entry 3 Low Read: %08x (%08x)\n", pMC->nDMATLBEntry3Lo, mem_mask ); | |
214 | 214 | return pMC->nDMATLBEntry3Lo; |
215 | 215 | case 0x1000: |
216 | 216 | case 0x1004: |
217 | //verboselog( space | |
217 | //verboselog( space.machine(), 2, "RPSS 100ns Counter Read: %08x (%08x)\n", pMC->nRPSSCounter, mem_mask ); | |
218 | 218 | return pMC->nRPSSCounter; |
219 | 219 | case 0x2000: |
220 | 220 | case 0x2004: |
221 | 221 | case 0x2008: |
222 | 222 | case 0x200c: |
223 | //verboselog( space | |
223 | //verboselog( space.machine(), 0, "DMA Memory Address Read: %08x (%08x)\n", pMC->nDMAMemAddr, mem_mask ); | |
224 | 224 | return pMC->nDMAMemAddr; |
225 | 225 | case 0x2010: |
226 | 226 | case 0x2014: |
227 | //verboselog( space | |
227 | //verboselog( space.machine(), 0, "DMA Line Count and Width Read: %08x (%08x)\n", pMC->nDMALineCntWidth, mem_mask ); | |
228 | 228 | return pMC->nDMALineCntWidth; |
229 | 229 | case 0x2018: |
230 | 230 | case 0x201c: |
231 | //verboselog( space | |
231 | //verboselog( space.machine(), 0, "DMA Line Zoom and Stride Read: %08x (%08x)\n", pMC->nDMALineZoomStride, mem_mask ); | |
232 | 232 | return pMC->nDMALineZoomStride; |
233 | 233 | case 0x2020: |
234 | 234 | case 0x2024: |
235 | 235 | case 0x2028: |
236 | 236 | case 0x202c: |
237 | //verboselog( space | |
237 | //verboselog( space.machine(), 0, "DMA GIO64 Address Read: %08x (%08x)\n", pMC->nDMAGIO64Addr, mem_mask ); | |
238 | 238 | return pMC->nDMAGIO64Addr; |
239 | 239 | case 0x2030: |
240 | 240 | case 0x2034: |
241 | //verboselog( space | |
241 | //verboselog( space.machine(), 0, "DMA Mode Write: %08x (%08x)\n", pMC->nDMAMode, mem_mask ); | |
242 | 242 | return pMC->nDMAMode; |
243 | 243 | case 0x2038: |
244 | 244 | case 0x203c: |
245 | //verboselog( space | |
245 | //verboselog( space.machine(), 0, "DMA Zoom Count Read: %08x (%08x)\n", pMC->nDMAZoomByteCnt, mem_mask ); | |
246 | 246 | return pMC->nDMAZoomByteCnt; |
247 | 247 | // case 0x2040: |
248 | 248 | // case 0x2044: |
249 | // //verboselog( space | |
249 | // //verboselog( space.machine(), 2, "DMA Start Write: %08x (%08x)\n", data, mem_mask ); | |
250 | 250 | // Start DMA |
251 | 251 | // pMC->nDMARunning = 1; |
252 | 252 | // break; |
253 | 253 | case 0x2048: |
254 | 254 | case 0x204c: |
255 | //verboselog( space | |
255 | //verboselog( space.machine(), 0, "VDMA Running Read: %08x (%08x)\n", pMC->nDMARunning, mem_mask ); | |
256 | 256 | if( pMC->nDMARunning == 1 ) |
257 | 257 | { |
258 | 258 | pMC->nDMARunning = 0; |
r17963 | r17964 | |
263 | 263 | return 0; |
264 | 264 | } |
265 | 265 | } |
266 | //verboselog( space | |
266 | //verboselog( space.machine(), 0, "Unmapped MC read: 0x%08x (%08x)\n", 0x1fa00000 + offset, mem_mask ); | |
267 | 267 | return 0; |
268 | 268 | } |
269 | 269 | |
r17963 | r17964 | |
274 | 274 | { |
275 | 275 | case 0x0000: |
276 | 276 | case 0x0004: |
277 | //verboselog( space | |
277 | //verboselog( space.machine(), 2, "CPU Control 0 Write: %08x (%08x)\n", data, mem_mask ); | |
278 | 278 | pMC->nCPUControl0 = data; |
279 | 279 | break; |
280 | 280 | case 0x0008: |
281 | 281 | case 0x000c: |
282 | //verboselog( space | |
282 | //verboselog( space.machine(), 2, "CPU Control 1 Write: %08x (%08x)\n", data, mem_mask ); | |
283 | 283 | pMC->nCPUControl1 = data; |
284 | 284 | break; |
285 | 285 | case 0x0010: |
286 | 286 | case 0x0014: |
287 | //verboselog( space | |
287 | //verboselog( space.machine(), 2, "Watchdog Timer Clear" ); | |
288 | 288 | pMC->nWatchdog = 0; |
289 | 289 | break; |
290 | 290 | case 0x0028: |
291 | 291 | case 0x002c: |
292 | //verboselog( space | |
292 | //verboselog( space.machine(), 2, "RPSS Divider Write: %08x (%08x)\n", data, mem_mask ); | |
293 | 293 | pMC->nRPSSDiv = data; |
294 | 294 | break; |
295 | 295 | case 0x0030: |
296 | 296 | case 0x0034: |
297 | //verboselog( space | |
297 | //verboselog( space.machine(), 2, "R4000 EEPROM Write\n" ); | |
298 | 298 | break; |
299 | 299 | case 0x0040: |
300 | 300 | case 0x0044: |
301 | //verboselog( space | |
301 | //verboselog( space.machine(), 2, "Refresh Count Preload Write: %08x (%08x)\n", data, mem_mask ); | |
302 | 302 | pMC->nRefCntPreload = data; |
303 | 303 | break; |
304 | 304 | case 0x0080: |
305 | 305 | case 0x0084: |
306 | //verboselog( space | |
306 | //verboselog( space.machine(), 2, "GIO64 Arbitration Param Write: %08x (%08x)\n", data, mem_mask ); | |
307 | 307 | pMC->nGIO64ArbParam = data; |
308 | 308 | break; |
309 | 309 | case 0x0088: |
310 | 310 | case 0x008c: |
311 | //verboselog( space | |
311 | //verboselog( space.machine(), 3, "Arbiter CPU Time Write: %08x (%08x)\n", data, mem_mask ); | |
312 | 312 | pMC->nArbCPUTime = data; |
313 | 313 | break; |
314 | 314 | case 0x0098: |
315 | 315 | case 0x009c: |
316 | //verboselog( space | |
316 | //verboselog( space.machine(), 3, "Arbiter Long Burst Time Write: %08x (%08x)\n", data, mem_mask ); | |
317 | 317 | pMC->nArbBurstTime = data; |
318 | 318 | break; |
319 | 319 | case 0x00c0: |
320 | 320 | case 0x00c4: |
321 | //verboselog( space | |
321 | //verboselog( space.machine(), 3, "Memory Configuration Register 0 Write: %08x (%08x)\n", data, mem_mask ); | |
322 | 322 | pMC->nMemCfg0 = data; |
323 | 323 | break; |
324 | 324 | case 0x00c8: |
325 | 325 | case 0x00cc: |
326 | //verboselog( space | |
326 | //verboselog( space.machine(), 3, "Memory Configuration Register 1 Write: %08x (%08x)\n", data, mem_mask ); | |
327 | 327 | pMC->nMemCfg1 = data; |
328 | 328 | break; |
329 | 329 | case 0x00d0: |
330 | 330 | case 0x00d4: |
331 | //verboselog( space | |
331 | //verboselog( space.machine(), 2, "CPU Memory Access Config Params Write: %08x (%08x)\n", data, mem_mask ); | |
332 | 332 | pMC->nCPUMemAccCfg = data; |
333 | 333 | break; |
334 | 334 | case 0x00d8: |
335 | 335 | case 0x00dc: |
336 | //verboselog( space | |
336 | //verboselog( space.machine(), 2, "GIO Memory Access Config Params Write: %08x (%08x)\n", data, mem_mask ); | |
337 | 337 | pMC->nGIOMemAccCfg = data; |
338 | 338 | break; |
339 | 339 | case 0x00e8: |
340 | 340 | case 0x00ec: |
341 | //verboselog( space | |
341 | //verboselog( space.machine(), 2, "CPU Error Status Clear\n" ); | |
342 | 342 | pMC->nCPUErrorStatus = 0; |
343 | 343 | break; |
344 | 344 | case 0x00f8: |
345 | 345 | case 0x00fc: |
346 | //verboselog( space | |
346 | //verboselog( space.machine(), 2, "GIO Error Status Clear\n" ); | |
347 | 347 | pMC->nGIOErrorStatus = 0; |
348 | 348 | break; |
349 | 349 | case 0x0100: |
350 | 350 | case 0x0104: |
351 | //verboselog( space | |
351 | //verboselog( space.machine(), 2, "System Semaphore Write: %08x (%08x)\n", data, mem_mask ); | |
352 | 352 | pMC->nSysSemaphore = data; |
353 | 353 | break; |
354 | 354 | case 0x0108: |
355 | 355 | case 0x010c: |
356 | //verboselog( space | |
356 | //verboselog( space.machine(), 2, "GIO Lock Write: %08x (%08x)\n", data, mem_mask ); | |
357 | 357 | pMC->nGIOLock = data; |
358 | 358 | break; |
359 | 359 | case 0x0110: |
360 | 360 | case 0x0114: |
361 | //verboselog( space | |
361 | //verboselog( space.machine(), 2, "EISA Lock Write: %08x (%08x)\n", data, mem_mask ); | |
362 | 362 | pMC->nEISALock = data; |
363 | 363 | break; |
364 | 364 | case 0x0150: |
365 | 365 | case 0x0154: |
366 | //verboselog( space | |
366 | //verboselog( space.machine(), 2, "GIO64 Translation Address Mask Write: %08x (%08x)\n", data, mem_mask ); | |
367 | 367 | pMC->nGIO64TransMask = data; |
368 | 368 | break; |
369 | 369 | case 0x0158: |
370 | 370 | case 0x015c: |
371 | //verboselog( space | |
371 | //verboselog( space.machine(), 2, "GIO64 Translation Address Substitution Bits Write: %08x (%08x)\n", data, mem_mask ); | |
372 | 372 | pMC->nGIO64Subst = data; |
373 | 373 | break; |
374 | 374 | case 0x0160: |
375 | 375 | case 0x0164: |
376 | //verboselog( space | |
376 | //verboselog( space.machine(), 0, "DMA Interrupt Cause Write: %08x (%08x)\n", data, mem_mask ); | |
377 | 377 | pMC->nDMAIntrCause = data; |
378 | 378 | break; |
379 | 379 | case 0x0168: |
380 | 380 | case 0x016c: |
381 | //verboselog( space | |
381 | //verboselog( space.machine(), 0, "DMA Control Write: %08x (%08x)\n", data, mem_mask ); | |
382 | 382 | pMC->nDMAControl = data; |
383 | 383 | break; |
384 | 384 | case 0x0180: |
385 | 385 | case 0x0184: |
386 | //verboselog( space | |
386 | //verboselog( space.machine(), 0, "DMA TLB Entry 0 High Write: %08x (%08x)\n", data, mem_mask ); | |
387 | 387 | pMC->nDMATLBEntry0Hi = data; |
388 | 388 | break; |
389 | 389 | case 0x0188: |
390 | 390 | case 0x018c: |
391 | //verboselog( space | |
391 | //verboselog( space.machine(), 0, "DMA TLB Entry 0 Low Write: %08x (%08x)\n", data, mem_mask ); | |
392 | 392 | pMC->nDMATLBEntry0Lo = data; |
393 | 393 | break; |
394 | 394 | case 0x0190: |
395 | 395 | case 0x0194: |
396 | //verboselog( space | |
396 | //verboselog( space.machine(), 0, "DMA TLB Entry 1 High Write: %08x (%08x)\n", data, mem_mask ); | |
397 | 397 | pMC->nDMATLBEntry1Hi = data; |
398 | 398 | break; |
399 | 399 | case 0x0198: |
400 | 400 | case 0x019c: |
401 | //verboselog( space | |
401 | //verboselog( space.machine(), 0, "DMA TLB Entry 1 Low Write: %08x (%08x)\n", data, mem_mask ); | |
402 | 402 | pMC->nDMATLBEntry1Lo = data; |
403 | 403 | break; |
404 | 404 | case 0x01a0: |
405 | 405 | case 0x01a4: |
406 | //verboselog( space | |
406 | //verboselog( space.machine(), 0, "DMA TLB Entry 2 High Write: %08x (%08x)\n", data, mem_mask ); | |
407 | 407 | pMC->nDMATLBEntry2Hi = data; |
408 | 408 | break; |
409 | 409 | case 0x01a8: |
410 | 410 | case 0x01ac: |
411 | //verboselog( space | |
411 | //verboselog( space.machine(), 0, "DMA TLB Entry 2 Low Write: %08x (%08x)\n", data, mem_mask ); | |
412 | 412 | pMC->nDMATLBEntry2Lo = data; |
413 | 413 | break; |
414 | 414 | case 0x01b0: |
415 | 415 | case 0x01b4: |
416 | //verboselog( space | |
416 | //verboselog( space.machine(), 0, "DMA TLB Entry 3 High Write: %08x (%08x)\n", data, mem_mask ); | |
417 | 417 | pMC->nDMATLBEntry3Hi = data; |
418 | 418 | break; |
419 | 419 | case 0x01b8: |
420 | 420 | case 0x01bc: |
421 | //verboselog( space | |
421 | //verboselog( space.machine(), 0, "DMA TLB Entry 3 Low Write: %08x (%08x)\n", data, mem_mask ); | |
422 | 422 | pMC->nDMATLBEntry3Lo = data; |
423 | 423 | break; |
424 | 424 | case 0x2000: |
425 | 425 | case 0x2004: |
426 | //verboselog( space | |
426 | //verboselog( space.machine(), 0, "DMA Memory Address Write: %08x (%08x)\n", data, mem_mask ); | |
427 | 427 | pMC->nDMAMemAddr = data; |
428 | 428 | break; |
429 | 429 | case 0x2008: |
430 | 430 | case 0x200c: |
431 | //verboselog( space | |
431 | //verboselog( space.machine(), 0, "DMA Memory Address + Default Params Write: %08x (%08x)\n", data, mem_mask ); | |
432 | 432 | pMC->nDMAMemAddr = data; |
433 | 433 | break; |
434 | 434 | case 0x2010: |
435 | 435 | case 0x2014: |
436 | //verboselog( space | |
436 | //verboselog( space.machine(), 0, "DMA Line Count and Width Write: %08x (%08x)\n", data, mem_mask ); | |
437 | 437 | pMC->nDMALineCntWidth = data; |
438 | 438 | break; |
439 | 439 | case 0x2018: |
440 | 440 | case 0x201c: |
441 | //verboselog( space | |
441 | //verboselog( space.machine(), 0, "DMA Line Zoom and Stride Write: %08x (%08x)\n", data, mem_mask ); | |
442 | 442 | pMC->nDMALineZoomStride = data; |
443 | 443 | break; |
444 | 444 | case 0x2020: |
445 | 445 | case 0x2024: |
446 | //verboselog( space | |
446 | //verboselog( space.machine(), 0, "DMA GIO64 Address Write: %08x (%08x)\n", data, mem_mask ); | |
447 | 447 | pMC->nDMAGIO64Addr = data; |
448 | 448 | break; |
449 | 449 | case 0x2028: |
450 | 450 | case 0x202c: |
451 | //verboselog( space | |
451 | //verboselog( space.machine(), 0, "DMA GIO64 Address Write + Start DMA: %08x (%08x)\n", data, mem_mask ); | |
452 | 452 | pMC->nDMAGIO64Addr = data; |
453 | 453 | // Start DMA |
454 | 454 | pMC->nDMARunning = 1; |
455 | 455 | break; |
456 | 456 | case 0x2030: |
457 | 457 | case 0x2034: |
458 | //verboselog( space | |
458 | //verboselog( space.machine(), 0, "DMA Mode Write: %08x (%08x)\n", data, mem_mask ); | |
459 | 459 | pMC->nDMAMode = data; |
460 | 460 | break; |
461 | 461 | case 0x2038: |
462 | 462 | case 0x203c: |
463 | //verboselog( space | |
463 | //verboselog( space.machine(), 0, "DMA Zoom Count + Byte Count Write: %08x (%08x)\n", data, mem_mask ); | |
464 | 464 | pMC->nDMAZoomByteCnt = data; |
465 | 465 | break; |
466 | 466 | case 0x2040: |
467 | 467 | case 0x2044: |
468 | //verboselog( space | |
468 | //verboselog( space.machine(), 0, "DMA Start Write: %08x (%08x)\n", data, mem_mask ); | |
469 | 469 | // Start DMA |
470 | 470 | pMC->nDMARunning = 1; |
471 | 471 | break; |
472 | 472 | case 0x2070: |
473 | 473 | case 0x2074: |
474 | //verboselog( space | |
474 | //verboselog( space.machine(), 0, "DMA GIO64 Address Write + Default Params Write + Start DMA: %08x (%08x)\n", data, mem_mask ); | |
475 | 475 | pMC->nDMAGIO64Addr = data; |
476 | 476 | // Start DMA |
477 | 477 | pMC->nDMARunning = 1; |
478 | 478 | break; |
479 | 479 | default: |
480 | //verboselog( space | |
480 | //verboselog( space.machine(), 0, "Unmapped MC write: 0x%08x: %08x (%08x)\n", 0x1fa00000 + offset, data, mem_mask ); | |
481 | 481 | break; |
482 | 482 | } |
483 | 483 | } |
r17963 | r17964 | |
---|---|---|
251 | 251 | |
252 | 252 | UINT8 comx_clm_device::comx_mrd_r(offs_t offset, int *extrom) |
253 | 253 | { |
254 | address_space | |
254 | address_space &space = *machine().firstcpu->space(AS_PROGRAM); | |
255 | 255 | |
256 | 256 | UINT8 data = 0xff; |
257 | 257 | |
r17963 | r17964 | |
265 | 265 | } |
266 | 266 | else if (offset == 0xd801) |
267 | 267 | { |
268 | data = m_crtc->register_r( | |
268 | data = m_crtc->register_r(space, 0); | |
269 | 269 | } |
270 | 270 | |
271 | 271 | return data; |
r17963 | r17964 | |
278 | 278 | |
279 | 279 | void comx_clm_device::comx_mwr_w(offs_t offset, UINT8 data) |
280 | 280 | { |
281 | address_space | |
281 | address_space &space = *machine().firstcpu->space(AS_PROGRAM); | |
282 | 282 | |
283 | 283 | if (offset >= 0xd000 && offset < 0xd800) |
284 | 284 | { |
r17963 | r17964 | |
286 | 286 | } |
287 | 287 | else if (offset == 0xd800) |
288 | 288 | { |
289 | m_crtc->address_w( | |
289 | m_crtc->address_w(space, 0, data); | |
290 | 290 | } |
291 | 291 | else if (offset == 0xd801) |
292 | 292 | { |
293 | m_crtc->register_w( | |
293 | m_crtc->register_w(space, 0, data); | |
294 | 294 | } |
295 | 295 | } |
r17963 | r17964 | |
---|---|---|
368 | 368 | |
369 | 369 | static WRITE8_HANDLER ( hp48_io_w ) |
370 | 370 | { |
371 | hp48_state *state = space | |
371 | hp48_state *state = space.machine().driver_data<hp48_state>(); | |
372 | 372 | LOG(( "%05x %f hp48_io_w: off=%02x data=%x\n", |
373 | space | |
373 | space.device().safe_pcbase(), space.machine().time().as_double(), offset, data )); | |
374 | 374 | |
375 | 375 | switch( offset ) |
376 | 376 | { |
r17963 | r17964 | |
413 | 413 | |
414 | 414 | /* cards */ |
415 | 415 | case 0x0e: |
416 | LOG(( "%05x: card control write %02x\n", space | |
416 | LOG(( "%05x: card control write %02x\n", space.device().safe_pcbase(), data )); | |
417 | 417 | |
418 | 418 | /* bit 0: software interrupt */ |
419 | 419 | if ( data & 1 ) |
420 | 420 | { |
421 | 421 | LOG(( "%f hp48_io_w: software interrupt requested\n", |
422 | space->machine().time().as_double() )); | |
423 | hp48_pulse_irq( space->machine(), SATURN_IRQ_LINE ); | |
422 | space.machine().time().as_double() )); | |
423 | hp48_pulse_irq( space.machine(), SATURN_IRQ_LINE ); | |
424 | 424 | data &= ~1; |
425 | 425 | } |
426 | 426 | |
r17963 | r17964 | |
432 | 432 | break; |
433 | 433 | |
434 | 434 | case 0x0f: |
435 | LOG(( "%05x: card info write %02x\n", space | |
435 | LOG(( "%05x: card info write %02x\n", space.device().safe_pcbase(), data )); | |
436 | 436 | state->m_io[0x0f] = data; |
437 | 437 | break; |
438 | 438 | |
r17963 | r17964 | |
447 | 447 | case 0x17: |
448 | 448 | /* second nibble of sent data */ |
449 | 449 | state->m_io[offset] = data; |
450 | hp48_rs232_send_byte(space | |
450 | hp48_rs232_send_byte(space.machine()); | |
451 | 451 | break; |
452 | 452 | |
453 | 453 | /* XXX not implemented: |
r17963 | r17964 | |
483 | 483 | |
484 | 484 | static READ8_HANDLER ( hp48_io_r ) |
485 | 485 | { |
486 | hp48_state *state = space | |
486 | hp48_state *state = space.machine().driver_data<hp48_state>(); | |
487 | 487 | UINT8 data = 0; |
488 | 488 | |
489 | 489 | switch( offset ) |
r17963 | r17964 | |
517 | 517 | case 0x29: |
518 | 518 | { |
519 | 519 | int last_line = HP48_IO_8(0x28) & 0x3f; /* last line of main bitmap before menu */ |
520 | int cur_line = space | |
520 | int cur_line = space.machine().primary_screen->vpos(); | |
521 | 521 | if ( last_line <= 1 ) last_line = 0x3f; |
522 | 522 | data = ( cur_line >= 0 && cur_line <= last_line ) ? last_line - cur_line : 0; |
523 | 523 | if ( offset == 0x29 ) |
r17963 | r17964 | |
548 | 548 | { |
549 | 549 | /* second nibble of received data */ |
550 | 550 | |
551 | //device_image_interface *xmodem = dynamic_cast<device_image_interface *>(space->machine().device("rs232_x")); | |
552 | //device_image_interface *kermit = dynamic_cast<device_image_interface *>(space->machine().device("rs232_k")); | |
551 | //device_image_interface *xmodem = dynamic_cast<device_image_interface *>(space.machine().device("rs232_x")); | |
552 | //device_image_interface *kermit = dynamic_cast<device_image_interface *>(space.machine().device("rs232_k")); | |
553 | 553 | |
554 | 554 | state->m_io[0x11] &= ~1; /* clear byte received */ |
555 | 555 | data = state->m_io[offset]; |
r17963 | r17964 | |
563 | 563 | /* cards */ |
564 | 564 | case 0x0e: /* detection */ |
565 | 565 | data = state->m_io[0x0e]; |
566 | LOG(( "%05x: card control read %02x\n", space | |
566 | LOG(( "%05x: card control read %02x\n", space.device().safe_pcbase(), data )); | |
567 | 567 | break; |
568 | 568 | case 0x0f: /* card info */ |
569 | 569 | data = 0; |
r17963 | r17964 | |
581 | 581 | if ( state->m_port_size[0] && state->m_port_write[0] ) data |= 4; |
582 | 582 | if ( state->m_port_size[1] && state->m_port_write[1] ) data |= 8; |
583 | 583 | } |
584 | LOG(( "%05x: card info read %02x\n", space | |
584 | LOG(( "%05x: card info read %02x\n", space.device().safe_pcbase(), data )); | |
585 | 585 | break; |
586 | 586 | |
587 | 587 | |
r17963 | r17964 | |
589 | 589 | } |
590 | 590 | |
591 | 591 | LOG(( "%05x %f hp48_io_r: off=%02x data=%x\n", |
592 | space | |
592 | space.device().safe_pcbase(), space.machine().time().as_double(), offset, data )); | |
593 | 593 | return data; |
594 | 594 | } |
595 | 595 | |
r17963 | r17964 | |
598 | 598 | |
599 | 599 | static READ8_HANDLER ( hp48_bank_r ) |
600 | 600 | { |
601 | hp48_state *state = space | |
601 | hp48_state *state = space.machine().driver_data<hp48_state>(); | |
602 | 602 | /* bit 0: ignored, bits 2-5: bank number, bit 6: enable */ |
603 | 603 | offset &= 0x7e; |
604 | 604 | if ( state->m_bank_switch != offset ) |
605 | 605 | { |
606 | LOG(( "%05x %f hp48_bank_r: off=%03x\n", space | |
606 | LOG(( "%05x %f hp48_bank_r: off=%03x\n", space.device().safe_pcbase(), space.machine().time().as_double(), offset )); | |
607 | 607 | state->m_bank_switch = offset; |
608 | 608 | hp48_apply_modules(state); |
609 | 609 | } |
r17963 | r17964 | |
709 | 709 | { |
710 | 710 | int i; |
711 | 711 | int nce2_enable = 1; |
712 | address_space | |
712 | address_space& space = *state->machine().device("maincpu")->memory().space(AS_PROGRAM); | |
713 | 713 | |
714 | 714 | state->m_io_addr = 0x100000; |
715 | 715 | |
r17963 | r17964 | |
772 | 772 | } |
773 | 773 | |
774 | 774 | if (state->m_modules[i].data) |
775 | space | |
775 | space.install_read_bank( base, end, 0, mirror, bank ); | |
776 | 776 | else |
777 | 777 | { |
778 | 778 | if (state->m_modules[i].read != NULL) |
779 | space | |
779 | space.install_legacy_read_handler( base, end, 0, mirror, state->m_modules[i].read, state->m_modules[i].read_name); | |
780 | 780 | } |
781 | 781 | |
782 | 782 | if (state->m_modules[i].isnop) |
783 | space | |
783 | space.nop_write(base, end, 0, mirror); | |
784 | 784 | else |
785 | 785 | { |
786 | 786 | if (state->m_modules[i].data) |
787 | space | |
787 | space.install_write_bank( base, end, 0, mirror, bank ); | |
788 | 788 | else |
789 | 789 | { |
790 | 790 | if (state->m_modules[i].write != NULL) |
791 | space | |
791 | space.install_legacy_write_handler( base, end, 0, mirror, state->m_modules[i].write, state->m_modules[i].write_name ); | |
792 | 792 | } |
793 | 793 | } |
794 | 794 |
r17963 | r17964 | |
---|---|---|
219 | 219 | /* dma controller and bankswitch hardware ?*/ |
220 | 220 | static READ8_HANDLER( c65_read_mem ) |
221 | 221 | { |
222 | c65_state *state = space | |
222 | c65_state *state = space.machine().driver_data<c65_state>(); | |
223 | 223 | UINT8 result; |
224 | 224 | if (offset <= 0x0ffff) |
225 | 225 | result = state->m_memory[offset]; |
226 | 226 | else |
227 | result = space | |
227 | result = space.read_byte(offset); | |
228 | 228 | return result; |
229 | 229 | } |
230 | 230 | |
231 | 231 | static WRITE8_HANDLER( c65_write_mem ) |
232 | 232 | { |
233 | c65_state *state = space | |
233 | c65_state *state = space.machine().driver_data<c65_state>(); | |
234 | 234 | if (offset <= 0x0ffff) |
235 | 235 | state->m_memory[offset] = data; |
236 | 236 | else |
237 | space | |
237 | space.write_byte(offset, data); | |
238 | 238 | } |
239 | 239 | |
240 | 240 | /* dma chip at 0xd700 |
r17963 | r17964 | |
268 | 268 | PAIR pair, src, dst, len; |
269 | 269 | UINT8 cmd, fill; |
270 | 270 | int i; |
271 | address_space | |
271 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
272 | 272 | |
273 | 273 | switch (offset & 3) |
274 | 274 | { |
r17963 | r17964 | |
299 | 299 | case 0: |
300 | 300 | if (src.d == 0x3ffff) state->m_dump_dma = 1; |
301 | 301 | if (state->m_dump_dma) |
302 | DBG_LOG(space | |
302 | DBG_LOG(space.machine(), 1,"dma copy job", | |
303 | 303 | ("len:%.4x src:%.6x dst:%.6x sub:%.2x modrm:%.2x\n", |
304 | 304 | len.w.l, src.d, dst.d, c65_read_mem(space, pair.d), |
305 | 305 | c65_read_mem(space, pair.d + 1) ) ); |
r17963 | r17964 | |
333 | 333 | } |
334 | 334 | break; |
335 | 335 | case 3: |
336 | DBG_LOG(space | |
336 | DBG_LOG(space.machine(), 3,"dma fill job", | |
337 | 337 | ("len:%.4x value:%.2x dst:%.6x sub:%.2x modrm:%.2x\n", |
338 | 338 | len.w.l, fill, dst.d, c65_read_mem(space, pair.d), |
339 | 339 | c65_read_mem(space, pair.d + 1))); |
r17963 | r17964 | |
341 | 341 | c65_write_mem(space, dst.d++, fill); |
342 | 342 | break; |
343 | 343 | case 0x30: |
344 | DBG_LOG(space | |
344 | DBG_LOG(space.machine(), 1,"dma copy down", | |
345 | 345 | ("len:%.4x src:%.6x dst:%.6x sub:%.2x modrm:%.2x\n", |
346 | 346 | len.w.l, src.d, dst.d, c65_read_mem(space, pair.d), |
347 | 347 | c65_read_mem(space, pair.d + 1) ) ); |
r17963 | r17964 | |
349 | 349 | c65_write_mem(space, dst.d--,c65_read_mem(space, src.d--)); |
350 | 350 | break; |
351 | 351 | default: |
352 | DBG_LOG(space | |
352 | DBG_LOG(space.machine(), 1,"dma job", | |
353 | 353 | ("cmd:%.2x len:%.4x src:%.6x dst:%.6x sub:%.2x modrm:%.2x\n", |
354 | 354 | cmd,len.w.l, src.d, dst.d, c65_read_mem(space, pair.d), |
355 | 355 | c65_read_mem(space, pair.d + 1))); |
356 | 356 | } |
357 | 357 | break; |
358 | 358 | default: |
359 | DBG_LOG(space | |
359 | DBG_LOG(space.machine(), 1, "dma chip write", ("%.3x %.2x\n", offset, value)); | |
360 | 360 | break; |
361 | 361 | } |
362 | 362 | } |
r17963 | r17964 | |
615 | 615 | |
616 | 616 | static READ8_HANDLER( c65_ram_expansion_r ) |
617 | 617 | { |
618 | c65_state *state = space | |
618 | c65_state *state = space.machine().driver_data<c65_state>(); | |
619 | 619 | UINT8 data = 0xff; |
620 | if (space | |
620 | if (space.machine().device<ram_device>(RAM_TAG)->size() > (128 * 1024)) | |
621 | 621 | data = state->m_expansion_ram.reg; |
622 | 622 | return data; |
623 | 623 | } |
624 | 624 | |
625 | 625 | static WRITE8_HANDLER( c65_ram_expansion_w ) |
626 | 626 | { |
627 | c65_state *state = space | |
627 | c65_state *state = space.machine().driver_data<c65_state>(); | |
628 | 628 | offs_t expansion_ram_begin; |
629 | 629 | offs_t expansion_ram_end; |
630 | 630 | |
631 | if (space | |
631 | if (space.machine().device<ram_device>(RAM_TAG)->size() > (128 * 1024)) | |
632 | 632 | { |
633 | 633 | state->m_expansion_ram.reg = data; |
634 | 634 | |
635 | 635 | expansion_ram_begin = 0x80000; |
636 | expansion_ram_end = 0x80000 + (space | |
636 | expansion_ram_end = 0x80000 + (space.machine().device<ram_device>(RAM_TAG)->size() - 128*1024) - 1; | |
637 | 637 | |
638 | 638 | if (data == 0x00) { |
639 | space->install_readwrite_bank(expansion_ram_begin, expansion_ram_end,"bank16"); | |
640 | state->membank("bank16")->set_base(space->machine().device<ram_device>(RAM_TAG)->pointer() + 128*1024); | |
639 | space.install_readwrite_bank(expansion_ram_begin, expansion_ram_end,"bank16"); | |
640 | state->membank("bank16")->set_base(space.machine().device<ram_device>(RAM_TAG)->pointer() + 128*1024); | |
641 | 641 | } else { |
642 | space | |
642 | space.nop_readwrite(expansion_ram_begin, expansion_ram_end); | |
643 | 643 | } |
644 | 644 | } |
645 | 645 | } |
646 | 646 | |
647 | 647 | static WRITE8_HANDLER( c65_write_io ) |
648 | 648 | { |
649 | sid6581_device *sid_0 = space->machine().device<sid6581_device>("sid_r"); | |
650 | sid6581_device *sid_1 = space->machine().device<sid6581_device>("sid_l"); | |
651 | device_t *vic3 = space->machine().device("vic3"); | |
649 | sid6581_device *sid_0 = space.machine().device<sid6581_device>("sid_r"); | |
650 | sid6581_device *sid_1 = space.machine().device<sid6581_device>("sid_l"); | |
651 | device_t *vic3 = space.machine().device("vic3"); | |
652 | 652 | |
653 | 653 | switch (offset & 0xf00) |
654 | 654 | { |
655 | 655 | case 0x000: |
656 | 656 | if (offset < 0x80) |
657 | vic3_port_w(vic3, | |
657 | vic3_port_w(vic3, space, offset & 0x7f, data); | |
658 | 658 | else if (offset < 0xa0) |
659 | c65_fdc_w(space | |
659 | c65_fdc_w(space.machine(), offset&0x1f,data); | |
660 | 660 | else |
661 | 661 | { |
662 | 662 | c65_ram_expansion_w(space, offset&0x1f, data); |
r17963 | r17964 | |
666 | 666 | case 0x100: |
667 | 667 | case 0x200: |
668 | 668 | case 0x300: |
669 | vic3_palette_w(vic3, | |
669 | vic3_palette_w(vic3, space, offset - 0x100, data); | |
670 | 670 | break; |
671 | 671 | case 0x400: |
672 | 672 | if (offset<0x420) /* maybe 0x20 */ |
673 | sid_0->write( | |
673 | sid_0->write(space, offset & 0x3f, data); | |
674 | 674 | else if (offset<0x440) |
675 | sid_1->write( | |
675 | sid_1->write(space, offset & 0x3f, data); | |
676 | 676 | else |
677 | DBG_LOG(space | |
677 | DBG_LOG(space.machine(), 1, "io write", ("%.3x %.2x\n", offset, data)); | |
678 | 678 | break; |
679 | 679 | case 0x500: |
680 | DBG_LOG(space | |
680 | DBG_LOG(space.machine(), 1, "io write", ("%.3x %.2x\n", offset, data)); | |
681 | 681 | break; |
682 | 682 | case 0x600: |
683 | c65_6511_port_w(space | |
683 | c65_6511_port_w(space.machine(), offset&0xff,data); | |
684 | 684 | break; |
685 | 685 | case 0x700: |
686 | c65_dma_port_w(space | |
686 | c65_dma_port_w(space.machine(), offset&0xff, data); | |
687 | 687 | break; |
688 | 688 | } |
689 | 689 | } |
690 | 690 | |
691 | 691 | static WRITE8_HANDLER( c65_write_io_dc00 ) |
692 | 692 | { |
693 | device_t *cia_0 = space->machine().device("cia_0"); | |
694 | device_t *cia_1 = space->machine().device("cia_1"); | |
693 | device_t *cia_0 = space.machine().device("cia_0"); | |
694 | device_t *cia_1 = space.machine().device("cia_1"); | |
695 | 695 | |
696 | 696 | switch (offset & 0xf00) |
697 | 697 | { |
698 | 698 | case 0x000: |
699 | mos6526_w(cia_0, | |
699 | mos6526_w(cia_0, space, offset, data); | |
700 | 700 | break; |
701 | 701 | case 0x100: |
702 | mos6526_w(cia_1, | |
702 | mos6526_w(cia_1, space, offset, data); | |
703 | 703 | break; |
704 | 704 | case 0x200: |
705 | 705 | case 0x300: |
706 | DBG_LOG(space | |
706 | DBG_LOG(space.machine(), 1, "io write", ("%.3x %.2x\n", offset+0xc00, data)); | |
707 | 707 | break; |
708 | 708 | } |
709 | 709 | } |
710 | 710 | |
711 | 711 | static READ8_HANDLER( c65_read_io ) |
712 | 712 | { |
713 | sid6581_device *sid_0 = space->machine().device<sid6581_device>("sid_r"); | |
714 | sid6581_device *sid_1 = space->machine().device<sid6581_device>("sid_l"); | |
715 | device_t *vic3 = space->machine().device("vic3"); | |
713 | sid6581_device *sid_0 = space.machine().device<sid6581_device>("sid_r"); | |
714 | sid6581_device *sid_1 = space.machine().device<sid6581_device>("sid_l"); | |
715 | device_t *vic3 = space.machine().device("vic3"); | |
716 | 716 | |
717 | 717 | switch (offset & 0xf00) |
718 | 718 | { |
719 | 719 | case 0x000: |
720 | 720 | if (offset < 0x80) |
721 | return vic3_port_r(vic3, | |
721 | return vic3_port_r(vic3, space, offset & 0x7f); | |
722 | 722 | if (offset < 0xa0) |
723 | return c65_fdc_r(space | |
723 | return c65_fdc_r(space.machine(), offset&0x1f); | |
724 | 724 | else |
725 | 725 | { |
726 | 726 | return c65_ram_expansion_r(space, offset&0x1f); |
r17963 | r17964 | |
731 | 731 | case 0x200: |
732 | 732 | case 0x300: |
733 | 733 | /* read only !? */ |
734 | DBG_LOG(space | |
734 | DBG_LOG(space.machine(), 1, "io read", ("%.3x\n", offset)); | |
735 | 735 | break; |
736 | 736 | case 0x400: |
737 | 737 | if (offset < 0x420) |
738 | return sid_0->read( | |
738 | return sid_0->read(space, offset & 0x3f); | |
739 | 739 | if (offset < 0x440) |
740 | return sid_1->read(*space, offset & 0x3f); | |
741 | DBG_LOG(space->machine(), 1, "io read", ("%.3x\n", offset)); | |
740 | return sid_1->read(space, offset & 0x3f); | |
741 | DBG_LOG(space.machine(), 1, "io read", ("%.3x\n", offset)); | |
742 | 742 | break; |
743 | 743 | case 0x500: |
744 | DBG_LOG(space | |
744 | DBG_LOG(space.machine(), 1, "io read", ("%.3x\n", offset)); | |
745 | 745 | break; |
746 | 746 | case 0x600: |
747 | return c65_6511_port_r(space | |
747 | return c65_6511_port_r(space.machine(), offset&0xff); | |
748 | 748 | case 0x700: |
749 | return c65_dma_port_r(space | |
749 | return c65_dma_port_r(space.machine(), offset&0xff); | |
750 | 750 | } |
751 | 751 | return 0xff; |
752 | 752 | } |
753 | 753 | |
754 | 754 | static READ8_HANDLER( c65_read_io_dc00 ) |
755 | 755 | { |
756 | device_t *cia_0 = space->machine().device("cia_0"); | |
757 | device_t *cia_1 = space->machine().device("cia_1"); | |
756 | device_t *cia_0 = space.machine().device("cia_0"); | |
757 | device_t *cia_1 = space.machine().device("cia_1"); | |
758 | 758 | |
759 | 759 | switch (offset & 0x300) |
760 | 760 | { |
761 | 761 | case 0x000: |
762 | return mos6526_r(cia_0, | |
762 | return mos6526_r(cia_0, space, offset); | |
763 | 763 | case 0x100: |
764 | return mos6526_r(cia_1, | |
764 | return mos6526_r(cia_1, space, offset); | |
765 | 765 | case 0x200: |
766 | 766 | case 0x300: |
767 | DBG_LOG(space | |
767 | DBG_LOG(space.machine(), 1, "io read", ("%.3x\n", offset+0xc00)); | |
768 | 768 | break; |
769 | 769 | } |
770 | 770 | return 0xff; |
r17963 | r17964 | |
---|---|---|
154 | 154 | static void gb_init(running_machine &machine) |
155 | 155 | { |
156 | 156 | gb_state *state = machine.driver_data<gb_state>(); |
157 | address_space | |
157 | address_space &space = *machine.device( "maincpu")->memory().space( AS_PROGRAM ); | |
158 | 158 | |
159 | 159 | /* Initialize the memory banks */ |
160 | 160 | state->m_MBC1Mode = 0; |
r17963 | r17964 | |
182 | 182 | case MBC_NONE: |
183 | 183 | break; |
184 | 184 | case MBC_MMM01: |
185 | space->install_write_handler( 0x0000, 0x1fff, write8_delegate(FUNC(gb_state::gb_rom_bank_mmm01_0000_w),state) ); | |
186 | space->install_write_handler( 0x2000, 0x3fff, write8_delegate(FUNC(gb_state::gb_rom_bank_mmm01_2000_w),state)); | |
187 | space->install_write_handler( 0x4000, 0x5fff, write8_delegate(FUNC(gb_state::gb_rom_bank_mmm01_4000_w),state)); | |
188 | space->install_write_handler( 0x6000, 0x7fff, write8_delegate(FUNC(gb_state::gb_rom_bank_mmm01_6000_w),state)); | |
185 | space.install_write_handler( 0x0000, 0x1fff, write8_delegate(FUNC(gb_state::gb_rom_bank_mmm01_0000_w),state) ); | |
186 | space.install_write_handler( 0x2000, 0x3fff, write8_delegate(FUNC(gb_state::gb_rom_bank_mmm01_2000_w),state)); | |
187 | space.install_write_handler( 0x4000, 0x5fff, write8_delegate(FUNC(gb_state::gb_rom_bank_mmm01_4000_w),state)); | |
188 | space.install_write_handler( 0x6000, 0x7fff, write8_delegate(FUNC(gb_state::gb_rom_bank_mmm01_6000_w),state)); | |
189 | 189 | break; |
190 | 190 | case MBC_MBC1: |
191 | space->install_write_handler( 0x0000, 0x1fff, write8_delegate(FUNC(gb_state::gb_ram_enable),state) ); /* We don't emulate RAM enable yet */ | |
192 | space->install_write_handler( 0x2000, 0x3fff, write8_delegate(FUNC(gb_state::gb_rom_bank_select_mbc1),state) ); | |
193 | space->install_write_handler( 0x4000, 0x5fff, write8_delegate(FUNC(gb_state::gb_ram_bank_select_mbc1),state) ); | |
194 | space->install_write_handler( 0x6000, 0x7fff, write8_delegate(FUNC(gb_state::gb_mem_mode_select_mbc1),state) ); | |
191 | space.install_write_handler( 0x0000, 0x1fff, write8_delegate(FUNC(gb_state::gb_ram_enable),state) ); /* We don't emulate RAM enable yet */ | |
192 | space.install_write_handler( 0x2000, 0x3fff, write8_delegate(FUNC(gb_state::gb_rom_bank_select_mbc1),state) ); | |
193 | space.install_write_handler( 0x4000, 0x5fff, write8_delegate(FUNC(gb_state::gb_ram_bank_select_mbc1),state) ); | |
194 | space.install_write_handler( 0x6000, 0x7fff, write8_delegate(FUNC(gb_state::gb_mem_mode_select_mbc1),state) ); | |
195 | 195 | break; |
196 | 196 | case MBC_MBC2: |
197 | space | |
197 | space.install_write_handler( 0x2000, 0x3fff, write8_delegate(FUNC(gb_state::gb_rom_bank_select_mbc2),state) ); | |
198 | 198 | break; |
199 | 199 | case MBC_MBC3: |
200 | 200 | case MBC_HUC1: /* Possibly wrong */ |
201 | 201 | case MBC_HUC3: /* Possibly wrong */ |
202 | space->install_write_handler( 0x0000, 0x1fff, write8_delegate(FUNC(gb_state::gb_ram_enable),state) ); /* We don't emulate RAM enable yet */ | |
203 | space->install_write_handler( 0x2000, 0x3fff, write8_delegate(FUNC(gb_state::gb_rom_bank_select_mbc3),state) ); | |
204 | space->install_write_handler( 0x4000, 0x5fff, write8_delegate(FUNC(gb_state::gb_ram_bank_select_mbc3),state) ); | |
205 | space->install_write_handler( 0x6000, 0x7fff, write8_delegate(FUNC(gb_state::gb_mem_mode_select_mbc3),state) ); | |
202 | space.install_write_handler( 0x0000, 0x1fff, write8_delegate(FUNC(gb_state::gb_ram_enable),state) ); /* We don't emulate RAM enable yet */ | |
203 | space.install_write_handler( 0x2000, 0x3fff, write8_delegate(FUNC(gb_state::gb_rom_bank_select_mbc3),state) ); | |
204 | space.install_write_handler( 0x4000, 0x5fff, write8_delegate(FUNC(gb_state::gb_ram_bank_select_mbc3),state) ); | |
205 | space.install_write_handler( 0x6000, 0x7fff, write8_delegate(FUNC(gb_state::gb_mem_mode_select_mbc3),state) ); | |
206 | 206 | break; |
207 | 207 | case MBC_MBC5: |
208 | space->install_write_handler( 0x0000, 0x1fff, write8_delegate(FUNC(gb_state::gb_ram_enable),state) ); | |
209 | space->install_write_handler( 0x2000, 0x3fff, write8_delegate(FUNC(gb_state::gb_rom_bank_select_mbc5),state) ); | |
210 | space->install_write_handler( 0x4000, 0x5fff, write8_delegate(FUNC(gb_state::gb_ram_bank_select_mbc5),state) ); | |
208 | space.install_write_handler( 0x0000, 0x1fff, write8_delegate(FUNC(gb_state::gb_ram_enable),state) ); | |
209 | space.install_write_handler( 0x2000, 0x3fff, write8_delegate(FUNC(gb_state::gb_rom_bank_select_mbc5),state) ); | |
210 | space.install_write_handler( 0x4000, 0x5fff, write8_delegate(FUNC(gb_state::gb_ram_bank_select_mbc5),state) ); | |
211 | 211 | break; |
212 | 212 | case MBC_MBC6: |
213 | space->install_write_handler( 0x0000, 0x1fff, write8_delegate(FUNC(gb_state::gb_ram_bank_select_mbc6),state) ); | |
214 | space->install_write_handler( 0x2000, 0x2fff, write8_delegate(FUNC(gb_state::gb_rom_bank_select_mbc6_1),state) ); | |
215 | space->install_write_handler( 0x3000, 0x3fff, write8_delegate(FUNC(gb_state::gb_rom_bank_select_mbc6_2),state) ); | |
213 | space.install_write_handler( 0x0000, 0x1fff, write8_delegate(FUNC(gb_state::gb_ram_bank_select_mbc6),state) ); | |
214 | space.install_write_handler( 0x2000, 0x2fff, write8_delegate(FUNC(gb_state::gb_rom_bank_select_mbc6_1),state) ); | |
215 | space.install_write_handler( 0x3000, 0x3fff, write8_delegate(FUNC(gb_state::gb_rom_bank_select_mbc6_2),state) ); | |
216 | 216 | break; |
217 | 217 | case MBC_MBC7: |
218 | space->install_write_handler( 0x0000, 0x1fff, write8_delegate(FUNC(gb_state::gb_ram_enable),state) ); | |
219 | space->install_write_handler( 0x2000, 0x2fff, write8_delegate(FUNC(gb_state::gb_rom_bank_select_mbc7),state) ); | |
220 | space->install_write_handler( 0x3000, 0x7fff, write8_delegate(FUNC(gb_state::gb_rom_bank_unknown_mbc7),state) ); | |
218 | space.install_write_handler( 0x0000, 0x1fff, write8_delegate(FUNC(gb_state::gb_ram_enable),state) ); | |
219 | space.install_write_handler( 0x2000, 0x2fff, write8_delegate(FUNC(gb_state::gb_rom_bank_select_mbc7),state) ); | |
220 | space.install_write_handler( 0x3000, 0x7fff, write8_delegate(FUNC(gb_state::gb_rom_bank_unknown_mbc7),state) ); | |
221 | 221 | break; |
222 | 222 | case MBC_TAMA5: |
223 | space | |
223 | space.install_write_handler( 0xA000, 0xBFFF, write8_delegate(FUNC(gb_state::gb_ram_tama5),state) ); | |
224 | 224 | break; |
225 | 225 | case MBC_WISDOM: |
226 | space | |
226 | space.install_write_handler( 0x0000, 0x3fff, write8_delegate(FUNC(gb_state::gb_rom_bank_select_wisdom),state) ); | |
227 | 227 | break; |
228 | 228 | case MBC_MBC1_KOR: |
229 | space->install_write_handler( 0x0000, 0x1fff, write8_delegate(FUNC(gb_state::gb_ram_enable),state) ); /* We don't emulate RAM enable yet */ | |
230 | space->install_write_handler( 0x2000, 0x3fff, write8_delegate(FUNC(gb_state::gb_rom_bank_select_mbc1_kor),state) ); | |
231 | space->install_write_handler( 0x4000, 0x5fff, write8_delegate(FUNC(gb_state::gb_ram_bank_select_mbc1_kor),state) ); | |
232 | space->install_write_handler( 0x6000, 0x7fff, write8_delegate(FUNC(gb_state::gb_mem_mode_select_mbc1_kor),state) ); | |
229 | space.install_write_handler( 0x0000, 0x1fff, write8_delegate(FUNC(gb_state::gb_ram_enable),state) ); /* We don't emulate RAM enable yet */ | |
230 | space.install_write_handler( 0x2000, 0x3fff, write8_delegate(FUNC(gb_state::gb_rom_bank_select_mbc1_kor),state) ); | |
231 | space.install_write_handler( 0x4000, 0x5fff, write8_delegate(FUNC(gb_state::gb_ram_bank_select_mbc1_kor),state) ); | |
232 | space.install_write_handler( 0x6000, 0x7fff, write8_delegate(FUNC(gb_state::gb_mem_mode_select_mbc1_kor),state) ); | |
233 | 233 | break; |
234 | 234 | |
235 | 235 | case MBC_MEGADUCK: |
236 | space->install_write_handler( 0x0001, 0x0001, write8_delegate(FUNC(gb_state::megaduck_rom_bank_select_type1),state) ); | |
237 | space->install_write_handler( 0xB000, 0xB000, write8_delegate(FUNC(gb_state::megaduck_rom_bank_select_type2),state) ); | |
236 | space.install_write_handler( 0x0001, 0x0001, write8_delegate(FUNC(gb_state::megaduck_rom_bank_select_type1),state) ); | |
237 | space.install_write_handler( 0xB000, 0xB000, write8_delegate(FUNC(gb_state::megaduck_rom_bank_select_type2),state) ); | |
238 | 238 | break; |
239 | 239 | } |
240 | 240 | |
241 | gb_sound_w(space | |
241 | gb_sound_w(space.machine().device("custom"), space, 0x16, 0x00 ); /* Initialize sound hardware */ | |
242 | 242 | |
243 | 243 | state->m_divcount = 0; |
244 | 244 | state->m_triggering_irq = 0; |
r17963 | r17964 | |
---|---|---|
1025 | 1025 | hdc.w[offset] = (hdc.w[offset] & ((~w_mask[offset]) | mem_mask)) | (data & w_mask[offset] & ~mem_mask); |
1026 | 1026 | |
1027 | 1027 | if ((offset == 0) || (offset == 7)) |
1028 | update_interrupt(space | |
1028 | update_interrupt(space.machine()); | |
1029 | 1029 | |
1030 | 1030 | if ((offset == 7) && (old_data & w7_idle) && ! (data & w7_idle)) |
1031 | 1031 | { /* idle has been cleared: start command execution */ |
1032 | execute_command(space | |
1032 | execute_command(space.machine()); | |
1033 | 1033 | } |
1034 | 1034 | } |
1035 | 1035 | } |
r17963 | r17964 | |
---|---|---|
140 | 140 | i8257_hlda_w(device, state); |
141 | 141 | } |
142 | 142 | |
143 | static UINT8 memory_read_byte(address_space *space, offs_t address) { return space->read_byte(address); } | |
144 | static void memory_write_byte(address_space *space, offs_t address, UINT8 data) { space->write_byte(address, data); } | |
143 | static UINT8 memory_read_byte(address_space &space, offs_t address) { return space.read_byte(address); } | |
144 | static void memory_write_byte(address_space &space, offs_t address, UINT8 data) { space.write_byte(address, data); } | |
145 | 145 | |
146 | 146 | I8257_INTERFACE( radio86_dma ) |
147 | 147 | { |
r17963 | r17964 | |
---|---|---|
44 | 44 | { |
45 | 45 | UINT8 *rom; |
46 | 46 | b2m_state *state = machine.driver_data<b2m_state>(); |
47 | address_space | |
47 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
48 | 48 | UINT8 *ram = machine.device<ram_device>(RAM_TAG)->pointer(); |
49 | 49 | |
50 | space->install_write_bank(0x0000, 0x27ff, "bank1"); | |
51 | space->install_write_bank(0x2800, 0x2fff, "bank2"); | |
52 | space->install_write_bank(0x3000, 0x6fff, "bank3"); | |
53 | space->install_write_bank(0x7000, 0xdfff, "bank4"); | |
54 | space->install_write_bank(0xe000, 0xffff, "bank5"); | |
50 | space.install_write_bank(0x0000, 0x27ff, "bank1"); | |
51 | space.install_write_bank(0x2800, 0x2fff, "bank2"); | |
52 | space.install_write_bank(0x3000, 0x6fff, "bank3"); | |
53 | space.install_write_bank(0x7000, 0xdfff, "bank4"); | |
54 | space.install_write_bank(0xe000, 0xffff, "bank5"); | |
55 | 55 | |
56 | 56 | rom = state->memregion("maincpu")->base(); |
57 | 57 | switch(bank) { |
58 | 58 | case 0 : |
59 | 59 | case 1 : |
60 | space | |
60 | space.unmap_write(0xe000, 0xffff); | |
61 | 61 | |
62 | 62 | state->membank("bank1")->set_base(ram); |
63 | 63 | state->membank("bank2")->set_base(ram + 0x2800); |
r17963 | r17964 | |
67 | 67 | break; |
68 | 68 | #if 0 |
69 | 69 | case 1 : |
70 | space->unmap_write(0x3000, 0x6fff); | |
71 | space->unmap_write(0xe000, 0xffff); | |
70 | space.unmap_write(0x3000, 0x6fff); | |
71 | space.unmap_write(0xe000, 0xffff); | |
72 | 72 | |
73 | 73 | state->membank("bank1")->set_base(ram); |
74 | 74 | state->membank("bank2")->set_base(ram + 0x2800); |
r17963 | r17964 | |
78 | 78 | break; |
79 | 79 | #endif |
80 | 80 | case 2 : |
81 | space->unmap_write(0x2800, 0x2fff); | |
82 | space->unmap_write(0xe000, 0xffff); | |
81 | space.unmap_write(0x2800, 0x2fff); | |
82 | space.unmap_write(0xe000, 0xffff); | |
83 | 83 | |
84 | 84 | state->membank("bank1")->set_base(ram); |
85 | space | |
85 | space.install_read_handler(0x2800, 0x2fff, read8_delegate(FUNC(b2m_state::b2m_keyboard_r),state)); | |
86 | 86 | state->membank("bank3")->set_base(ram + 0x10000); |
87 | 87 | state->membank("bank4")->set_base(ram + 0x7000); |
88 | 88 | state->membank("bank5")->set_base(rom + 0x10000); |
89 | 89 | break; |
90 | 90 | case 3 : |
91 | space->unmap_write(0x2800, 0x2fff); | |
92 | space->unmap_write(0xe000, 0xffff); | |
91 | space.unmap_write(0x2800, 0x2fff); | |
92 | space.unmap_write(0xe000, 0xffff); | |
93 | 93 | |
94 | 94 | state->membank("bank1")->set_base(ram); |
95 | space | |
95 | space.install_read_handler(0x2800, 0x2fff, read8_delegate(FUNC(b2m_state::b2m_keyboard_r),state)); | |
96 | 96 | state->membank("bank3")->set_base(ram + 0x14000); |
97 | 97 | state->membank("bank4")->set_base(ram + 0x7000); |
98 | 98 | state->membank("bank5")->set_base(rom + 0x10000); |
99 | 99 | break; |
100 | 100 | case 4 : |
101 | space->unmap_write(0x2800, 0x2fff); | |
102 | space->unmap_write(0xe000, 0xffff); | |
101 | space.unmap_write(0x2800, 0x2fff); | |
102 | space.unmap_write(0xe000, 0xffff); | |
103 | 103 | |
104 | 104 | state->membank("bank1")->set_base(ram); |
105 | space | |
105 | space.install_read_handler(0x2800, 0x2fff, read8_delegate(FUNC(b2m_state::b2m_keyboard_r),state)); | |
106 | 106 | state->membank("bank3")->set_base(ram + 0x18000); |
107 | 107 | state->membank("bank4")->set_base(ram + 0x7000); |
108 | 108 | state->membank("bank5")->set_base(rom + 0x10000); |
109 | 109 | |
110 | 110 | break; |
111 | 111 | case 5 : |
112 | space->unmap_write(0x2800, 0x2fff); | |
113 | space->unmap_write(0xe000, 0xffff); | |
112 | space.unmap_write(0x2800, 0x2fff); | |
113 | space.unmap_write(0xe000, 0xffff); | |
114 | 114 | |
115 | 115 | state->membank("bank1")->set_base(ram); |
116 | space | |
116 | space.install_read_handler(0x2800, 0x2fff, read8_delegate(FUNC(b2m_state::b2m_keyboard_r),state)); | |
117 | 117 | state->membank("bank3")->set_base(ram + 0x1c000); |
118 | 118 | state->membank("bank4")->set_base(ram + 0x7000); |
119 | 119 | state->membank("bank5")->set_base(rom + 0x10000); |
r17963 | r17964 | |
127 | 127 | state->membank("bank5")->set_base(ram + 0xe000); |
128 | 128 | break; |
129 | 129 | case 7 : |
130 | space->unmap_write(0x0000, 0x27ff); | |
131 | space->unmap_write(0x2800, 0x2fff); | |
132 | space->unmap_write(0x3000, 0x6fff); | |
133 | space->unmap_write(0x7000, 0xdfff); | |
134 | space->unmap_write(0xe000, 0xffff); | |
130 | space.unmap_write(0x0000, 0x27ff); | |
131 | space.unmap_write(0x2800, 0x2fff); | |
132 | space.unmap_write(0x3000, 0x6fff); | |
133 | space.unmap_write(0x7000, 0xdfff); | |
134 | space.unmap_write(0xe000, 0xffff); | |
135 | 135 | |
136 | 136 | state->membank("bank1")->set_base(rom + 0x10000); |
137 | 137 | state->membank("bank2")->set_base(rom + 0x10000); |
r17963 | r17964 | |
---|---|---|
141 | 141 | void aim65_state::machine_start() |
142 | 142 | { |
143 | 143 | ram_device *ram = machine().device<ram_device>(RAM_TAG); |
144 | address_space | |
144 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
145 | 145 | |
146 | 146 | /* Init RAM */ |
147 | space | |
147 | space.install_ram(0x0000, ram->size() - 1, ram->pointer()); | |
148 | 148 | |
149 | 149 | m_pb_save = 0; |
150 | 150 | } |
r17963 | r17964 | |
---|---|---|
447 | 447 | |
448 | 448 | static void to7_update_cart_bank(running_machine &machine) |
449 | 449 | { |
450 | address_space | |
450 | address_space& space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
451 | 451 | int bank = 0; |
452 | 452 | if ( thom_cart_nb_banks ) |
453 | 453 | { |
454 | 454 | bank = thom_cart_bank % thom_cart_nb_banks; |
455 | 455 | if ( bank != old_cart_bank && old_cart_bank < 0 ) |
456 | 456 | { |
457 | space | |
457 | space.install_legacy_read_handler(0x0000, 0x0003, FUNC(to7_cartridge_r) ); | |
458 | 458 | } |
459 | 459 | } |
460 | 460 | if ( bank != old_cart_bank ) |
r17963 | r17964 | |
481 | 481 | return; |
482 | 482 | |
483 | 483 | thom_cart_bank = offset & 3; |
484 | to7_update_cart_bank(space | |
484 | to7_update_cart_bank(space.machine()); | |
485 | 485 | } |
486 | 486 | |
487 | 487 | |
r17963 | r17964 | |
489 | 489 | /* read signal to 0000-0003 generates a bank switch */ |
490 | 490 | READ8_HANDLER ( to7_cartridge_r ) |
491 | 491 | { |
492 | UINT8* pos = space | |
492 | UINT8* pos = space.machine().root_device().memregion( "maincpu" )->base() + 0x10000; | |
493 | 493 | UINT8 data = pos[offset + (thom_cart_bank % thom_cart_nb_banks) * 0x4000]; |
494 | if ( !space | |
494 | if ( !space.debugger_access() ) | |
495 | 495 | { |
496 | 496 | thom_cart_bank = offset & 3; |
497 | to7_update_cart_bank(space | |
497 | to7_update_cart_bank(space.machine()); | |
498 | 498 | } |
499 | 499 | return data; |
500 | 500 | } |
r17963 | r17964 | |
939 | 939 | |
940 | 940 | READ8_HANDLER ( to7_modem_mea8000_r ) |
941 | 941 | { |
942 | if ( space | |
942 | if ( space.debugger_access() ) | |
943 | 943 | { |
944 | 944 | return 0; |
945 | 945 | } |
946 | 946 | |
947 | if ( space | |
947 | if ( space.machine().root_device().ioport("mconfig")->read() & 1 ) | |
948 | 948 | { |
949 | device_t* device = space->machine().device("mea8000" ); | |
950 | return mea8000_r( device, *space, offset ); | |
949 | device_t* device = space.machine().device("mea8000" ); | |
950 | return mea8000_r( device, space, offset ); | |
951 | 951 | } |
952 | 952 | else |
953 | 953 | { |
954 | acia6850_device* acia = space | |
954 | acia6850_device* acia = space.machine().device<acia6850_device>("acia6850" ); | |
955 | 955 | switch (offset) { |
956 | case 0: return acia->status_read(*space, offset ); | |
957 | case 1: return acia->data_read(*space, offset ); | |
956 | case 0: return acia->status_read(space, offset ); | |
957 | case 1: return acia->data_read(space, offset ); | |
958 | 958 | default: return 0; |
959 | 959 | } |
960 | 960 | } |
r17963 | r17964 | |
964 | 964 | |
965 | 965 | WRITE8_HANDLER ( to7_modem_mea8000_w ) |
966 | 966 | { |
967 | if ( space | |
967 | if ( space.machine().root_device().ioport("mconfig")->read() & 1 ) | |
968 | 968 | { |
969 | device_t* device = space->machine().device("mea8000" ); | |
970 | mea8000_w( device, *space, offset, data ); | |
969 | device_t* device = space.machine().device("mea8000" ); | |
970 | mea8000_w( device, space, offset, data ); | |
971 | 971 | } |
972 | 972 | else |
973 | 973 | { |
974 | acia6850_device* acia = space | |
974 | acia6850_device* acia = space.machine().device<acia6850_device>("acia6850" ); | |
975 | 975 | switch (offset) { |
976 | case 0: acia->control_write( *space, offset, data ); | |
977 | case 1: acia->data_write( *space, offset, data ); | |
976 | case 0: acia->control_write( space, offset, data ); | |
977 | case 1: acia->data_write( space, offset, data ); | |
978 | 978 | } |
979 | 979 | } |
980 | 980 | } |
r17963 | r17964 | |
1283 | 1283 | /* bit 6: parity error (ignored) */ |
1284 | 1284 | /* bit 7: interrupt */ |
1285 | 1285 | LOG_MIDI(( "$%04x %f to7_midi_r: status $%02X (rdrf=%i, tdre=%i, ovrn=%i, irq=%i)\n", |
1286 | space | |
1286 | space.machine().device("maincpu")->safe_pcbase(), space.machine().time().as_double(), to7_midi_status, | |
1287 | 1287 | (to7_midi_status & ACIA_6850_RDRF) ? 1 : 0, |
1288 | 1288 | (to7_midi_status & ACIA_6850_TDRE) ? 1 : 0, |
1289 | 1289 | (to7_midi_status & ACIA_6850_OVRN) ? 1 : 0, |
r17963 | r17964 | |
1294 | 1294 | case 1: /* get input data */ |
1295 | 1295 | { |
1296 | 1296 | UINT8 data = chardev_in( to7_midi_chardev ); |
1297 | if ( !space | |
1297 | if ( !space.debugger_access() ) | |
1298 | 1298 | { |
1299 | 1299 | to7_midi_status &= ~(ACIA_6850_irq | ACIA_6850_RDRF); |
1300 | 1300 | if ( to7_midi_overrun ) |
r17963 | r17964 | |
1303 | 1303 | to7_midi_status &= ~ACIA_6850_OVRN; |
1304 | 1304 | to7_midi_overrun = 0; |
1305 | 1305 | LOG_MIDI(( "$%04x %f to7_midi_r: read data $%02X\n", |
1306 | space->machine().device("maincpu")->safe_pcbase(), space->machine().time().as_double(), data )); | |
1307 | to7_midi_update_irq( space->machine() ); | |
1306 | space.machine().device("maincpu")->safe_pcbase(), space.machine().time().as_double(), data )); | |
1307 | to7_midi_update_irq( space.machine() ); | |
1308 | 1308 | } |
1309 | 1309 | return data; |
1310 | 1310 | } |
r17963 | r17964 | |
1312 | 1312 | |
1313 | 1313 | default: |
1314 | 1314 | logerror( "$%04x to7_midi_r: invalid offset %i\n", |
1315 | space | |
1315 | space.machine().device("maincpu")->safe_pcbase(), offset ); | |
1316 | 1316 | return 0; |
1317 | 1317 | } |
1318 | 1318 | } |
r17963 | r17964 | |
1331 | 1331 | if ( (data & 3) == 3 ) |
1332 | 1332 | { |
1333 | 1333 | /* reset */ |
1334 | LOG_MIDI(( "$%04x %f to7_midi_w: reset (data=$%02X)\n", space | |
1334 | LOG_MIDI(( "$%04x %f to7_midi_w: reset (data=$%02X)\n", space.machine().device("maincpu")->safe_pcbase(), space.machine().time().as_double(), data )); | |
1335 | 1335 | to7_midi_overrun = 0; |
1336 | 1336 | to7_midi_status = 2; |
1337 | 1337 | to7_midi_intr = 0; |
r17963 | r17964 | |
1348 | 1348 | static const int stop[8] = { 2,2,1,1,2,1,1,1 }; |
1349 | 1349 | static const char parity[8] = { 'e','o','e','o','-','-','e','o' }; |
1350 | 1350 | LOG_MIDI(( "$%04x %f to7_midi_w: set control to $%02X (bits=%i, stop=%i, parity=%c, intr in=%i out=%i)\n", |
1351 | space | |
1351 | space.machine().device("maincpu")->safe_pcbase(), space.machine().time().as_double(), | |
1352 | 1352 | data, |
1353 | 1353 | bits[ (data >> 2) & 7 ], |
1354 | 1354 | stop[ (data >> 2) & 7 ], |
r17963 | r17964 | |
1357 | 1357 | (to7_midi_intr & 3) ? 1 : 0)); |
1358 | 1358 | } |
1359 | 1359 | } |
1360 | to7_midi_update_irq( space | |
1360 | to7_midi_update_irq( space.machine() ); | |
1361 | 1361 | break; |
1362 | 1362 | |
1363 | 1363 | |
1364 | 1364 | case 1: /* output data */ |
1365 | LOG_MIDI(( "$%04x %f to7_midi_w: write data $%02X\n", space | |
1365 | LOG_MIDI(( "$%04x %f to7_midi_w: write data $%02X\n", space.machine().device("maincpu")->safe_pcbase(), space.machine().time().as_double(), data )); | |
1366 | 1366 | if ( data == 0x55 ) |
1367 | 1367 | /* cable-detect: shortcut */ |
1368 | 1368 | chardev_fake_in( to7_midi_chardev, 0x55 ); |
r17963 | r17964 | |
1376 | 1376 | |
1377 | 1377 | |
1378 | 1378 | default: |
1379 | logerror( "$%04x to7_midi_w: invalid offset %i (data=$%02X) \n", space | |
1379 | logerror( "$%04x to7_midi_w: invalid offset %i (data=$%02X) \n", space.machine().device("maincpu")->safe_pcbase(), offset, data ); | |
1380 | 1380 | } |
1381 | 1381 | } |
1382 | 1382 | |
r17963 | r17964 | |
1487 | 1487 | |
1488 | 1488 | MACHINE_START ( to7 ) |
1489 | 1489 | { |
1490 | address_space | |
1490 | address_space& space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
1491 | 1491 | UINT8* mem = machine.root_device().memregion("maincpu")->base(); |
1492 | 1492 | UINT8* ram = machine.device<ram_device>(RAM_TAG)->pointer(); |
1493 | 1493 | |
r17963 | r17964 | |
1515 | 1515 | /* install 16 KB or 16 KB + 8 KB memory extensions */ |
1516 | 1516 | /* BASIC instruction to see free memory: ?FRE(0) */ |
1517 | 1517 | int extram = machine.device<ram_device>(RAM_TAG)->size() - 24*1024; |
1518 | space->install_write_bank(0x8000, 0x8000 + extram - 1, THOM_RAM_BANK); | |
1519 | space->install_read_bank(0x8000, 0x8000 + extram - 1, THOM_RAM_BANK ); | |
1518 | space.install_write_bank(0x8000, 0x8000 + extram - 1, THOM_RAM_BANK); | |
1519 | space.install_read_bank(0x8000, 0x8000 + extram - 1, THOM_RAM_BANK ); | |
1520 | 1520 | machine.root_device().membank( THOM_RAM_BANK )->configure_entry( 0, ram + 0x6000); |
1521 | 1521 | machine.root_device().membank( THOM_RAM_BANK )->set_entry( 0 ); |
1522 | 1522 | } |
r17963 | r17964 | |
1568 | 1568 | static void to770_update_ram_bank(running_machine &machine) |
1569 | 1569 | { |
1570 | 1570 | pia6821_device *sys_pia = machine.device<pia6821_device>(THOM_PIA_SYS ); |
1571 | address_space | |
1571 | address_space& space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
1572 | 1572 | UINT8 portb = sys_pia->port_b_z_mask(); |
1573 | 1573 | int bank; |
1574 | 1574 | |
r17963 | r17964 | |
1602 | 1602 | { |
1603 | 1603 | /* RAM size is 48 KB only and unavailable bank |
1604 | 1604 | * requested */ |
1605 | space | |
1605 | space.nop_readwrite(0xa000, 0xdfff); | |
1606 | 1606 | } |
1607 | 1607 | old_ram_bank = bank; |
1608 | 1608 | LOG_BANK(( "to770_update_ram_bank: RAM bank change %i\n", bank )); |
r17963 | r17964 | |
1675 | 1675 | |
1676 | 1676 | READ8_HANDLER ( to770_gatearray_r ) |
1677 | 1677 | { |
1678 | struct thom_vsignal v = thom_get_vsignal(space->machine()); | |
1679 | struct thom_vsignal l = thom_get_lightpen_vsignal( space->machine(), TO7_LIGHTPEN_DECAL, to7_lightpen_step - 1, 0 ); | |
1678 | struct thom_vsignal v = thom_get_vsignal(space.machine()); | |
1679 | struct thom_vsignal l = thom_get_lightpen_vsignal( space.machine(), TO7_LIGHTPEN_DECAL, to7_lightpen_step - 1, 0 ); | |
1680 | 1680 | int count, inil, init, lt3; |
1681 | 1681 | count = to7_lightpen ? l.count : v.count; |
1682 | 1682 | inil = to7_lightpen ? l.inil : v.inil; |
r17963 | r17964 | |
1690 | 1690 | case 2: return (lt3 << 7) | (inil << 6); |
1691 | 1691 | case 3: return (init << 7); |
1692 | 1692 | default: |
1693 | logerror( "$%04x to770_gatearray_r: invalid offset %i\n", space | |
1693 | logerror( "$%04x to770_gatearray_r: invalid offset %i\n", space.machine().device("maincpu")->safe_pcbase(), offset ); | |
1694 | 1694 | return 0; |
1695 | 1695 | } |
1696 | 1696 | } |
r17963 | r17964 | |
1907 | 1907 | |
1908 | 1908 | READ8_HANDLER ( mo5_gatearray_r ) |
1909 | 1909 | { |
1910 | struct thom_vsignal v = thom_get_vsignal(space->machine()); | |
1911 | struct thom_vsignal l = thom_get_lightpen_vsignal( space->machine(), MO5_LIGHTPEN_DECAL, to7_lightpen_step - 1, 0 ); | |
1910 | struct thom_vsignal v = thom_get_vsignal(space.machine()); | |
1911 | struct thom_vsignal l = thom_get_lightpen_vsignal( space.machine(), MO5_LIGHTPEN_DECAL, to7_lightpen_step - 1, 0 ); | |
1912 | 1912 | int count, inil, init, lt3; |
1913 | 1913 | count = to7_lightpen ? l.count : v.count; |
1914 | 1914 | inil = to7_lightpen ? l.inil : v.inil; |
r17963 | r17964 | |
1921 | 1921 | case 2: return (lt3 << 7) | (inil << 6); |
1922 | 1922 | case 3: return (init << 7); |
1923 | 1923 | default: |
1924 | logerror( "$%04x mo5_gatearray_r: invalid offset %i\n", space | |
1924 | logerror( "$%04x mo5_gatearray_r: invalid offset %i\n", space.machine().device("maincpu")->safe_pcbase(), offset ); | |
1925 | 1925 | return 0; |
1926 | 1926 | } |
1927 | 1927 | } |
r17963 | r17964 | |
1992 | 1992 | |
1993 | 1993 | static void mo5_update_cart_bank(running_machine &machine) |
1994 | 1994 | { |
1995 | address_space | |
1995 | address_space& space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
1996 | 1996 | int rom_is_ram = mo5_reg_cart & 4; |
1997 | 1997 | int bank = 0; |
1998 | 1998 | int bank_is_read_only = 0; |
r17963 | r17964 | |
2006 | 2006 | { |
2007 | 2007 | if ( old_cart_bank < 0 || old_cart_bank > 3 ) |
2008 | 2008 | { |
2009 | space->install_read_bank( 0xb000, 0xefff, THOM_CART_BANK); | |
2010 | space->nop_write( 0xb000, 0xefff); | |
2009 | space.install_read_bank( 0xb000, 0xefff, THOM_CART_BANK); | |
2010 | space.nop_write( 0xb000, 0xefff); | |
2011 | 2011 | } |
2012 | 2012 | LOG_BANK(( "mo5_update_cart_bank: CART is cartridge bank %i (A7CB style)\n", bank )); |
2013 | 2013 | } |
r17963 | r17964 | |
2022 | 2022 | { |
2023 | 2023 | if ( bank_is_read_only ) |
2024 | 2024 | { |
2025 | space->install_read_bank( 0xb000, 0xefff, THOM_CART_BANK); | |
2026 | space->nop_write( 0xb000, 0xefff ); | |
2025 | space.install_read_bank( 0xb000, 0xefff, THOM_CART_BANK); | |
2026 | space.nop_write( 0xb000, 0xefff ); | |
2027 | 2027 | } |
2028 | 2028 | else |
2029 | 2029 | { |
2030 | space | |
2030 | space.install_readwrite_bank( 0xb000, 0xefff, THOM_CART_BANK); | |
2031 | 2031 | } |
2032 | 2032 | LOG_BANK(( "mo5_update_cart_bank: CART is nanonetwork RAM bank %i (%s)\n", |
2033 | 2033 | mo5_reg_cart & 3, |
r17963 | r17964 | |
2045 | 2045 | { |
2046 | 2046 | if ( old_cart_bank < 0 ) |
2047 | 2047 | { |
2048 | space->install_read_bank( 0xb000, 0xefff, THOM_CART_BANK); | |
2049 | space->install_legacy_write_handler( 0xb000, 0xefff, FUNC(mo5_cartridge_w) ); | |
2050 | space->install_legacy_read_handler( 0xbffc, 0xbfff, FUNC(mo5_cartridge_r) ); | |
2048 | space.install_read_bank( 0xb000, 0xefff, THOM_CART_BANK); | |
2049 | space.install_legacy_write_handler( 0xb000, 0xefff, FUNC(mo5_cartridge_w) ); | |
2050 | space.install_legacy_read_handler( 0xbffc, 0xbfff, FUNC(mo5_cartridge_r) ); | |
2051 | 2051 | } |
2052 | 2052 | LOG_BANK(( "mo5_update_cart_bank: CART is cartridge bank %i\n", bank )); |
2053 | 2053 | } |
r17963 | r17964 | |
2055 | 2055 | /* internal ROM */ |
2056 | 2056 | if ( old_cart_bank != 0 ) |
2057 | 2057 | { |
2058 | space->install_read_bank( 0xb000, 0xefff, THOM_CART_BANK); | |
2059 | space->install_legacy_write_handler( 0xb000, 0xefff, FUNC(mo5_cartridge_w) ); | |
2058 | space.install_read_bank( 0xb000, 0xefff, THOM_CART_BANK); | |
2059 | space.install_legacy_write_handler( 0xb000, 0xefff, FUNC(mo5_cartridge_w) ); | |
2060 | 2060 | LOG_BANK(( "mo5_update_cart_bank: CART is internal\n")); |
2061 | 2061 | } |
2062 | 2062 | } |
r17963 | r17964 | |
2083 | 2083 | return; |
2084 | 2084 | |
2085 | 2085 | thom_cart_bank = offset & 3; |
2086 | mo5_update_cart_bank(space | |
2086 | mo5_update_cart_bank(space.machine()); | |
2087 | 2087 | } |
2088 | 2088 | |
2089 | 2089 | |
r17963 | r17964 | |
2091 | 2091 | /* read signal to bffc-bfff generates a bank switch */ |
2092 | 2092 | READ8_HANDLER ( mo5_cartridge_r ) |
2093 | 2093 | { |
2094 | UINT8* pos = space | |
2094 | UINT8* pos = space.machine().root_device().memregion( "maincpu" )->base() + 0x10000; | |
2095 | 2095 | UINT8 data = pos[offset + 0xbffc + (thom_cart_bank % thom_cart_nb_banks) * 0x4000]; |
2096 | if ( !space | |
2096 | if ( !space.debugger_access() ) | |
2097 | 2097 | { |
2098 | 2098 | thom_cart_bank = offset & 3; |
2099 | mo5_update_cart_bank(space | |
2099 | mo5_update_cart_bank(space.machine()); | |
2100 | 2100 | } |
2101 | 2101 | return data; |
2102 | 2102 | } |
r17963 | r17964 | |
2107 | 2107 | WRITE8_HANDLER ( mo5_ext_w ) |
2108 | 2108 | { |
2109 | 2109 | mo5_reg_cart = data; |
2110 | mo5_update_cart_bank(space | |
2110 | mo5_update_cart_bank(space.machine()); | |
2111 | 2111 | } |
2112 | 2112 | |
2113 | 2113 | |
r17963 | r17964 | |
2203 | 2203 | |
2204 | 2204 | WRITE8_HANDLER ( to9_ieee_w ) |
2205 | 2205 | { |
2206 | logerror( "$%04x %f to9_ieee_w: unhandled write $%02X to register %i\n", space | |
2206 | logerror( "$%04x %f to9_ieee_w: unhandled write $%02X to register %i\n", space.machine().device("maincpu")->safe_pcbase(), space.machine().time().as_double(), data, offset ); | |
2207 | 2207 | } |
2208 | 2208 | |
2209 | 2209 | |
2210 | 2210 | |
2211 | 2211 | READ8_HANDLER ( to9_ieee_r ) |
2212 | 2212 | { |
2213 | logerror( "$%04x %f to9_ieee_r: unhandled read from register %i\n", space | |
2213 | logerror( "$%04x %f to9_ieee_r: unhandled read from register %i\n", space.machine().device("maincpu")->safe_pcbase(), space.machine().time().as_double(), offset ); | |
2214 | 2214 | return 0; |
2215 | 2215 | } |
2216 | 2216 | |
r17963 | r17964 | |
2226 | 2226 | |
2227 | 2227 | READ8_HANDLER ( to9_gatearray_r ) |
2228 | 2228 | { |
2229 | struct thom_vsignal v = thom_get_vsignal(space->machine()); | |
2230 | struct thom_vsignal l = thom_get_lightpen_vsignal( space->machine(), TO9_LIGHTPEN_DECAL, to7_lightpen_step - 1, 0 ); | |
2229 | struct thom_vsignal v = thom_get_vsignal(space.machine()); | |
2230 | struct thom_vsignal l = thom_get_lightpen_vsignal( space.machine(), TO9_LIGHTPEN_DECAL, to7_lightpen_step - 1, 0 ); | |
2231 | 2231 | int count, inil, init, lt3; |
2232 | 2232 | count = to7_lightpen ? l.count : v.count; |
2233 | 2233 | inil = to7_lightpen ? l.inil : v.inil; |
r17963 | r17964 | |
2241 | 2241 | case 2: return (lt3 << 7) | (inil << 6); |
2242 | 2242 | case 3: return (v.init << 7) | (init << 6); /* != TO7/70 */ |
2243 | 2243 | default: |
2244 | logerror( "$%04x to9_gatearray_r: invalid offset %i\n", space | |
2244 | logerror( "$%04x to9_gatearray_r: invalid offset %i\n", space.machine().device("maincpu")->safe_pcbase(), offset ); | |
2245 | 2245 | return 0; |
2246 | 2246 | } |
2247 | 2247 | } |
r17963 | r17964 | |
2315 | 2315 | case 0: /* palette data */ |
2316 | 2316 | { |
2317 | 2317 | UINT8 c = to9_palette_data[ to9_palette_idx ]; |
2318 | if ( !space | |
2318 | if ( !space.debugger_access() ) | |
2319 | 2319 | { |
2320 | 2320 | to9_palette_idx = ( to9_palette_idx + 1 ) & 31; |
2321 | 2321 | } |
r17963 | r17964 | |
2339 | 2339 | |
2340 | 2340 | WRITE8_HANDLER ( to9_vreg_w ) |
2341 | 2341 | { |
2342 | LOG_VIDEO(( "$%04x %f to9_vreg_w: off=%i ($%04X) data=$%02X\n", space | |
2342 | LOG_VIDEO(( "$%04x %f to9_vreg_w: off=%i ($%04X) data=$%02X\n", space.machine().device("maincpu")->safe_pcbase(), space.machine().time().as_double(), offset, 0xe7da + offset, data )); | |
2343 | 2343 | |
2344 | 2344 | switch ( offset ) |
2345 | 2345 | { |
r17963 | r17964 | |
2351 | 2351 | idx = to9_palette_idx / 2; |
2352 | 2352 | color = to9_palette_data[ 2 * idx + 1 ]; |
2353 | 2353 | color = to9_palette_data[ 2 * idx ] | (color << 8); |
2354 | thom_set_palette( space | |
2354 | thom_set_palette( space.machine(), idx ^ 8, color & 0x1fff ); | |
2355 | 2355 | |
2356 | 2356 | to9_palette_idx = ( to9_palette_idx + 1 ) & 31; |
2357 | 2357 | } |
r17963 | r17964 | |
2362 | 2362 | break; |
2363 | 2363 | |
2364 | 2364 | case 2: /* video mode */ |
2365 | to9_set_video_mode( space | |
2365 | to9_set_video_mode( space.machine(), data, 0 ); | |
2366 | 2366 | break; |
2367 | 2367 | |
2368 | 2368 | case 3: /* border color */ |
2369 | thom_set_border_color( space | |
2369 | thom_set_border_color( space.machine(), data & 15 ); | |
2370 | 2370 | break; |
2371 | 2371 | |
2372 | 2372 | default: |
r17963 | r17964 | |
2394 | 2394 | |
2395 | 2395 | static void to9_update_cart_bank(running_machine &machine) |
2396 | 2396 | { |
2397 | address_space | |
2397 | address_space& space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
2398 | 2398 | int bank = 0; |
2399 | 2399 | int slot = ( mc6846_get_output_port(machine.device("mc6846")) >> 4 ) & 3; /* bits 4-5: ROM bank */ |
2400 | 2400 | |
r17963 | r17964 | |
2407 | 2407 | { |
2408 | 2408 | if ( old_cart_bank < 4) |
2409 | 2409 | { |
2410 | space | |
2410 | space.install_read_bank( 0x0000, 0x3fff, THOM_CART_BANK ); | |
2411 | 2411 | } |
2412 | 2412 | LOG_BANK(( "to9_update_cart_bank: CART is BASIC bank %i\n", to9_soft_bank )); |
2413 | 2413 | } |
r17963 | r17964 | |
2419 | 2419 | { |
2420 | 2420 | if ( old_cart_bank < 4) |
2421 | 2421 | { |
2422 | space | |
2422 | space.install_read_bank( 0x0000, 0x3fff, THOM_CART_BANK ); | |
2423 | 2423 | } |
2424 | 2424 | LOG_BANK(( "to9_update_cart_bank: CART is software 1 bank %i\n", to9_soft_bank )); |
2425 | 2425 | } |
r17963 | r17964 | |
2431 | 2431 | { |
2432 | 2432 | if ( old_cart_bank < 4) |
2433 | 2433 | { |
2434 | space | |
2434 | space.install_read_bank( 0x0000, 0x3fff, THOM_CART_BANK ); | |
2435 | 2435 | } |
2436 | 2436 | LOG_BANK(( "to9_update_cart_bank: CART is software 2 bank %i\n", to9_soft_bank )); |
2437 | 2437 | } |
r17963 | r17964 | |
2445 | 2445 | { |
2446 | 2446 | if ( old_cart_bank < 0 || old_cart_bank > 3 ) |
2447 | 2447 | { |
2448 | space->install_read_bank( 0x0000, 0x3fff, THOM_CART_BANK ); | |
2449 | space->install_legacy_write_handler( 0x0000, 0x3fff, FUNC(to9_cartridge_w) ); | |
2450 | space->install_legacy_read_handler( 0x0000, 0x0003, FUNC(to9_cartridge_r) ); | |
2448 | space.install_read_bank( 0x0000, 0x3fff, THOM_CART_BANK ); | |
2449 | space.install_legacy_write_handler( 0x0000, 0x3fff, FUNC(to9_cartridge_w) ); | |
2450 | space.install_legacy_read_handler( 0x0000, 0x0003, FUNC(to9_cartridge_r) ); | |
2451 | 2451 | } |
2452 | 2452 | LOG_BANK(( "to9_update_cart_bank: CART is cartridge bank %i\n", thom_cart_bank )); |
2453 | 2453 | } |
2454 | 2454 | } else |
2455 | 2455 | if ( old_cart_bank != 0 ) |
2456 | 2456 | { |
2457 | space | |
2457 | space.nop_read( 0x0000, 0x3fff); | |
2458 | 2458 | LOG_BANK(( "to9_update_cart_bank: CART is unmapped\n")); |
2459 | 2459 | } |
2460 | 2460 | break; |
r17963 | r17964 | |
2478 | 2478 | /* write signal to 0000-1fff generates a bank switch */ |
2479 | 2479 | WRITE8_HANDLER ( to9_cartridge_w ) |
2480 | 2480 | { |
2481 | int slot = ( mc6846_get_output_port(space | |
2481 | int slot = ( mc6846_get_output_port(space.machine().device("mc6846")) >> 4 ) & 3; /* bits 4-5: ROM bank */ | |
2482 | 2482 | |
2483 | 2483 | if ( offset >= 0x2000 ) |
2484 | 2484 | return; |
r17963 | r17964 | |
2487 | 2487 | thom_cart_bank = offset & 3; |
2488 | 2488 | else |
2489 | 2489 | to9_soft_bank = offset & 3; |
2490 | to9_update_cart_bank(space | |
2490 | to9_update_cart_bank(space.machine()); | |
2491 | 2491 | } |
2492 | 2492 | |
2493 | 2493 | |
r17963 | r17964 | |
2495 | 2495 | /* read signal to 0000-0003 generates a bank switch */ |
2496 | 2496 | READ8_HANDLER ( to9_cartridge_r ) |
2497 | 2497 | { |
2498 | UINT8* pos = space | |
2498 | UINT8* pos = space.machine().root_device().memregion( "maincpu" )->base() + 0x10000; | |
2499 | 2499 | UINT8 data = pos[offset + (thom_cart_bank % thom_cart_nb_banks) * 0x4000]; |
2500 | if ( !space | |
2500 | if ( !space.debugger_access() ) | |
2501 | 2501 | { |
2502 | 2502 | thom_cart_bank = offset & 3; |
2503 | to9_update_cart_bank(space | |
2503 | to9_update_cart_bank(space.machine()); | |
2504 | 2504 | } |
2505 | 2505 | return data; |
2506 | 2506 | } |
r17963 | r17964 | |
2510 | 2510 | static void to9_update_ram_bank (running_machine &machine) |
2511 | 2511 | { |
2512 | 2512 | pia6821_device *sys_pia = machine.device<pia6821_device>(THOM_PIA_SYS ); |
2513 | address_space | |
2513 | address_space& space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
2514 | 2514 | UINT8 port = mc6846_get_output_port(machine.device("mc6846")); |
2515 | 2515 | UINT8 portb = sys_pia->port_b_z_mask(); |
2516 | 2516 | UINT8 disk = ((port >> 2) & 1) | ((port >> 5) & 2); /* bits 6,2: RAM bank */ |
r17963 | r17964 | |
2545 | 2545 | } |
2546 | 2546 | else |
2547 | 2547 | { |
2548 | space | |
2548 | space.nop_readwrite( 0xa000, 0xdfff); | |
2549 | 2549 | } |
2550 | 2550 | old_ram_bank = bank; |
2551 | 2551 | LOG_BANK(( "to9_update_ram_bank: bank %i selected (pia=$%02X disk=%i)\n", bank, portb & 0xf8, disk )); |
r17963 | r17964 | |
2668 | 2668 | /* bit 7: interrupt */ |
2669 | 2669 | |
2670 | 2670 | LOG_KBD(( "$%04x %f to9_kbd_r: status $%02X (rdrf=%i, tdre=%i, ovrn=%i, pe=%i, irq=%i)\n", |
2671 | space | |
2671 | space.machine().device("maincpu")->safe_pcbase(), space.machine().time().as_double(), to9_kbd_status, | |
2672 | 2672 | (to9_kbd_status & ACIA_6850_RDRF) ? 1 : 0, |
2673 | 2673 | (to9_kbd_status & ACIA_6850_TDRE) ? 1 : 0, |
2674 | 2674 | (to9_kbd_status & ACIA_6850_OVRN) ? 1 : 0, |
r17963 | r17964 | |
2677 | 2677 | return to9_kbd_status; |
2678 | 2678 | |
2679 | 2679 | case 1: /* get input data */ |
2680 | if ( !space | |
2680 | if ( !space.debugger_access() ) | |
2681 | 2681 | { |
2682 | 2682 | to9_kbd_status &= ~(ACIA_6850_irq | ACIA_6850_PE); |
2683 | 2683 | if ( to9_kbd_overrun ) |
r17963 | r17964 | |
2685 | 2685 | else |
2686 | 2686 | to9_kbd_status &= ~(ACIA_6850_OVRN | ACIA_6850_RDRF); |
2687 | 2687 | to9_kbd_overrun = 0; |
2688 | LOG_KBD(( "$%04x %f to9_kbd_r: read data $%02X\n", space->machine().device("maincpu")->safe_pcbase(), space->machine().time().as_double(), to9_kbd_in )); | |
2689 | to9_kbd_update_irq(space->machine()); | |
2688 | LOG_KBD(( "$%04x %f to9_kbd_r: read data $%02X\n", space.machine().device("maincpu")->safe_pcbase(), space.machine().time().as_double(), to9_kbd_in )); | |
2689 | to9_kbd_update_irq(space.machine()); | |
2690 | 2690 | } |
2691 | 2691 | return to9_kbd_in; |
2692 | 2692 | |
2693 | 2693 | default: |
2694 | logerror( "$%04x to9_kbd_r: invalid offset %i\n", space | |
2694 | logerror( "$%04x to9_kbd_r: invalid offset %i\n", space.machine().device("maincpu")->safe_pcbase(), offset ); | |
2695 | 2695 | return 0; |
2696 | 2696 | } |
2697 | 2697 | } |
r17963 | r17964 | |
2713 | 2713 | to9_kbd_overrun = 0; |
2714 | 2714 | to9_kbd_status = ACIA_6850_TDRE; |
2715 | 2715 | to9_kbd_intr = 0; |
2716 | LOG_KBD(( "$%04x %f to9_kbd_w: reset (data=$%02X)\n", space | |
2716 | LOG_KBD(( "$%04x %f to9_kbd_w: reset (data=$%02X)\n", space.machine().device("maincpu")->safe_pcbase(), space.machine().time().as_double(), data )); | |
2717 | 2717 | } |
2718 | 2718 | else |
2719 | 2719 | { |
r17963 | r17964 | |
2727 | 2727 | to9_kbd_intr = data >> 5; |
2728 | 2728 | |
2729 | 2729 | LOG_KBD(( "$%04x %f to9_kbd_w: set control to $%02X (parity=%i, intr in=%i out=%i)\n", |
2730 | space | |
2730 | space.machine().device("maincpu")->safe_pcbase(), space.machine().time().as_double(), | |
2731 | 2731 | data, to9_kbd_parity, to9_kbd_intr >> 2, |
2732 | 2732 | (to9_kbd_intr & 3) ? 1 : 0 )); |
2733 | 2733 | } |
2734 | to9_kbd_update_irq(space | |
2734 | to9_kbd_update_irq(space.machine()); | |
2735 | 2735 | break; |
2736 | 2736 | |
2737 | 2737 | case 1: /* output data */ |
2738 | 2738 | to9_kbd_status &= ~(ACIA_6850_irq | ACIA_6850_TDRE); |
2739 | to9_kbd_update_irq(space | |
2739 | to9_kbd_update_irq(space.machine()); | |
2740 | 2740 | /* TODO: 1 ms delay here ? */ |
2741 | 2741 | to9_kbd_status |= ACIA_6850_TDRE; /* data transmit ready again */ |
2742 | to9_kbd_update_irq(space | |
2742 | to9_kbd_update_irq(space.machine()); | |
2743 | 2743 | |
2744 | 2744 | switch ( data ) |
2745 | 2745 | { |
r17963 | r17964 | |
2758 | 2758 | case 0xFE: to9_kbd_periph = 0; break; |
2759 | 2759 | |
2760 | 2760 | default: |
2761 | logerror( "$%04x %f to9_kbd_w: unknown kbd command %02X\n", space | |
2761 | logerror( "$%04x %f to9_kbd_w: unknown kbd command %02X\n", space.machine().device("maincpu")->safe_pcbase(), space.machine().time().as_double(), data ); | |
2762 | 2762 | } |
2763 | 2763 | |
2764 | thom_set_caps_led( space | |
2764 | thom_set_caps_led( space.machine(), !to9_kbd_caps ); | |
2765 | 2765 | |
2766 | 2766 | LOG(( "$%04x %f to9_kbd_w: kbd command %02X (caps=%i, pad=%i, periph=%i)\n", |
2767 | space | |
2767 | space.machine().device("maincpu")->safe_pcbase(), space.machine().time().as_double(), data, | |
2768 | 2768 | to9_kbd_caps, to9_kbd_pad, to9_kbd_periph )); |
2769 | 2769 | |
2770 | 2770 | break; |
2771 | 2771 | |
2772 | 2772 | default: |
2773 | logerror( "$%04x to9_kbd_w: invalid offset %i (data=$%02X) \n", space | |
2773 | logerror( "$%04x to9_kbd_w: invalid offset %i (data=$%02X) \n", space.machine().device("maincpu")->safe_pcbase(), offset, data ); | |
2774 | 2774 | } |
2775 | 2775 | } |
2776 | 2776 | |
r17963 | r17964 | |
3573 | 3573 | static void to8_update_ram_bank (running_machine &machine) |
3574 | 3574 | { |
3575 | 3575 | pia6821_device *sys_pia = machine.device<pia6821_device>(THOM_PIA_SYS ); |
3576 | address_space | |
3576 | address_space& space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
3577 | 3577 | UINT8 bank = 0; |
3578 | 3578 | |
3579 | 3579 | if ( to8_reg_sys1 & 0x10 ) |
r17963 | r17964 | |
3617 | 3617 | { |
3618 | 3618 | /* RAM size is 256 KB only and unavailable |
3619 | 3619 | * bank requested */ |
3620 | space->nop_readwrite( 0xa000, 0xbfff); | |
3621 | space->nop_readwrite( 0xc000, 0xdfff); | |
3620 | space.nop_readwrite( 0xa000, 0xbfff); | |
3621 | space.nop_readwrite( 0xc000, 0xdfff); | |
3622 | 3622 | } |
3623 | 3623 | to8_data_vpage = bank; |
3624 | 3624 | old_ram_bank = bank; |
r17963 | r17964 | |
3637 | 3637 | |
3638 | 3638 | static void to8_update_cart_bank (running_machine &machine) |
3639 | 3639 | { |
3640 | address_space | |
3640 | address_space& space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
3641 | 3641 | int bank = 0; |
3642 | 3642 | int bank_is_read_only = 0; |
3643 | 3643 | |
r17963 | r17964 | |
3656 | 3656 | { |
3657 | 3657 | if (old_cart_bank < 8 || old_cart_bank > 11) |
3658 | 3658 | { |
3659 | space | |
3659 | space.install_read_bank( 0x0000, 0x3fff, THOM_CART_BANK ); | |
3660 | 3660 | if ( bank_is_read_only ) |
3661 | 3661 | { |
3662 | space | |
3662 | space.nop_write( 0x0000, 0x3fff); | |
3663 | 3663 | } |
3664 | 3664 | else |
3665 | 3665 | { |
3666 | space | |
3666 | space.install_legacy_write_handler( 0x0000, 0x3fff, FUNC(to8_vcart_w)); | |
3667 | 3667 | } |
3668 | 3668 | } |
3669 | 3669 | } |
r17963 | r17964 | |
3673 | 3673 | { |
3674 | 3674 | if ( bank_is_read_only ) |
3675 | 3675 | { |
3676 | space->install_read_bank( 0x0000, 0x3fff, THOM_CART_BANK ); | |
3677 | space->nop_write( 0x0000, 0x3fff); | |
3676 | space.install_read_bank( 0x0000, 0x3fff, THOM_CART_BANK ); | |
3677 | space.nop_write( 0x0000, 0x3fff); | |
3678 | 3678 | } |
3679 | 3679 | else |
3680 | 3680 | { |
3681 | space | |
3681 | space.install_readwrite_bank( 0x0000, 0x3fff,THOM_CART_BANK); | |
3682 | 3682 | } |
3683 | 3683 | } |
3684 | 3684 | } |
r17963 | r17964 | |
3687 | 3687 | { |
3688 | 3688 | /* RAM size is 256 KB only and unavailable |
3689 | 3689 | * bank requested */ |
3690 | space | |
3690 | space.nop_readwrite( 0x0000, 0x3fff); | |
3691 | 3691 | } |
3692 | 3692 | LOG_BANK(( "to8_update_cart_bank: CART is RAM bank %i (%s)\n", |
3693 | 3693 | to8_cart_vpage, |
r17963 | r17964 | |
3699 | 3699 | { |
3700 | 3700 | if ( bank_is_read_only ) |
3701 | 3701 | { |
3702 | space | |
3702 | space.nop_write( 0x0000, 0x3fff); | |
3703 | 3703 | } |
3704 | 3704 | else |
3705 | 3705 | { |
3706 | 3706 | if (to8_cart_vpage < 4) |
3707 | 3707 | { |
3708 | space | |
3708 | space.install_legacy_write_handler( 0x0000, 0x3fff, FUNC(to8_vcart_w)); | |
3709 | 3709 | } |
3710 | 3710 | else |
3711 | 3711 | { |
3712 | space | |
3712 | space.install_readwrite_bank( 0x0000, 0x3fff, THOM_CART_BANK ); | |
3713 | 3713 | } |
3714 | 3714 | } |
3715 | 3715 | LOG_BANK(( "to8_update_cart_bank: update CART bank %i write status to %s\n", |
r17963 | r17964 | |
3729 | 3729 | { |
3730 | 3730 | if ( old_cart_bank < 4 || old_cart_bank > 7 ) |
3731 | 3731 | { |
3732 | space->install_read_bank( 0x0000, 0x3fff, THOM_CART_BANK ); | |
3733 | space->install_legacy_write_handler( 0x0000, 0x3fff, FUNC(to8_cartridge_w) ); | |
3732 | space.install_read_bank( 0x0000, 0x3fff, THOM_CART_BANK ); | |
3733 | space.install_legacy_write_handler( 0x0000, 0x3fff, FUNC(to8_cartridge_w) ); | |
3734 | 3734 | } |
3735 | 3735 | LOG_BANK(( "to8_update_cart_bank: CART is internal bank %i\n", to8_soft_bank )); |
3736 | 3736 | } |
r17963 | r17964 | |
3745 | 3745 | { |
3746 | 3746 | if ( old_cart_bank < 0 || old_cart_bank > 3 ) |
3747 | 3747 | { |
3748 | space->install_read_bank( 0x0000, 0x3fff, THOM_CART_BANK ); | |
3749 | space->install_legacy_write_handler( 0x0000, 0x3fff, FUNC(to8_cartridge_w) ); | |
3750 | space->install_legacy_read_handler( 0x0000, 0x0003, FUNC(to8_cartridge_r) ); | |
3748 | space.install_read_bank( 0x0000, 0x3fff, THOM_CART_BANK ); | |
3749 | space.install_legacy_write_handler( 0x0000, 0x3fff, FUNC(to8_cartridge_w) ); | |
3750 | space.install_legacy_read_handler( 0x0000, 0x0003, FUNC(to8_cartridge_r) ); | |
3751 | 3751 | } |
3752 | 3752 | LOG_BANK(( "to8_update_cart_bank: CART is external cartridge bank %i\n", bank )); |
3753 | 3753 | } |
r17963 | r17964 | |
3756 | 3756 | { |
3757 | 3757 | if ( old_cart_bank != 0 ) |
3758 | 3758 | { |
3759 | space | |
3759 | space.nop_read( 0x0000, 0x3fff); | |
3760 | 3760 | LOG_BANK(( "to8_update_cart_bank: CART is unmapped\n")); |
3761 | 3761 | } |
3762 | 3762 | } |
r17963 | r17964 | |
3789 | 3789 | else |
3790 | 3790 | thom_cart_bank = offset & 3; |
3791 | 3791 | |
3792 | to8_update_cart_bank(space | |
3792 | to8_update_cart_bank(space.machine()); | |
3793 | 3793 | } |
3794 | 3794 | |
3795 | 3795 | |
r17963 | r17964 | |
3797 | 3797 | /* read signal to 0000-0003 generates a bank switch */ |
3798 | 3798 | READ8_HANDLER ( to8_cartridge_r ) |
3799 | 3799 | { |
3800 | UINT8* pos = space | |
3800 | UINT8* pos = space.machine().root_device().memregion( "maincpu" )->base() + 0x10000; | |
3801 | 3801 | UINT8 data = pos[offset + (thom_cart_bank % thom_cart_nb_banks) * 0x4000]; |
3802 | if ( !space | |
3802 | if ( !space.debugger_access() ) | |
3803 | 3803 | { |
3804 | 3804 | thom_cart_bank = offset & 3; |
3805 | to8_update_cart_bank(space | |
3805 | to8_update_cart_bank(space.machine()); | |
3806 | 3806 | } |
3807 | 3807 | return data; |
3808 | 3808 | } |
r17963 | r17964 | |
3833 | 3833 | |
3834 | 3834 | READ8_HANDLER ( to8_floppy_r ) |
3835 | 3835 | { |
3836 | if ( space | |
3836 | if ( space.debugger_access() ) | |
3837 | 3837 | return 0; |
3838 | 3838 | |
3839 | 3839 | if ( (to8_reg_sys1 & 0x80) && THOM_FLOPPY_EXT ) |
r17963 | r17964 | |
3871 | 3871 | |
3872 | 3872 | READ8_HANDLER ( to8_gatearray_r ) |
3873 | 3873 | { |
3874 | struct thom_vsignal v = thom_get_vsignal(space->machine()); | |
3875 | struct thom_vsignal l = thom_get_lightpen_vsignal( space->machine(), TO8_LIGHTPEN_DECAL, to7_lightpen_step - 1, 6 ); | |
3874 | struct thom_vsignal v = thom_get_vsignal(space.machine()); | |
3875 | struct thom_vsignal l = thom_get_lightpen_vsignal( space.machine(), TO8_LIGHTPEN_DECAL, to7_lightpen_step - 1, 6 ); | |
3876 | 3876 | int count, inil, init, lt3; |
3877 | 3877 | UINT8 res; |
3878 | 3878 | count = to7_lightpen ? l.count : v.count; |
r17963 | r17964 | |
3893 | 3893 | case 1: /* ram register / lightpen register 2 */ |
3894 | 3894 | if ( to7_lightpen ) |
3895 | 3895 | { |
3896 | if ( !space | |
3896 | if ( !space.debugger_access() ) | |
3897 | 3897 | { |
3898 | thom_firq_2( space | |
3898 | thom_firq_2( space.machine(), 0 ); | |
3899 | 3899 | to8_lightpen_intr = 0; |
3900 | 3900 | } |
3901 | 3901 | res = count & 0xff; |
r17963 | r17964 | |
3916 | 3916 | break; |
3917 | 3917 | |
3918 | 3918 | default: |
3919 | logerror( "$%04x to8_gatearray_r: invalid offset %i\n", space | |
3919 | logerror( "$%04x to8_gatearray_r: invalid offset %i\n", space.machine().device("maincpu")->safe_pcbase(), offset ); | |
3920 | 3920 | res = 0; |
3921 | 3921 | } |
3922 | 3922 | |
3923 | 3923 | LOG_VIDEO(( "$%04x %f to8_gatearray_r: off=%i ($%04X) res=$%02X lightpen=%i\n", |
3924 | space | |
3924 | space.machine().device("maincpu")->safe_pcbase(), space.machine().time().as_double(), | |
3925 | 3925 | offset, 0xe7e4 + offset, res, to7_lightpen )); |
3926 | 3926 | |
3927 | 3927 | return res; |
r17963 | r17964 | |
3932 | 3932 | WRITE8_HANDLER ( to8_gatearray_w ) |
3933 | 3933 | { |
3934 | 3934 | LOG_VIDEO(( "$%04x %f to8_gatearray_w: off=%i ($%04X) data=$%02X\n", |
3935 | space | |
3935 | space.machine().device("maincpu")->safe_pcbase(), space.machine().time().as_double(), | |
3936 | 3936 | offset, 0xe7e4 + offset, data )); |
3937 | 3937 | |
3938 | 3938 | switch ( offset ) |
r17963 | r17964 | |
3946 | 3946 | if ( to8_reg_sys1 & 0x10 ) |
3947 | 3947 | { |
3948 | 3948 | to8_reg_ram = data; |
3949 | to8_update_ram_bank(space | |
3949 | to8_update_ram_bank(space.machine()); | |
3950 | 3950 | } |
3951 | 3951 | break; |
3952 | 3952 | |
3953 | 3953 | case 2: /* cartridge register */ |
3954 | 3954 | to8_reg_cart = data; |
3955 | to8_update_cart_bank(space | |
3955 | to8_update_cart_bank(space.machine()); | |
3956 | 3956 | break; |
3957 | 3957 | |
3958 | 3958 | case 3: /* system register 1 */ |
3959 | 3959 | to8_reg_sys1 = data; |
3960 | to8_update_floppy_bank(space->machine()); | |
3961 | to8_update_ram_bank(space->machine()); | |
3962 | to8_update_cart_bank(space->machine()); | |
3960 | to8_update_floppy_bank(space.machine()); | |
3961 | to8_update_ram_bank(space.machine()); | |
3962 | to8_update_cart_bank(space.machine()); | |
3963 | 3963 | break; |
3964 | 3964 | |
3965 | 3965 | default: |
3966 | 3966 | logerror( "$%04x to8_gatearray_w: invalid offset %i (data=$%02X)\n", |
3967 | space | |
3967 | space.machine().device("maincpu")->safe_pcbase(), offset, data ); | |
3968 | 3968 | } |
3969 | 3969 | } |
3970 | 3970 | |
r17963 | r17964 | |
3979 | 3979 | /* 0xe7dc from external floppy drive aliases the video gate-array */ |
3980 | 3980 | if ( ( offset == 3 ) && ( to8_reg_ram & 0x80 ) && ( to8_reg_sys1 & 0x80 ) ) |
3981 | 3981 | { |
3982 | if ( space | |
3982 | if ( space.debugger_access() ) | |
3983 | 3983 | return 0; |
3984 | 3984 | |
3985 | 3985 | if ( THOM_FLOPPY_EXT ) |
r17963 | r17964 | |
3994 | 3994 | case 0: /* palette data */ |
3995 | 3995 | { |
3996 | 3996 | UINT8 c = to9_palette_data[ to9_palette_idx ]; |
3997 | if ( !space | |
3997 | if ( !space.debugger_access() ) | |
3998 | 3998 | { |
3999 | 3999 | to9_palette_idx = ( to9_palette_idx + 1 ) & 31; |
4000 | 4000 | } |
r17963 | r17964 | |
4019 | 4019 | WRITE8_HANDLER ( to8_vreg_w ) |
4020 | 4020 | { |
4021 | 4021 | LOG_VIDEO(( "$%04x %f to8_vreg_w: off=%i ($%04X) data=$%02X\n", |
4022 | space | |
4022 | space.machine().device("maincpu")->safe_pcbase(), space.machine().time().as_double(), | |
4023 | 4023 | offset, 0xe7da + offset, data )); |
4024 | 4024 | |
4025 | 4025 | switch ( offset ) |
r17963 | r17964 | |
4032 | 4032 | idx = to9_palette_idx / 2; |
4033 | 4033 | color = to9_palette_data[ 2 * idx + 1 ]; |
4034 | 4034 | color = to9_palette_data[ 2 * idx ] | (color << 8); |
4035 | thom_set_palette( space | |
4035 | thom_set_palette( space.machine(), idx, color & 0x1fff ); | |
4036 | 4036 | to9_palette_idx = ( to9_palette_idx + 1 ) & 31; |
4037 | 4037 | } |
4038 | 4038 | break; |
r17963 | r17964 | |
4042 | 4042 | break; |
4043 | 4043 | |
4044 | 4044 | case 2: /* display register */ |
4045 | to9_set_video_mode( space | |
4045 | to9_set_video_mode( space.machine(), data, 1 ); | |
4046 | 4046 | break; |
4047 | 4047 | |
4048 | 4048 | case 3: /* system register 2 */ |
r17963 | r17964 | |
4055 | 4055 | else |
4056 | 4056 | { |
4057 | 4057 | to8_reg_sys2 = data; |
4058 | thom_set_video_page( space->machine(), data >> 6 ); | |
4059 | thom_set_border_color( space->machine(), data & 15 ); | |
4058 | thom_set_video_page( space.machine(), data >> 6 ); | |
4059 | thom_set_border_color( space.machine(), data & 15 ); | |
4060 | 4060 | } |
4061 | 4061 | break; |
4062 | 4062 | |
r17963 | r17964 | |
4498 | 4498 | static void mo6_update_cart_bank (running_machine &machine) |
4499 | 4499 | { |
4500 | 4500 | pia6821_device *sys_pia = machine.device<pia6821_device>(THOM_PIA_SYS ); |
4501 | address_space | |
4501 | address_space& space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
4502 | 4502 | int b = (sys_pia->a_output() >> 5) & 1; |
4503 | 4503 | int bank = 0; |
4504 | 4504 | int bank_is_read_only = 0; |
4505 | 4505 | |
4506 | // space | |
4506 | // space.install_read_bank( 0xb000, 0xefff, THOM_CART_BANK ); | |
4507 | 4507 | |
4508 | 4508 | if ( ( ( to8_reg_sys1 & 0x40 ) && ( to8_reg_cart & 0x20 ) ) || ( ! ( to8_reg_sys1 & 0x40 ) && ( mo5_reg_cart & 4 ) ) ) |
4509 | 4509 | { |
r17963 | r17964 | |
4520 | 4520 | { |
4521 | 4521 | if (old_cart_bank < 8 || old_cart_bank > 11) |
4522 | 4522 | { |
4523 | space | |
4523 | space.install_read_bank( 0xb000, 0xefff, THOM_CART_BANK ); | |
4524 | 4524 | if ( bank_is_read_only ) |
4525 | 4525 | { |
4526 | space | |
4526 | space.nop_write( 0xb000, 0xefff); | |
4527 | 4527 | } |
4528 | 4528 | else |
4529 | 4529 | { |
4530 | space | |
4530 | space.install_legacy_write_handler( 0xb000, 0xefff, FUNC(to8_vcart_w)); | |
4531 | 4531 | } |
4532 | 4532 | } |
4533 | 4533 | } |
r17963 | r17964 | |
4538 | 4538 | { |
4539 | 4539 | if ( bank_is_read_only ) |
4540 | 4540 | { |
4541 | space->install_read_bank( 0xb000, 0xefff, THOM_CART_BANK ); | |
4542 | space->nop_write( 0xb000, 0xefff); | |
4541 | space.install_read_bank( 0xb000, 0xefff, THOM_CART_BANK ); | |
4542 | space.nop_write( 0xb000, 0xefff); | |
4543 | 4543 | } |
4544 | 4544 | else |
4545 | 4545 | { |
4546 | space | |
4546 | space.install_readwrite_bank( 0xb000, 0xefff,THOM_CART_BANK); | |
4547 | 4547 | } |
4548 | 4548 | } |
4549 | 4549 | } |
r17963 | r17964 | |
4555 | 4555 | { |
4556 | 4556 | if ( bank_is_read_only ) |
4557 | 4557 | { |
4558 | space | |
4558 | space.nop_write( 0xb000, 0xefff); | |
4559 | 4559 | } |
4560 | 4560 | else |
4561 | 4561 | { |
4562 | 4562 | if (to8_cart_vpage < 4) |
4563 | 4563 | { |
4564 | space | |
4564 | space.install_legacy_write_handler( 0xb000, 0xefff, FUNC(to8_vcart_w)); | |
4565 | 4565 | } |
4566 | 4566 | else |
4567 | 4567 | { |
4568 | space | |
4568 | space.install_readwrite_bank( 0xb000, 0xefff, THOM_CART_BANK ); | |
4569 | 4569 | } |
4570 | 4570 | } |
4571 | 4571 | LOG_BANK(( "mo6_update_cart_bank: update CART bank %i write status to %s\n", |
r17963 | r17964 | |
4582 | 4582 | { |
4583 | 4583 | if ( old_cart_bank < 0 || old_cart_bank > 3 ) |
4584 | 4584 | { |
4585 | space->install_read_bank( 0xb000, 0xefff, THOM_CART_BANK ); | |
4586 | space->nop_write( 0xb000, 0xefff); | |
4585 | space.install_read_bank( 0xb000, 0xefff, THOM_CART_BANK ); | |
4586 | space.nop_write( 0xb000, 0xefff); | |
4587 | 4587 | } |
4588 | 4588 | LOG_BANK(( "mo6_update_cart_bank: CART is external cartridge bank %i (A7CB style)\n", bank )); |
4589 | 4589 | } |
r17963 | r17964 | |
4600 | 4600 | { |
4601 | 4601 | if ( bank_is_read_only ) |
4602 | 4602 | { |
4603 | space->install_read_bank( 0xb000, 0xefff, THOM_CART_BANK); | |
4604 | space->nop_write( 0xb000, 0xefff); | |
4603 | space.install_read_bank( 0xb000, 0xefff, THOM_CART_BANK); | |
4604 | space.nop_write( 0xb000, 0xefff); | |
4605 | 4605 | } else |
4606 | 4606 | { |
4607 | space | |
4607 | space.install_readwrite_bank( 0xb000, 0xefff, THOM_CART_BANK); | |
4608 | 4608 | } |
4609 | 4609 | } |
4610 | 4610 | LOG_BANK(( "mo6_update_cart_bank: CART is RAM bank %i (MO5 compat.) (%s)\n", |
r17963 | r17964 | |
4615 | 4615 | { |
4616 | 4616 | if ( bank_is_read_only ) |
4617 | 4617 | { |
4618 | space->install_read_bank( 0xb000, 0xefff, THOM_CART_BANK); | |
4619 | space->nop_write( 0xb000, 0xefff); | |
4618 | space.install_read_bank( 0xb000, 0xefff, THOM_CART_BANK); | |
4619 | space.nop_write( 0xb000, 0xefff); | |
4620 | 4620 | } |
4621 | 4621 | else |
4622 | 4622 | { |
4623 | space | |
4623 | space.install_readwrite_bank( 0xb000, 0xefff, THOM_CART_BANK); | |
4624 | 4624 | } |
4625 | 4625 | LOG_BANK(( "mo5_update_cart_bank: update CART bank %i write status to %s\n", |
4626 | 4626 | to8_cart_vpage, |
r17963 | r17964 | |
4647 | 4647 | { |
4648 | 4648 | if ( old_cart_bank < 4 || old_cart_bank > 7 ) |
4649 | 4649 | { |
4650 | space->install_read_bank( 0xb000, 0xefff, THOM_CART_BANK); | |
4651 | space->install_legacy_write_handler( 0xb000, 0xefff, FUNC(mo6_cartridge_w) ); | |
4650 | space.install_read_bank( 0xb000, 0xefff, THOM_CART_BANK); | |
4651 | space.install_legacy_write_handler( 0xb000, 0xefff, FUNC(mo6_cartridge_w) ); | |
4652 | 4652 | } |
4653 | 4653 | LOG_BANK(( "mo6_update_cart_bank: CART is internal ROM bank %i\n", b )); |
4654 | 4654 | } |
r17963 | r17964 | |
4663 | 4663 | { |
4664 | 4664 | if ( old_cart_bank < 0 || old_cart_bank > 3 ) |
4665 | 4665 | { |
4666 | space->install_read_bank( 0xb000, 0xefff, THOM_CART_BANK ); | |
4667 | space->install_legacy_write_handler( 0xb000, 0xefff, FUNC(mo6_cartridge_w) ); | |
4668 | space->install_legacy_read_handler( 0xbffc, 0xbfff, FUNC(mo6_cartridge_r) ); | |
4666 | space.install_read_bank( 0xb000, 0xefff, THOM_CART_BANK ); | |
4667 | space.install_legacy_write_handler( 0xb000, 0xefff, FUNC(mo6_cartridge_w) ); | |
4668 | space.install_legacy_read_handler( 0xbffc, 0xbfff, FUNC(mo6_cartridge_r) ); | |
4669 | 4669 | } |
4670 | 4670 | LOG_BANK(( "mo6_update_cart_bank: CART is external cartridge bank %i\n", bank )); |
4671 | 4671 | } |
r17963 | r17964 | |
4674 | 4674 | { |
4675 | 4675 | if ( old_cart_bank != 0 ) |
4676 | 4676 | { |
4677 | space | |
4677 | space.nop_read( 0xb000, 0xefff ); | |
4678 | 4678 | LOG_BANK(( "mo6_update_cart_bank: CART is unmapped\n")); |
4679 | 4679 | } |
4680 | 4680 | } |
r17963 | r17964 | |
4704 | 4704 | return; |
4705 | 4705 | |
4706 | 4706 | thom_cart_bank = offset & 3; |
4707 | mo6_update_cart_bank(space | |
4707 | mo6_update_cart_bank(space.machine()); | |
4708 | 4708 | } |
4709 | 4709 | |
4710 | 4710 | |
r17963 | r17964 | |
4712 | 4712 | /* read signal generates a bank switch */ |
4713 | 4713 | READ8_HANDLER ( mo6_cartridge_r ) |
4714 | 4714 | { |
4715 | UINT8* pos = space | |
4715 | UINT8* pos = space.machine().root_device().memregion( "maincpu" )->base() + 0x10000; | |
4716 | 4716 | UINT8 data = pos[offset + 0xbffc + (thom_cart_bank % thom_cart_nb_banks) * 0x4000]; |
4717 | if ( !space | |
4717 | if ( !space.debugger_access() ) | |
4718 | 4718 | { |
4719 | 4719 | thom_cart_bank = offset & 3; |
4720 | mo6_update_cart_bank(space | |
4720 | mo6_update_cart_bank(space.machine()); | |
4721 | 4721 | } |
4722 | 4722 | return data; |
4723 | 4723 | } |
r17963 | r17964 | |
4728 | 4728 | { |
4729 | 4729 | /* MO5 network extension compatible */ |
4730 | 4730 | mo5_reg_cart = data; |
4731 | mo6_update_cart_bank(space | |
4731 | mo6_update_cart_bank(space.machine()); | |
4732 | 4732 | } |
4733 | 4733 | |
4734 | 4734 | |
r17963 | r17964 | |
4930 | 4930 | |
4931 | 4931 | READ8_HANDLER ( mo6_gatearray_r ) |
4932 | 4932 | { |
4933 | struct thom_vsignal v = thom_get_vsignal(space->machine()); | |
4934 | struct thom_vsignal l = thom_get_lightpen_vsignal( space->machine(), MO6_LIGHTPEN_DECAL, to7_lightpen_step - 1, 6 ); | |
4933 | struct thom_vsignal v = thom_get_vsignal(space.machine()); | |
4934 | struct thom_vsignal l = thom_get_lightpen_vsignal( space.machine(), MO6_LIGHTPEN_DECAL, to7_lightpen_step - 1, 6 ); | |
4935 | 4935 | int count, inil, init, lt3; |
4936 | 4936 | UINT8 res; |
4937 | 4937 | count = to7_lightpen ? l.count : v.count; |
r17963 | r17964 | |
4952 | 4952 | case 1: /* ram register / lightpen register 2 */ |
4953 | 4953 | if ( to7_lightpen ) |
4954 | 4954 | { |
4955 | if ( !space | |
4955 | if ( !space.debugger_access() ) | |
4956 | 4956 | { |
4957 | thom_firq_2( space | |
4957 | thom_firq_2( space.machine(), 0 ); | |
4958 | 4958 | to8_lightpen_intr = 0; |
4959 | 4959 | } |
4960 | 4960 | res = count & 0xff; |
r17963 | r17964 | |
4975 | 4975 | break; |
4976 | 4976 | |
4977 | 4977 | default: |
4978 | logerror( "$%04x mo6_gatearray_r: invalid offset %i\n", space | |
4978 | logerror( "$%04x mo6_gatearray_r: invalid offset %i\n", space.machine().device("maincpu")->safe_pcbase(), offset ); | |
4979 | 4979 | res = 0; |
4980 | 4980 | } |
4981 | 4981 | |
4982 | 4982 | LOG_VIDEO(( "$%04x %f mo6_gatearray_r: off=%i ($%04X) res=$%02X lightpen=%i\n", |
4983 | space | |
4983 | space.machine().device("maincpu")->safe_pcbase(), space.machine().time().as_double(), | |
4984 | 4984 | offset, 0xa7e4 + offset, res, to7_lightpen )); |
4985 | 4985 | |
4986 | 4986 | return res; |
r17963 | r17964 | |
4991 | 4991 | WRITE8_HANDLER ( mo6_gatearray_w ) |
4992 | 4992 | { |
4993 | 4993 | LOG_VIDEO(( "$%04x %f mo6_gatearray_w: off=%i ($%04X) data=$%02X\n", |
4994 | space | |
4994 | space.machine().device("maincpu")->safe_pcbase(), space.machine().time().as_double(), | |
4995 | 4995 | offset, 0xa7e4 + offset, data )); |
4996 | 4996 | |
4997 | 4997 | switch ( offset ) |
r17963 | r17964 | |
5005 | 5005 | if ( to8_reg_sys1 & 0x10 ) |
5006 | 5006 | { |
5007 | 5007 | to8_reg_ram = data; |
5008 | mo6_update_ram_bank(space | |
5008 | mo6_update_ram_bank(space.machine()); | |
5009 | 5009 | } |
5010 | 5010 | break; |
5011 | 5011 | |
5012 | 5012 | case 2: /* cartridge register */ |
5013 | 5013 | to8_reg_cart = data; |
5014 | mo6_update_cart_bank(space | |
5014 | mo6_update_cart_bank(space.machine()); | |
5015 | 5015 | break; |
5016 | 5016 | |
5017 | 5017 | case 3: /* system register 1 */ |
5018 | 5018 | to8_reg_sys1 = data; |
5019 | mo6_update_ram_bank(space->machine()); | |
5020 | mo6_update_cart_bank(space->machine()); | |
5019 | mo6_update_ram_bank(space.machine()); | |
5020 | mo6_update_cart_bank(space.machine()); | |
5021 | 5021 | break; |
5022 | 5022 | |
5023 | 5023 | default: |
5024 | logerror( "$%04x mo6_gatearray_w: invalid offset %i (data=$%02X)\n", space | |
5024 | logerror( "$%04x mo6_gatearray_w: invalid offset %i (data=$%02X)\n", space.machine().device("maincpu")->safe_pcbase(), offset, data ); | |
5025 | 5025 | } |
5026 | 5026 | } |
5027 | 5027 | |
r17963 | r17964 | |
5035 | 5035 | /* 0xa7dc from external floppy drive aliases the video gate-array */ |
5036 | 5036 | if ( ( offset == 3 ) && ( to8_reg_ram & 0x80 ) ) |
5037 | 5037 | { |
5038 | if ( !space | |
5038 | if ( !space.debugger_access() ) | |
5039 | 5039 | return to7_floppy_r( space, 0xc ); |
5040 | 5040 | } |
5041 | 5041 | |
r17963 | r17964 | |
5061 | 5061 | WRITE8_HANDLER ( mo6_vreg_w ) |
5062 | 5062 | { |
5063 | 5063 | LOG_VIDEO(( "$%04x %f mo6_vreg_w: off=%i ($%04X) data=$%02X\n", |
5064 | space | |
5064 | space.machine().device("maincpu")->safe_pcbase(), space.machine().time().as_double(), | |
5065 | 5065 | offset, 0xa7da + offset, data )); |
5066 | 5066 | |
5067 | 5067 | switch ( offset ) |
r17963 | r17964 | |
5076 | 5076 | if ( ( to8_reg_sys1 & 0x80 ) && ( to8_reg_ram & 0x80 ) ) |
5077 | 5077 | to7_floppy_w( space, 0xc, data ); |
5078 | 5078 | else |
5079 | to9_set_video_mode( space | |
5079 | to9_set_video_mode( space.machine(), data, 2 ); | |
5080 | 5080 | break; |
5081 | 5081 | |
5082 | 5082 | case 3: /* system register 2 */ |
r17963 | r17964 | |
5086 | 5086 | else |
5087 | 5087 | { |
5088 | 5088 | to8_reg_sys2 = data; |
5089 | thom_set_video_page( space->machine(), data >> 6 ); | |
5090 | thom_set_border_color( space->machine(), data & 15 ); | |
5091 | mo6_update_cart_bank(space->machine()); | |
5089 | thom_set_video_page( space.machine(), data >> 6 ); | |
5090 | thom_set_border_color( space.machine(), data & 15 ); | |
5091 | mo6_update_cart_bank(space.machine()); | |
5092 | 5092 | } |
5093 | 5093 | break; |
5094 | 5094 | |
r17963 | r17964 | |
5213 | 5213 | |
5214 | 5214 | READ8_HANDLER ( mo5nr_net_r ) |
5215 | 5215 | { |
5216 | if ( space | |
5216 | if ( space.debugger_access() ) | |
5217 | 5217 | return 0; |
5218 | 5218 | |
5219 | 5219 | if ( to7_controller_type ) |
5220 | 5220 | return to7_floppy_r ( space, offset ); |
5221 | 5221 | |
5222 | logerror( "$%04x %f mo5nr_net_r: read from reg %i\n", space | |
5222 | logerror( "$%04x %f mo5nr_net_r: read from reg %i\n", space.machine().device("maincpu")->safe_pcbase(), space.machine().time().as_double(), offset ); | |
5223 | 5223 | |
5224 | 5224 | return 0; |
5225 | 5225 | } |
r17963 | r17964 | |
5232 | 5232 | to7_floppy_w ( space, offset, data ); |
5233 | 5233 | else |
5234 | 5234 | logerror( "$%04x %f mo5nr_net_w: write $%02X to reg %i\n", |
5235 | space | |
5235 | space.machine().device("maincpu")->safe_pcbase(), space.machine().time().as_double(), data, offset ); | |
5236 | 5236 | } |
5237 | 5237 | |
5238 | 5238 | |
r17963 | r17964 | |
5245 | 5245 | |
5246 | 5246 | READ8_HANDLER( mo5nr_prn_r ) |
5247 | 5247 | { |
5248 | centronics_device *printer = space | |
5248 | centronics_device *printer = space.machine().device<centronics_device>("centronics"); | |
5249 | 5249 | UINT8 result = 0; |
5250 | 5250 | |
5251 | 5251 | result |= !printer->busy_r() << 7; |
r17963 | r17964 | |
5256 | 5256 | |
5257 | 5257 | WRITE8_HANDLER( mo5nr_prn_w ) |
5258 | 5258 | { |
5259 | centronics_device *printer = space | |
5259 | centronics_device *printer = space.machine().device<centronics_device>("centronics"); | |
5260 | 5260 | |
5261 | 5261 | /* TODO: understand other bits */ |
5262 | 5262 | printer->strobe_w(BIT(data, 3)); |
r17963 | r17964 | |
---|---|---|
273 | 273 | |
274 | 274 | static READ8_HANDLER ( to7_5p14_r ) |
275 | 275 | { |
276 | device_t *fdc = space | |
276 | device_t *fdc = space.machine().device("wd2793"); | |
277 | 277 | |
278 | 278 | if ( offset < 4 ) |
279 | return wd17xx_r( fdc, | |
279 | return wd17xx_r( fdc, space, offset ); | |
280 | 280 | else if ( offset == 8 ) |
281 | 281 | return to7_5p14_select; |
282 | 282 | else |
283 | logerror ( "%f $%04x to7_5p14_r: invalid read offset %i\n", space | |
283 | logerror ( "%f $%04x to7_5p14_r: invalid read offset %i\n", space.machine().time().as_double(), space.machine().device("maincpu")->safe_pcbase(), offset ); | |
284 | 284 | return 0; |
285 | 285 | } |
286 | 286 | |
r17963 | r17964 | |
288 | 288 | |
289 | 289 | static WRITE8_HANDLER( to7_5p14_w ) |
290 | 290 | { |
291 | device_t *fdc = space | |
291 | device_t *fdc = space.machine().device("wd2793"); | |
292 | 292 | if ( offset < 4 ) |
293 | wd17xx_w( fdc, | |
293 | wd17xx_w( fdc, space, offset, data ); | |
294 | 294 | else if ( offset == 8 ) |
295 | 295 | { |
296 | 296 | /* drive select */ |
r17963 | r17964 | |
304 | 304 | case 4: drive = 2; side = 0; break; |
305 | 305 | case 5: drive = 3; side = 1; break; |
306 | 306 | default: |
307 | logerror( "%f $%04x to7_5p14_w: invalid drive select pattern $%02X\n", space | |
307 | logerror( "%f $%04x to7_5p14_w: invalid drive select pattern $%02X\n", space.machine().time().as_double(), space.machine().device("maincpu")->safe_pcbase(), data ); | |
308 | 308 | } |
309 | 309 | |
310 | 310 | wd17xx_dden_w(fdc, BIT(data, 7)); |
r17963 | r17964 | |
313 | 313 | |
314 | 314 | if ( drive != -1 ) |
315 | 315 | { |
316 | thom_floppy_active( space | |
316 | thom_floppy_active( space.machine(), 0 ); | |
317 | 317 | wd17xx_set_drive( fdc, drive ); |
318 | 318 | wd17xx_set_side( fdc, side ); |
319 | 319 | LOG(( "%f $%04x to7_5p14_w: $%02X set drive=%i side=%i density=%s\n", |
320 | space | |
320 | space.machine().time().as_double(), space.machine().device("maincpu")->safe_pcbase(), | |
321 | 321 | data, drive, side, (BIT(data, 7) ? "FM" : "MFM"))); |
322 | 322 | } |
323 | 323 | } |
324 | 324 | else |
325 | 325 | logerror ( "%f $%04x to7_5p14_w: invalid write offset %i (data=$%02X)\n", |
326 | space | |
326 | space.machine().time().as_double(), space.machine().device("maincpu")->safe_pcbase(), offset, data ); | |
327 | 327 | } |
328 | 328 | |
329 | 329 | |
r17963 | r17964 | |
362 | 362 | static READ8_HANDLER ( to7_5p14sd_r ) |
363 | 363 | { |
364 | 364 | if ( offset < 8 ) |
365 | return mc6843_r( space | |
365 | return mc6843_r( space.machine().device("mc6843"), space, offset ); | |
366 | 366 | else if ( offset >= 8 && offset <= 9 ) |
367 | 367 | return to7_5p14sd_select; |
368 | 368 | else |
369 | logerror ( "%f $%04x to7_5p14sd_r: invalid read offset %i\n", space | |
369 | logerror ( "%f $%04x to7_5p14sd_r: invalid read offset %i\n", space.machine().time().as_double(), space.machine().device("maincpu")->safe_pcbase(), offset ); | |
370 | 370 | return 0; |
371 | 371 | } |
372 | 372 | |
r17963 | r17964 | |
375 | 375 | static WRITE8_HANDLER( to7_5p14sd_w ) |
376 | 376 | { |
377 | 377 | if ( offset < 8 ) |
378 | mc6843_w( space | |
378 | mc6843_w( space.machine().device("mc6843"), space, offset, data ); | |
379 | 379 | else if ( offset >= 8 && offset <= 9 ) |
380 | 380 | { |
381 | 381 | /* drive select */ |
r17963 | r17964 | |
406 | 406 | |
407 | 407 | if ( drive != -1 ) |
408 | 408 | { |
409 | thom_floppy_active( space->machine(), 0 ); | |
410 | mc6843_set_drive( space->machine().device("mc6843"), drive ); | |
411 | mc6843_set_side( space->machine().device("mc6843"), side ); | |
409 | thom_floppy_active( space.machine(), 0 ); | |
410 | mc6843_set_drive( space.machine().device("mc6843"), drive ); | |
411 | mc6843_set_side( space.machine().device("mc6843"), side ); | |
412 | 412 | LOG(( "%f $%04x to7_5p14sd_w: $%02X set drive=%i side=%i\n", |
413 | space | |
413 | space.machine().time().as_double(), space.machine().device("maincpu")->safe_pcbase(), data, drive, side )); | |
414 | 414 | } |
415 | 415 | } |
416 | 416 | else |
417 | 417 | logerror ( "%f $%04x to7_5p14sd_w: invalid write offset %i (data=$%02X)\n", |
418 | space | |
418 | space.machine().time().as_double(), space.machine().device("maincpu")->safe_pcbase(), offset, data ); | |
419 | 419 | } |
420 | 420 | |
421 | 421 | static void to7_5p14_index_pulse_callback( device_t *controller,device_t *image, int state ) |
r17963 | r17964 | |
700 | 700 | { |
701 | 701 | |
702 | 702 | case 0: /* MC6852 status */ |
703 | to7_qdd_stat_update(space | |
703 | to7_qdd_stat_update(space.machine()); | |
704 | 704 | VLOG(( "%f $%04x to7_qdd_r: STAT=$%02X irq=%i pe=%i ovr=%i und=%i tr=%i rd=%i ncts=%i\n", |
705 | space | |
705 | space.machine().time().as_double(), space.machine().device("maincpu")->safe_pcbase(), to7qdd->status, | |
706 | 706 | to7qdd->status & QDD_S_IRQ ? 1 : 0, |
707 | 707 | to7qdd->status & QDD_S_PE ? 1 : 0, |
708 | 708 | to7qdd->status & QDD_S_OVR ? 1 : 0, |
r17963 | r17964 | |
714 | 714 | |
715 | 715 | case 1: /* MC6852 data input => read byte from disk */ |
716 | 716 | to7qdd->status &= ~(QDD_S_RDA | QDD_S_PE | QDD_S_OVR); |
717 | to7_qdd_stat_update(space->machine()); | |
718 | return to7_qdd_read_byte(space->machine()); | |
717 | to7_qdd_stat_update(space.machine()); | |
718 | return to7_qdd_read_byte(space.machine()); | |
719 | 719 | |
720 | 720 | case 8: /* floppy status */ |
721 | 721 | { |
722 | 722 | UINT8 data = 0; |
723 | device_image_interface* img = dynamic_cast<device_image_interface *>(to7_qdd_image(space | |
723 | device_image_interface* img = dynamic_cast<device_image_interface *>(to7_qdd_image(space.machine())); | |
724 | 724 | if ( ! img->exists() ) |
725 | 725 | data |= 0x40; /* disk present */ |
726 | 726 | if ( to7qdd->index_pulse ) |
727 | 727 | data |= 0x80; /* disk start */ |
728 | VLOG(( "%f $%04x to7_qdd_r: STATUS8 $%02X\n", space | |
728 | VLOG(( "%f $%04x to7_qdd_r: STATUS8 $%02X\n", space.machine().time().as_double(), space.machine().device("maincpu")->safe_pcbase(), data )); | |
729 | 729 | return data; |
730 | 730 | } |
731 | 731 | |
732 | 732 | default: |
733 | logerror ( "%f $%04x to7_qdd_r: invalid read offset %i\n", space | |
733 | logerror ( "%f $%04x to7_qdd_r: invalid read offset %i\n", space.machine().time().as_double(), space.machine().device("maincpu")->safe_pcbase(), offset ); | |
734 | 734 | return 0; |
735 | 735 | } |
736 | 736 | } |
r17963 | r17964 | |
750 | 750 | to7qdd->status &= ~(QDD_S_TDRA | QDD_S_TUF); |
751 | 751 | |
752 | 752 | to7qdd->ctrl1 = ( data & ~(QDD_C1_RRESET | QDD_C1_TRESET) ) |( data & (QDD_C1_RRESET | QDD_C1_TRESET) & to7qdd->ctrl1 ); |
753 | to7_qdd_stat_update(space | |
753 | to7_qdd_stat_update(space.machine()); | |
754 | 754 | VLOG(( "%f $%04x to7_qdd_w: CTRL1=$%02X reset=%c%c %s%sirq=%c%c\n", |
755 | space | |
755 | space.machine().time().as_double(), space.machine().device("maincpu")->safe_pcbase(), data, | |
756 | 756 | data & QDD_C1_RRESET ? 'r' : '-', data & QDD_C1_TRESET ? 't' : '-', |
757 | 757 | data & QDD_C1_STRIPSYNC ? "strip-sync " : "", |
758 | 758 | data & QDD_C1_CLRSYNC ? "clear-sync " : "", |
r17963 | r17964 | |
774 | 774 | int bits, parity; |
775 | 775 | bits = bit[ (data >> 3) & 7 ]; |
776 | 776 | parity = par[ (data >> 3) & 7 ]; |
777 | to7_qdd_stat_update(space | |
777 | to7_qdd_stat_update(space.machine()); | |
778 | 778 | VLOG(( "%f $%04x to7_qdd_w: CTRL2=$%02X bits=%i par=%s blen=%i under=%s%s\n", |
779 | space | |
779 | space.machine().time().as_double(), space.machine().device("maincpu")->safe_pcbase(), data, | |
780 | 780 | bits, parname[ parity ], data & QDD_C2_BLEN ? 1 : 2, |
781 | 781 | data & QDD_C2_TSYNC ? "sync" : "ff", |
782 | 782 | data & QDD_C2_EIE ? "irq-err" : "" )); |
r17963 | r17964 | |
792 | 792 | to7qdd->status &= ~QDD_S_TUF; |
793 | 793 | if ( data & QDD_C3_CLRCTS ) |
794 | 794 | to7qdd->status &= ~QDD_S_NCTS; |
795 | to7_qdd_stat_update(space | |
795 | to7_qdd_stat_update(space.machine()); | |
796 | 796 | VLOG(( "%f $%04x to7_qdd_w: CTRL3=$%02X %s%ssync-len=%i sync-mode=%s\n", |
797 | space | |
797 | space.machine().time().as_double(), space.machine().device("maincpu")->safe_pcbase(), data, | |
798 | 798 | data & QDD_C3_CLRTUF ? "clr-tuf " : "", |
799 | 799 | data & QDD_C3_CLRCTS ? "clr-cts " : "", |
800 | 800 | data & QDD_C3_SYNCLEN ? 1 : 2, |
r17963 | r17964 | |
802 | 802 | break; |
803 | 803 | |
804 | 804 | case 2: /* MC6852 sync code => write byte to disk */ |
805 | to7_qdd_write_byte( space | |
805 | to7_qdd_write_byte( space.machine(), data ); | |
806 | 806 | break; |
807 | 807 | |
808 | 808 | case 3: /* MC6852 data out => does not seem to be used */ |
809 | VLOG(( "%f $%04x to7_qdd_w: ignored WDATA=$%02X\n", space | |
809 | VLOG(( "%f $%04x to7_qdd_w: ignored WDATA=$%02X\n", space.machine().time().as_double(), space.machine().device("maincpu")->safe_pcbase(), data )); | |
810 | 810 | break; |
811 | 811 | |
812 | 812 | } |
r17963 | r17964 | |
814 | 814 | |
815 | 815 | case 8: /* set drive */ |
816 | 816 | to7qdd->drive = data; |
817 | VLOG(( "%f $%04x to7_qdd_w: DRIVE=$%02X\n", space | |
817 | VLOG(( "%f $%04x to7_qdd_w: DRIVE=$%02X\n", space.machine().time().as_double(), space.machine().device("maincpu")->safe_pcbase(), data )); | |
818 | 818 | break; |
819 | 819 | |
820 | 820 | case 12: /* motor pulse ? */ |
821 | thom_floppy_active( space->machine(), 0 ); | |
822 | VLOG(( "%f $%04x to7_qdd_w: MOTOR=$%02X\n", space->machine().time().as_double(), space->machine().device("maincpu")->safe_pcbase(), data )); | |
821 | thom_floppy_active( space.machine(), 0 ); | |
822 | VLOG(( "%f $%04x to7_qdd_w: MOTOR=$%02X\n", space.machine().time().as_double(), space.machine().device("maincpu")->safe_pcbase(), data )); | |
823 | 823 | break; |
824 | 824 | |
825 | 825 | default: |
826 | logerror ( "%f $%04x to7_qdd_w: invalid write offset %i (data=$%02X)\n", space | |
826 | logerror ( "%f $%04x to7_qdd_w: invalid write offset %i (data=$%02X)\n", space.machine().time().as_double(), space.machine().device("maincpu")->safe_pcbase(), offset, data ); | |
827 | 827 | } |
828 | 828 | } |
829 | 829 | |
r17963 | r17964 | |
1264 | 1264 | |
1265 | 1265 | case 0: /* STAT0 */ |
1266 | 1266 | thmfc1->stat0 ^= THMFC1_STAT0_SYNCHRO | THMFC1_STAT0_BYTE_READY_POL; |
1267 | VLOG(( "%f $%04x thmfc_floppy_r: STAT0=$%02X\n", space | |
1267 | VLOG(( "%f $%04x thmfc_floppy_r: STAT0=$%02X\n", space.machine().time().as_double(), space.machine().device("maincpu")->safe_pcbase(), thmfc1->stat0 )); | |
1268 | 1268 | return thmfc1->stat0; |
1269 | 1269 | |
1270 | 1270 | case 1: /* STAT1 */ |
1271 | 1271 | { |
1272 | 1272 | UINT8 data = 0; |
1273 | device_image_interface * img = dynamic_cast<device_image_interface *>(thmfc_floppy_image(space | |
1273 | device_image_interface * img = dynamic_cast<device_image_interface *>(thmfc_floppy_image(space.machine())); | |
1274 | 1274 | int flags = floppy_drive_get_flag_state( &img->device(), -1 ); |
1275 | 1275 | if ( thmfc_floppy_is_qdd(img) ) |
1276 | 1276 | { |
r17963 | r17964 | |
1296 | 1296 | data |= 0x10; |
1297 | 1297 | if (!floppy_wpt_r(&img->device())) |
1298 | 1298 | data |= 0x04; |
1299 | VLOG(( "%f $%04x thmfc_floppy_r: STAT1=$%02X\n", space | |
1299 | VLOG(( "%f $%04x thmfc_floppy_r: STAT1=$%02X\n", space.machine().time().as_double(), space.machine().device("maincpu")->safe_pcbase(), data )); | |
1300 | 1300 | return data; |
1301 | 1301 | } |
1302 | 1302 | |
1303 | 1303 | case 3: /* RDATA */ |
1304 | 1304 | |
1305 | 1305 | if ( thmfc1->op == THMFC1_OP_READ_SECT || thmfc1->op == THMFC1_OP_READ_ADDR ) |
1306 | return thmfc_floppy_read_byte(space | |
1306 | return thmfc_floppy_read_byte(space.machine()); | |
1307 | 1307 | else |
1308 | return thmfc_floppy_raw_read_byte(space | |
1308 | return thmfc_floppy_raw_read_byte(space.machine()); | |
1309 | 1309 | |
1310 | 1310 | case 6: |
1311 | 1311 | return 0; |
r17963 | r17964 | |
1314 | 1314 | { |
1315 | 1315 | /* undocumented => emulate TO7 QDD controller ? */ |
1316 | 1316 | UINT8 data = thmfc1->ipl << 7; |
1317 | VLOG(( "%f $%04x thmfc_floppy_r: STAT8=$%02X\n", space | |
1317 | VLOG(( "%f $%04x thmfc_floppy_r: STAT8=$%02X\n", space.machine().time().as_double(), space.machine().device("maincpu")->safe_pcbase(), data )); | |
1318 | 1318 | return data; |
1319 | 1319 | } |
1320 | 1320 | |
1321 | 1321 | default: |
1322 | logerror ( "%f $%04x thmfc_floppy_r: invalid read offset %i\n", space | |
1322 | logerror ( "%f $%04x thmfc_floppy_r: invalid read offset %i\n", space.machine().time().as_double(), space.machine().device("maincpu")->safe_pcbase(), offset ); | |
1323 | 1323 | return 0; |
1324 | 1324 | } |
1325 | 1325 | } |
r17963 | r17964 | |
1333 | 1333 | case 0: /* CMD0 */ |
1334 | 1334 | { |
1335 | 1335 | int wsync = (data >> 4) & 1; |
1336 | int qdd = thmfc_floppy_is_qdd(dynamic_cast<device_image_interface *>(thmfc_floppy_image(space | |
1336 | int qdd = thmfc_floppy_is_qdd(dynamic_cast<device_image_interface *>(thmfc_floppy_image(space.machine()))); | |
1337 | 1337 | chrn_id id; |
1338 | 1338 | thmfc1->formatting = (data >> 2) & 1; |
1339 | 1339 | LOG (( "%f $%04x thmfc_floppy_w: CMD0=$%02X dens=%s wsync=%i dsync=%i fmt=%i op=%i\n", |
1340 | space | |
1340 | space.machine().time().as_double(), space.machine().device("maincpu")->safe_pcbase(), data, | |
1341 | 1341 | (BIT(data, 5) ? "FM" : "MFM"), |
1342 | 1342 | wsync, (data >> 3) & 1, |
1343 | 1343 | thmfc1->formatting, data & 3 )); |
r17963 | r17964 | |
1356 | 1356 | case THMFC1_OP_WRITE_SECT: |
1357 | 1357 | if ( qdd ) |
1358 | 1358 | logerror( "thmfc_floppy_w: smart operation 1 not supported for QDD\n" ); |
1359 | else if ( thmfc_floppy_find_sector( space | |
1359 | else if ( thmfc_floppy_find_sector( space.machine(), &id ) ) | |
1360 | 1360 | { |
1361 | 1361 | thmfc1->sector_id = id.data_id; |
1362 | 1362 | thmfc1->data_idx = 0; |
r17963 | r17964 | |
1371 | 1371 | case THMFC1_OP_READ_ADDR: |
1372 | 1372 | if ( qdd ) |
1373 | 1373 | logerror( "thmfc_floppy_w: smart operation 2 not supported for QDD\n" ); |
1374 | else if ( thmfc_floppy_find_sector( space | |
1374 | else if ( thmfc_floppy_find_sector( space.machine(), &id ) ) | |
1375 | 1375 | { |
1376 | 1376 | thmfc1->data_size = |
1377 | 1377 | thom_floppy_make_addr( id, thmfc1->data, thmfc1->sector_size ); |
r17963 | r17964 | |
1387 | 1387 | case THMFC1_OP_READ_SECT: |
1388 | 1388 | if ( qdd ) |
1389 | 1389 | logerror( "thmfc_floppy_w: smart operation 3 not supported for QDD\n" ); |
1390 | else if ( thmfc_floppy_find_sector( space | |
1390 | else if ( thmfc_floppy_find_sector( space.machine(), &id ) ) | |
1391 | 1391 | { |
1392 | 1392 | thmfc1->data_size = thom_floppy_make_sector |
1393 | ( thmfc_floppy_image(space | |
1393 | ( thmfc_floppy_image(space.machine()), id, thmfc1->data, thmfc1->sector_size ); | |
1394 | 1394 | assert( thmfc1->data_size < sizeof( thmfc1->data ) ); |
1395 | 1395 | thmfc1->data_finish = thmfc1->sector_size + 4; |
1396 | 1396 | thmfc1->data_idx = 1; |
r17963 | r17964 | |
1404 | 1404 | /* synchronize to word, if needed (QDD only) */ |
1405 | 1405 | if ( wsync && qdd ) { |
1406 | 1406 | if ( ! thmfc1->data_raw_size ) |
1407 | thmfc1->data_raw_size = thom_qdd_make_disk ( thmfc_floppy_image(space | |
1407 | thmfc1->data_raw_size = thom_qdd_make_disk ( thmfc_floppy_image(space.machine()), thmfc1->data ); | |
1408 | 1408 | while ( thmfc1->data_raw_idx < thmfc1->data_raw_size && |
1409 | 1409 | thmfc1->data[ thmfc1->data_raw_idx ] != thmfc1->wsync ) |
1410 | 1410 | { |
r17963 | r17964 | |
1423 | 1423 | if ( thmfc1->sector_size > 256 ) |
1424 | 1424 | { |
1425 | 1425 | logerror( "$%04x thmfc_floppy_w: sector size %i > 256 not handled\n", |
1426 | space | |
1426 | space.machine().device("maincpu")->safe_pcbase(), thmfc1->sector_size ); | |
1427 | 1427 | thmfc1->sector_size = 256; |
1428 | 1428 | } |
1429 | 1429 | |
1430 | 1430 | LOG (( "%f $%04x thmfc_floppy_w: CMD1=$%02X sect-size=%i comp=%i head=%i\n", |
1431 | space | |
1431 | space.machine().time().as_double(), space.machine().device("maincpu")->safe_pcbase(), data, | |
1432 | 1432 | thmfc1->sector_size, (data >> 1) & 7, thmfc1->side )); |
1433 | 1433 | break; |
1434 | 1434 | |
r17963 | r17964 | |
1439 | 1439 | int seek = 0, motor; |
1440 | 1440 | thmfc1->drive = data & 2; |
1441 | 1441 | |
1442 | img = thmfc_floppy_image(space | |
1442 | img = thmfc_floppy_image(space.machine()); | |
1443 | 1443 | if ( thmfc_floppy_is_qdd(dynamic_cast<device_image_interface *>(img))) |
1444 | 1444 | { |
1445 | 1445 | motor = !(data & 0x40); |
r17963 | r17964 | |
1451 | 1451 | seek = (data & 0x20) ? 1 : -1; |
1452 | 1452 | motor = (data >> 2) & 1; |
1453 | 1453 | thmfc1->drive |= 1 ^ ((data >> 6) & 1); |
1454 | img = thmfc_floppy_image(space | |
1454 | img = thmfc_floppy_image(space.machine()); | |
1455 | 1455 | } |
1456 | 1456 | |
1457 | thom_floppy_active( space | |
1457 | thom_floppy_active( space.machine(), 0 ); | |
1458 | 1458 | |
1459 | 1459 | LOG (( "%f $%04x thmfc_floppy_w: CMD2=$%02X drv=%i step=%i motor=%i\n", |
1460 | space | |
1460 | space.machine().time().as_double(), space.machine().device("maincpu")->safe_pcbase(), data, | |
1461 | 1461 | thmfc1->drive, seek, motor )); |
1462 | 1462 | |
1463 | 1463 | if ( seek ) |
r17963 | r17964 | |
1478 | 1478 | |
1479 | 1479 | case 3: /* WDATA */ |
1480 | 1480 | thmfc1->wsync = data; |
1481 | if ( thmfc_floppy_is_qdd(dynamic_cast<device_image_interface *>(thmfc_floppy_image(space->machine())))) | |
1482 | thmfc_floppy_qdd_write_byte( space->machine(), data ); | |
1481 | if ( thmfc_floppy_is_qdd(dynamic_cast<device_image_interface *>(thmfc_floppy_image(space.machine())))) | |
1482 | thmfc_floppy_qdd_write_byte( space.machine(), data ); | |
1483 | 1483 | else if ( thmfc1->op==THMFC1_OP_WRITE_SECT ) |
1484 | thmfc_floppy_write_byte( space | |
1484 | thmfc_floppy_write_byte( space.machine(), data ); | |
1485 | 1485 | else if ( thmfc1->formatting ) |
1486 | thmfc_floppy_format_byte( space | |
1486 | thmfc_floppy_format_byte( space.machine(), data ); | |
1487 | 1487 | else |
1488 | 1488 | { |
1489 | 1489 | /* TODO: implement other forms of raw track writing */ |
1490 | 1490 | LOG (( "%f $%04x thmfc_floppy_w: ignored raw WDATA $%02X\n", |
1491 | space | |
1491 | space.machine().time().as_double(), space.machine().device("maincpu")->safe_pcbase(), data )); | |
1492 | 1492 | } |
1493 | 1493 | break; |
1494 | 1494 | |
r17963 | r17964 | |
1496 | 1496 | case 4: /* WCLK (unemulated) */ |
1497 | 1497 | /* clock configuration: FF for data, 0A for synchro */ |
1498 | 1498 | LOG (( "%f $%04x thmfc_floppy_w: WCLK=$%02X (%s)\n", |
1499 | space | |
1499 | space.machine().time().as_double(), space.machine().device("maincpu")->safe_pcbase(), data, | |
1500 | 1500 | (data == 0xff) ? "data" : (data == 0x0A) ? "synchro" : "?" )); |
1501 | 1501 | break; |
1502 | 1502 | |
1503 | 1503 | case 5: /* WSECT */ |
1504 | 1504 | thmfc1->sector = data; |
1505 | 1505 | LOG (( "%f $%04x thmfc_floppy_w: WSECT=%i\n", |
1506 | space | |
1506 | space.machine().time().as_double(), space.machine().device("maincpu")->safe_pcbase(), data )); | |
1507 | 1507 | break; |
1508 | 1508 | |
1509 | 1509 | case 6: /* WTRCK */ |
1510 | 1510 | thmfc1->track = data; |
1511 | 1511 | LOG (( "%f $%04x thmfc_floppy_w: WTRCK=%i (real=%i)\n", |
1512 | space->machine().time().as_double(), space->machine().device("maincpu")->safe_pcbase(), data, | |
1513 | floppy_drive_get_current_track( thmfc_floppy_image(space->machine()) ) )); | |
1512 | space.machine().time().as_double(), space.machine().device("maincpu")->safe_pcbase(), data, | |
1513 | floppy_drive_get_current_track( thmfc_floppy_image(space.machine()) ) )); | |
1514 | 1514 | break; |
1515 | 1515 | |
1516 | 1516 | case 7: /* WCELL */ |
1517 | 1517 | /* precompensation (unemulated) */ |
1518 | 1518 | LOG (( "%f $%04x thmfc_floppy_w: WCELL=$%02X\n", |
1519 | space | |
1519 | space.machine().time().as_double(), space.machine().device("maincpu")->safe_pcbase(), data )); | |
1520 | 1520 | break; |
1521 | 1521 | |
1522 | 1522 | default: |
1523 | 1523 | logerror ( "%f $%04x thmfc_floppy_w: invalid write offset %i (data=$%02X)\n", |
1524 | space | |
1524 | space.machine().time().as_double(), space.machine().device("maincpu")->safe_pcbase(), offset, data ); | |
1525 | 1525 | } |
1526 | 1526 | } |
1527 | 1527 | |
r17963 | r17964 | |
1715 | 1715 | static READ8_HANDLER ( to7_network_r ) |
1716 | 1716 | { |
1717 | 1717 | if ( offset < 4 ) |
1718 | return mc6854_r( space | |
1718 | return mc6854_r( space.machine().device("mc6854"), space, offset ); | |
1719 | 1719 | |
1720 | 1720 | if ( offset == 8 ) |
1721 | 1721 | { |
1722 | 1722 | /* network ID of the computer */ |
1723 | UINT8 id = space->machine().root_device().ioport("fconfig")->read() >> 3; | |
1724 | VLOG(( "%f $%04x to7_network_r: read id $%02X\n", space->machine().time().as_double(), space->machine().device("maincpu")->safe_pcbase(), id )); | |
1723 | UINT8 id = space.machine().root_device().ioport("fconfig")->read() >> 3; | |
1724 | VLOG(( "%f $%04x to7_network_r: read id $%02X\n", space.machine().time().as_double(), space.machine().device("maincpu")->safe_pcbase(), id )); | |
1725 | 1725 | return id; |
1726 | 1726 | } |
1727 | 1727 | |
1728 | logerror( "%f $%04x to7_network_r: invalid read offset %i\n", space | |
1728 | logerror( "%f $%04x to7_network_r: invalid read offset %i\n", space.machine().time().as_double(), space.machine().device("maincpu")->safe_pcbase(), offset ); | |
1729 | 1729 | return 0; |
1730 | 1730 | } |
1731 | 1731 | |
r17963 | r17964 | |
1734 | 1734 | static WRITE8_HANDLER ( to7_network_w ) |
1735 | 1735 | { |
1736 | 1736 | if ( offset < 4 ) |
1737 | mc6854_w( space | |
1737 | mc6854_w( space.machine().device("mc6854"), space, offset, data ); | |
1738 | 1738 | else |
1739 | 1739 | { |
1740 | 1740 | logerror( "%f $%04x to7_network_w: invalid write offset %i (data=$%02X)\n", |
1741 | space | |
1741 | space.machine().time().as_double(), space.machine().device("maincpu")->safe_pcbase(), offset, data ); | |
1742 | 1742 | } |
1743 | 1743 | } |
1744 | 1744 | |
r17963 | r17964 | |
1861 | 1861 | if ( offset == 8 ) |
1862 | 1862 | { |
1863 | 1863 | to7_floppy_bank = 3 + (data & 3); |
1864 | space | |
1864 | space.machine().root_device().membank( THOM_FLOP_BANK )->set_entry( to7_floppy_bank ); | |
1865 | 1865 | VLOG (( "to7_floppy_w: set CD 90-351 ROM bank to %i\n", data & 3 )); |
1866 | 1866 | } |
1867 | 1867 | else |
r17963 | r17964 | |
---|---|---|
405 | 405 | |
406 | 406 | static WRITE8_HANDLER( cbm8096_io_w ) |
407 | 407 | { |
408 | via6522_device *via_0 = space->machine().device<via6522_device>("via6522_0"); | |
409 | pia6821_device *pia_0 = space->machine().device<pia6821_device>("pia_0"); | |
410 | pia6821_device *pia_1 = space->machine().device<pia6821_device>("pia_1"); | |
411 | mc6845_device *mc6845 = space->machine().device<mc6845_device>("crtc"); | |
408 | via6522_device *via_0 = space.machine().device<via6522_device>("via6522_0"); | |
409 | pia6821_device *pia_0 = space.machine().device<pia6821_device>("pia_0"); | |
410 | pia6821_device *pia_1 = space.machine().device<pia6821_device>("pia_1"); | |
411 | mc6845_device *mc6845 = space.machine().device<mc6845_device>("crtc"); | |
412 | 412 | |
413 | 413 | if (offset < 0x10) ; |
414 | else if (offset < 0x14) pia_0->write( | |
414 | else if (offset < 0x14) pia_0->write(space, offset & 3, data); | |
415 | 415 | else if (offset < 0x20) ; |
416 | else if (offset < 0x24) pia_1->write( | |
416 | else if (offset < 0x24) pia_1->write(space, offset & 3, data); | |
417 | 417 | else if (offset < 0x40) ; |
418 | else if (offset < 0x50) via_0->write( | |
418 | else if (offset < 0x50) via_0->write(space, offset & 0xf, data); | |
419 | 419 | else if (offset < 0x80) ; |
420 | else if (offset == 0x80) mc6845->address_w(*space, 0, data); | |
421 | else if (offset == 0x81) mc6845->register_w(*space, 0, data); | |
420 | else if (offset == 0x80) mc6845->address_w(space, 0, data); | |
421 | else if (offset == 0x81) mc6845->register_w(space, 0, data); | |
422 | 422 | } |
423 | 423 | |
424 | 424 | static READ8_HANDLER( cbm8096_io_r ) |
425 | 425 | { |
426 | via6522_device *via_0 = space->machine().device<via6522_device>("via6522_0"); | |
427 | pia6821_device *pia_0 = space->machine().device<pia6821_device>("pia_0"); | |
428 | pia6821_device *pia_1 = space->machine().device<pia6821_device>("pia_1"); | |
429 | mc6845_device *mc6845 = space->machine().device<mc6845_device>("crtc"); | |
426 | via6522_device *via_0 = space.machine().device<via6522_device>("via6522_0"); | |
427 | pia6821_device *pia_0 = space.machine().device<pia6821_device>("pia_0"); | |
428 | pia6821_device *pia_1 = space.machine().device<pia6821_device>("pia_1"); | |
429 | mc6845_device *mc6845 = space.machine().device<mc6845_device>("crtc"); | |
430 | 430 | |
431 | 431 | int data = 0xff; |
432 | 432 | if (offset < 0x10) ; |
433 | else if (offset < 0x14) data = pia_0->read( | |
433 | else if (offset < 0x14) data = pia_0->read(space, offset & 3); | |
434 | 434 | else if (offset < 0x20) ; |
435 | else if (offset < 0x24) data = pia_1->read( | |
435 | else if (offset < 0x24) data = pia_1->read(space, offset & 3); | |
436 | 436 | else if (offset < 0x40) ; |
437 | else if (offset < 0x50) data = via_0->read( | |
437 | else if (offset < 0x50) data = via_0->read(space, offset & 0xf); | |
438 | 438 | else if (offset < 0x80) ; |
439 | else if (offset == 0x81) data = mc6845->register_r( | |
439 | else if (offset == 0x81) data = mc6845->register_r(space, 0); | |
440 | 440 | return data; |
441 | 441 | } |
442 | 442 | |
443 | 443 | static WRITE8_HANDLER( pet80_bank1_w ) |
444 | 444 | { |
445 | pet_state *state = space | |
445 | pet_state *state = space.machine().driver_data<pet_state>(); | |
446 | 446 | state->m_pet80_bank1_base[offset] = data; |
447 | 447 | } |
448 | 448 | |
r17963 | r17964 | |
459 | 459 | */ |
460 | 460 | WRITE8_HANDLER( cbm8096_w ) |
461 | 461 | { |
462 | pet_state *state = space | |
462 | pet_state *state = space.machine().driver_data<pet_state>(); | |
463 | 463 | if (data & 0x80) |
464 | 464 | { |
465 | 465 | if (data & 0x40) |
466 | 466 | { |
467 | space->install_legacy_read_handler(0xe800, 0xefff, FUNC(cbm8096_io_r)); | |
468 | space->install_legacy_write_handler(0xe800, 0xefff, FUNC(cbm8096_io_w)); | |
467 | space.install_legacy_read_handler(0xe800, 0xefff, FUNC(cbm8096_io_r)); | |
468 | space.install_legacy_write_handler(0xe800, 0xefff, FUNC(cbm8096_io_w)); | |
469 | 469 | } |
470 | 470 | else |
471 | 471 | { |
472 | space | |
472 | space.install_read_bank(0xe800, 0xefff, "bank7"); | |
473 | 473 | if (!(data & 2)) |
474 | space | |
474 | space.install_write_bank(0xe800, 0xefff, "bank7"); | |
475 | 475 | else |
476 | space | |
476 | space.nop_write(0xe800, 0xefff); | |
477 | 477 | } |
478 | 478 | |
479 | 479 | |
480 | 480 | if ((data & 2) == 0) { |
481 | space->install_write_bank(0xc000, 0xe7ff, "bank6"); | |
482 | space->install_write_bank(0xf000, 0xffef, "bank8"); | |
483 | space->install_write_bank(0xfff1, 0xffff, "bank9"); | |
481 | space.install_write_bank(0xc000, 0xe7ff, "bank6"); | |
482 | space.install_write_bank(0xf000, 0xffef, "bank8"); | |
483 | space.install_write_bank(0xfff1, 0xffff, "bank9"); | |
484 | 484 | } else { |
485 | space->nop_write(0xc000, 0xe7ff); | |
486 | space->nop_write(0xf000, 0xffef); | |
487 | space->nop_write(0xfff1, 0xffff); | |
485 | space.nop_write(0xc000, 0xe7ff); | |
486 | space.nop_write(0xf000, 0xffef); | |
487 | space.nop_write(0xfff1, 0xffff); | |
488 | 488 | } |
489 | 489 | |
490 | 490 | if (data & 0x20) |
491 | 491 | { |
492 | 492 | state->m_pet80_bank1_base = state->m_memory + 0x8000; |
493 | 493 | state->membank("bank1")->set_base(state->m_pet80_bank1_base); |
494 | space | |
494 | space.install_legacy_write_handler(0x8000, 0x8fff, FUNC(pet80_bank1_w)); | |
495 | 495 | } |
496 | 496 | else |
497 | 497 | { |
498 | 498 | if (!(data & 1)) |
499 | space | |
499 | space.install_write_bank(0x8000, 0x8fff, "bank1"); | |
500 | 500 | else |
501 | space | |
501 | space.nop_write(0x8000, 0x8fff); | |
502 | 502 | } |
503 | 503 | |
504 | 504 | if ((data & 1) == 0 ){ |
505 | space->install_write_bank(0x9000, 0x9fff, "bank2"); | |
506 | space->install_write_bank(0xa000, 0xafff, "bank3"); | |
507 | space->install_write_bank(0xb000, 0xbfff, "bank4"); | |
505 | space.install_write_bank(0x9000, 0x9fff, "bank2"); | |
506 | space.install_write_bank(0xa000, 0xafff, "bank3"); | |
507 | space.install_write_bank(0xb000, 0xbfff, "bank4"); | |
508 | 508 | } else { |
509 | space->nop_write(0x9000, 0x9fff); | |
510 | space->nop_write(0xa000, 0xafff); | |
511 | space->nop_write(0xb000, 0xbfff); | |
509 | space.nop_write(0x9000, 0x9fff); | |
510 | space.nop_write(0xa000, 0xafff); | |
511 | space.nop_write(0xb000, 0xbfff); | |
512 | 512 | } |
513 | 513 | |
514 | 514 | if (data & 4) |
r17963 | r17964 | |
559 | 559 | { |
560 | 560 | state->m_pet80_bank1_base = state->m_memory + 0x8000; |
561 | 561 | state->membank("bank1")->set_base(state->m_pet80_bank1_base ); |
562 | space | |
562 | space.install_legacy_write_handler(0x8000, 0x8fff, FUNC(pet80_bank1_w)); | |
563 | 563 | |
564 | 564 | state->membank("bank2")->set_base(state->m_memory + 0x9000); |
565 | space | |
565 | space.unmap_write(0x9000, 0x9fff); | |
566 | 566 | |
567 | 567 | state->membank("bank3")->set_base(state->m_memory + 0xa000); |
568 | space | |
568 | space.unmap_write(0xa000, 0xafff); | |
569 | 569 | |
570 | 570 | state->membank("bank4")->set_base(state->m_memory + 0xb000); |
571 | space | |
571 | space.unmap_write(0xb000, 0xbfff); | |
572 | 572 | |
573 | 573 | state->membank("bank6")->set_base(state->m_memory + 0xc000); |
574 | space | |
574 | space.unmap_write(0xc000, 0xe7ff); | |
575 | 575 | |
576 | space->install_legacy_read_handler(0xe800, 0xefff, FUNC(cbm8096_io_r)); | |
577 | space->install_legacy_write_handler(0xe800, 0xefff, FUNC(cbm8096_io_w)); | |
576 | space.install_legacy_read_handler(0xe800, 0xefff, FUNC(cbm8096_io_r)); | |
577 | space.install_legacy_write_handler(0xe800, 0xefff, FUNC(cbm8096_io_w)); | |
578 | 578 | |
579 | 579 | state->membank("bank8")->set_base(state->m_memory + 0xf000); |
580 | space | |
580 | space.unmap_write(0xf000, 0xffef); | |
581 | 581 | |
582 | 582 | state->membank("bank9")->set_base(state->m_memory + 0xfff1); |
583 | space | |
583 | space.unmap_write(0xfff1, 0xffff); | |
584 | 584 | } |
585 | 585 | } |
586 | 586 | |
r17963 | r17964 | |
591 | 591 | |
592 | 592 | WRITE8_HANDLER( superpet_w ) |
593 | 593 | { |
594 | pet_state *state = space | |
594 | pet_state *state = space.machine().driver_data<pet_state>(); | |
595 | 595 | switch (offset) |
596 | 596 | { |
597 | 597 | case 0: |
r17963 | r17964 | |
749 | 749 | { |
750 | 750 | machine().device("maincpu")->memory().space(AS_PROGRAM)->nop_write(0xfff0, 0xfff0); |
751 | 751 | } |
752 | cbm8096_w(machine().device("maincpu")->memory().space(AS_PROGRAM), 0, 0); | |
752 | cbm8096_w(*machine().device("maincpu")->memory().space(AS_PROGRAM), 0, 0); | |
753 | 753 | } |
754 | 754 | |
755 | 755 | //removed cbm_drive_0_config (machine().root_device().ioport("CFG")->read() & 2 ? IEEE : 0, 8); |
r17963 | r17964 | |
---|---|---|
427 | 427 | { |
428 | 428 | oric_state *state = machine.driver_data<oric_state>(); |
429 | 429 | device_t *fdc = machine.device("fdc"); |
430 | address_space | |
430 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
431 | 431 | |
432 | 432 | if (state->m_is_telestrat) |
433 | 433 | return; |
434 | 434 | |
435 | space->install_read_handler(0x0300, 0x030f, read8_delegate(FUNC(oric_state::oric_IO_r),state)); | |
436 | space->install_legacy_read_handler(*fdc, 0x0310, 0x031f, FUNC(applefdc_r)); | |
437 | space->install_read_bank(0x0320, 0x03ff, "bank4"); | |
435 | space.install_read_handler(0x0300, 0x030f, read8_delegate(FUNC(oric_state::oric_IO_r),state)); | |
436 | space.install_legacy_read_handler(*fdc, 0x0310, 0x031f, FUNC(applefdc_r)); | |
437 | space.install_read_bank(0x0320, 0x03ff, "bank4"); | |
438 | 438 | |
439 | space->install_write_handler(0x0300, 0x030f, write8_delegate(FUNC(oric_state::oric_IO_w),state)); | |
440 | space->install_legacy_write_handler(*fdc, 0x0310, 0x031f, FUNC(applefdc_w)); | |
439 | space.install_write_handler(0x0300, 0x030f, write8_delegate(FUNC(oric_state::oric_IO_w),state)); | |
440 | space.install_legacy_write_handler(*fdc, 0x0310, 0x031f, FUNC(applefdc_w)); | |
441 | 441 | state->membank("bank4")->set_base( state->memregion("maincpu")->base() + 0x014000 + 0x020); |
442 | 442 | } |
443 | 443 | |
r17963 | r17964 | |
446 | 446 | { |
447 | 447 | oric_state *state = machine.driver_data<oric_state>(); |
448 | 448 | int i; |
449 | address_space | |
449 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
450 | 450 | |
451 | 451 | if (state->m_is_telestrat) |
452 | 452 | return; |
r17963 | r17964 | |
455 | 455 | switch(i) { |
456 | 456 | case 1: |
457 | 457 | if (rd) { |
458 | space | |
458 | space.install_read_bank(0xc000, 0xdfff, "bank1"); | |
459 | 459 | } else { |
460 | space | |
460 | space.nop_read(0xc000, 0xdfff); | |
461 | 461 | } |
462 | 462 | if (wr) { |
463 | space | |
463 | space.install_write_bank(0xc000, 0xdfff, "bank5"); | |
464 | 464 | } else { |
465 | space | |
465 | space.unmap_write(0xc000, 0xdfff); | |
466 | 466 | } |
467 | 467 | break; |
468 | 468 | case 2: |
469 | 469 | if (rd) { |
470 | space | |
470 | space.install_read_bank(0xe000, 0xf7ff, "bank2"); | |
471 | 471 | } else { |
472 | space | |
472 | space.nop_read(0xe000, 0xf7ff); | |
473 | 473 | } |
474 | 474 | if (wr) { |
475 | space | |
475 | space.install_write_bank(0xe000, 0xf7ff, "bank6"); | |
476 | 476 | } else { |
477 | space | |
477 | space.unmap_write(0xe000, 0xf7ff); | |
478 | 478 | } |
479 | 479 | break; |
480 | 480 | case 3: |
481 | 481 | if (rd) { |
482 | space | |
482 | space.install_read_bank(0xf800, 0xffff, "bank3"); | |
483 | 483 | } else { |
484 | space | |
484 | space.nop_read(0xf800, 0xffff); | |
485 | 485 | } |
486 | 486 | break; |
487 | 487 | } |
r17963 | r17964 | |
551 | 551 | { |
552 | 552 | oric_state *state = machine.driver_data<oric_state>(); |
553 | 553 | device_t *fdc = machine.device("fdc"); |
554 | address_space | |
554 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
555 | 555 | |
556 | space->install_read_handler(0x0300, 0x030f, read8_delegate(FUNC(oric_state::oric_IO_r),state)); | |
557 | space->install_legacy_read_handler(*fdc, 0x0310, 0x031f, FUNC(applefdc_r)); | |
558 | space->install_read_bank(0x0320, 0x03ff, "bank4"); | |
556 | space.install_read_handler(0x0300, 0x030f, read8_delegate(FUNC(oric_state::oric_IO_r),state)); | |
557 | space.install_legacy_read_handler(*fdc, 0x0310, 0x031f, FUNC(applefdc_r)); | |
558 | space.install_read_bank(0x0320, 0x03ff, "bank4"); | |
559 | 559 | |
560 | space->install_write_handler(0x0300, 0x030f, write8_delegate(FUNC(oric_state::oric_IO_w),state)); | |
561 | space->install_legacy_write_handler(*fdc, 0x0310, 0x031f, FUNC(applefdc_w)); | |
562 | space->install_write_handler(0x0380, 0x0383, write8_delegate(FUNC(oric_state::apple2_v2_interface_w),state)); | |
560 | space.install_write_handler(0x0300, 0x030f, write8_delegate(FUNC(oric_state::oric_IO_w),state)); | |
561 | space.install_legacy_write_handler(*fdc, 0x0310, 0x031f, FUNC(applefdc_w)); | |
562 | space.install_write_handler(0x0380, 0x0383, write8_delegate(FUNC(oric_state::apple2_v2_interface_w),state)); | |
563 | 563 | |
564 | state->apple2_v2_interface_w( | |
564 | state->apple2_v2_interface_w(space, 0, 0); | |
565 | 565 | } |
566 | 566 | |
567 | 567 | /********************/ |
r17963 | r17964 | |
755 | 755 | static void oric_install_jasmin_interface(running_machine &machine) |
756 | 756 | { |
757 | 757 | oric_state *state = machine.driver_data<oric_state>(); |
758 | address_space | |
758 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
759 | 759 | /* romdis */ |
760 | 760 | state->m_port_3fb_w = 1; |
761 | 761 | oric_jasmin_set_mem_0x0c000(machine); |
762 | 762 | |
763 | space->install_read_handler(0x0300, 0x03ef, read8_delegate(FUNC(oric_state::oric_IO_r),state)); | |
764 | space->install_read_handler(0x03f0, 0x03ff, read8_delegate(FUNC(oric_state::oric_jasmin_r),state)); | |
763 | space.install_read_handler(0x0300, 0x03ef, read8_delegate(FUNC(oric_state::oric_IO_r),state)); | |
764 | space.install_read_handler(0x03f0, 0x03ff, read8_delegate(FUNC(oric_state::oric_jasmin_r),state)); | |
765 | 765 | |
766 | space->install_write_handler(0x0300, 0x03ef, write8_delegate(FUNC(oric_state::oric_IO_w),state)); | |
767 | space->install_write_handler(0x03f0, 0x03ff, write8_delegate(FUNC(oric_state::oric_jasmin_w),state)); | |
766 | space.install_write_handler(0x0300, 0x03ef, write8_delegate(FUNC(oric_state::oric_IO_w),state)); | |
767 | space.install_write_handler(0x03f0, 0x03ff, write8_delegate(FUNC(oric_state::oric_jasmin_w),state)); | |
768 | 768 | } |
769 | 769 | |
770 | 770 | /*********************************/ |
r17963 | r17964 | |
978 | 978 | static void oric_install_microdisc_interface(running_machine &machine) |
979 | 979 | { |
980 | 980 | oric_state *state = machine.driver_data<oric_state>(); |
981 | address_space | |
981 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
982 | 982 | |
983 | space->install_read_handler(0x0300, 0x030f, read8_delegate(FUNC(oric_state::oric_IO_r),state)); | |
984 | space->install_read_handler(0x0310, 0x031f, read8_delegate(FUNC(oric_state::oric_microdisc_r),state)); | |
985 | space->install_read_handler(0x0320, 0x03ff, read8_delegate(FUNC(oric_state::oric_IO_r),state)); | |
983 | space.install_read_handler(0x0300, 0x030f, read8_delegate(FUNC(oric_state::oric_IO_r),state)); | |
984 | space.install_read_handler(0x0310, 0x031f, read8_delegate(FUNC(oric_state::oric_microdisc_r),state)); | |
985 | space.install_read_handler(0x0320, 0x03ff, read8_delegate(FUNC(oric_state::oric_IO_r),state)); | |
986 | 986 | |
987 | space->install_write_handler(0x0300, 0x030f, write8_delegate(FUNC(oric_state::oric_IO_w),state)); | |
988 | space->install_write_handler(0x0310, 0x031f, write8_delegate(FUNC(oric_state::oric_microdisc_w),state)); | |
989 | space->install_write_handler(0x0320, 0x03ff, write8_delegate(FUNC(oric_state::oric_IO_w),state)); | |
987 | space.install_write_handler(0x0300, 0x030f, write8_delegate(FUNC(oric_state::oric_IO_w),state)); | |
988 | space.install_write_handler(0x0310, 0x031f, write8_delegate(FUNC(oric_state::oric_microdisc_w),state)); | |
989 | space.install_write_handler(0x0320, 0x03ff, write8_delegate(FUNC(oric_state::oric_IO_w),state)); | |
990 | 990 | |
991 | 991 | /* disable os rom, enable microdisc rom */ |
992 | 992 | /* 0x0c000-0x0dfff will be ram, 0x0e000-0x0ffff will be microdisc rom */ |
r17963 | r17964 | |
1064 | 1064 | void oric_state::machine_reset() |
1065 | 1065 | { |
1066 | 1066 | int disc_interface_id = machine().root_device().ioport("FLOPPY")->read() & 0x07; |
1067 | address_space | |
1067 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
1068 | 1068 | if (m_is_telestrat) |
1069 | 1069 | return; |
1070 | 1070 | |
r17963 | r17964 | |
1095 | 1095 | } |
1096 | 1096 | else |
1097 | 1097 | { |
1098 | space->install_read_handler(0x0300, 0x03ff, read8_delegate(FUNC(oric_state::oric_IO_r),this)); | |
1099 | space->install_write_handler(0x0300, 0x03ff, write8_delegate(FUNC(oric_state::oric_IO_w),this)); | |
1098 | space.install_read_handler(0x0300, 0x03ff, read8_delegate(FUNC(oric_state::oric_IO_r),this)); | |
1099 | space.install_write_handler(0x0300, 0x03ff, write8_delegate(FUNC(oric_state::oric_IO_w),this)); | |
1100 | 1100 | } |
1101 | 1101 | } |
1102 | 1102 | break; |
r17963 | r17964 | |
1246 | 1246 | static void telestrat_refresh_mem(running_machine &machine) |
1247 | 1247 | { |
1248 | 1248 | oric_state *state = machine.driver_data<oric_state>(); |
1249 | address_space | |
1249 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
1250 | 1250 | |
1251 | 1251 | telestrat_mem_block *mem_block = &state->m_telestrat_blocks[state->m_telestrat_bank_selection]; |
1252 | 1252 | |
r17963 | r17964 | |
1256 | 1256 | { |
1257 | 1257 | state->membank("bank1")->set_base(mem_block->ptr); |
1258 | 1258 | state->membank("bank2")->set_base(mem_block->ptr); |
1259 | space->install_read_bank(0xc000, 0xffff, "bank1"); | |
1260 | space->install_write_bank(0xc000, 0xffff, "bank2"); | |
1259 | space.install_read_bank(0xc000, 0xffff, "bank1"); | |
1260 | space.install_write_bank(0xc000, 0xffff, "bank2"); | |
1261 | 1261 | } |
1262 | 1262 | break; |
1263 | 1263 | |
1264 | 1264 | case TELESTRAT_MEM_BLOCK_ROM: |
1265 | 1265 | { |
1266 | 1266 | state->membank("bank1")->set_base(mem_block->ptr); |
1267 | space->install_read_bank(0xc000, 0xffff, "bank1"); | |
1268 | space->nop_write(0xc000, 0xffff); | |
1267 | space.install_read_bank(0xc000, 0xffff, "bank1"); | |
1268 | space.nop_write(0xc000, 0xffff); | |
1269 | 1269 | } |
1270 | 1270 | break; |
1271 | 1271 | |
1272 | 1272 | default: |
1273 | 1273 | case TELESTRAT_MEM_BLOCK_UNDEFINED: |
1274 | 1274 | { |
1275 | space | |
1275 | space.nop_readwrite(0xc000, 0xffff); | |
1276 | 1276 | } |
1277 | 1277 | break; |
1278 | 1278 | } |
r17963 | r17964 | |
---|---|---|
114 | 114 | } |
115 | 115 | // mode= data&0x10?AGA_COLOR:AGA_MONO; |
116 | 116 | // mode= data&0x10?AGA_COLOR:AGA_OFF; |
117 | pc_aga_set_mode(space | |
117 | pc_aga_set_mode(space.machine(), europc_jim.mode); | |
118 | 118 | if (data & 0x80) europc_jim.state = 0; |
119 | 119 | break; |
120 | 120 | case 4: |
121 | 121 | switch(data & 0xc0) |
122 | 122 | { |
123 | case 0x00: space->machine().device("maincpu")->set_clock_scale(1.0 / 2); break; | |
124 | case 0x40: space->machine().device("maincpu")->set_clock_scale(3.0 / 4); break; | |
125 | default: space->machine().device("maincpu")->set_clock_scale(1); break; | |
123 | case 0x00: space.machine().device("maincpu")->set_clock_scale(1.0 / 2); break; | |
124 | case 0x40: space.machine().device("maincpu")->set_clock_scale(3.0 / 4); break; | |
125 | default: space.machine().device("maincpu")->set_clock_scale(1); break; | |
126 | 126 | } |
127 | 127 | break; |
128 | 128 | case 0xa: |
r17963 | r17964 | |
178 | 178 | europc_pio.port61=data; |
179 | 179 | // if (data == 0x30) pc1640.port62 = (pc1640.port65 & 0x10) >> 4; |
180 | 180 | // else if (data == 0x34) pc1640.port62 = pc1640.port65 & 0xf; |
181 | pit8253_gate2_w(space->machine().device("pit8253"), BIT(data, 0)); | |
182 | pc_speaker_set_spkrdata(space->machine(), BIT(data, 1)); | |
181 | pit8253_gate2_w(space.machine().device("pit8253"), BIT(data, 0)); | |
182 | pc_speaker_set_spkrdata(space.machine(), BIT(data, 1)); | |
183 | 183 | pc_keyb_set_clock(BIT(data, 6)); |
184 | 184 | break; |
185 | 185 | } |
r17963 | r17964 | |
201 | 201 | data = europc_pio.port61; |
202 | 202 | break; |
203 | 203 | case 2: |
204 | if (pit8253_get_output(space | |
204 | if (pit8253_get_output(space.machine().device("pit8253"), 2)) | |
205 | 205 | data |= 0x20; |
206 | 206 | break; |
207 | 207 | } |
r17963 | r17964 | |
---|---|---|
170 | 170 | |
171 | 171 | void vector06_state::machine_reset() |
172 | 172 | { |
173 | address_space | |
173 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
174 | 174 | |
175 | 175 | machine().device("maincpu")->execute().set_irq_acknowledge_callback(vector06_irq_callback); |
176 | space->install_read_bank (0x0000, 0x7fff, "bank1"); | |
177 | space->install_write_bank(0x0000, 0x7fff, "bank2"); | |
178 | space->install_read_bank (0x8000, 0xffff, "bank3"); | |
179 | space->install_write_bank(0x8000, 0xffff, "bank4"); | |
176 | space.install_read_bank (0x0000, 0x7fff, "bank1"); | |
177 | space.install_write_bank(0x0000, 0x7fff, "bank2"); | |
178 | space.install_read_bank (0x8000, 0xffff, "bank3"); | |
179 | space.install_write_bank(0x8000, 0xffff, "bank4"); | |
180 | 180 | |
181 | 181 | membank("bank1")->set_base(memregion("maincpu")->base() + 0x10000); |
182 | 182 | membank("bank2")->set_base(machine().device<ram_device>(RAM_TAG)->pointer() + 0x0000); |
r17963 | r17964 | |
---|---|---|
306 | 306 | { |
307 | 307 | device_t *cpu = image.device().machine().device("maincpu"); |
308 | 308 | UINT8 *RAM = image.device().machine().root_device().memregion(cpu->tag())->base(); |
309 | address_space | |
309 | address_space &space = *cpu->memory().space(AS_PROGRAM); | |
310 | 310 | UINT8 header[28]; |
311 | 311 | unsigned char s_byte; |
312 | 312 | |
r17963 | r17964 | |
325 | 325 | for (int i = 0; i < 0xc000; i++) |
326 | 326 | { |
327 | 327 | image.fread( &s_byte, 1); |
328 | space | |
328 | space.write_byte(i, s_byte); | |
329 | 329 | } |
330 | 330 | image.fread( RAM+0xc000, 0x4000); |
331 | 331 | |
r17963 | r17964 | |
360 | 360 | |
361 | 361 | UINT16 endmem = 0xbfff; |
362 | 362 | |
363 | address_space | |
363 | address_space &space = *m_maincpu->space(AS_PROGRAM); | |
364 | 364 | /* configure RAM */ |
365 | 365 | switch (m_ram->size()) |
366 | 366 | { |
367 | 367 | case 8*1024: |
368 | space | |
368 | space.unmap_readwrite(0x2000, endmem); | |
369 | 369 | break; |
370 | 370 | |
371 | 371 | case 16*1024: |
372 | space | |
372 | space.unmap_readwrite(0x4000, endmem); | |
373 | 373 | break; |
374 | 374 | |
375 | 375 | case 32*1024: |
376 | space | |
376 | space.unmap_readwrite(0x8000, endmem); | |
377 | 377 | break; |
378 | 378 | } |
379 | 379 | } |
r17963 | r17964 | |
387 | 387 | |
388 | 388 | UINT16 endmem = 0xbbff; |
389 | 389 | |
390 | address_space | |
390 | address_space &space = *m_maincpu->space(AS_PROGRAM); | |
391 | 391 | /* configure RAM */ |
392 | 392 | switch (m_ram->size()) |
393 | 393 | { |
394 | 394 | case 8*1024: |
395 | space | |
395 | space.unmap_readwrite(0x2000, endmem); | |
396 | 396 | break; |
397 | 397 | |
398 | 398 | case 16*1024: |
399 | space | |
399 | space.unmap_readwrite(0x4000, endmem); | |
400 | 400 | break; |
401 | 401 | |
402 | 402 | case 32*1024: |
403 | space | |
403 | space.unmap_readwrite(0x8000, endmem); | |
404 | 404 | break; |
405 | 405 | } |
406 | 406 | } |
407 | 407 | |
408 | 408 | void sorcerer_state::machine_reset() |
409 | 409 | { |
410 | address_space | |
410 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
411 | 411 | |
412 | 412 | /* Initialize cassette interface */ |
413 | 413 | m_cass_data.output.length = 0; |
r17963 | r17964 | |
416 | 416 | m_cass_data.input.bit = 1; |
417 | 417 | |
418 | 418 | m_fe = 0xff; |
419 | sorcerer_fe_w( | |
419 | sorcerer_fe_w(space, 0, 0, 0xff); | |
420 | 420 | |
421 | 421 | membank("boot")->set_entry(1); |
422 | 422 | machine().scheduler().timer_set(attotime::from_usec(10), FUNC(sorcerer_reset)); |
r17963 | r17964 | |
---|---|---|
68 | 68 | device_t* cpu = machine().device("maincpu"); |
69 | 69 | UINT8* ROM; |
70 | 70 | astring temp; |
71 | address_space | |
71 | address_space& space = *cpu->memory().space(AS_PROGRAM); | |
72 | 72 | m_slot = dynamic_cast<x68k_expansion_slot_device *>(owner()); |
73 | space->install_read_bank(0xea0020,0xea1fff,0,0,"scsi_ext"); | |
74 | space->unmap_write(0xea0020,0xea1fff,0,0); | |
73 | space.install_read_bank(0xea0020,0xea1fff,0,0,"scsi_ext"); | |
74 | space.unmap_write(0xea0020,0xea1fff,0,0); | |
75 | 75 | ROM = machine().root_device().memregion(subtag(temp,"scsiexrom"))->base(); |
76 | 76 | machine().root_device().membank("scsi_ext")->set_base(ROM); |
77 | space | |
77 | space.install_readwrite_handler(0xea0000,0xea001f,0,0,read8_delegate(FUNC(x68k_scsiext_device::register_r),this),write8_delegate(FUNC(x68k_scsiext_device::register_w),this),0x00ff00ff); | |
78 | 78 | } |
79 | 79 | |
80 | 80 | void x68k_scsiext_device::device_reset() |
r17963 | r17964 | |
---|---|---|
112 | 112 | |
113 | 113 | static WRITE16_HANDLER( amiga_ar1_chipmem_w ) |
114 | 114 | { |
115 | amiga_state *state = space->machine().driver_data<amiga_state>(); | |
116 | int pc = space->device().safe_pc(); | |
115 | amiga_state *state = space.machine().driver_data<amiga_state>(); | |
116 | int pc = space.device().safe_pc(); | |
117 | 117 | |
118 | 118 | /* see if we're inside the AR1 rom */ |
119 | 119 | if ( ((pc >> 16) & 0xff ) != 0xf0 ) |
r17963 | r17964 | |
124 | 124 | { |
125 | 125 | /* trigger an NMI or spurious irq */ |
126 | 126 | amigacrt.ar1_spurious = (offset == 0x60/2) ? 0 : 1; |
127 | space | |
127 | space.machine().scheduler().timer_set(space.machine().device<cpu_device>("maincpu")->cycles_to_attotime(28), FUNC(amiga_ar1_delayed_nmi)); | |
128 | 128 | } |
129 | 129 | } |
130 | 130 | |
r17963 | r17964 | |
192 | 192 | |
193 | 193 | static READ16_HANDLER( amiga_ar23_cia_r ) |
194 | 194 | { |
195 | int pc = space | |
195 | int pc = space.device().safe_pc(); | |
196 | 196 | |
197 | 197 | if ( ACCESSING_BITS_0_7 && offset == 2048 && pc >= 0x40 && pc < 0x120 ) |
198 | 198 | { |
199 | amiga_ar23_freeze(space | |
199 | amiga_ar23_freeze(space.machine()); | |
200 | 200 | } |
201 | 201 | |
202 | 202 | return amiga_cia_r( space, offset, mem_mask ); |
r17963 | r17964 | |
206 | 206 | { |
207 | 207 | if ( data & 2 ) |
208 | 208 | { |
209 | space | |
209 | space.install_legacy_read_handler(0xbfd000, 0xbfefff, FUNC(amiga_ar23_cia_r)); | |
210 | 210 | } |
211 | 211 | else |
212 | 212 | { |
213 | space | |
213 | space.install_legacy_read_handler(0xbfd000, 0xbfefff, FUNC(amiga_cia_r)); | |
214 | 214 | } |
215 | 215 | |
216 | 216 | amigacrt.ar23_mode = (data&0x3); |
r17963 | r17964 | |
221 | 221 | |
222 | 222 | static READ16_HANDLER( amiga_ar23_mode_r ) |
223 | 223 | { |
224 | amiga_state *state = space | |
224 | amiga_state *state = space.machine().driver_data<amiga_state>(); | |
225 | 225 | UINT16 *mem = (UINT16 *)(*state->memregion( "user2" )); |
226 | 226 | |
227 | 227 | if ( ACCESSING_BITS_0_7 ) |
r17963 | r17964 | |
241 | 241 | } |
242 | 242 | |
243 | 243 | /* overlay disabled, map RAM on 0x000000 */ |
244 | space | |
244 | space.install_write_bank(0x000000, state->m_chip_ram.bytes() - 1, 0, mirror_mask, "bank1"); | |
245 | 245 | } |
246 | 246 | } |
247 | 247 | |
r17963 | r17964 | |
250 | 250 | |
251 | 251 | static WRITE16_HANDLER( amiga_ar23_chipmem_w ) |
252 | 252 | { |
253 | amiga_state *state = space | |
253 | amiga_state *state = space.machine().driver_data<amiga_state>(); | |
254 | 254 | if ( offset == (0x08/2) ) |
255 | 255 | { |
256 | 256 | if ( amigacrt.ar23_mode & 1 ) |
257 | amiga_ar23_freeze(space | |
257 | amiga_ar23_freeze(space.machine()); | |
258 | 258 | } |
259 | 259 | |
260 | 260 | (*state->m_chip_ram_w)(state, offset * 2, data ); |
r17963 | r17964 | |
299 | 299 | #if 0 |
300 | 300 | static WRITE16_HANDLER( amiga_ar23_custom_w ) |
301 | 301 | { |
302 | int pc = space | |
302 | int pc = space.device().safe_pc(); | |
303 | 303 | |
304 | 304 | /* see if we're inside the AR2 rom */ |
305 | 305 | if ( ((pc >> 16) & 0xfe ) != 0x40 ) |
r17963 | r17964 | |
320 | 320 | { |
321 | 321 | UINT16 data = amiga_custom_r( offset, mem_mask ); |
322 | 322 | |
323 | int pc = space | |
323 | int pc = space.device().safe_pc(); | |
324 | 324 | |
325 | 325 | /* see if we're inside the AR2 rom */ |
326 | 326 | if ( ((pc >> 16) & 0xfe ) != 0x40 ) |
r17963 | r17964 | |
---|---|---|
426 | 426 | void osborne1_state::machine_reset() |
427 | 427 | { |
428 | 428 | int drive; |
429 | address_space | |
429 | address_space& space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
430 | 430 | /* Initialize memory configuration */ |
431 | osborne1_bankswitch_w( | |
431 | osborne1_bankswitch_w( space, 0x00, 0 ); | |
432 | 432 | |
433 | 433 | m_pia_0_irq_state = FALSE; |
434 | 434 | m_pia_1_irq_state = FALSE; |
r17963 | r17964 | |
441 | 441 | for(drive=0;drive<2;drive++) |
442 | 442 | floppy_install_load_proc(floppy_get_device(machine(), drive), osborne1_load_proc); |
443 | 443 | |
444 | space | |
444 | space.set_direct_update_handler(direct_update_delegate(FUNC(osborne1_state::osborne1_opbase), this)); | |
445 | 445 | } |
446 | 446 | |
447 | 447 | |
r17963 | r17964 | |
524 | 524 | osborne1_state *state = machine().driver_data<osborne1_state>(); |
525 | 525 | /* Enable ROM and I/O when IRQ is acknowledged */ |
526 | 526 | UINT8 old_bankswitch = state->m_bankswitch; |
527 | address_space | |
527 | address_space& space = *device().machine().device("maincpu")->memory().space(AS_PROGRAM); | |
528 | 528 | |
529 | state->osborne1_bankswitch_w( | |
529 | state->osborne1_bankswitch_w( space, 0, 0 ); | |
530 | 530 | state->m_bankswitch = old_bankswitch; |
531 | 531 | state->m_in_irq_handler = 1; |
532 | 532 | return 0xF8; |
r17963 | r17964 | |
---|---|---|
1196 | 1196 | } |
1197 | 1197 | else // CPC+/GX4000 |
1198 | 1198 | { |
1199 | //address_space | |
1199 | //address_space &space = *state->m_maincpu->space(AS_PROGRAM); | |
1200 | 1200 | |
1201 | 1201 | /* if ( state->m_asic.enabled && ( state->m_asic.rmr2 & 0x18 ) == 0x18 ) |
1202 | 1202 | { |
1203 | space->install_read_handler(0x4000, 0x5fff, read8_delegate(FUNC(amstrad_state::amstrad_plus_asic_4000_r),state)); | |
1204 | space->install_read_handler(0x6000, 0x7fff, read8_delegate(FUNC(amstrad_state::amstrad_plus_asic_6000_r),state)); | |
1205 | space->install_write_handler(0x4000, 0x5fff, write8_delegate(FUNC(amstrad_state::amstrad_plus_asic_4000_w),state)); | |
1206 | space->install_write_handler(0x6000, 0x7fff, write8_delegate(FUNC(amstrad_state::amstrad_plus_asic_6000_w),state)); | |
1203 | space.install_read_handler(0x4000, 0x5fff, read8_delegate(FUNC(amstrad_state::amstrad_plus_asic_4000_r),state)); | |
1204 | space.install_read_handler(0x6000, 0x7fff, read8_delegate(FUNC(amstrad_state::amstrad_plus_asic_6000_r),state)); | |
1205 | space.install_write_handler(0x4000, 0x5fff, write8_delegate(FUNC(amstrad_state::amstrad_plus_asic_4000_w),state)); | |
1206 | space.install_write_handler(0x6000, 0x7fff, write8_delegate(FUNC(amstrad_state::amstrad_plus_asic_6000_w),state)); | |
1207 | 1207 | } |
1208 | 1208 | else |
1209 | 1209 | { |
1210 | space->install_read_bank(0x4000, 0x5fff, "bank3"); | |
1211 | space->install_read_bank(0x6000, 0x7fff, "bank4"); | |
1212 | space->install_write_bank(0x4000, 0x5fff, "bank11"); | |
1213 | space->install_write_bank(0x6000, 0x7fff, "bank12"); | |
1210 | space.install_read_bank(0x4000, 0x5fff, "bank3"); | |
1211 | space.install_read_bank(0x6000, 0x7fff, "bank4"); | |
1212 | space.install_write_bank(0x4000, 0x5fff, "bank11"); | |
1213 | space.install_write_bank(0x6000, 0x7fff, "bank12"); | |
1214 | 1214 | } |
1215 | 1215 | */ |
1216 | 1216 | if(state->m_AmstradCPC_RamBanks[0] != NULL) |
r17963 | r17964 | |
---|---|---|
27 | 27 | #define LGUN_X_INTERVAL 4 |
28 | 28 | |
29 | 29 | |
30 | static void setup_rom(address_space | |
30 | static void setup_rom(address_space &space); | |
31 | 31 | |
32 | 32 | |
33 | 33 | static TIMER_CALLBACK( rapid_fire_callback ) |
r17963 | r17964 | |
427 | 427 | } |
428 | 428 | |
429 | 429 | |
430 | static void sms_vdp_hcount_latch( address_space | |
430 | static void sms_vdp_hcount_latch( address_space &space ) | |
431 | 431 | { |
432 | sms_state *state = space->machine().driver_data<sms_state>(); | |
433 | UINT8 value = sms_vdp_hcount(space->machine()); | |
432 | sms_state *state = space.machine().driver_data<sms_state>(); | |
433 | UINT8 value = sms_vdp_hcount(space.machine()); | |
434 | 434 | |
435 | state->m_vdp->hcount_latch_write( | |
435 | state->m_vdp->hcount_latch_write(space, 0, value); | |
436 | 436 | } |
437 | 437 | |
438 | 438 | |
r17963 | r17964 | |
556 | 556 | } |
557 | 557 | |
558 | 558 | |
559 | static void sms_get_inputs( address_space | |
559 | static void sms_get_inputs( address_space &space ) | |
560 | 560 | { |
561 | sms_state *state = space | |
561 | sms_state *state = space.machine().driver_data<sms_state>(); | |
562 | 562 | UINT8 data = 0x00; |
563 | UINT32 cpu_cycles = downcast<cpu_device *>(&space->device())->total_cycles(); | |
564 | running_machine &machine = space->machine(); | |
563 | UINT32 cpu_cycles = downcast<cpu_device *>(&space.device())->total_cycles(); | |
564 | running_machine &machine = space.machine(); | |
565 | 565 | |
566 | 566 | state->m_input_port0 = 0xff; |
567 | 567 | state->m_input_port1 = 0xff; |
r17963 | r17964 | |
722 | 722 | } |
723 | 723 | else |
724 | 724 | { |
725 | sms_get_inputs( | |
725 | sms_get_inputs(space); | |
726 | 726 | return m_input_port0; |
727 | 727 | } |
728 | 728 | } |
r17963 | r17964 | |
753 | 753 | |
754 | 754 | if (hcount_latch) |
755 | 755 | { |
756 | sms_vdp_hcount_latch( | |
756 | sms_vdp_hcount_latch(space); | |
757 | 757 | } |
758 | 758 | |
759 | 759 | m_ctrl_reg = data; |
r17963 | r17964 | |
808 | 808 | } |
809 | 809 | else |
810 | 810 | { |
811 | sms_get_inputs( | |
811 | sms_get_inputs(space); | |
812 | 812 | return m_input_port0; |
813 | 813 | } |
814 | 814 | } |
r17963 | r17964 | |
820 | 820 | if (m_bios_port & IO_CHIP) |
821 | 821 | return 0xff; |
822 | 822 | |
823 | sms_get_inputs( | |
823 | sms_get_inputs(space); | |
824 | 824 | |
825 | 825 | /* Reset Button */ |
826 | 826 | m_input_port1 = (m_input_port1 & 0xef) | (ioport("RESET")->read_safe(0x01) & 0x01) << 4; |
r17963 | r17964 | |
1228 | 1228 | |
1229 | 1229 | logerror("bios write %02x, pc: %04x\n", data, space.device().safe_pc()); |
1230 | 1230 | |
1231 | setup_rom( | |
1231 | setup_rom(space); | |
1232 | 1232 | } |
1233 | 1233 | |
1234 | 1234 | |
r17963 | r17964 | |
1363 | 1363 | } |
1364 | 1364 | |
1365 | 1365 | |
1366 | static void setup_rom( address_space | |
1366 | static void setup_rom( address_space &space ) | |
1367 | 1367 | { |
1368 | sms_state *state = space | |
1368 | sms_state *state = space.machine().driver_data<sms_state>(); | |
1369 | 1369 | |
1370 | 1370 | /* 1. set up bank pointers to point to nothing */ |
1371 | 1371 | state->membank("bank1")->set_base(state->m_banking_none); |
r17963 | r17964 | |
1950 | 1950 | |
1951 | 1951 | MACHINE_RESET_MEMBER(sms_state,sms) |
1952 | 1952 | { |
1953 | address_space | |
1953 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
1954 | 1954 | |
1955 | 1955 | m_ctrl_reg = 0xff; |
1956 | 1956 | if (m_has_fm) |
1957 | 1957 | m_fm_detect = 0x01; |
1958 | 1958 | |
1959 | m_mapper_ram = (UINT8*)space | |
1959 | m_mapper_ram = (UINT8*)space.get_write_ptr(0xdffc); | |
1960 | 1960 | |
1961 | 1961 | m_bios_port = 0; |
1962 | 1962 | |
1963 | 1963 | if ( m_cartridge[m_current_cartridge].features & CF_CODEMASTERS_MAPPER ) |
1964 | 1964 | { |
1965 | 1965 | /* Install special memory handlers */ |
1966 | space->install_write_handler(0x0000, 0x0000, write8_delegate(FUNC(sms_state::sms_codemasters_page0_w),this)); | |
1967 | space->install_write_handler(0x4000, 0x4000, write8_delegate(FUNC(sms_state::sms_codemasters_page1_w),this)); | |
1966 | space.install_write_handler(0x0000, 0x0000, write8_delegate(FUNC(sms_state::sms_codemasters_page0_w),this)); | |
1967 | space.install_write_handler(0x4000, 0x4000, write8_delegate(FUNC(sms_state::sms_codemasters_page1_w),this)); | |
1968 | 1968 | } |
1969 | 1969 | |
1970 | 1970 | if ( m_cartridge[m_current_cartridge].features & CF_KOREAN_ZEMINA_MAPPER ) |
1971 | 1971 | { |
1972 | space | |
1972 | space.install_write_handler(0x0000, 0x0003, write8_delegate(FUNC(sms_state::sms_korean_zemina_banksw_w),this)); | |
1973 | 1973 | } |
1974 | 1974 | |
1975 | 1975 | if ( m_cartridge[m_current_cartridge].features & CF_JANGGUN_MAPPER ) |
1976 | 1976 | { |
1977 | space->install_write_handler(0x4000, 0x4000, write8_delegate(FUNC(sms_state::sms_janggun_bank0_w),this)); | |
1978 | space->install_write_handler(0x6000, 0x6000, write8_delegate(FUNC(sms_state::sms_janggun_bank1_w),this)); | |
1979 | space->install_write_handler(0x8000, 0x8000, write8_delegate(FUNC(sms_state::sms_janggun_bank2_w),this)); | |
1980 | space->install_write_handler(0xA000, 0xA000,write8_delegate(FUNC(sms_state::sms_janggun_bank3_w),this)); | |
1977 | space.install_write_handler(0x4000, 0x4000, write8_delegate(FUNC(sms_state::sms_janggun_bank0_w),this)); | |
1978 | space.install_write_handler(0x6000, 0x6000, write8_delegate(FUNC(sms_state::sms_janggun_bank1_w),this)); | |
1979 | space.install_write_handler(0x8000, 0x8000, write8_delegate(FUNC(sms_state::sms_janggun_bank2_w),this)); | |
1980 | space.install_write_handler(0xA000, 0xA000,write8_delegate(FUNC(sms_state::sms_janggun_bank3_w),this)); | |
1981 | 1981 | } |
1982 | 1982 | |
1983 | 1983 | if ( m_cartridge[m_current_cartridge].features & CF_4PAK_MAPPER ) |
1984 | 1984 | { |
1985 | space->install_write_handler(0x3ffe, 0x3ffe, write8_delegate(FUNC(sms_state::sms_4pak_page0_w),this)); | |
1986 | space->install_write_handler(0x7fff, 0x7fff, write8_delegate(FUNC(sms_state::sms_4pak_page1_w),this)); | |
1987 | space->install_write_handler(0xbfff, 0xbfff, write8_delegate(FUNC(sms_state::sms_4pak_page2_w),this)); | |
1985 | space.install_write_handler(0x3ffe, 0x3ffe, write8_delegate(FUNC(sms_state::sms_4pak_page0_w),this)); | |
1986 | space.install_write_handler(0x7fff, 0x7fff, write8_delegate(FUNC(sms_state::sms_4pak_page1_w),this)); | |
1987 | space.install_write_handler(0xbfff, 0xbfff, write8_delegate(FUNC(sms_state::sms_4pak_page2_w),this)); | |
1988 | 1988 | } |
1989 | 1989 | |
1990 | 1990 | if ( m_cartridge[m_current_cartridge].features & CF_TVDRAW ) |
1991 | 1991 | { |
1992 | space->install_write_handler(0x6000, 0x6000, write8_delegate(FUNC(sms_state::sms_tvdraw_axis_w),this)); | |
1993 | space->install_read_handler(0x8000, 0x8000, read8_delegate(FUNC(sms_state::sms_tvdraw_status_r),this)); | |
1994 | space->install_read_handler(0xa000, 0xa000, read8_delegate(FUNC(sms_state::sms_tvdraw_data_r),this)); | |
1995 | space->nop_write(0xa000, 0xa000); | |
1992 | space.install_write_handler(0x6000, 0x6000, write8_delegate(FUNC(sms_state::sms_tvdraw_axis_w),this)); | |
1993 | space.install_read_handler(0x8000, 0x8000, read8_delegate(FUNC(sms_state::sms_tvdraw_status_r),this)); | |
1994 | space.install_read_handler(0xa000, 0xa000, read8_delegate(FUNC(sms_state::sms_tvdraw_data_r),this)); | |
1995 | space.nop_write(0xa000, 0xa000); | |
1996 | 1996 | m_cartridge[m_current_cartridge].m_tvdraw_data = 0; |
1997 | 1997 | } |
1998 | 1998 | |
1999 | 1999 | if ( m_cartridge[m_current_cartridge].features & CF_93C46_EEPROM ) |
2000 | 2000 | { |
2001 | space->install_write_handler(0x8000,0x8000, write8_delegate(FUNC(sms_state::sms_93c46_w),this)); | |
2002 | space->install_read_handler(0x8000,0x8000, read8_delegate(FUNC(sms_state::sms_93c46_r),this)); | |
2001 | space.install_write_handler(0x8000,0x8000, write8_delegate(FUNC(sms_state::sms_93c46_w),this)); | |
2002 | space.install_read_handler(0x8000,0x8000, read8_delegate(FUNC(sms_state::sms_93c46_r),this)); | |
2003 | 2003 | } |
2004 | 2004 | |
2005 | 2005 | if (m_cartridge[m_current_cartridge].features & CF_GG_SMS_MODE) |
r17963 | r17964 | |
2061 | 2061 | |
2062 | 2062 | setup_cart_banks(machine()); |
2063 | 2063 | membank("bank10")->set_base(m_banking_cart[3] + 0x2000); |
2064 | setup_rom( | |
2064 | setup_rom(space); | |
2065 | 2065 | } |
2066 | 2066 | |
2067 | 2067 |
r17963 | r17964 | |
---|---|---|
718 | 718 | { |
719 | 719 | LOG_MMC(("uxrom_w, offset: %04x, data: %02x\n", offset, data)); |
720 | 720 | |
721 | prg16_89ab(space | |
721 | prg16_89ab(space.machine(), data); | |
722 | 722 | } |
723 | 723 | |
724 | 724 | /************************************************************* |
r17963 | r17964 | |
741 | 741 | { |
742 | 742 | LOG_MMC(("uxrom_cc_w, offset: %04x, data: %02x\n", offset, data)); |
743 | 743 | |
744 | prg16_cdef(space | |
744 | prg16_cdef(space.machine(), data); | |
745 | 745 | } |
746 | 746 | |
747 | 747 | /************************************************************* |
r17963 | r17964 | |
764 | 764 | { |
765 | 765 | LOG_MMC(("un1rom_w, offset: %04x, data: %02x\n", offset, data)); |
766 | 766 | |
767 | prg16_89ab(space | |
767 | prg16_89ab(space.machine(), data >> 2); | |
768 | 768 | } |
769 | 769 | |
770 | 770 | /************************************************************* |
r17963 | r17964 | |
793 | 793 | |
794 | 794 | static WRITE8_HANDLER( cnrom_w ) |
795 | 795 | { |
796 | nes_state *state = space | |
796 | nes_state *state = space.machine().driver_data<nes_state>(); | |
797 | 797 | LOG_MMC(("cnrom_w, offset: %04x, data: %02x\n", offset, data)); |
798 | 798 | |
799 | 799 | if (state->m_ce_mask) |
800 | 800 | { |
801 | chr8(space | |
801 | chr8(space.machine(), data & ~state->m_ce_mask, CHRROM); | |
802 | 802 | |
803 | 803 | if ((data & state->m_ce_mask) == state->m_ce_state) |
804 | 804 | state->m_chr_open_bus = 0; |
r17963 | r17964 | |
806 | 806 | state->m_chr_open_bus = 1; |
807 | 807 | } |
808 | 808 | else |
809 | chr8(space | |
809 | chr8(space.machine(), data, CHRROM); | |
810 | 810 | } |
811 | 811 | |
812 | 812 | /************************************************************* |
r17963 | r17964 | |
849 | 849 | static WRITE8_HANDLER( cprom_w ) |
850 | 850 | { |
851 | 851 | LOG_MMC(("cprom_w, offset: %04x, data: %02x\n", offset, data)); |
852 | chr4_4(space | |
852 | chr4_4(space.machine(), data, CHRRAM); | |
853 | 853 | } |
854 | 854 | |
855 | 855 | /************************************************************* |
r17963 | r17964 | |
872 | 872 | { |
873 | 873 | LOG_MMC(("axrom_w, offset: %04x, data: %02x\n", offset, data)); |
874 | 874 | |
875 | set_nt_mirroring(space->machine(), BIT(data, 4) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW); | |
876 | prg32(space->machine(), data); | |
875 | set_nt_mirroring(space.machine(), BIT(data, 4) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW); | |
876 | prg32(space.machine(), data); | |
877 | 877 | } |
878 | 878 | |
879 | 879 | /************************************************************* |
r17963 | r17964 | |
894 | 894 | /* Deadly Towers is really a BxROM game - the demo screens look wrong using mapper 7. */ |
895 | 895 | LOG_MMC(("bxrom_w, offset: %04x, data: %02x\n", offset, data)); |
896 | 896 | |
897 | prg32(space | |
897 | prg32(space.machine(), data); | |
898 | 898 | } |
899 | 899 | |
900 | 900 | /************************************************************* |
r17963 | r17964 | |
913 | 913 | { |
914 | 914 | LOG_MMC(("gxrom_w, offset %04x, data: %02x\n", offset, data)); |
915 | 915 | |
916 | prg32(space->machine(), (data & 0xf0) >> 4); | |
917 | chr8(space->machine(), data & 0x0f, CHRROM); | |
916 | prg32(space.machine(), (data & 0xf0) >> 4); | |
917 | chr8(space.machine(), data & 0x0f, CHRROM); | |
918 | 918 | } |
919 | 919 | |
920 | 920 | /************************************************************* |
r17963 | r17964 | |
933 | 933 | } |
934 | 934 | |
935 | 935 | |
936 | static void mmc1_set_wram( address_space | |
936 | static void mmc1_set_wram( address_space &space, int board ) | |
937 | 937 | { |
938 | running_machine &machine = space | |
938 | running_machine &machine = space.machine(); | |
939 | 939 | nes_state *state = machine.driver_data<nes_state>(); |
940 | 940 | UINT8 bank = BIT(state->m_mmc_reg[0], 4) ? BIT(state->m_mmc_reg[1], 4) : BIT(state->m_mmc_reg[1], 3); |
941 | 941 | |
r17963 | r17964 | |
943 | 943 | { |
944 | 944 | case STD_SXROM: // here also reads are disabled! |
945 | 945 | if (!BIT(state->m_mmc_reg[3], 4)) |
946 | space | |
946 | space.install_readwrite_bank(0x6000, 0x7fff, "bank5"); | |
947 | 947 | else |
948 | 948 | { |
949 | space | |
949 | space.unmap_readwrite(0x6000, 0x7fff); | |
950 | 950 | break; |
951 | 951 | } |
952 | 952 | case STD_SXROM_A: // ignore WRAM enable bit |
r17963 | r17964 | |
957 | 957 | break; |
958 | 958 | case STD_SOROM: // there are 2 WRAM banks only and battery is bank 2 for the cart (hence, we invert bank, because we have battery first) |
959 | 959 | if (!BIT(state->m_mmc_reg[3], 4)) |
960 | space | |
960 | space.install_readwrite_bank(0x6000, 0x7fff, "bank5"); | |
961 | 961 | else |
962 | 962 | { |
963 | space | |
963 | space.unmap_readwrite(0x6000, 0x7fff); | |
964 | 964 | break; |
965 | 965 | } |
966 | 966 | case STD_SOROM_A: // ignore WRAM enable bit |
r17963 | r17964 | |
1005 | 1005 | } |
1006 | 1006 | } |
1007 | 1007 | |
1008 | static void mmc1_set_prg_wram( address_space | |
1008 | static void mmc1_set_prg_wram( address_space &space, int board ) | |
1009 | 1009 | { |
1010 | mmc1_set_prg(space | |
1010 | mmc1_set_prg(space.machine()); | |
1011 | 1011 | mmc1_set_wram(space, board); |
1012 | 1012 | } |
1013 | 1013 | |
r17963 | r17964 | |
1025 | 1025 | chr8(machine, (state->m_mmc_reg[1] & 0x1f) >> 1, state->m_mmc_chr_source); |
1026 | 1026 | } |
1027 | 1027 | |
1028 | static void common_sxrom_write_handler( address_space | |
1028 | static void common_sxrom_write_handler( address_space &space, offs_t offset, UINT8 data, int board ) | |
1029 | 1029 | { |
1030 | running_machine &machine = space | |
1030 | running_machine &machine = space.machine(); | |
1031 | 1031 | nes_state *state = machine.driver_data<nes_state>(); |
1032 | 1032 | /* Note that there is only one latch and shift counter, shared amongst the 4 regs */ |
1033 | 1033 | /* Space Shuttle will not work if they have independent variables. */ |
r17963 | r17964 | |
1044 | 1044 | else |
1045 | 1045 | { |
1046 | 1046 | state->m_mmc1_reg_write_enable = 0; |
1047 | space | |
1047 | space.machine().scheduler().synchronize(FUNC(mmc1_resync_callback)); | |
1048 | 1048 | } |
1049 | 1049 | |
1050 | 1050 | if (data & 0x80) |
r17963 | r17964 | |
1103 | 1103 | |
1104 | 1104 | static WRITE8_HANDLER( sxrom_w ) |
1105 | 1105 | { |
1106 | nes_state *state = space | |
1106 | nes_state *state = space.machine().driver_data<nes_state>(); | |
1107 | 1107 | |
1108 | 1108 | LOG_MMC(("sxrom_w, offset: %04x, data: %02x\n", offset, data)); |
1109 | 1109 | common_sxrom_write_handler(space, offset, data, state->m_pcb_id); |
r17963 | r17964 | |
1152 | 1152 | |
1153 | 1153 | static WRITE8_HANDLER( pxrom_w ) |
1154 | 1154 | { |
1155 | nes_state *state = space | |
1155 | nes_state *state = space.machine().driver_data<nes_state>(); | |
1156 | 1156 | LOG_MMC(("pxrom_w, offset: %04x, data: %02x\n", offset, data)); |
1157 | 1157 | switch (offset & 0x7000) |
1158 | 1158 | { |
1159 | 1159 | case 0x2000: |
1160 | prg8_89(space | |
1160 | prg8_89(space.machine(), data); | |
1161 | 1161 | break; |
1162 | 1162 | case 0x3000: |
1163 | 1163 | state->m_mmc_reg[0] = data; |
1164 | 1164 | if (state->m_mmc_latch1 == 0xfd) |
1165 | chr4_0(space | |
1165 | chr4_0(space.machine(), state->m_mmc_reg[0], CHRROM); | |
1166 | 1166 | break; |
1167 | 1167 | case 0x4000: |
1168 | 1168 | state->m_mmc_reg[1] = data; |
1169 | 1169 | if (state->m_mmc_latch1 == 0xfe) |
1170 | chr4_0(space | |
1170 | chr4_0(space.machine(), state->m_mmc_reg[1], CHRROM); | |
1171 | 1171 | break; |
1172 | 1172 | case 0x5000: |
1173 | 1173 | state->m_mmc_reg[2] = data; |
1174 | 1174 | if (state->m_mmc_latch2 == 0xfd) |
1175 | chr4_4(space | |
1175 | chr4_4(space.machine(), state->m_mmc_reg[2], CHRROM); | |
1176 | 1176 | break; |
1177 | 1177 | case 0x6000: |
1178 | 1178 | state->m_mmc_reg[3] = data; |
1179 | 1179 | if (state->m_mmc_latch2 == 0xfe) |
1180 | chr4_4(space | |
1180 | chr4_4(space.machine(), state->m_mmc_reg[3], CHRROM); | |
1181 | 1181 | break; |
1182 | 1182 | case 0x7000: |
1183 | set_nt_mirroring(space | |
1183 | set_nt_mirroring(space.machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
1184 | 1184 | break; |
1185 | 1185 | default: |
1186 | 1186 | LOG_MMC(("MMC2 uncaught w: %04x:%02x\n", offset, data)); |
r17963 | r17964 | |
1206 | 1206 | switch (offset & 0x7000) |
1207 | 1207 | { |
1208 | 1208 | case 0x2000: |
1209 | prg16_89ab(space | |
1209 | prg16_89ab(space.machine(), data); | |
1210 | 1210 | break; |
1211 | 1211 | default: |
1212 | 1212 | pxrom_w(space, offset, data); |
r17963 | r17964 | |
1222 | 1222 | |
1223 | 1223 | *************************************************************/ |
1224 | 1224 | |
1225 | static void mmc3_set_wram( address_space | |
1225 | static void mmc3_set_wram( address_space &space ) | |
1226 | 1226 | { |
1227 | running_machine &machine = space | |
1227 | running_machine &machine = space.machine(); | |
1228 | 1228 | nes_state *state = machine.driver_data<nes_state>(); |
1229 | 1229 | |
1230 | 1230 | // skip this function if we are emulating a MMC3 clone with mid writes |
r17963 | r17964 | |
1232 | 1232 | return; |
1233 | 1233 | |
1234 | 1234 | if (BIT(state->m_mmc3_wram_protect, 7)) |
1235 | space | |
1235 | space.install_readwrite_bank(0x6000, 0x7fff, "bank5"); | |
1236 | 1236 | else |
1237 | 1237 | { |
1238 | space | |
1238 | space.unmap_readwrite(0x6000, 0x7fff); | |
1239 | 1239 | return; |
1240 | 1240 | } |
1241 | 1241 | |
1242 | 1242 | if (!BIT(state->m_mmc3_wram_protect, 6)) |
1243 | space | |
1243 | space.install_write_bank(0x6000, 0x7fff, "bank5"); | |
1244 | 1244 | else |
1245 | 1245 | { |
1246 | space | |
1246 | space.unmap_write(0x6000, 0x7fff); | |
1247 | 1247 | return; |
1248 | 1248 | } |
1249 | 1249 | } |
r17963 | r17964 | |
1299 | 1299 | |
1300 | 1300 | static WRITE8_HANDLER( txrom_w ) |
1301 | 1301 | { |
1302 | nes_state *state = space | |
1302 | nes_state *state = space.machine().driver_data<nes_state>(); | |
1303 | 1303 | UINT8 mmc_helper, cmd; |
1304 | 1304 | |
1305 | 1305 | LOG_MMC(("txrom_w, offset: %04x, data: %02x\n", offset, data)); |
r17963 | r17964 | |
1312 | 1312 | |
1313 | 1313 | /* Has PRG Mode changed? */ |
1314 | 1314 | if (mmc_helper & 0x40) |
1315 | mmc3_set_prg(space | |
1315 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
1316 | 1316 | |
1317 | 1317 | /* Has CHR Mode changed? */ |
1318 | 1318 | if (mmc_helper & 0x80) |
1319 | mmc3_set_chr(space | |
1319 | mmc3_set_chr(space.machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
1320 | 1320 | break; |
1321 | 1321 | |
1322 | 1322 | case 0x0001: |
r17963 | r17964 | |
1326 | 1326 | case 0: case 1: // these do not need to be separated: we take care of them in set_chr! |
1327 | 1327 | case 2: case 3: case 4: case 5: |
1328 | 1328 | state->m_mmc_vrom_bank[cmd] = data; |
1329 | mmc3_set_chr(space | |
1329 | mmc3_set_chr(space.machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
1330 | 1330 | break; |
1331 | 1331 | case 6: |
1332 | 1332 | case 7: |
1333 | 1333 | state->m_mmc_prg_bank[cmd - 6] = data; |
1334 | mmc3_set_prg(space | |
1334 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
1335 | 1335 | break; |
1336 | 1336 | } |
1337 | 1337 | break; |
1338 | 1338 | |
1339 | 1339 | case 0x2000: |
1340 | set_nt_mirroring(space | |
1340 | set_nt_mirroring(space.machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
1341 | 1341 | break; |
1342 | 1342 | |
1343 | 1343 | case 0x2001: |
r17963 | r17964 | |
1377 | 1377 | |
1378 | 1378 | static WRITE8_HANDLER( hkrom_m_w ) |
1379 | 1379 | { |
1380 | nes_state *state = space | |
1380 | nes_state *state = space.machine().driver_data<nes_state>(); | |
1381 | 1381 | UINT8 write_hi, write_lo; |
1382 | 1382 | LOG_MMC(("hkrom_m_w, offset: %04x, data: %02x\n", offset, data)); |
1383 | 1383 | |
r17963 | r17964 | |
1397 | 1397 | |
1398 | 1398 | static READ8_HANDLER( hkrom_m_r ) |
1399 | 1399 | { |
1400 | nes_state *state = space | |
1400 | nes_state *state = space.machine().driver_data<nes_state>(); | |
1401 | 1401 | LOG_MMC(("hkrom_m_r, offset: %04x\n", offset)); |
1402 | 1402 | |
1403 | 1403 | if (offset < 0x1000) |
r17963 | r17964 | |
1418 | 1418 | |
1419 | 1419 | static WRITE8_HANDLER( hkrom_w ) |
1420 | 1420 | { |
1421 | nes_state *state = space | |
1421 | nes_state *state = space.machine().driver_data<nes_state>(); | |
1422 | 1422 | UINT8 mmc6_helper; |
1423 | 1423 | LOG_MMC(("hkrom_w, offset: %04x, data: %02x\n", offset, data)); |
1424 | 1424 | |
r17963 | r17964 | |
1433 | 1433 | |
1434 | 1434 | /* Has PRG Mode changed? */ |
1435 | 1435 | if (BIT(mmc6_helper, 6)) |
1436 | mmc3_set_prg(space | |
1436 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
1437 | 1437 | |
1438 | 1438 | /* Has CHR Mode changed? */ |
1439 | 1439 | if (BIT(mmc6_helper, 7)) |
1440 | mmc3_set_chr(space | |
1440 | mmc3_set_chr(space.machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
1441 | 1441 | break; |
1442 | 1442 | |
1443 | 1443 | case 0x2001: |
r17963 | r17964 | |
1546 | 1546 | |
1547 | 1547 | static WRITE8_HANDLER( tqrom_w ) |
1548 | 1548 | { |
1549 | nes_state *state = space | |
1549 | nes_state *state = space.machine().driver_data<nes_state>(); | |
1550 | 1550 | UINT8 mmc_helper, cmd; |
1551 | 1551 | LOG_MMC(("tqrom_w, offset: %04x, data: %02x\n", offset, data)); |
1552 | 1552 | |
r17963 | r17964 | |
1558 | 1558 | |
1559 | 1559 | /* Has PRG Mode changed? */ |
1560 | 1560 | if (mmc_helper & 0x40) |
1561 | mmc3_set_prg(space | |
1561 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
1562 | 1562 | |
1563 | 1563 | /* Has CHR Mode changed? */ |
1564 | 1564 | if (mmc_helper & 0x80) |
1565 | tqrom_set_chr(space | |
1565 | tqrom_set_chr(space.machine()); | |
1566 | 1566 | break; |
1567 | 1567 | case 0x0001: /* $8001 */ |
1568 | 1568 | cmd = state->m_mmc3_latch & 0x07; |
r17963 | r17964 | |
1571 | 1571 | case 0: case 1: // these do not need to be separated: we take care of them in set_chr! |
1572 | 1572 | case 2: case 3: case 4: case 5: |
1573 | 1573 | state->m_mmc_vrom_bank[cmd] = data; |
1574 | tqrom_set_chr(space | |
1574 | tqrom_set_chr(space.machine()); | |
1575 | 1575 | break; |
1576 | 1576 | case 6: |
1577 | 1577 | case 7: |
1578 | 1578 | state->m_mmc_prg_bank[cmd - 6] = data; |
1579 | mmc3_set_prg(space | |
1579 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
1580 | 1580 | break; |
1581 | 1581 | } |
1582 | 1582 | break; |
r17963 | r17964 | |
1598 | 1598 | |
1599 | 1599 | static WRITE8_HANDLER( zz_m_w ) |
1600 | 1600 | { |
1601 | nes_state *state = space | |
1601 | nes_state *state = space.machine().driver_data<nes_state>(); | |
1602 | 1602 | UINT8 mmc_helper = data & 0x07; |
1603 | 1603 | LOG_MMC(("zz_m_w, offset: %04x, data: %02x\n", offset, data)); |
1604 | 1604 | |
r17963 | r17964 | |
1606 | 1606 | state->m_mmc_prg_mask = (mmc_helper << 1) | 0x07; |
1607 | 1607 | state->m_mmc_chr_base = BIT(mmc_helper, 2) << 7; |
1608 | 1608 | state->m_mmc_chr_mask = 0x7f; |
1609 | mmc3_set_prg(space->machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
1610 | mmc3_set_chr(space->machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
1609 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
1610 | mmc3_set_chr(space.machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
1611 | 1611 | } |
1612 | 1612 | |
1613 | 1613 | /************************************************************* |
r17963 | r17964 | |
1621 | 1621 | |
1622 | 1622 | static WRITE8_HANDLER( qj_m_w ) |
1623 | 1623 | { |
1624 | nes_state *state = space | |
1624 | nes_state *state = space.machine().driver_data<nes_state>(); | |
1625 | 1625 | LOG_MMC(("qj_m_w, offset: %04x, data: %02x\n", offset, data)); |
1626 | 1626 | |
1627 | 1627 | state->m_mmc_prg_base = BIT(data, 0) << 4; |
1628 | 1628 | state->m_mmc_prg_mask = 0x0f; |
1629 | 1629 | state->m_mmc_chr_base = BIT(data, 0) << 7; |
1630 | 1630 | state->m_mmc_chr_mask = 0x7f; |
1631 | mmc3_set_prg(space->machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
1632 | mmc3_set_chr(space->machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
1631 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
1632 | mmc3_set_chr(space.machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
1633 | 1633 | } |
1634 | 1634 | |
1635 | 1635 | /************************************************************* |
r17963 | r17964 | |
1858 | 1858 | |
1859 | 1859 | static READ8_HANDLER( exrom_l_r ) |
1860 | 1860 | { |
1861 | nes_state *state = space | |
1861 | nes_state *state = space.machine().driver_data<nes_state>(); | |
1862 | 1862 | int retVal; |
1863 | 1863 | |
1864 | 1864 | /* $5c00 - $5fff: extended videoram attributes */ |
r17963 | r17964 | |
1895 | 1895 | |
1896 | 1896 | static WRITE8_HANDLER( exrom_l_w ) |
1897 | 1897 | { |
1898 | nes_state *state = space | |
1898 | nes_state *state = space.machine().driver_data<nes_state>(); | |
1899 | 1899 | |
1900 | 1900 | // LOG_MMC(("Mapper 5 write, offset: %04x, data: %02x\n", offset + 0x4100, data)); |
1901 | 1901 | /* Send $5000-$5015 to the sound chip */ |
1902 | 1902 | if ((offset >= 0xf00) && (offset <= 0xf15)) |
1903 | 1903 | { |
1904 | nes_psg_w(state->m_sound, | |
1904 | nes_psg_w(state->m_sound, space, offset & 0x1f, data); | |
1905 | 1905 | return; |
1906 | 1906 | } |
1907 | 1907 | |
r17963 | r17964 | |
1917 | 1917 | { |
1918 | 1918 | case 0x1000: /* $5100 */ |
1919 | 1919 | state->m_mmc5_prg_mode = data & 0x03; |
1920 | // mmc5_update_prg(space | |
1920 | // mmc5_update_prg(space.machine()); | |
1921 | 1921 | LOG_MMC(("MMC5 rom bank mode: %02x\n", data)); |
1922 | 1922 | break; |
1923 | 1923 | |
r17963 | r17964 | |
1945 | 1945 | case 0x1004: /* $5104 - Extra VRAM (EXRAM) control */ |
1946 | 1946 | state->m_mmc5_vram_control = data & 0x03; |
1947 | 1947 | // update render |
1948 | mmc5_update_render_mode(space | |
1948 | mmc5_update_render_mode(space.machine()); | |
1949 | 1949 | LOG_MMC(("MMC5 exram control: %02x\n", data)); |
1950 | 1950 | break; |
1951 | 1951 | |
1952 | 1952 | case 0x1005: /* $5105 */ |
1953 | mmc5_ppu_mirror(space->machine(), 0, data & 0x03); | |
1954 | mmc5_ppu_mirror(space->machine(), 1, (data & 0x0c) >> 2); | |
1955 | mmc5_ppu_mirror(space->machine(), 2, (data & 0x30) >> 4); | |
1956 | mmc5_ppu_mirror(space->machine(), 3, (data & 0xc0) >> 6); | |
1953 | mmc5_ppu_mirror(space.machine(), 0, data & 0x03); | |
1954 | mmc5_ppu_mirror(space.machine(), 1, (data & 0x0c) >> 2); | |
1955 | mmc5_ppu_mirror(space.machine(), 2, (data & 0x30) >> 4); | |
1956 | mmc5_ppu_mirror(space.machine(), 3, (data & 0xc0) >> 6); | |
1957 | 1957 | // update render |
1958 | mmc5_update_render_mode(space | |
1958 | mmc5_update_render_mode(space.machine()); | |
1959 | 1959 | break; |
1960 | 1960 | |
1961 | 1961 | /* tile data for MMC5 flood-fill NT mode */ |
r17963 | r17964 | |
1979 | 1979 | LOG_MMC(("MMC5 mid RAM bank select: %02x\n", data & 0x07)); |
1980 | 1980 | // FIXME: a few Koei games have both WRAM & BWRAM but here we don't support this (yet) |
1981 | 1981 | if (state->m_battery) |
1982 | wram_bank(space | |
1982 | wram_bank(space.machine(), data, NES_BATTERY); | |
1983 | 1983 | else |
1984 | wram_bank(space | |
1984 | wram_bank(space.machine(), data, NES_WRAM); | |
1985 | 1985 | break; |
1986 | 1986 | |
1987 | 1987 | |
r17963 | r17964 | |
1990 | 1990 | case 0x1016: /* $5116 */ |
1991 | 1991 | case 0x1017: /* $5117 */ |
1992 | 1992 | state->m_mmc5_prg_regs[offset & 3] = data; |
1993 | mmc5_update_prg(space | |
1993 | mmc5_update_prg(space.machine()); | |
1994 | 1994 | break; |
1995 | 1995 | |
1996 | 1996 | #if 0 |
r17963 | r17964 | |
2009 | 2009 | state->m_mmc5_vrom_regA[offset & 0x07] = data; |
2010 | 2010 | state->m_mmc5_last_chr_a = 1; |
2011 | 2011 | if (state->m_ppu->get_current_scanline() == 240 || !state->m_ppu->is_sprite_8x16()) |
2012 | mmc5_update_chr_a(space | |
2012 | mmc5_update_chr_a(space.machine()); | |
2013 | 2013 | } |
2014 | 2014 | break; |
2015 | 2015 | |
r17963 | r17964 | |
2022 | 2022 | state->m_mmc5_vrom_regB[offset & 0x03] = data; |
2023 | 2023 | state->m_mmc5_last_chr_a = 0; |
2024 | 2024 | if (state->m_ppu->get_current_scanline() == 240 || !state->m_ppu->is_sprite_8x16()) |
2025 | mmc5_update_chr_b(space | |
2025 | mmc5_update_chr_b(space.machine()); | |
2026 | 2026 | break; |
2027 | 2027 | |
2028 | 2028 | case 0x1030: /* $5130 */ |
r17963 | r17964 | |
2044 | 2044 | /* 1k switch */ |
2045 | 2045 | state->m_MMC5_vrom_bank[0] = data | (state->m_mmc5_high_chr << 8); |
2046 | 2046 | // mapper5_sync_vrom(0); |
2047 | chr1_0(space | |
2047 | chr1_0(space.machine(), state->m_MMC5_vrom_bank[0], CHRROM); | |
2048 | 2048 | // state->m_nes_vram_sprite[0] = state->m_MMC5_vrom_bank[0] * 64; |
2049 | 2049 | // vrom_next[0] = 4; |
2050 | 2050 | // vrom_page_a = 1; |
r17963 | r17964 | |
2058 | 2058 | { |
2059 | 2059 | case 0x02: |
2060 | 2060 | /* 2k switch */ |
2061 | chr2_0(space | |
2061 | chr2_0(space.machine(), data | (state->m_mmc5_high_chr << 8), CHRROM); | |
2062 | 2062 | break; |
2063 | 2063 | case 0x03: |
2064 | 2064 | /* 1k switch */ |
2065 | 2065 | state->m_MMC5_vrom_bank[1] = data | (state->m_mmc5_high_chr << 8); |
2066 | 2066 | // mapper5_sync_vrom(0); |
2067 | chr1_1(space | |
2067 | chr1_1(space.machine(), state->m_MMC5_vrom_bank[1], CHRROM); | |
2068 | 2068 | // state->m_nes_vram_sprite[1] = state->m_MMC5_vrom_bank[0] * 64; |
2069 | 2069 | // vrom_next[1] = 5; |
2070 | 2070 | // vrom_page_a = 1; |
r17963 | r17964 | |
2080 | 2080 | /* 1k switch */ |
2081 | 2081 | state->m_MMC5_vrom_bank[2] = data | (state->m_mmc5_high_chr << 8); |
2082 | 2082 | // mapper5_sync_vrom(0); |
2083 | chr1_2(space | |
2083 | chr1_2(space.machine(), state->m_MMC5_vrom_bank[2], CHRROM); | |
2084 | 2084 | // state->m_nes_vram_sprite[2] = state->m_MMC5_vrom_bank[0] * 64; |
2085 | 2085 | // vrom_next[2] = 6; |
2086 | 2086 | // vrom_page_a = 1; |
r17963 | r17964 | |
2093 | 2093 | switch (state->m_mmc5_chr_mode) |
2094 | 2094 | { |
2095 | 2095 | case 0x01: |
2096 | chr4_0(space | |
2096 | chr4_0(space.machine(), data, CHRROM); | |
2097 | 2097 | break; |
2098 | 2098 | case 0x02: |
2099 | 2099 | /* 2k switch */ |
2100 | chr2_2(space | |
2100 | chr2_2(space.machine(), data | (state->m_mmc5_high_chr << 8), CHRROM); | |
2101 | 2101 | break; |
2102 | 2102 | case 0x03: |
2103 | 2103 | /* 1k switch */ |
2104 | 2104 | state->m_MMC5_vrom_bank[3] = data | (state->m_mmc5_high_chr << 8); |
2105 | 2105 | // mapper5_sync_vrom(0); |
2106 | chr1_3(space | |
2106 | chr1_3(space.machine(), state->m_MMC5_vrom_bank[3], CHRROM); | |
2107 | 2107 | // state->m_nes_vram_sprite[3] = state->m_MMC5_vrom_bank[0] * 64; |
2108 | 2108 | // vrom_next[3] = 7; |
2109 | 2109 | // vrom_page_a = 1; |
r17963 | r17964 | |
2119 | 2119 | /* 1k switch */ |
2120 | 2120 | state->m_MMC5_vrom_bank[4] = data | (state->m_mmc5_high_chr << 8); |
2121 | 2121 | // mapper5_sync_vrom(0); |
2122 | chr1_4(space | |
2122 | chr1_4(space.machine(), state->m_MMC5_vrom_bank[4], CHRROM); | |
2123 | 2123 | // state->m_nes_vram_sprite[4] = state->m_MMC5_vrom_bank[0] * 64; |
2124 | 2124 | // vrom_next[0] = 0; |
2125 | 2125 | // vrom_page_a = 0; |
r17963 | r17964 | |
2133 | 2133 | { |
2134 | 2134 | case 0x02: |
2135 | 2135 | /* 2k switch */ |
2136 | chr2_4(space | |
2136 | chr2_4(space.machine(), data | (state->m_mmc5_high_chr << 8), CHRROM); | |
2137 | 2137 | break; |
2138 | 2138 | case 0x03: |
2139 | 2139 | /* 1k switch */ |
2140 | 2140 | state->m_MMC5_vrom_bank[5] = data | (state->m_mmc5_high_chr << 8); |
2141 | 2141 | // mapper5_sync_vrom(0); |
2142 | chr1_5(space | |
2142 | chr1_5(space.machine(), state->m_MMC5_vrom_bank[5], CHRROM); | |
2143 | 2143 | // state->m_nes_vram_sprite[5] = state->m_MMC5_vrom_bank[0] * 64; |
2144 | 2144 | // vrom_next[1] = 1; |
2145 | 2145 | // vrom_page_a = 0; |
r17963 | r17964 | |
2155 | 2155 | /* 1k switch */ |
2156 | 2156 | state->m_MMC5_vrom_bank[6] = data | (state->m_mmc5_high_chr << 8); |
2157 | 2157 | // mapper5_sync_vrom(0); |
2158 | chr1_6(space | |
2158 | chr1_6(space.machine(), state->m_MMC5_vrom_bank[6], CHRROM); | |
2159 | 2159 | // state->m_nes_vram_sprite[6] = state->m_MMC5_vrom_bank[0] * 64; |
2160 | 2160 | // vrom_next[2] = 2; |
2161 | 2161 | // vrom_page_a = 0; |
r17963 | r17964 | |
2169 | 2169 | { |
2170 | 2170 | case 0x00: |
2171 | 2171 | /* 8k switch */ |
2172 | chr8(space | |
2172 | chr8(space.machine(), data, CHRROM); | |
2173 | 2173 | break; |
2174 | 2174 | case 0x01: |
2175 | 2175 | /* 4k switch */ |
2176 | chr4_4(space | |
2176 | chr4_4(space.machine(), data, CHRROM); | |
2177 | 2177 | break; |
2178 | 2178 | case 0x02: |
2179 | 2179 | /* 2k switch */ |
2180 | chr2_6(space | |
2180 | chr2_6(space.machine(), data | (state->m_mmc5_high_chr << 8), CHRROM); | |
2181 | 2181 | break; |
2182 | 2182 | case 0x03: |
2183 | 2183 | /* 1k switch */ |
2184 | 2184 | state->m_MMC5_vrom_bank[7] = data | (state->m_mmc5_high_chr << 8); |
2185 | 2185 | // mapper5_sync_vrom(0); |
2186 | chr1_7(space | |
2186 | chr1_7(space.machine(), state->m_MMC5_vrom_bank[7], CHRROM); | |
2187 | 2187 | // state->m_nes_vram_sprite[7] = state->m_MMC5_vrom_bank[0] * 64; |
2188 | 2188 | // vrom_next[3] = 3; |
2189 | 2189 | // vrom_page_a = 0; |
r17963 | r17964 | |
2201 | 2201 | // nes_vram[vrom_next[0]] = data * 64; |
2202 | 2202 | // nes_vram[0 + (vrom_page_a*4)] = data * 64; |
2203 | 2203 | // nes_vram[0] = data * 64; |
2204 | chr1_4(space | |
2204 | chr1_4(space.machine(), state->m_MMC5_vrom_bank[8], CHRROM); | |
2205 | 2205 | // mapper5_sync_vrom(1); |
2206 | 2206 | if (!state->m_vrom_page_b) |
2207 | 2207 | { |
r17963 | r17964 | |
2217 | 2217 | { |
2218 | 2218 | case 0x02: |
2219 | 2219 | /* 2k switch */ |
2220 | chr2_0(space->machine(), data | (state->m_mmc5_high_chr << 8), CHRROM); | |
2221 | chr2_4(space->machine(), data | (state->m_mmc5_high_chr << 8), CHRROM); | |
2220 | chr2_0(space.machine(), data | (state->m_mmc5_high_chr << 8), CHRROM); | |
2221 | chr2_4(space.machine(), data | (state->m_mmc5_high_chr << 8), CHRROM); | |
2222 | 2222 | break; |
2223 | 2223 | case 0x03: |
2224 | 2224 | /* 1k switch */ |
r17963 | r17964 | |
2226 | 2226 | // nes_vram[vrom_next[1]] = data * 64; |
2227 | 2227 | // nes_vram[1 + (vrom_page_a*4)] = data * 64; |
2228 | 2228 | // nes_vram[1] = data * 64; |
2229 | chr1_5(space | |
2229 | chr1_5(space.machine(), state->m_MMC5_vrom_bank[9], CHRROM); | |
2230 | 2230 | // mapper5_sync_vrom(1); |
2231 | 2231 | if (!state->m_vrom_page_b) |
2232 | 2232 | { |
r17963 | r17964 | |
2246 | 2246 | // nes_vram[vrom_next[2]] = data * 64; |
2247 | 2247 | // nes_vram[2 + (vrom_page_a*4)] = data * 64; |
2248 | 2248 | // nes_vram[2] = data * 64; |
2249 | chr1_6(space | |
2249 | chr1_6(space.machine(), state->m_MMC5_vrom_bank[10], CHRROM); | |
2250 | 2250 | // mapper5_sync_vrom(1); |
2251 | 2251 | if (!state->m_vrom_page_b) |
2252 | 2252 | { |
r17963 | r17964 | |
2263 | 2263 | case 0x00: |
2264 | 2264 | /* 8k switch */ |
2265 | 2265 | /* switches in first half of an 8K bank!) */ |
2266 | chr4_0(space->machine(), data << 1, CHRROM); | |
2267 | chr4_4(space->machine(), data << 1, CHRROM); | |
2266 | chr4_0(space.machine(), data << 1, CHRROM); | |
2267 | chr4_4(space.machine(), data << 1, CHRROM); | |
2268 | 2268 | break; |
2269 | 2269 | case 0x01: |
2270 | 2270 | /* 4k switch */ |
2271 | chr4_0(space->machine(), data, CHRROM); | |
2272 | chr4_4(space->machine(), data, CHRROM); | |
2271 | chr4_0(space.machine(), data, CHRROM); | |
2272 | chr4_4(space.machine(), data, CHRROM); | |
2273 | 2273 | break; |
2274 | 2274 | case 0x02: |
2275 | 2275 | /* 2k switch */ |
2276 | chr2_2(space->machine(), data | (state->m_mmc5_high_chr << 8), CHRROM); | |
2277 | chr2_6(space->machine(), data | (state->m_mmc5_high_chr << 8), CHRROM); | |
2276 | chr2_2(space.machine(), data | (state->m_mmc5_high_chr << 8), CHRROM); | |
2277 | chr2_6(space.machine(), data | (state->m_mmc5_high_chr << 8), CHRROM); | |
2278 | 2278 | break; |
2279 | 2279 | case 0x03: |
2280 | 2280 | /* 1k switch */ |
r17963 | r17964 | |
2282 | 2282 | // nes_vram[vrom_next[3]] = data * 64; |
2283 | 2283 | // nes_vram[3 + (vrom_page_a*4)] = data * 64; |
2284 | 2284 | // nes_vram[3] = data * 64; |
2285 | chr1_7(space | |
2285 | chr1_7(space.machine(), state->m_MMC5_vrom_bank[11], CHRROM); | |
2286 | 2286 | // mapper5_sync_vrom(1); |
2287 | 2287 | if (!state->m_vrom_page_b) |
2288 | 2288 | { |
r17963 | r17964 | |
2397 | 2397 | |
2398 | 2398 | static WRITE8_HANDLER( ntbrom_w ) |
2399 | 2399 | { |
2400 | nes_state *state = space | |
2400 | nes_state *state = space.machine().driver_data<nes_state>(); | |
2401 | 2401 | |
2402 | 2402 | LOG_MMC(("ntbrom_w, offset %04x, data: %02x\n", offset, data)); |
2403 | 2403 | |
2404 | 2404 | switch (offset & 0x7000) |
2405 | 2405 | { |
2406 | 2406 | case 0x0000: |
2407 | chr2_0(space | |
2407 | chr2_0(space.machine(), data, CHRROM); | |
2408 | 2408 | break; |
2409 | 2409 | case 0x1000: |
2410 | chr2_2(space | |
2410 | chr2_2(space.machine(), data, CHRROM); | |
2411 | 2411 | break; |
2412 | 2412 | case 0x2000: |
2413 | chr2_4(space | |
2413 | chr2_4(space.machine(), data, CHRROM); | |
2414 | 2414 | break; |
2415 | 2415 | case 0x3000: |
2416 | chr2_6(space | |
2416 | chr2_6(space.machine(), data, CHRROM); | |
2417 | 2417 | break; |
2418 | 2418 | case 0x4000: |
2419 | 2419 | state->m_mmc_latch1 = data & 0x7f; |
2420 | ntbrom_mirror(space | |
2420 | ntbrom_mirror(space.machine(), state->m_mmc_reg[0], state->m_mmc_latch1, state->m_mmc_latch2); | |
2421 | 2421 | break; |
2422 | 2422 | case 0x5000: |
2423 | 2423 | state->m_mmc_latch2 = data & 0x7f; |
2424 | ntbrom_mirror(space | |
2424 | ntbrom_mirror(space.machine(), state->m_mmc_reg[0], state->m_mmc_latch1, state->m_mmc_latch2); | |
2425 | 2425 | break; |
2426 | 2426 | case 0x6000: |
2427 | 2427 | state->m_mmc_reg[0] = data & 0x13; |
2428 | ntbrom_mirror(space | |
2428 | ntbrom_mirror(space.machine(), state->m_mmc_reg[0], state->m_mmc_latch1, state->m_mmc_latch2); | |
2429 | 2429 | break; |
2430 | 2430 | case 0x7000: |
2431 | prg16_89ab(space | |
2431 | prg16_89ab(space.machine(), data); | |
2432 | 2432 | break; |
2433 | 2433 | default: |
2434 | 2434 | LOG_MMC(("ntbrom_w uncaught write, offset: %04x, data: %02x\n", offset, data)); |
r17963 | r17964 | |
2476 | 2476 | |
2477 | 2477 | static WRITE8_HANDLER( jxrom_w ) |
2478 | 2478 | { |
2479 | nes_state *state = space | |
2479 | nes_state *state = space.machine().driver_data<nes_state>(); | |
2480 | 2480 | LOG_MMC(("jxrom_w, offset %04x, data: %02x\n", offset, data)); |
2481 | 2481 | |
2482 | 2482 | switch (offset & 0x6000) |
r17963 | r17964 | |
2489 | 2489 | switch (state->m_mmc_latch1) |
2490 | 2490 | { |
2491 | 2491 | case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: |
2492 | chr1_x(space | |
2492 | chr1_x(space.machine(), state->m_mmc_latch1, data, CHRROM); | |
2493 | 2493 | break; |
2494 | 2494 | |
2495 | 2495 | case 8: |
2496 | 2496 | if (!(data & 0x40)) |
2497 | 2497 | { |
2498 | 2498 | // is PRG ROM |
2499 | space->unmap_write(0x6000, 0x7fff); | |
2500 | prg8_67(space->machine(), data & 0x3f); | |
2499 | space.unmap_write(0x6000, 0x7fff); | |
2500 | prg8_67(space.machine(), data & 0x3f); | |
2501 | 2501 | } |
2502 | 2502 | else if (data & 0x80) |
2503 | 2503 | { |
2504 | 2504 | // is PRG RAM |
2505 | space | |
2505 | space.install_write_bank(0x6000, 0x7fff, "bank5"); | |
2506 | 2506 | state->m_prg_bank[4] = state->m_battery_bank5_start + (data & 0x3f); |
2507 | 2507 | state->membank("bank5")->set_entry(state->m_prg_bank[4]); |
2508 | 2508 | } |
2509 | 2509 | break; |
2510 | 2510 | |
2511 | 2511 | case 9: |
2512 | prg8_89(space | |
2512 | prg8_89(space.machine(), data); | |
2513 | 2513 | break; |
2514 | 2514 | case 0x0a: |
2515 | prg8_ab(space | |
2515 | prg8_ab(space.machine(), data); | |
2516 | 2516 | break; |
2517 | 2517 | case 0x0b: |
2518 | prg8_cd(space | |
2518 | prg8_cd(space.machine(), data); | |
2519 | 2519 | break; |
2520 | 2520 | case 0x0c: |
2521 | 2521 | switch (data & 0x03) |
2522 | 2522 | { |
2523 | case 0x00: set_nt_mirroring(space->machine(), PPU_MIRROR_VERT); break; | |
2524 | case 0x01: set_nt_mirroring(space->machine(), PPU_MIRROR_HORZ); break; | |
2525 | case 0x02: set_nt_mirroring(space->machine(), PPU_MIRROR_LOW); break; | |
2526 | case 0x03: set_nt_mirroring(space->machine(), PPU_MIRROR_HIGH); break; | |
2523 | case 0x00: set_nt_mirroring(space.machine(), PPU_MIRROR_VERT); break; | |
2524 | case 0x01: set_nt_mirroring(space.machine(), PPU_MIRROR_HORZ); break; | |
2525 | case 0x02: set_nt_mirroring(space.machine(), PPU_MIRROR_LOW); break; | |
2526 | case 0x03: set_nt_mirroring(space.machine(), PPU_MIRROR_HIGH); break; | |
2527 | 2527 | } |
2528 | 2528 | break; |
2529 | 2529 | case 0x0d: |
r17963 | r17964 | |
2569 | 2569 | |
2570 | 2570 | static WRITE8_HANDLER( dxrom_w ) |
2571 | 2571 | { |
2572 | nes_state *state = space | |
2572 | nes_state *state = space.machine().driver_data<nes_state>(); | |
2573 | 2573 | LOG_MMC(("dxrom_w, offset: %04x, data: %02x\n", offset, data)); |
2574 | 2574 | |
2575 | 2575 | if (offset >= 0x2000) |
r17963 | r17964 | |
2580 | 2580 | case 1: |
2581 | 2581 | switch (state->m_mmc_latch1 & 0x07) |
2582 | 2582 | { |
2583 | case 0: chr2_0(space->machine(), data >> 1, CHRROM); break; | |
2584 | case 1: chr2_2(space->machine(), data >> 1, CHRROM); break; | |
2585 | case 2: chr1_4(space->machine(), data | 0x40, CHRROM); break; | |
2586 | case 3: chr1_5(space->machine(), data | 0x40, CHRROM); break; | |
2587 | case 4: chr1_6(space->machine(), data | 0x40, CHRROM); break; | |
2588 | case 5: chr1_7(space->machine(), data | 0x40, CHRROM); break; | |
2589 | case 6: prg8_89(space->machine(), data); break; | |
2590 | case 7: prg8_ab(space->machine(), data); break; | |
2583 | case 0: chr2_0(space.machine(), data >> 1, CHRROM); break; | |
2584 | case 1: chr2_2(space.machine(), data >> 1, CHRROM); break; | |
2585 | case 2: chr1_4(space.machine(), data | 0x40, CHRROM); break; | |
2586 | case 3: chr1_5(space.machine(), data | 0x40, CHRROM); break; | |
2587 | case 4: chr1_6(space.machine(), data | 0x40, CHRROM); break; | |
2588 | case 5: chr1_7(space.machine(), data | 0x40, CHRROM); break; | |
2589 | case 6: prg8_89(space.machine(), data); break; | |
2590 | case 7: prg8_ab(space.machine(), data); break; | |
2591 | 2591 | } |
2592 | 2592 | break; |
2593 | 2593 | case 0: |
r17963 | r17964 | |
2616 | 2616 | |
2617 | 2617 | // additional mirroring control when writing to even addresses |
2618 | 2618 | if (!(offset & 1)) |
2619 | set_nt_mirroring(space | |
2619 | set_nt_mirroring(space.machine(), BIT(data, 6) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW); | |
2620 | 2620 | |
2621 | 2621 | dxrom_w(space, offset, data); |
2622 | 2622 | } |
r17963 | r17964 | |
2635 | 2635 | |
2636 | 2636 | static WRITE8_HANDLER( namcot3446_w ) |
2637 | 2637 | { |
2638 | nes_state *state = space | |
2638 | nes_state *state = space.machine().driver_data<nes_state>(); | |
2639 | 2639 | LOG_MMC(("namcot3446_w, offset: %04x, data: %02x\n", offset, data)); |
2640 | 2640 | |
2641 | 2641 | // NEStopia does not have this! |
2642 | 2642 | if (offset >= 0x2000) |
2643 | 2643 | { |
2644 | 2644 | if (!(offset & 1)) |
2645 | set_nt_mirroring(space | |
2645 | set_nt_mirroring(space.machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
2646 | 2646 | return; |
2647 | 2647 | } |
2648 | 2648 | |
r17963 | r17964 | |
2651 | 2651 | case 1: |
2652 | 2652 | switch (state->m_mmc_latch1 & 0x07) |
2653 | 2653 | { |
2654 | case 2: chr2_0(space->machine(), data, CHRROM); break; | |
2655 | case 3: chr2_2(space->machine(), data, CHRROM); break; | |
2656 | case 4: chr2_4(space->machine(), data, CHRROM); break; | |
2657 | case 5: chr2_6(space->machine(), data, CHRROM); break; | |
2658 | case 6: BIT(state->m_mmc_latch1, 6) ? prg8_cd(space->machine(), data) : prg8_89(space->machine(), data); break; | |
2659 | case 7: prg8_ab(space->machine(), data); break; | |
2654 | case 2: chr2_0(space.machine(), data, CHRROM); break; | |
2655 | case 3: chr2_2(space.machine(), data, CHRROM); break; | |
2656 | case 4: chr2_4(space.machine(), data, CHRROM); break; | |
2657 | case 5: chr2_6(space.machine(), data, CHRROM); break; | |
2658 | case 6: BIT(state->m_mmc_latch1, 6) ? prg8_cd(space.machine(), data) : prg8_89(space.machine(), data); break; | |
2659 | case 7: prg8_ab(space.machine(), data); break; | |
2660 | 2660 | } |
2661 | 2661 | break; |
2662 | 2662 | case 0: |
r17963 | r17964 | |
2680 | 2680 | |
2681 | 2681 | static WRITE8_HANDLER( namcot3425_w ) |
2682 | 2682 | { |
2683 | nes_state *state = space | |
2683 | nes_state *state = space.machine().driver_data<nes_state>(); | |
2684 | 2684 | UINT8 mode; |
2685 | 2685 | LOG_MMC(("namcot3425_w, offset: %04x, data: %02x\n", offset, data)); |
2686 | 2686 | if (offset >= 0x2000) |
r17963 | r17964 | |
2692 | 2692 | mode = state->m_mmc_latch1 & 0x07; |
2693 | 2693 | switch (mode) |
2694 | 2694 | { |
2695 | case 0: chr2_0(space->machine(), data >> 1, CHRROM); break; | |
2696 | case 1: chr2_2(space->machine(), data >> 1, CHRROM); break; | |
2695 | case 0: chr2_0(space.machine(), data >> 1, CHRROM); break; | |
2696 | case 1: chr2_2(space.machine(), data >> 1, CHRROM); break; | |
2697 | 2697 | case 2: |
2698 | 2698 | case 3: |
2699 | 2699 | case 4: |
2700 | 2700 | case 5: |
2701 | chr1_x(space | |
2701 | chr1_x(space.machine(), 2 + mode, data, CHRROM); | |
2702 | 2702 | state->m_mmc_reg[mode - 2] = BIT(data, 5); |
2703 | 2703 | if (!BIT(state->m_mmc_latch1, 7)) |
2704 | 2704 | { |
2705 | set_nt_page(space->machine(), 0, CIRAM, state->m_mmc_reg[0], 1); | |
2706 | set_nt_page(space->machine(), 1, CIRAM, state->m_mmc_reg[1], 1); | |
2707 | set_nt_page(space->machine(), 2, CIRAM, state->m_mmc_reg[2], 1); | |
2708 | set_nt_page(space->machine(), 3, CIRAM, state->m_mmc_reg[3], 1); | |
2705 | set_nt_page(space.machine(), 0, CIRAM, state->m_mmc_reg[0], 1); | |
2706 | set_nt_page(space.machine(), 1, CIRAM, state->m_mmc_reg[1], 1); | |
2707 | set_nt_page(space.machine(), 2, CIRAM, state->m_mmc_reg[2], 1); | |
2708 | set_nt_page(space.machine(), 3, CIRAM, state->m_mmc_reg[3], 1); | |
2709 | 2709 | } |
2710 | 2710 | else |
2711 | set_nt_mirroring(space | |
2711 | set_nt_mirroring(space.machine(), PPU_MIRROR_HORZ); | |
2712 | 2712 | break; |
2713 | case 6: prg8_89(space->machine(), data); break; | |
2714 | case 7: prg8_ab(space->machine(), data); break; | |
2713 | case 6: prg8_89(space.machine(), data); break; | |
2714 | case 7: prg8_ab(space.machine(), data); break; | |
2715 | 2715 | } |
2716 | 2716 | break; |
2717 | 2717 | case 0: |
r17963 | r17964 | |
2734 | 2734 | |
2735 | 2735 | static WRITE8_HANDLER( dis_74x377_w ) |
2736 | 2736 | { |
2737 | nes_state *state = space | |
2737 | nes_state *state = space.machine().driver_data<nes_state>(); | |
2738 | 2738 | LOG_MMC(("dis_74x377_w, offset: %04x, data: %02x\n", offset, data)); |
2739 | 2739 | |
2740 | chr8(space->machine(), data >> 4, state->m_mmc_chr_source); | |
2741 | prg32(space->machine(), data & 0x0f); | |
2740 | chr8(space.machine(), data >> 4, state->m_mmc_chr_source); | |
2741 | prg32(space.machine(), data & 0x0f); | |
2742 | 2742 | } |
2743 | 2743 | |
2744 | 2744 | /************************************************************* |
r17963 | r17964 | |
2753 | 2753 | { |
2754 | 2754 | LOG_MMC(("dis_74x139x74_m_w, offset: %04x, data: %02x\n", offset, data)); |
2755 | 2755 | |
2756 | chr8(space | |
2756 | chr8(space.machine(), ((data & 0x02) >> 1) | ((data & 0x01) << 1), CHRROM); | |
2757 | 2757 | } |
2758 | 2758 | |
2759 | 2759 | /************************************************************* |
r17963 | r17964 | |
2770 | 2770 | { |
2771 | 2771 | LOG_MMC(("dis_74x161x138_m_w, offset: %04x, data: %02x\n", offset, data)); |
2772 | 2772 | |
2773 | chr8(space->machine(), data >> 2, CHRROM); | |
2774 | prg32(space->machine(), data); | |
2773 | chr8(space.machine(), data >> 2, CHRROM); | |
2774 | prg32(space.machine(), data); | |
2775 | 2775 | } |
2776 | 2776 | |
2777 | 2777 | /************************************************************* |
r17963 | r17964 | |
2788 | 2788 | |
2789 | 2789 | static WRITE8_HANDLER( dis_74x161x161x32_w ) |
2790 | 2790 | { |
2791 | nes_state *state = space | |
2791 | nes_state *state = space.machine().driver_data<nes_state>(); | |
2792 | 2792 | LOG_MMC(("dis_74x161x161x32_w, offset: %04x, data: %02x\n", offset, data)); |
2793 | 2793 | |
2794 | 2794 | if (!state->m_hard_mirroring) // there are two 'variants' depending on hardwired or mapper ctrl mirroring |
2795 | set_nt_mirroring(space->machine(), BIT(data, 7) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW); | |
2796 | chr8(space->machine(), data, CHRROM); | |
2797 | prg16_89ab(space->machine(), data >> 4); | |
2795 | set_nt_mirroring(space.machine(), BIT(data, 7) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW); | |
2796 | chr8(space.machine(), data, CHRROM); | |
2797 | prg16_89ab(space.machine(), data >> 4); | |
2798 | 2798 | } |
2799 | 2799 | |
2800 | 2800 | /************************************************************* |
r17963 | r17964 | |
2842 | 2842 | |
2843 | 2843 | static WRITE8_HANDLER( lz93d50_w ) |
2844 | 2844 | { |
2845 | nes_state *state = space | |
2845 | nes_state *state = space.machine().driver_data<nes_state>(); | |
2846 | 2846 | LOG_MMC(("lz93d50_w, offset: %04x, data: %02x\n", offset, data)); |
2847 | 2847 | |
2848 | 2848 | switch (offset & 0x000f) |
2849 | 2849 | { |
2850 | 2850 | case 0: case 1: case 2: case 3: |
2851 | 2851 | case 4: case 5: case 6: case 7: |
2852 | chr1_x(space | |
2852 | chr1_x(space.machine(), offset & 0x07, data, state->m_mmc_chr_source); | |
2853 | 2853 | break; |
2854 | 2854 | case 8: |
2855 | prg16_89ab(space | |
2855 | prg16_89ab(space.machine(), data); | |
2856 | 2856 | break; |
2857 | 2857 | case 9: |
2858 | 2858 | switch (data & 0x03) |
2859 | 2859 | { |
2860 | case 0: set_nt_mirroring(space->machine(), PPU_MIRROR_VERT); break; | |
2861 | case 1: set_nt_mirroring(space->machine(), PPU_MIRROR_HORZ); break; | |
2862 | case 2: set_nt_mirroring(space->machine(), PPU_MIRROR_LOW); break; | |
2863 | case 3: set_nt_mirroring(space->machine(), PPU_MIRROR_HIGH); break; | |
2860 | case 0: set_nt_mirroring(space.machine(), PPU_MIRROR_VERT); break; | |
2861 | case 1: set_nt_mirroring(space.machine(), PPU_MIRROR_HORZ); break; | |
2862 | case 2: set_nt_mirroring(space.machine(), PPU_MIRROR_LOW); break; | |
2863 | case 3: set_nt_mirroring(space.machine(), PPU_MIRROR_HIGH); break; | |
2864 | 2864 | } |
2865 | 2865 | break; |
2866 | 2866 | case 0x0a: |
r17963 | r17964 | |
2880 | 2880 | |
2881 | 2881 | static WRITE8_HANDLER( lz93d50_m_w ) |
2882 | 2882 | { |
2883 | nes_state *state = space | |
2883 | nes_state *state = space.machine().driver_data<nes_state>(); | |
2884 | 2884 | LOG_MMC(("lz93d50_m_w, offset: %04x, data: %02x\n", offset, data)); |
2885 | 2885 | |
2886 | 2886 | if (!state->m_battery && !state->m_wram) |
r17963 | r17964 | |
2906 | 2906 | |
2907 | 2907 | static WRITE8_HANDLER( fjump2_w ) |
2908 | 2908 | { |
2909 | nes_state *state = space | |
2909 | nes_state *state = space.machine().driver_data<nes_state>(); | |
2910 | 2910 | LOG_MMC(("fjump2_w, offset: %04x, data: %02x\n", offset, data)); |
2911 | 2911 | |
2912 | 2912 | switch (offset & 0x000f) |
r17963 | r17964 | |
2914 | 2914 | case 0: case 1: case 2: case 3: |
2915 | 2915 | case 4: case 5: case 6: case 7: |
2916 | 2916 | state->m_mmc_reg[offset & 0x000f] = data; |
2917 | fjump2_set_prg(space | |
2917 | fjump2_set_prg(space.machine()); | |
2918 | 2918 | break; |
2919 | 2919 | case 8: |
2920 | 2920 | state->m_mmc_latch1 = (data & 0x0f); |
2921 | fjump2_set_prg(space | |
2921 | fjump2_set_prg(space.machine()); | |
2922 | 2922 | break; |
2923 | 2923 | default: |
2924 | 2924 | lz93d50_m_w(space, offset & 0x0f, data); |
r17963 | r17964 | |
2942 | 2942 | { |
2943 | 2943 | LOG_MMC(("bandai_ks_w, offset: %04x, data: %02x\n", offset, data)); |
2944 | 2944 | |
2945 | prg16_89ab(space | |
2945 | prg16_89ab(space.machine(), data ^ 0x08); | |
2946 | 2946 | } |
2947 | 2947 | |
2948 | 2948 | /************************************************************* |
r17963 | r17964 | |
2960 | 2960 | |
2961 | 2961 | static WRITE8_HANDLER( bandai_ok_w ) |
2962 | 2962 | { |
2963 | nes_state *state = space | |
2963 | nes_state *state = space.machine().driver_data<nes_state>(); | |
2964 | 2964 | UINT8 mmc_helper; |
2965 | 2965 | LOG_MMC(("mapper96_w, offset: %04x, data: %02x\n", offset, data)); |
2966 | 2966 | |
2967 | prg32(space | |
2967 | prg32(space.machine(), data); | |
2968 | 2968 | |
2969 | 2969 | state->m_mmc_latch1 = data; |
2970 | 2970 | mmc_helper = (state->m_mmc_latch1 & 0x03) | (data & 0x04); |
2971 | chr4_0(space->machine(), mmc_helper, CHRRAM); | |
2972 | chr4_4(space->machine(), 0x03 | (data & 0x04), CHRRAM); | |
2971 | chr4_0(space.machine(), mmc_helper, CHRRAM); | |
2972 | chr4_4(space.machine(), 0x03 | (data & 0x04), CHRRAM); | |
2973 | 2973 | } |
2974 | 2974 | |
2975 | 2975 | /************************************************************* |
r17963 | r17964 | |
2986 | 2986 | { |
2987 | 2987 | LOG_MMC(("lrog017_w, offset: %04x, data: %02x\n", offset, data)); |
2988 | 2988 | |
2989 | prg32(space->machine(), data); | |
2990 | chr2_0(space->machine(), (data >> 4), CHRROM); | |
2989 | prg32(space.machine(), data); | |
2990 | chr2_0(space.machine(), (data >> 4), CHRROM); | |
2991 | 2991 | } |
2992 | 2992 | |
2993 | 2993 | /************************************************************* |
r17963 | r17964 | |
3002 | 3002 | { |
3003 | 3003 | LOG_MMC(("irem_hd_w, offset: %04x, data: %02x\n", offset, data)); |
3004 | 3004 | |
3005 | set_nt_mirroring(space->machine(), BIT(data, 3) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ); | |
3006 | chr8(space->machine(), data >> 4, CHRROM); | |
3007 | prg16_89ab(space->machine(), data); | |
3005 | set_nt_mirroring(space.machine(), BIT(data, 3) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ); | |
3006 | chr8(space.machine(), data >> 4, CHRROM); | |
3007 | prg16_89ab(space.machine(), data); | |
3008 | 3008 | } |
3009 | 3009 | |
3010 | 3010 | /************************************************************* |
r17963 | r17964 | |
3025 | 3025 | |
3026 | 3026 | if (offset < 0x4000) |
3027 | 3027 | { |
3028 | set_nt_mirroring(space->machine(), BIT(data, 7) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ); | |
3029 | prg16_cdef(space->machine(), data); | |
3028 | set_nt_mirroring(space.machine(), BIT(data, 7) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ); | |
3029 | prg16_cdef(space.machine(), data); | |
3030 | 3030 | } |
3031 | 3031 | } |
3032 | 3032 | |
r17963 | r17964 | |
3042 | 3042 | |
3043 | 3043 | static WRITE8_HANDLER( g101_w ) |
3044 | 3044 | { |
3045 | nes_state *state = space | |
3045 | nes_state *state = space.machine().driver_data<nes_state>(); | |
3046 | 3046 | LOG_MMC(("g101_w, offset: %04x, data: %02x\n", offset, data)); |
3047 | 3047 | |
3048 | 3048 | switch (offset & 0x7000) |
3049 | 3049 | { |
3050 | 3050 | case 0x0000: |
3051 | 3051 | // NEStopia here differs a little bit |
3052 | state->m_mmc_latch1 ? prg8_cd(space | |
3052 | state->m_mmc_latch1 ? prg8_cd(space.machine(), data) : prg8_89(space.machine(), data); | |
3053 | 3053 | break; |
3054 | 3054 | case 0x1000: |
3055 | 3055 | state->m_mmc_latch1 = BIT(data, 1); |
3056 | 3056 | if (!state->m_hard_mirroring) // there are two 'variants' depending on hardwired or mapper ctrl mirroring |
3057 | set_nt_mirroring(space | |
3057 | set_nt_mirroring(space.machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
3058 | 3058 | break; |
3059 | 3059 | case 0x2000: |
3060 | prg8_ab(space | |
3060 | prg8_ab(space.machine(), data); | |
3061 | 3061 | break; |
3062 | 3062 | case 0x3000: |
3063 | chr1_x(space | |
3063 | chr1_x(space.machine(), offset & 0x07, data, CHRROM); | |
3064 | 3064 | break; |
3065 | 3065 | } |
3066 | 3066 | } |
r17963 | r17964 | |
3098 | 3098 | |
3099 | 3099 | static WRITE8_HANDLER( h3001_w ) |
3100 | 3100 | { |
3101 | nes_state *state = space | |
3101 | nes_state *state = space.machine().driver_data<nes_state>(); | |
3102 | 3102 | LOG_MMC(("h3001_w, offset %04x, data: %02x\n", offset, data)); |
3103 | 3103 | |
3104 | 3104 | switch (offset & 0x7fff) |
3105 | 3105 | { |
3106 | 3106 | case 0x0000: |
3107 | prg8_89(space | |
3107 | prg8_89(space.machine(), data); | |
3108 | 3108 | break; |
3109 | 3109 | |
3110 | 3110 | case 0x1001: |
3111 | set_nt_mirroring(space | |
3111 | set_nt_mirroring(space.machine(), BIT(data, 7) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
3112 | 3112 | break; |
3113 | 3113 | |
3114 | 3114 | case 0x1003: |
r17963 | r17964 | |
3128 | 3128 | break; |
3129 | 3129 | |
3130 | 3130 | case 0x2000: |
3131 | prg8_ab(space | |
3131 | prg8_ab(space.machine(), data); | |
3132 | 3132 | break; |
3133 | 3133 | |
3134 | 3134 | case 0x3000: case 0x3001: case 0x3002: case 0x3003: |
3135 | 3135 | case 0x3004: case 0x3005: case 0x3006: case 0x3007: |
3136 | chr1_x(space | |
3136 | chr1_x(space.machine(), offset & 0x07, data, CHRROM); | |
3137 | 3137 | break; |
3138 | 3138 | |
3139 | 3139 | case 0x4000: |
3140 | prg8_cd(space | |
3140 | prg8_cd(space.machine(), data); | |
3141 | 3141 | break; |
3142 | 3142 | |
3143 | 3143 | default: |
r17963 | r17964 | |
3211 | 3211 | |
3212 | 3212 | static WRITE8_HANDLER( ss88006_w ) |
3213 | 3213 | { |
3214 | nes_state *state = space | |
3214 | nes_state *state = space.machine().driver_data<nes_state>(); | |
3215 | 3215 | UINT8 bank; |
3216 | 3216 | LOG_MMC(("mapper18_w, offset: %04x, data: %02x\n", offset, data)); |
3217 | 3217 | |
r17963 | r17964 | |
3219 | 3219 | { |
3220 | 3220 | case 0x0000: |
3221 | 3221 | state->m_mmc_prg_bank[0] = (state->m_mmc_prg_bank[0] & 0xf0) | (data & 0x0f); |
3222 | prg8_89(space | |
3222 | prg8_89(space.machine(), state->m_mmc_prg_bank[0]); | |
3223 | 3223 | break; |
3224 | 3224 | case 0x0001: |
3225 | 3225 | state->m_mmc_prg_bank[0] = (state->m_mmc_prg_bank[0] & 0x0f) | (data << 4); |
3226 | prg8_89(space | |
3226 | prg8_89(space.machine(), state->m_mmc_prg_bank[0]); | |
3227 | 3227 | break; |
3228 | 3228 | case 0x0002: |
3229 | 3229 | state->m_mmc_prg_bank[1] = (state->m_mmc_prg_bank[1] & 0xf0) | (data & 0x0f); |
3230 | prg8_ab(space | |
3230 | prg8_ab(space.machine(), state->m_mmc_prg_bank[1]); | |
3231 | 3231 | break; |
3232 | 3232 | case 0x0003: |
3233 | 3233 | state->m_mmc_prg_bank[1] = (state->m_mmc_prg_bank[1] & 0x0f) | (data << 4); |
3234 | prg8_ab(space | |
3234 | prg8_ab(space.machine(), state->m_mmc_prg_bank[1]); | |
3235 | 3235 | break; |
3236 | 3236 | case 0x1000: |
3237 | 3237 | state->m_mmc_prg_bank[2] = (state->m_mmc_prg_bank[2] & 0xf0) | (data & 0x0f); |
3238 | prg8_cd(space | |
3238 | prg8_cd(space.machine(), state->m_mmc_prg_bank[2]); | |
3239 | 3239 | break; |
3240 | 3240 | case 0x1001: |
3241 | 3241 | state->m_mmc_prg_bank[2] = (state->m_mmc_prg_bank[2] & 0x0f) | (data << 4); |
3242 | prg8_cd(space | |
3242 | prg8_cd(space.machine(), state->m_mmc_prg_bank[2]); | |
3243 | 3243 | break; |
3244 | 3244 | |
3245 | 3245 | /* $9002, 3 (1002, 3) uncaught = Jaleco Baseball writes 0 */ |
r17963 | r17964 | |
3255 | 3255 | else |
3256 | 3256 | state->m_mmc_vrom_bank[bank] = (state->m_mmc_vrom_bank[bank] & 0xf0) | (data & 0x0f); |
3257 | 3257 | |
3258 | chr1_x(space | |
3258 | chr1_x(space.machine(), bank, state->m_mmc_vrom_bank[bank], CHRROM); | |
3259 | 3259 | break; |
3260 | 3260 | |
3261 | 3261 | case 0x6000: |
r17963 | r17964 | |
3282 | 3282 | case 0x7002: |
3283 | 3283 | switch (data & 0x03) |
3284 | 3284 | { |
3285 | case 0: set_nt_mirroring(space->machine(), PPU_MIRROR_HORZ); break; | |
3286 | case 1: set_nt_mirroring(space->machine(), PPU_MIRROR_VERT); break; | |
3287 | case 2: set_nt_mirroring(space->machine(), PPU_MIRROR_LOW); break; | |
3288 | case 3: set_nt_mirroring(space->machine(), PPU_MIRROR_HIGH); break; | |
3285 | case 0: set_nt_mirroring(space.machine(), PPU_MIRROR_HORZ); break; | |
3286 | case 1: set_nt_mirroring(space.machine(), PPU_MIRROR_VERT); break; | |
3287 | case 2: set_nt_mirroring(space.machine(), PPU_MIRROR_LOW); break; | |
3288 | case 3: set_nt_mirroring(space.machine(), PPU_MIRROR_HIGH); break; | |
3289 | 3289 | } |
3290 | 3290 | break; |
3291 | 3291 | |
r17963 | r17964 | |
3310 | 3310 | static WRITE8_HANDLER( jf11_m_w ) |
3311 | 3311 | { |
3312 | 3312 | LOG_MMC(("jf11_m_w, offset: %04x, data: %02x\n", offset, data)); |
3313 | chr8(space->machine(), data, CHRROM); | |
3314 | prg32(space->machine(), data >> 4); | |
3313 | chr8(space.machine(), data, CHRROM); | |
3314 | prg32(space.machine(), data >> 4); | |
3315 | 3315 | } |
3316 | 3316 | |
3317 | 3317 | /************************************************************* |
r17963 | r17964 | |
3334 | 3334 | |
3335 | 3335 | if (offset == 0) |
3336 | 3336 | { |
3337 | prg32(space->machine(), (data >> 4) & 0x03); | |
3338 | chr8(space->machine(), ((data >> 4) & 0x04) | (data & 0x03), CHRROM); | |
3337 | prg32(space.machine(), (data >> 4) & 0x03); | |
3338 | chr8(space.machine(), ((data >> 4) & 0x04) | (data & 0x03), CHRROM); | |
3339 | 3339 | } |
3340 | 3340 | |
3341 | 3341 | if (offset == 0x1000) |
r17963 | r17964 | |
3361 | 3361 | { |
3362 | 3362 | LOG_MMC(("jf16_w, offset: %04x, data: %02x\n", offset, data)); |
3363 | 3363 | |
3364 | set_nt_mirroring(space->machine(), BIT(data, 3) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW); | |
3365 | chr8(space->machine(), data >> 4, CHRROM); | |
3366 | prg16_89ab(space->machine(), data); | |
3364 | set_nt_mirroring(space.machine(), BIT(data, 3) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW); | |
3365 | chr8(space.machine(), data >> 4, CHRROM); | |
3366 | prg16_89ab(space.machine(), data); | |
3367 | 3367 | } |
3368 | 3368 | |
3369 | 3369 | /************************************************************* |
r17963 | r17964 | |
3386 | 3386 | LOG_MMC(("jf17_w, offset: %04x, data: %02x\n", offset, data)); |
3387 | 3387 | |
3388 | 3388 | if (BIT(data, 7)) |
3389 | prg16_89ab(space | |
3389 | prg16_89ab(space.machine(), data & 0x0f); | |
3390 | 3390 | if (BIT(data, 6)) |
3391 | chr8(space | |
3391 | chr8(space.machine(), data & 0x0f, CHRROM); | |
3392 | 3392 | if (BIT(data, 5) && !BIT(data,4)) |
3393 | 3393 | LOG_MMC(("Jaleco JF-17 sound write, data: %02x\n", data & 0x1f)); |
3394 | 3394 | } |
r17963 | r17964 | |
3412 | 3412 | LOG_MMC(("jf19_w, offset: %04x, data: %02x\n", offset, data)); |
3413 | 3413 | |
3414 | 3414 | if (BIT(data, 7)) |
3415 | prg16_cdef(space | |
3415 | prg16_cdef(space.machine(), data & 0x0f); | |
3416 | 3416 | if (BIT(data, 6)) |
3417 | chr8(space | |
3417 | chr8(space.machine(), data & 0x0f, CHRROM); | |
3418 | 3418 | if (BIT(data, 5) && !BIT(data,4)) |
3419 | 3419 | LOG_MMC(("Jaleco JF-19 sound write, data: %02x\n", data & 0x1f)); |
3420 | 3420 | } |
r17963 | r17964 | |
3433 | 3433 | |
3434 | 3434 | static WRITE8_HANDLER( konami_vrc1_w ) |
3435 | 3435 | { |
3436 | nes_state *state = space | |
3436 | nes_state *state = space.machine().driver_data<nes_state>(); | |
3437 | 3437 | LOG_MMC(("konami_vrc1_w, offset: %04x, data: %02x\n", offset, data)); |
3438 | 3438 | |
3439 | 3439 | switch (offset & 0x7000) |
3440 | 3440 | { |
3441 | 3441 | case 0x0000: |
3442 | prg8_89(space | |
3442 | prg8_89(space.machine(), data); | |
3443 | 3443 | break; |
3444 | 3444 | case 0x1000: |
3445 | set_nt_mirroring(space | |
3445 | set_nt_mirroring(space.machine(), (data & 0x01) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
3446 | 3446 | state->m_mmc_vrom_bank[0] = (state->m_mmc_vrom_bank[0] & 0x0f) | ((data & 0x02) << 3); |
3447 | 3447 | state->m_mmc_vrom_bank[1] = (state->m_mmc_vrom_bank[1] & 0x0f) | ((data & 0x04) << 2); |
3448 | chr4_0(space->machine(), state->m_mmc_vrom_bank[0], CHRROM); | |
3449 | chr4_4(space->machine(), state->m_mmc_vrom_bank[1], CHRROM); | |
3448 | chr4_0(space.machine(), state->m_mmc_vrom_bank[0], CHRROM); | |
3449 | chr4_4(space.machine(), state->m_mmc_vrom_bank[1], CHRROM); | |
3450 | 3450 | break; |
3451 | 3451 | case 0x2000: |
3452 | prg8_ab(space | |
3452 | prg8_ab(space.machine(), data); | |
3453 | 3453 | break; |
3454 | 3454 | case 0x4000: |
3455 | prg8_cd(space | |
3455 | prg8_cd(space.machine(), data); | |
3456 | 3456 | break; |
3457 | 3457 | case 0x6000: |
3458 | 3458 | state->m_mmc_vrom_bank[0] = (state->m_mmc_vrom_bank[0] & 0x10) | (data & 0x0f); |
3459 | chr4_0(space | |
3459 | chr4_0(space.machine(), state->m_mmc_vrom_bank[0], CHRROM); | |
3460 | 3460 | break; |
3461 | 3461 | case 0x7000: |
3462 | 3462 | state->m_mmc_vrom_bank[1] = (state->m_mmc_vrom_bank[1] & 0x10) | (data & 0x0f); |
3463 | chr4_4(space | |
3463 | chr4_4(space.machine(), state->m_mmc_vrom_bank[1], CHRROM); | |
3464 | 3464 | break; |
3465 | 3465 | } |
3466 | 3466 | } |
r17963 | r17964 | |
3475 | 3475 | |
3476 | 3476 | static WRITE8_HANDLER( konami_vrc2_w ) |
3477 | 3477 | { |
3478 | nes_state *state = space | |
3478 | nes_state *state = space.machine().driver_data<nes_state>(); | |
3479 | 3479 | UINT8 bank, shift, mask; |
3480 | 3480 | UINT32 shifted_offs = (offset & 0x7000) |
3481 | 3481 | | ((offset << (9 - state->m_vrc_ls_prg_a)) & 0x200) |
r17963 | r17964 | |
3483 | 3483 | LOG_MMC(("konami_vrc2_w, offset: %04x, data: %02x\n", offset, data)); |
3484 | 3484 | |
3485 | 3485 | if (offset < 0x1000) |
3486 | prg8_89(space | |
3486 | prg8_89(space.machine(), data); | |
3487 | 3487 | else if (offset < 0x2000) |
3488 | 3488 | { |
3489 | 3489 | switch (data & 0x03) |
3490 | 3490 | { |
3491 | case 0x00: set_nt_mirroring(space->machine(), PPU_MIRROR_VERT); break; | |
3492 | case 0x01: set_nt_mirroring(space->machine(), PPU_MIRROR_HORZ); break; | |
3493 | case 0x02: set_nt_mirroring(space->machine(), PPU_MIRROR_LOW); break; | |
3494 | case 0x03: set_nt_mirroring(space->machine(), PPU_MIRROR_HIGH); break; | |
3491 | case 0x00: set_nt_mirroring(space.machine(), PPU_MIRROR_VERT); break; | |
3492 | case 0x01: set_nt_mirroring(space.machine(), PPU_MIRROR_HORZ); break; | |
3493 | case 0x02: set_nt_mirroring(space.machine(), PPU_MIRROR_LOW); break; | |
3494 | case 0x03: set_nt_mirroring(space.machine(), PPU_MIRROR_HIGH); break; | |
3495 | 3495 | } |
3496 | 3496 | } |
3497 | 3497 | else if (offset < 0x3000) |
3498 | prg8_ab(space | |
3498 | prg8_ab(space.machine(), data); | |
3499 | 3499 | else if (offset < 0x7000) |
3500 | 3500 | { |
3501 | 3501 | bank = ((shifted_offs & 0x7000) - 0x3000) / 0x0800 + BIT(shifted_offs, 9); |
r17963 | r17964 | |
3503 | 3503 | mask = (0xf0 >> shift); |
3504 | 3504 | state->m_mmc_vrom_bank[bank] = (state->m_mmc_vrom_bank[bank] & mask) |
3505 | 3505 | | (((data >> state->m_vrc_ls_chr) & 0x0f) << shift); |
3506 | chr1_x(space | |
3506 | chr1_x(space.machine(), bank, state->m_mmc_vrom_bank[bank], CHRROM); | |
3507 | 3507 | } |
3508 | 3508 | else |
3509 | 3509 | logerror("konami_vrc2_w uncaught write, addr: %04x value: %02x\n", offset + 0x8000, data); |
r17963 | r17964 | |
3524 | 3524 | static WRITE8_HANDLER( konami_vrc3_w ) |
3525 | 3525 | { |
3526 | 3526 | LOG_MMC(("konami_vrc3_w, offset: %04x, data: %02x\n", offset, data)); |
3527 | nes_state *state = space | |
3527 | nes_state *state = space.machine().driver_data<nes_state>(); | |
3528 | 3528 | |
3529 | 3529 | switch (offset & 0x7000) |
3530 | 3530 | { |
r17963 | r17964 | |
3546 | 3546 | state->m_IRQ_count |= (data & 0x0f) << 4; |
3547 | 3547 | break; |
3548 | 3548 | case 0x7000: |
3549 | prg16_89ab(space | |
3549 | prg16_89ab(space.machine(), data); | |
3550 | 3550 | break; |
3551 | 3551 | default: |
3552 | 3552 | logerror("konami_vrc3_w uncaught write, offset %04x, data: %02x\n", offset, data); |
r17963 | r17964 | |
3591 | 3591 | |
3592 | 3592 | static WRITE8_HANDLER( konami_vrc4_w ) |
3593 | 3593 | { |
3594 | nes_state *state = space | |
3594 | nes_state *state = space.machine().driver_data<nes_state>(); | |
3595 | 3595 | UINT8 bank, shift, mask; |
3596 | 3596 | UINT32 shifted_offs = (offset & 0x7000) |
3597 | 3597 | | ((offset << (9 - state->m_vrc_ls_prg_a)) & 0x200) |
r17963 | r17964 | |
3601 | 3601 | if (offset < 0x1000) |
3602 | 3602 | { |
3603 | 3603 | state->m_mmc_prg_bank[0] = data; |
3604 | vrc4_set_prg(space | |
3604 | vrc4_set_prg(space.machine()); | |
3605 | 3605 | } |
3606 | 3606 | else if (offset >= 0x2000 && offset < 0x3000) |
3607 | prg8_ab(space | |
3607 | prg8_ab(space.machine(), data); | |
3608 | 3608 | else |
3609 | 3609 | { |
3610 | 3610 | switch (shifted_offs & 0x7300) |
r17963 | r17964 | |
3613 | 3613 | case 0x1100: |
3614 | 3614 | switch (data & 0x03) |
3615 | 3615 | { |
3616 | case 0x00: set_nt_mirroring(space->machine(), PPU_MIRROR_VERT); break; | |
3617 | case 0x01: set_nt_mirroring(space->machine(), PPU_MIRROR_HORZ); break; | |
3618 | case 0x02: set_nt_mirroring(space->machine(), PPU_MIRROR_LOW); break; | |
3619 | case 0x03: set_nt_mirroring(space->machine(), PPU_MIRROR_HIGH); break; | |
3616 | case 0x00: set_nt_mirroring(space.machine(), PPU_MIRROR_VERT); break; | |
3617 | case 0x01: set_nt_mirroring(space.machine(), PPU_MIRROR_HORZ); break; | |
3618 | case 0x02: set_nt_mirroring(space.machine(), PPU_MIRROR_LOW); break; | |
3619 | case 0x03: set_nt_mirroring(space.machine(), PPU_MIRROR_HIGH); break; | |
3620 | 3620 | } |
3621 | 3621 | break; |
3622 | 3622 | case 0x1200: |
3623 | 3623 | case 0x1300: |
3624 | 3624 | state->m_mmc_latch1 = data & 0x02; |
3625 | vrc4_set_prg(space | |
3625 | vrc4_set_prg(space.machine()); | |
3626 | 3626 | break; |
3627 | 3627 | case 0x3000: |
3628 | 3628 | case 0x3100: |
r17963 | r17964 | |
3644 | 3644 | shift = BIT(shifted_offs, 8) * 4; |
3645 | 3645 | mask = (0xf0 >> shift); |
3646 | 3646 | state->m_mmc_vrom_bank[bank] = (state->m_mmc_vrom_bank[bank] & mask) | ((data & 0x0f) << shift); |
3647 | chr1_x(space | |
3647 | chr1_x(space.machine(), bank, state->m_mmc_vrom_bank[bank], CHRROM); | |
3648 | 3648 | break; |
3649 | 3649 | case 0x7000: |
3650 | 3650 | state->m_IRQ_count_latch = (state->m_IRQ_count_latch & 0xf0) | (data & 0x0f); |
r17963 | r17964 | |
3680 | 3680 | |
3681 | 3681 | static WRITE8_HANDLER( konami_vrc6_w ) |
3682 | 3682 | { |
3683 | nes_state *state = space | |
3683 | nes_state *state = space.machine().driver_data<nes_state>(); | |
3684 | 3684 | UINT8 bank; |
3685 | 3685 | UINT32 shifted_offs = (offset & 0x7000) |
3686 | 3686 | | ((offset << (9 - state->m_vrc_ls_prg_a)) & 0x200) |
r17963 | r17964 | |
3688 | 3688 | LOG_MMC(("konami_vrc6_w, offset: %04x, data: %02x\n", offset, data)); |
3689 | 3689 | |
3690 | 3690 | if (offset < 0x1000) |
3691 | prg16_89ab(space | |
3691 | prg16_89ab(space.machine(), data); | |
3692 | 3692 | else if (offset >= 0x4000 && offset < 0x5000) |
3693 | prg8_cd(space | |
3693 | prg8_cd(space.machine(), data); | |
3694 | 3694 | else |
3695 | 3695 | { |
3696 | 3696 | switch (shifted_offs & 0x7300) |
r17963 | r17964 | |
3709 | 3709 | case 0x3300: |
3710 | 3710 | switch (data & 0x0c) |
3711 | 3711 | { |
3712 | case 0x00: set_nt_mirroring(space->machine(), PPU_MIRROR_VERT); break; | |
3713 | case 0x04: set_nt_mirroring(space->machine(), PPU_MIRROR_HORZ); break; | |
3714 | case 0x08: set_nt_mirroring(space->machine(), PPU_MIRROR_LOW); break; | |
3715 | case 0x0c: set_nt_mirroring(space->machine(), PPU_MIRROR_HIGH); break; | |
3712 | case 0x00: set_nt_mirroring(space.machine(), PPU_MIRROR_VERT); break; | |
3713 | case 0x04: set_nt_mirroring(space.machine(), PPU_MIRROR_HORZ); break; | |
3714 | case 0x08: set_nt_mirroring(space.machine(), PPU_MIRROR_LOW); break; | |
3715 | case 0x0c: set_nt_mirroring(space.machine(), PPU_MIRROR_HIGH); break; | |
3716 | 3716 | } |
3717 | 3717 | break; |
3718 | 3718 | case 0x5000: |
r17963 | r17964 | |
3724 | 3724 | case 0x6200: |
3725 | 3725 | case 0x6300: |
3726 | 3726 | bank = ((shifted_offs & 0x7000) - 0x5000) / 0x0400 + ((shifted_offs & 0x0300) >> 8); |
3727 | chr1_x(space | |
3727 | chr1_x(space.machine(), bank, data, CHRROM); | |
3728 | 3728 | break; |
3729 | 3729 | case 0x7000: |
3730 | 3730 | state->m_IRQ_count_latch = data; |
r17963 | r17964 | |
3760 | 3760 | |
3761 | 3761 | static WRITE8_HANDLER( konami_vrc7_w ) |
3762 | 3762 | { |
3763 | nes_state *state = space | |
3763 | nes_state *state = space.machine().driver_data<nes_state>(); | |
3764 | 3764 | UINT8 bank; |
3765 | 3765 | LOG_MMC(("konami_vrc7_w, offset: %04x, data: %02x\n", offset, data)); |
3766 | 3766 | |
3767 | 3767 | switch (offset & 0x7018) |
3768 | 3768 | { |
3769 | 3769 | case 0x0000: |
3770 | prg8_89(space | |
3770 | prg8_89(space.machine(), data); | |
3771 | 3771 | break; |
3772 | 3772 | case 0x0008: |
3773 | 3773 | case 0x0010: |
3774 | 3774 | case 0x0018: |
3775 | prg8_ab(space | |
3775 | prg8_ab(space.machine(), data); | |
3776 | 3776 | break; |
3777 | 3777 | |
3778 | 3778 | case 0x1000: |
3779 | prg8_cd(space | |
3779 | prg8_cd(space.machine(), data); | |
3780 | 3780 | break; |
3781 | 3781 | |
3782 | 3782 | /* TODO: there are sound regs in here */ |
r17963 | r17964 | |
3798 | 3798 | case 0x5010: |
3799 | 3799 | case 0x5018: |
3800 | 3800 | bank = ((offset & 0x7000) - 0x2000) / 0x0800 + ((offset & 0x0018) ? 1 : 0); |
3801 | chr1_x(space | |
3801 | chr1_x(space.machine(), bank, data, state->m_mmc_chr_source); | |
3802 | 3802 | break; |
3803 | 3803 | |
3804 | 3804 | case 0x6000: |
3805 | 3805 | switch (data & 0x03) |
3806 | 3806 | { |
3807 | case 0x00: set_nt_mirroring(space->machine(), PPU_MIRROR_VERT); break; | |
3808 | case 0x01: set_nt_mirroring(space->machine(), PPU_MIRROR_HORZ); break; | |
3809 | case 0x02: set_nt_mirroring(space->machine(), PPU_MIRROR_LOW); break; | |
3810 | case 0x03: set_nt_mirroring(space->machine(), PPU_MIRROR_HIGH); break; | |
3807 | case 0x00: set_nt_mirroring(space.machine(), PPU_MIRROR_VERT); break; | |
3808 | case 0x01: set_nt_mirroring(space.machine(), PPU_MIRROR_HORZ); break; | |
3809 | case 0x02: set_nt_mirroring(space.machine(), PPU_MIRROR_LOW); break; | |
3810 | case 0x03: set_nt_mirroring(space.machine(), PPU_MIRROR_HIGH); break; | |
3811 | 3811 | } |
3812 | 3812 | break; |
3813 | 3813 | case 0x6008: case 0x6010: case 0x6018: |
r17963 | r17964 | |
3864 | 3864 | |
3865 | 3865 | static WRITE8_HANDLER( namcot163_l_w ) |
3866 | 3866 | { |
3867 | nes_state *state = space | |
3867 | nes_state *state = space.machine().driver_data<nes_state>(); | |
3868 | 3868 | LOG_MMC(("namcot163_l_w, offset: %04x, data: %02x\n", offset, data)); |
3869 | 3869 | offset += 0x100; |
3870 | 3870 | |
r17963 | r17964 | |
3885 | 3885 | |
3886 | 3886 | static READ8_HANDLER( namcot163_l_r ) |
3887 | 3887 | { |
3888 | nes_state *state = space | |
3888 | nes_state *state = space.machine().driver_data<nes_state>(); | |
3889 | 3889 | LOG_MMC(("namcot163_l_r, offset: %04x\n", offset)); |
3890 | 3890 | offset += 0x100; |
3891 | 3891 | |
r17963 | r17964 | |
3912 | 3912 | |
3913 | 3913 | static WRITE8_HANDLER( namcot163_w ) |
3914 | 3914 | { |
3915 | nes_state *state = space | |
3915 | nes_state *state = space.machine().driver_data<nes_state>(); | |
3916 | 3916 | LOG_MMC(("namcot163_w, offset: %04x, data: %02x\n", offset, data)); |
3917 | 3917 | switch (offset & 0x7800) |
3918 | 3918 | { |
r17963 | r17964 | |
3920 | 3920 | case 0x1000: case 0x1800: |
3921 | 3921 | case 0x2000: case 0x2800: |
3922 | 3922 | case 0x3000: case 0x3800: |
3923 | chr1_x(space | |
3923 | chr1_x(space.machine(), offset / 0x800, data, CHRROM); | |
3924 | 3924 | break; |
3925 | 3925 | case 0x4000: |
3926 | namcot163_set_mirror(space | |
3926 | namcot163_set_mirror(space.machine(), 0, data); | |
3927 | 3927 | break; |
3928 | 3928 | case 0x4800: |
3929 | namcot163_set_mirror(space | |
3929 | namcot163_set_mirror(space.machine(), 1, data); | |
3930 | 3930 | break; |
3931 | 3931 | case 0x5000: |
3932 | namcot163_set_mirror(space | |
3932 | namcot163_set_mirror(space.machine(), 2, data); | |
3933 | 3933 | break; |
3934 | 3934 | case 0x5800: |
3935 | namcot163_set_mirror(space | |
3935 | namcot163_set_mirror(space.machine(), 3, data); | |
3936 | 3936 | break; |
3937 | 3937 | case 0x6000: |
3938 | prg8_89(space | |
3938 | prg8_89(space.machine(), data & 0x3f); | |
3939 | 3939 | break; |
3940 | 3940 | case 0x6800: |
3941 | 3941 | state->m_mmc_latch1 = data & 0xc0; // this should enable High CHRRAM, but we still have to properly implement it! |
3942 | prg8_ab(space | |
3942 | prg8_ab(space.machine(), data & 0x3f); | |
3943 | 3943 | break; |
3944 | 3944 | case 0x7000: |
3945 | prg8_cd(space | |
3945 | prg8_cd(space.machine(), data & 0x3f); | |
3946 | 3946 | break; |
3947 | 3947 | case 0x7800: |
3948 | 3948 | LOG_MMC(("Namcot-163 sound address write, data: %02x\n", data)); |
r17963 | r17964 | |
3964 | 3964 | |
3965 | 3965 | static WRITE8_HANDLER( sunsoft1_m_w ) |
3966 | 3966 | { |
3967 | nes_state *state = space | |
3967 | nes_state *state = space.machine().driver_data<nes_state>(); | |
3968 | 3968 | LOG_MMC(("sunsoft1_m_w, offset: %04x, data: %02x\n", offset, data)); |
3969 | 3969 | |
3970 | 3970 | if (state->m_chr_chunks) |
3971 | 3971 | { |
3972 | chr4_0(space->machine(), data & 0x0f, CHRROM); | |
3973 | chr4_4(space->machine(), data >> 4, CHRROM); | |
3972 | chr4_0(space.machine(), data & 0x0f, CHRROM); | |
3973 | chr4_4(space.machine(), data >> 4, CHRROM); | |
3974 | 3974 | } |
3975 | 3975 | else |
3976 | prg16_89ab(space | |
3976 | prg16_89ab(space.machine(), data & 0x0f); | |
3977 | 3977 | } |
3978 | 3978 | |
3979 | 3979 | /************************************************************* |
r17963 | r17964 | |
3989 | 3989 | |
3990 | 3990 | static WRITE8_HANDLER( sunsoft2_w ) |
3991 | 3991 | { |
3992 | nes_state *state = space | |
3992 | nes_state *state = space.machine().driver_data<nes_state>(); | |
3993 | 3993 | UINT8 sunsoft_helper = (data & 0x07) | ((data & 0x80) ? 0x08 : 0x00); |
3994 | 3994 | LOG_MMC(("sunsoft2_w, offset: %04x, data: %02x\n", offset, data)); |
3995 | 3995 | |
3996 | 3996 | if (!state->m_hard_mirroring) // there are two 'variants' depending on hardwired or mapper ctrl mirroring |
3997 | set_nt_mirroring(space | |
3997 | set_nt_mirroring(space.machine(), BIT(data, 3) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW); | |
3998 | 3998 | if (state->m_chr_chunks) |
3999 | chr8(space | |
3999 | chr8(space.machine(), sunsoft_helper, CHRROM); | |
4000 | 4000 | |
4001 | prg16_89ab(space | |
4001 | prg16_89ab(space.machine(), data >> 4); | |
4002 | 4002 | } |
4003 | 4003 | |
4004 | 4004 | /************************************************************* |
r17963 | r17964 | |
4036 | 4036 | |
4037 | 4037 | static WRITE8_HANDLER( sunsoft3_w ) |
4038 | 4038 | { |
4039 | nes_state *state = space | |
4039 | nes_state *state = space.machine().driver_data<nes_state>(); | |
4040 | 4040 | LOG_MMC(("sunsoft3_w, offset %04x, data: %02x\n", offset, data)); |
4041 | 4041 | |
4042 | 4042 | switch (offset & 0x7800) |
4043 | 4043 | { |
4044 | 4044 | case 0x0800: |
4045 | chr2_0(space | |
4045 | chr2_0(space.machine(), data, CHRROM); | |
4046 | 4046 | break; |
4047 | 4047 | case 0x1800: |
4048 | chr2_2(space | |
4048 | chr2_2(space.machine(), data, CHRROM); | |
4049 | 4049 | break; |
4050 | 4050 | case 0x2800: |
4051 | chr2_4(space | |
4051 | chr2_4(space.machine(), data, CHRROM); | |
4052 | 4052 | break; |
4053 | 4053 | case 0x3800: |
4054 | chr2_6(space | |
4054 | chr2_6(space.machine(), data, CHRROM); | |
4055 | 4055 | break; |
4056 | 4056 | case 0x4000: |
4057 | 4057 | case 0x4800: |
r17963 | r17964 | |
4068 | 4068 | case 0x6800: |
4069 | 4069 | switch (data & 3) |
4070 | 4070 | { |
4071 | case 0x00: set_nt_mirroring(space->machine(), PPU_MIRROR_VERT); break; | |
4072 | case 0x01: set_nt_mirroring(space->machine(), PPU_MIRROR_HORZ); break; | |
4073 | case 0x02: set_nt_mirroring(space->machine(), PPU_MIRROR_LOW); break; | |
4074 | case 0x03: set_nt_mirroring(space->machine(), PPU_MIRROR_HIGH); break; | |
4071 | case 0x00: set_nt_mirroring(space.machine(), PPU_MIRROR_VERT); break; | |
4072 | case 0x01: set_nt_mirroring(space.machine(), PPU_MIRROR_HORZ); break; | |
4073 | case 0x02: set_nt_mirroring(space.machine(), PPU_MIRROR_LOW); break; | |
4074 | case 0x03: set_nt_mirroring(space.machine(), PPU_MIRROR_HIGH); break; | |
4075 | 4075 | } |
4076 | 4076 | break; |
4077 | 4077 | case 0x7800: |
4078 | prg16_89ab(space | |
4078 | prg16_89ab(space.machine(), data); | |
4079 | 4079 | break; |
4080 | 4080 | default: |
4081 | 4081 | LOG_MMC(("sunsoft3_w uncaught write, offset: %04x, data: %02x\n", offset, data)); |
r17963 | r17964 | |
4104 | 4104 | switch (offset & 0x7003) |
4105 | 4105 | { |
4106 | 4106 | case 0x0000: |
4107 | set_nt_mirroring(space->machine(), BIT(data, 6) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
4108 | prg8_89(space->machine(), data); | |
4107 | set_nt_mirroring(space.machine(), BIT(data, 6) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
4108 | prg8_89(space.machine(), data); | |
4109 | 4109 | break; |
4110 | 4110 | case 0x0001: |
4111 | prg8_ab(space | |
4111 | prg8_ab(space.machine(), data); | |
4112 | 4112 | break; |
4113 | 4113 | case 0x0002: |
4114 | chr2_0(space | |
4114 | chr2_0(space.machine(), data, CHRROM); | |
4115 | 4115 | break; |
4116 | 4116 | case 0x0003: |
4117 | chr2_2(space | |
4117 | chr2_2(space.machine(), data, CHRROM); | |
4118 | 4118 | break; |
4119 | 4119 | case 0x2000: |
4120 | chr1_4(space | |
4120 | chr1_4(space.machine(), data, CHRROM); | |
4121 | 4121 | break; |
4122 | 4122 | case 0x2001: |
4123 | chr1_5(space | |
4123 | chr1_5(space.machine(), data, CHRROM); | |
4124 | 4124 | break; |
4125 | 4125 | case 0x2002: |
4126 | chr1_6(space | |
4126 | chr1_6(space.machine(), data, CHRROM); | |
4127 | 4127 | break; |
4128 | 4128 | case 0x2003: |
4129 | chr1_7(space | |
4129 | chr1_7(space.machine(), data, CHRROM); | |
4130 | 4130 | break; |
4131 | 4131 | } |
4132 | 4132 | } |
r17963 | r17964 | |
4152 | 4152 | |
4153 | 4153 | static WRITE8_HANDLER( tc0190fmc_p16_w ) |
4154 | 4154 | { |
4155 | nes_state *state = space | |
4155 | nes_state *state = space.machine().driver_data<nes_state>(); | |
4156 | 4156 | LOG_MMC(("tc0190fmc_p16_w, offset: %04x, data: %02x\n", offset, data)); |
4157 | 4157 | |
4158 | 4158 | switch (offset & 0x7003) |
4159 | 4159 | { |
4160 | 4160 | case 0x0000: |
4161 | prg8_89(space | |
4161 | prg8_89(space.machine(), data); | |
4162 | 4162 | break; |
4163 | 4163 | case 0x0001: |
4164 | 4164 | case 0x0002: |
r17963 | r17964 | |
4182 | 4182 | state->m_IRQ_enable = 0; |
4183 | 4183 | break; |
4184 | 4184 | case 0x6000: |
4185 | set_nt_mirroring(space | |
4185 | set_nt_mirroring(space.machine(), BIT(data, 6) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
4186 | 4186 | break; |
4187 | 4187 | } |
4188 | 4188 | } |
r17963 | r17964 | |
4203 | 4203 | |
4204 | 4204 | static WRITE8_HANDLER( x1005_m_w ) |
4205 | 4205 | { |
4206 | nes_state *state = space | |
4206 | nes_state *state = space.machine().driver_data<nes_state>(); | |
4207 | 4207 | LOG_MMC(("x1005_m_w, offset: %04x, data: %02x\n", offset, data)); |
4208 | 4208 | |
4209 | 4209 | switch (offset) |
4210 | 4210 | { |
4211 | 4211 | case 0x1ef0: |
4212 | chr2_0(space | |
4212 | chr2_0(space.machine(), (data & 0x7f) >> 1, CHRROM); | |
4213 | 4213 | break; |
4214 | 4214 | case 0x1ef1: |
4215 | chr2_2(space | |
4215 | chr2_2(space.machine(), (data & 0x7f) >> 1, CHRROM); | |
4216 | 4216 | break; |
4217 | 4217 | case 0x1ef2: |
4218 | chr1_4(space | |
4218 | chr1_4(space.machine(), data, CHRROM); | |
4219 | 4219 | break; |
4220 | 4220 | case 0x1ef3: |
4221 | chr1_5(space | |
4221 | chr1_5(space.machine(), data, CHRROM); | |
4222 | 4222 | break; |
4223 | 4223 | case 0x1ef4: |
4224 | chr1_6(space | |
4224 | chr1_6(space.machine(), data, CHRROM); | |
4225 | 4225 | break; |
4226 | 4226 | case 0x1ef5: |
4227 | chr1_7(space | |
4227 | chr1_7(space.machine(), data, CHRROM); | |
4228 | 4228 | break; |
4229 | 4229 | case 0x1ef6: |
4230 | 4230 | case 0x1ef7: |
4231 | set_nt_mirroring(space | |
4231 | set_nt_mirroring(space.machine(), BIT(data, 0) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ); | |
4232 | 4232 | break; |
4233 | 4233 | case 0x1ef8: |
4234 | 4234 | case 0x1ef9: |
r17963 | r17964 | |
4236 | 4236 | break; |
4237 | 4237 | case 0x1efa: |
4238 | 4238 | case 0x1efb: |
4239 | prg8_89(space | |
4239 | prg8_89(space.machine(), data); | |
4240 | 4240 | break; |
4241 | 4241 | case 0x1efc: |
4242 | 4242 | case 0x1efd: |
4243 | prg8_ab(space | |
4243 | prg8_ab(space.machine(), data); | |
4244 | 4244 | break; |
4245 | 4245 | case 0x1efe: |
4246 | 4246 | case 0x1eff: |
4247 | prg8_cd(space | |
4247 | prg8_cd(space.machine(), data); | |
4248 | 4248 | break; |
4249 | 4249 | default: |
4250 | 4250 | logerror("mapper80_m_w uncaught addr: %04x, value: %02x\n", offset + 0x6000, data); |
r17963 | r17964 | |
4259 | 4259 | |
4260 | 4260 | static READ8_HANDLER( x1005_m_r ) |
4261 | 4261 | { |
4262 | nes_state *state = space | |
4262 | nes_state *state = space.machine().driver_data<nes_state>(); | |
4263 | 4263 | LOG_MMC(("x1005a_m_r, offset: %04x\n", offset)); |
4264 | 4264 | |
4265 | 4265 | if (offset >= 0x1f00 && state->m_mapper_ram != NULL && state->m_mmc_latch1 == 0xa3) |
r17963 | r17964 | |
4281 | 4281 | switch (offset) |
4282 | 4282 | { |
4283 | 4283 | case 0x1ef0: |
4284 | set_nt_page(space->machine(), 0, CIRAM, (data & 0x80) ? 1 : 0, 1); | |
4285 | set_nt_page(space->machine(), 1, CIRAM, (data & 0x80) ? 1 : 0, 1); | |
4284 | set_nt_page(space.machine(), 0, CIRAM, (data & 0x80) ? 1 : 0, 1); | |
4285 | set_nt_page(space.machine(), 1, CIRAM, (data & 0x80) ? 1 : 0, 1); | |
4286 | 4286 | break; |
4287 | 4287 | case 0x1ef1: |
4288 | set_nt_page(space->machine(), 2, CIRAM, (data & 0x80) ? 1 : 0, 1); | |
4289 | set_nt_page(space->machine(), 3, CIRAM, (data & 0x80) ? 1 : 0, 1); | |
4288 | set_nt_page(space.machine(), 2, CIRAM, (data & 0x80) ? 1 : 0, 1); | |
4289 | set_nt_page(space.machine(), 3, CIRAM, (data & 0x80) ? 1 : 0, 1); | |
4290 | 4290 | break; |
4291 | 4291 | } |
4292 | 4292 | |
r17963 | r17964 | |
4330 | 4330 | |
4331 | 4331 | static WRITE8_HANDLER( x1017_m_w ) |
4332 | 4332 | { |
4333 | nes_state *state = space | |
4333 | nes_state *state = space.machine().driver_data<nes_state>(); | |
4334 | 4334 | UINT8 reg = offset & 0x07; |
4335 | 4335 | LOG_MMC(("x1017_m_w, offset: %04x, data: %02x\n", offset, data)); |
4336 | 4336 | |
r17963 | r17964 | |
4341 | 4341 | if (state->m_mmc_vrom_bank[reg] != data) |
4342 | 4342 | { |
4343 | 4343 | state->m_mmc_vrom_bank[reg] = data; |
4344 | x1017_set_chr(space | |
4344 | x1017_set_chr(space.machine()); | |
4345 | 4345 | } |
4346 | 4346 | break; |
4347 | 4347 | case 0x1ef2: |
r17963 | r17964 | |
4351 | 4351 | if (state->m_mmc_vrom_bank[reg] != data) |
4352 | 4352 | { |
4353 | 4353 | state->m_mmc_vrom_bank[reg] = data; |
4354 | x1017_set_chr(space | |
4354 | x1017_set_chr(space.machine()); | |
4355 | 4355 | } |
4356 | 4356 | break; |
4357 | 4357 | case 0x1ef6: |
4358 | set_nt_mirroring(space | |
4358 | set_nt_mirroring(space.machine(), BIT(data, 0) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ); | |
4359 | 4359 | state->m_mmc_latch1 = ((data & 0x02) << 1); |
4360 | x1017_set_chr(space | |
4360 | x1017_set_chr(space.machine()); | |
4361 | 4361 | break; |
4362 | 4362 | case 0x1ef7: |
4363 | 4363 | case 0x1ef8: |
r17963 | r17964 | |
4365 | 4365 | state->m_mmc_reg[(offset & 0x0f) - 7] = data; |
4366 | 4366 | break; |
4367 | 4367 | case 0x1efa: |
4368 | prg8_89(space | |
4368 | prg8_89(space.machine(), data >> 2); | |
4369 | 4369 | break; |
4370 | 4370 | case 0x1efb: |
4371 | prg8_ab(space | |
4371 | prg8_ab(space.machine(), data >> 2); | |
4372 | 4372 | break; |
4373 | 4373 | case 0x1efc: |
4374 | prg8_cd(space | |
4374 | prg8_cd(space.machine(), data >> 2); | |
4375 | 4375 | break; |
4376 | 4376 | default: |
4377 | 4377 | logerror("x1017_m_w uncaught write, addr: %04x, value: %02x\n", offset + 0x6000, data); |
r17963 | r17964 | |
4381 | 4381 | |
4382 | 4382 | static READ8_HANDLER( x1017_m_r ) |
4383 | 4383 | { |
4384 | nes_state *state = space | |
4384 | nes_state *state = space.machine().driver_data<nes_state>(); | |
4385 | 4385 | LOG_MMC(("x1017_m_r, offset: %04x\n", offset)); |
4386 | 4386 | |
4387 | 4387 | // 2+2+1 KB of Internal RAM can be independently enabled/disabled! |
r17963 | r17964 | |
4418 | 4418 | LOG_MMC(("agci_50282_w, offset: %04x, data: %02x\n", offset, data)); |
4419 | 4419 | |
4420 | 4420 | offset += 0x8000; |
4421 | data |= (space | |
4421 | data |= (space.read_byte(offset) & 1); | |
4422 | 4422 | |
4423 | chr8(space->machine(), data >> 4, CHRROM); | |
4424 | prg32(space->machine(), data); | |
4423 | chr8(space.machine(), data >> 4, CHRROM); | |
4424 | prg32(space.machine(), data); | |
4425 | 4425 | } |
4426 | 4426 | |
4427 | 4427 | /************************************************************* |
r17963 | r17964 | |
4439 | 4439 | switch (offset) |
4440 | 4440 | { |
4441 | 4441 | case 0x1ffd: |
4442 | prg32(space | |
4442 | prg32(space.machine(), data); | |
4443 | 4443 | break; |
4444 | 4444 | case 0x1ffe: |
4445 | chr4_0(space | |
4445 | chr4_0(space.machine(), data, CHRROM); | |
4446 | 4446 | break; |
4447 | 4447 | case 0x1fff: |
4448 | chr4_4(space | |
4448 | chr4_4(space.machine(), data, CHRROM); | |
4449 | 4449 | break; |
4450 | 4450 | } |
4451 | 4451 | } |
r17963 | r17964 | |
4469 | 4469 | |
4470 | 4470 | if (!(offset & 0x0100)) |
4471 | 4471 | { |
4472 | prg32(space->machine(), data >> 3); | |
4473 | chr8(space->machine(), data, CHRROM); | |
4472 | prg32(space.machine(), data >> 3); | |
4473 | chr8(space.machine(), data, CHRROM); | |
4474 | 4474 | } |
4475 | 4475 | } |
4476 | 4476 | |
r17963 | r17964 | |
4488 | 4488 | UINT8 pmode; |
4489 | 4489 | LOG_MMC(("ae_act52_w, offset: %04x, data: %02x\n", offset, data)); |
4490 | 4490 | |
4491 | set_nt_mirroring(space | |
4491 | set_nt_mirroring(space.machine(), BIT(offset, 13) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
4492 | 4492 | |
4493 | 4493 | cbank = (data & 0x03) | ((offset & 0x0f) << 2); |
4494 | chr8(space | |
4494 | chr8(space.machine(), cbank, CHRROM); | |
4495 | 4495 | |
4496 | 4496 | pmode = offset & 0x20; |
4497 | 4497 | pbank = (offset & 0x1fc0) >> 6; |
4498 | 4498 | if (pmode) |
4499 | 4499 | { |
4500 | prg16_89ab(space->machine(), pbank); | |
4501 | prg16_cdef(space->machine(), pbank); | |
4500 | prg16_89ab(space.machine(), pbank); | |
4501 | prg16_cdef(space.machine(), pbank); | |
4502 | 4502 | } |
4503 | 4503 | else |
4504 | prg32(space | |
4504 | prg32(space.machine(), pbank >> 1); | |
4505 | 4505 | } |
4506 | 4506 | |
4507 | 4507 | |
r17963 | r17964 | |
4528 | 4528 | return; |
4529 | 4529 | if (offset < 0x00a5) |
4530 | 4530 | { |
4531 | prg32(space | |
4531 | prg32(space.machine(), (offset - 0x0065) & 0x03); | |
4532 | 4532 | return; |
4533 | 4533 | } |
4534 | 4534 | if (offset < 0x00e5) |
4535 | 4535 | { |
4536 | chr8(space | |
4536 | chr8(space.machine(), (offset - 0x00a5) & 0x07, CHRROM); | |
4537 | 4537 | } |
4538 | 4538 | } |
4539 | 4539 | |
r17963 | r17964 | |
4556 | 4556 | |
4557 | 4557 | static WRITE8_HANDLER( cne_fsb_m_w ) |
4558 | 4558 | { |
4559 | nes_state *state = space | |
4559 | nes_state *state = space.machine().driver_data<nes_state>(); | |
4560 | 4560 | LOG_MMC(("cne_fsb_m_w, offset: %04x, data: %02x\n", offset, data)); |
4561 | 4561 | |
4562 | 4562 | if (offset < 0x0800) |
r17963 | r17964 | |
4564 | 4564 | switch (offset & 0x0007) |
4565 | 4565 | { |
4566 | 4566 | case 0x0000: |
4567 | prg8_89(space | |
4567 | prg8_89(space.machine(), data); | |
4568 | 4568 | break; |
4569 | 4569 | case 0x0001: |
4570 | prg8_ab(space | |
4570 | prg8_ab(space.machine(), data); | |
4571 | 4571 | break; |
4572 | 4572 | case 0x0002: |
4573 | prg8_cd(space | |
4573 | prg8_cd(space.machine(), data); | |
4574 | 4574 | break; |
4575 | 4575 | case 0x0003: |
4576 | prg8_ef(space | |
4576 | prg8_ef(space.machine(), data); | |
4577 | 4577 | break; |
4578 | 4578 | case 0x0004: |
4579 | chr2_0(space | |
4579 | chr2_0(space.machine(), data, CHRROM); | |
4580 | 4580 | break; |
4581 | 4581 | case 0x0005: |
4582 | chr2_2(space | |
4582 | chr2_2(space.machine(), data, CHRROM); | |
4583 | 4583 | break; |
4584 | 4584 | case 0x0006: |
4585 | chr2_4(space | |
4585 | chr2_4(space.machine(), data, CHRROM); | |
4586 | 4586 | break; |
4587 | 4587 | case 0x0007: |
4588 | chr2_6(space | |
4588 | chr2_6(space.machine(), data, CHRROM); | |
4589 | 4589 | break; |
4590 | 4590 | } |
4591 | 4591 | } |
r17963 | r17964 | |
4614 | 4614 | { |
4615 | 4615 | LOG_MMC(("cne_shlz_l_w, offset: %04x, data: %02x\n", offset, data)); |
4616 | 4616 | |
4617 | prg32(space->machine(), data >> 4); | |
4618 | chr8(space->machine(), data & 0x0f, CHRROM); | |
4617 | prg32(space.machine(), data >> 4); | |
4618 | chr8(space.machine(), data & 0x0f, CHRROM); | |
4619 | 4619 | } |
4620 | 4620 | |
4621 | 4621 | /************************************************************* |
r17963 | r17964 | |
4632 | 4632 | |
4633 | 4633 | static WRITE8_HANDLER( caltron6in1_m_w ) |
4634 | 4634 | { |
4635 | nes_state *state = space | |
4635 | nes_state *state = space.machine().driver_data<nes_state>(); | |
4636 | 4636 | LOG_MMC(("caltron6in1_m_w, offset: %04x, data: %02x\n", offset, data)); |
4637 | 4637 | |
4638 | 4638 | state->m_mmc_latch1 = offset & 0xff; |
4639 | set_nt_mirroring(space->machine(), BIT(data, 5) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
4640 | prg32(space->machine(), offset & 0x07); | |
4639 | set_nt_mirroring(space.machine(), BIT(data, 5) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
4640 | prg32(space.machine(), offset & 0x07); | |
4641 | 4641 | } |
4642 | 4642 | |
4643 | 4643 | static WRITE8_HANDLER( caltron6in1_w ) |
4644 | 4644 | { |
4645 | nes_state *state = space | |
4645 | nes_state *state = space.machine().driver_data<nes_state>(); | |
4646 | 4646 | LOG_MMC(("caltron6in1_w, offset: %04x, data: %02x\n", offset, data)); |
4647 | 4647 | |
4648 | 4648 | if (state->m_mmc_latch1 & 0x04) |
4649 | chr8(space | |
4649 | chr8(space.machine(), ((state->m_mmc_latch1 & 0x18) >> 1) | (data & 0x03), CHRROM); | |
4650 | 4650 | } |
4651 | 4651 | |
4652 | 4652 | /************************************************************* |
r17963 | r17964 | |
4668 | 4668 | |
4669 | 4669 | static WRITE8_HANDLER( bf9093_w ) |
4670 | 4670 | { |
4671 | nes_state *state = space | |
4671 | nes_state *state = space.machine().driver_data<nes_state>(); | |
4672 | 4672 | LOG_MMC(("bf9093_w, offset: %04x, data: %02x\n", offset, data)); |
4673 | 4673 | |
4674 | 4674 | switch (offset & 0x7000) |
r17963 | r17964 | |
4676 | 4676 | case 0x0000: |
4677 | 4677 | case 0x1000: |
4678 | 4678 | if (!state->m_hard_mirroring) |
4679 | set_nt_mirroring(space | |
4679 | set_nt_mirroring(space.machine(), BIT(data, 4) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW); | |
4680 | 4680 | break; |
4681 | 4681 | case 0x4000: |
4682 | 4682 | case 0x5000: |
4683 | 4683 | case 0x6000: |
4684 | 4684 | case 0x7000: |
4685 | prg16_89ab(space | |
4685 | prg16_89ab(space.machine(), data); | |
4686 | 4686 | break; |
4687 | 4687 | } |
4688 | 4688 | } |
r17963 | r17964 | |
4714 | 4714 | |
4715 | 4715 | static WRITE8_HANDLER( bf9096_w ) |
4716 | 4716 | { |
4717 | nes_state *state = space | |
4717 | nes_state *state = space.machine().driver_data<nes_state>(); | |
4718 | 4718 | LOG_MMC(("bf9096_w, offset: %04x, data: %02x\n", offset, data)); |
4719 | 4719 | |
4720 | 4720 | if (offset < 0x2000) |
r17963 | r17964 | |
4722 | 4722 | else |
4723 | 4723 | state->m_mmc_latch2 = data; |
4724 | 4724 | |
4725 | bf9096_set_prg(space | |
4725 | bf9096_set_prg(space.machine()); | |
4726 | 4726 | } |
4727 | 4727 | |
4728 | 4728 | /************************************************************* |
r17963 | r17964 | |
4739 | 4739 | |
4740 | 4740 | static WRITE8_HANDLER( golden5_w ) |
4741 | 4741 | { |
4742 | nes_state *state = space | |
4742 | nes_state *state = space.machine().driver_data<nes_state>(); | |
4743 | 4743 | LOG_MMC(("golden5_w, offset: %04x, data: %02x\n", offset, data)); |
4744 | 4744 | |
4745 | 4745 | if (offset < 0x4000) |
r17963 | r17964 | |
4747 | 4747 | if (data & 0x08) |
4748 | 4748 | { |
4749 | 4749 | state->m_mmc_prg_bank[0] = ((data & 0x07) << 4) | (state->m_mmc_prg_bank[0] & 0x0f); |
4750 | prg16_89ab(space->machine(), state->m_mmc_prg_bank[0]); | |
4751 | prg16_cdef(space->machine(), ((data & 0x07) << 4) | 0x0f); | |
4750 | prg16_89ab(space.machine(), state->m_mmc_prg_bank[0]); | |
4751 | prg16_cdef(space.machine(), ((data & 0x07) << 4) | 0x0f); | |
4752 | 4752 | } |
4753 | 4753 | |
4754 | 4754 | } |
4755 | 4755 | else |
4756 | 4756 | { |
4757 | 4757 | state->m_mmc_prg_bank[0] = (state->m_mmc_prg_bank[0] & 0x70) | (data & 0x0f); |
4758 | prg16_89ab(space | |
4758 | prg16_89ab(space.machine(), state->m_mmc_prg_bank[0]); | |
4759 | 4759 | } |
4760 | 4760 | } |
4761 | 4761 | |
r17963 | r17964 | |
4774 | 4774 | |
4775 | 4775 | static WRITE8_HANDLER( cony_l_w ) |
4776 | 4776 | { |
4777 | nes_state *state = space | |
4777 | nes_state *state = space.machine().driver_data<nes_state>(); | |
4778 | 4778 | LOG_MMC(("cony_l_w, offset: %04x, data: %02x\n", offset, data)); |
4779 | 4779 | |
4780 | 4780 | if (offset >= 0x1000 && offset < 0x1103) // from 0x5100-0x51ff |
r17963 | r17964 | |
4783 | 4783 | |
4784 | 4784 | static READ8_HANDLER( cony_l_r ) |
4785 | 4785 | { |
4786 | nes_state *state = space | |
4786 | nes_state *state = space.machine().driver_data<nes_state>(); | |
4787 | 4787 | LOG_MMC(("cony_l_r, offset: %04x\n", offset)); |
4788 | 4788 | |
4789 | 4789 | if (offset == 0x0f00) // 0x5000 |
r17963 | r17964 | |
4833 | 4833 | |
4834 | 4834 | static WRITE8_HANDLER( cony_w ) |
4835 | 4835 | { |
4836 | nes_state *state = space | |
4836 | nes_state *state = space.machine().driver_data<nes_state>(); | |
4837 | 4837 | LOG_MMC(("cony_w, offset: %04x, data: %02x\n", offset, data)); |
4838 | 4838 | |
4839 | 4839 | switch (offset) |
r17963 | r17964 | |
4844 | 4844 | case 0x30ff: |
4845 | 4845 | case 0x31ff: |
4846 | 4846 | state->m_mapper83_reg[8] = data; |
4847 | cony_set_prg(space->machine()); | |
4848 | cony_set_chr(space->machine()); | |
4847 | cony_set_prg(space.machine()); | |
4848 | cony_set_chr(space.machine()); | |
4849 | 4849 | break; |
4850 | 4850 | case 0x0100: |
4851 | 4851 | state->m_mmc_reg[0] = data & 0x80; |
4852 | 4852 | switch (data & 0x03) |
4853 | 4853 | { |
4854 | 4854 | case 0: |
4855 | set_nt_mirroring(space | |
4855 | set_nt_mirroring(space.machine(), PPU_MIRROR_VERT); | |
4856 | 4856 | break; |
4857 | 4857 | case 1: |
4858 | set_nt_mirroring(space | |
4858 | set_nt_mirroring(space.machine(), PPU_MIRROR_HORZ); | |
4859 | 4859 | break; |
4860 | 4860 | case 2: |
4861 | set_nt_mirroring(space | |
4861 | set_nt_mirroring(space.machine(), PPU_MIRROR_LOW); | |
4862 | 4862 | break; |
4863 | 4863 | case 3: |
4864 | set_nt_mirroring(space | |
4864 | set_nt_mirroring(space.machine(), PPU_MIRROR_HIGH); | |
4865 | 4865 | break; |
4866 | 4866 | } |
4867 | 4867 | break; |
r17963 | r17964 | |
4873 | 4873 | state->m_IRQ_count = (data << 8) | (state->m_IRQ_count & 0xff); |
4874 | 4874 | break; |
4875 | 4875 | case 0x0300: |
4876 | prg8_89(space | |
4876 | prg8_89(space.machine(), data); | |
4877 | 4877 | break; |
4878 | 4878 | case 0x0301: |
4879 | prg8_ab(space | |
4879 | prg8_ab(space.machine(), data); | |
4880 | 4880 | break; |
4881 | 4881 | case 0x0302: |
4882 | prg8_cd(space | |
4882 | prg8_cd(space.machine(), data); | |
4883 | 4883 | break; |
4884 | 4884 | case 0x0312: |
4885 | 4885 | case 0x0313: |
r17963 | r17964 | |
4891 | 4891 | case 0x0316: |
4892 | 4892 | case 0x0317: |
4893 | 4893 | state->m_mapper83_reg[offset - 0x0310] = data; |
4894 | cony_set_chr(space | |
4894 | cony_set_chr(space.machine()); | |
4895 | 4895 | break; |
4896 | 4896 | case 0x0318: |
4897 | 4897 | state->m_mapper83_reg[9] = data; |
4898 | cony_set_prg(space | |
4898 | cony_set_prg(space.machine()); | |
4899 | 4899 | break; |
4900 | 4900 | } |
4901 | 4901 | } |
r17963 | r17964 | |
4915 | 4915 | |
4916 | 4916 | static WRITE8_HANDLER( yoko_l_w ) |
4917 | 4917 | { |
4918 | nes_state *state = space | |
4918 | nes_state *state = space.machine().driver_data<nes_state>(); | |
4919 | 4919 | LOG_MMC(("cony_l_w, offset: %04x, data: %02x\n", offset, data)); |
4920 | 4920 | |
4921 | 4921 | if (offset >= 0x1300) // from 0x5400 |
r17963 | r17964 | |
4924 | 4924 | |
4925 | 4925 | static READ8_HANDLER( yoko_l_r ) |
4926 | 4926 | { |
4927 | nes_state *state = space | |
4927 | nes_state *state = space.machine().driver_data<nes_state>(); | |
4928 | 4928 | LOG_MMC(("cony_l_r, offset: %04x\n", offset)); |
4929 | 4929 | |
4930 | 4930 | if (offset >= 0x0f00 && offset < 0x1300) // 0x5000 |
r17963 | r17964 | |
4968 | 4968 | |
4969 | 4969 | static WRITE8_HANDLER( yoko_w ) |
4970 | 4970 | { |
4971 | nes_state *state = space | |
4971 | nes_state *state = space.machine().driver_data<nes_state>(); | |
4972 | 4972 | LOG_MMC(("yoko_w, offset: %04x, data: %02x\n", offset, data)); |
4973 | 4973 | |
4974 | 4974 | switch (offset & 0x0c17) |
4975 | 4975 | { |
4976 | 4976 | case 0x0000: |
4977 | 4977 | state->m_mmc_reg[1] = data; |
4978 | yoko_set_prg(space | |
4978 | yoko_set_prg(space.machine()); | |
4979 | 4979 | break; |
4980 | 4980 | case 0x400: |
4981 | 4981 | state->m_mmc_reg[0] = data; |
4982 | 4982 | if (data & 1) |
4983 | set_nt_mirroring(space | |
4983 | set_nt_mirroring(space.machine(), PPU_MIRROR_HORZ); | |
4984 | 4984 | else |
4985 | set_nt_mirroring(space->machine(), PPU_MIRROR_VERT); | |
4986 | yoko_set_prg(space->machine()); | |
4985 | set_nt_mirroring(space.machine(), PPU_MIRROR_VERT); | |
4986 | yoko_set_prg(space.machine()); | |
4987 | 4987 | break; |
4988 | 4988 | case 0x0800: |
4989 | 4989 | state->m_IRQ_count = (state->m_IRQ_count & 0xff00) | data; |
r17963 | r17964 | |
4996 | 4996 | case 0x0c01: |
4997 | 4997 | case 0x0c02: |
4998 | 4998 | state->m_mapper83_reg[offset & 3] = data; |
4999 | yoko_set_prg(space | |
4999 | yoko_set_prg(space.machine()); | |
5000 | 5000 | break; |
5001 | 5001 | case 0x0c10: |
5002 | 5002 | case 0x0c11: |
5003 | 5003 | case 0x0c16: |
5004 | 5004 | case 0x0c17: |
5005 | 5005 | state->m_mapper83_reg[4 + (offset & 3)] = data; |
5006 | yoko_set_chr(space | |
5006 | yoko_set_chr(space.machine()); | |
5007 | 5007 | break; |
5008 | 5008 | } |
5009 | 5009 | } |
r17963 | r17964 | |
5024 | 5024 | offset += 0x100; |
5025 | 5025 | |
5026 | 5026 | if (offset == 0x1020) /* 0x5020 */ |
5027 | prg16_89ab(space | |
5027 | prg16_89ab(space.machine(), data); | |
5028 | 5028 | } |
5029 | 5029 | |
5030 | 5030 | /************************************************************* |
r17963 | r17964 | |
5042 | 5042 | |
5043 | 5043 | static WRITE8_HANDLER( fukutake_l_w ) |
5044 | 5044 | { |
5045 | nes_state *state = space | |
5045 | nes_state *state = space.machine().driver_data<nes_state>(); | |
5046 | 5046 | LOG_MMC(("fukutake_l_w offset: %04x, data: %02x\n", offset, data)); |
5047 | 5047 | offset += 0x100; |
5048 | 5048 | |
5049 | 5049 | if (offset >= 0x200 && offset < 0x400) |
5050 | 5050 | { |
5051 | 5051 | if (offset & 1) |
5052 | prg16_89ab(space | |
5052 | prg16_89ab(space.machine(), data); | |
5053 | 5053 | else |
5054 | wram_bank(space | |
5054 | wram_bank(space.machine(), data >> 6, NES_WRAM); | |
5055 | 5055 | } |
5056 | 5056 | else if (offset >= 0x400 && offset < 0xf00) |
5057 | 5057 | state->m_mapper_ram[offset - 0x400] = data; |
r17963 | r17964 | |
5059 | 5059 | |
5060 | 5060 | static READ8_HANDLER( fukutake_l_r ) |
5061 | 5061 | { |
5062 | nes_state *state = space | |
5062 | nes_state *state = space.machine().driver_data<nes_state>(); | |
5063 | 5063 | LOG_MMC(("fukutake_l_r offset: %04x\n", offset)); |
5064 | 5064 | offset += 0x100; |
5065 | 5065 | |
r17963 | r17964 | |
5106 | 5106 | |
5107 | 5107 | static WRITE8_HANDLER( futuremedia_w ) |
5108 | 5108 | { |
5109 | nes_state *state = space | |
5109 | nes_state *state = space.machine().driver_data<nes_state>(); | |
5110 | 5110 | LOG_MMC(("futuremedia_w, offset: %04x, data: %02x\n", offset, data)); |
5111 | 5111 | |
5112 | 5112 | switch (offset) |
5113 | 5113 | { |
5114 | 5114 | case 0x0000: |
5115 | prg8_89(space | |
5115 | prg8_89(space.machine(), data); | |
5116 | 5116 | break; |
5117 | 5117 | case 0x0001: |
5118 | prg8_ab(space | |
5118 | prg8_ab(space.machine(), data); | |
5119 | 5119 | break; |
5120 | 5120 | case 0x0002: |
5121 | prg8_cd(space | |
5121 | prg8_cd(space.machine(), data); | |
5122 | 5122 | break; |
5123 | 5123 | case 0x0003: |
5124 | prg8_ef(space | |
5124 | prg8_ef(space.machine(), data); | |
5125 | 5125 | break; |
5126 | 5126 | case 0x2000: |
5127 | 5127 | case 0x2001: |
r17963 | r17964 | |
5131 | 5131 | case 0x2005: |
5132 | 5132 | case 0x2006: |
5133 | 5133 | case 0x2007: |
5134 | chr1_x(space | |
5134 | chr1_x(space.machine(), offset & 0x07, data, CHRROM); | |
5135 | 5135 | break; |
5136 | 5136 | |
5137 | 5137 | case 0x5000: |
5138 | set_nt_mirroring(space | |
5138 | set_nt_mirroring(space.machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
5139 | 5139 | break; |
5140 | 5140 | |
5141 | 5141 | case 0x4001: |
r17963 | r17964 | |
5169 | 5169 | |
5170 | 5170 | static WRITE8_HANDLER( gouder_sf4_l_w ) |
5171 | 5171 | { |
5172 | nes_state *state = space | |
5172 | nes_state *state = space.machine().driver_data<nes_state>(); | |
5173 | 5173 | static const UINT8 conv_table[256] = |
5174 | 5174 | { |
5175 | 5175 | 0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x49,0x19,0x09,0x59,0x49,0x19,0x09, |
r17963 | r17964 | |
5197 | 5197 | else if (!(offset < 0xf00)) |
5198 | 5198 | state->m_mmc_reg[4] = data; |
5199 | 5199 | else if (!(offset < 0x700)) |
5200 | prg32(space | |
5200 | prg32(space.machine(), ((data >> 3) & 0x02) | (data & 0x01)); | |
5201 | 5201 | } |
5202 | 5202 | |
5203 | 5203 | static READ8_HANDLER( gouder_sf4_l_r ) |
5204 | 5204 | { |
5205 | nes_state *state = space | |
5205 | nes_state *state = space.machine().driver_data<nes_state>(); | |
5206 | 5206 | LOG_MMC(("gouder_sf4_l_r, offset: %04x\n", offset)); |
5207 | 5207 | |
5208 | 5208 | if (!(offset < 0x1700)) |
r17963 | r17964 | |
5238 | 5238 | { |
5239 | 5239 | LOG_MMC(("henggedianzi_w, offset: %04x, data: %02x\n", offset, data)); |
5240 | 5240 | |
5241 | prg32(space->machine(), data); | |
5242 | set_nt_mirroring(space->machine(), BIT(data, 5) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
5241 | prg32(space.machine(), data); | |
5242 | set_nt_mirroring(space.machine(), BIT(data, 5) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
5243 | 5243 | } |
5244 | 5244 | |
5245 | 5245 | /************************************************************* |
r17963 | r17964 | |
5263 | 5263 | offset += 0x4100; |
5264 | 5264 | |
5265 | 5265 | if (offset & 0x5000) |
5266 | prg32(space | |
5266 | prg32(space.machine(), data >> 1); | |
5267 | 5267 | } |
5268 | 5268 | |
5269 | 5269 | static WRITE8_HANDLER( heng_xjzb_w ) |
5270 | 5270 | { |
5271 | 5271 | LOG_MMC(("heng_xjzb_w, offset: %04x, data: %02x\n", offset, data)); |
5272 | 5272 | |
5273 | set_nt_mirroring(space | |
5273 | set_nt_mirroring(space.machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
5274 | 5274 | } |
5275 | 5275 | |
5276 | 5276 | /************************************************************* |
r17963 | r17964 | |
5295 | 5295 | |
5296 | 5296 | if (!(offset & 0x100)) |
5297 | 5297 | { |
5298 | prg32(space->machine(), (data & 0x38) >> 3); | |
5299 | chr8(space->machine(), (data & 0x07) | ((data & 0x40) >> 3), CHRROM); | |
5300 | set_nt_mirroring(space->machine(), BIT(data, 7) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ); | |
5298 | prg32(space.machine(), (data & 0x38) >> 3); | |
5299 | chr8(space.machine(), (data & 0x07) | ((data & 0x40) >> 3), CHRROM); | |
5300 | set_nt_mirroring(space.machine(), BIT(data, 7) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ); | |
5301 | 5301 | } |
5302 | 5302 | } |
5303 | 5303 | |
r17963 | r17964 | |
5307 | 5307 | |
5308 | 5308 | if (!(offset & 0x100)) |
5309 | 5309 | { |
5310 | prg32(space->machine(), (data & 0x38) >> 3); | |
5311 | chr8(space->machine(), (data & 0x07) | ((data & 0x40) >> 3), CHRROM); | |
5310 | prg32(space.machine(), (data & 0x38) >> 3); | |
5311 | chr8(space.machine(), (data & 0x07) | ((data & 0x40) >> 3), CHRROM); | |
5312 | 5312 | } |
5313 | 5313 | } |
5314 | 5314 | |
r17963 | r17964 | |
5326 | 5326 | |
5327 | 5327 | static WRITE8_HANDLER( hosenkan_w ) |
5328 | 5328 | { |
5329 | nes_state *state = space | |
5329 | nes_state *state = space.machine().driver_data<nes_state>(); | |
5330 | 5330 | LOG_MMC(("hosenkan_w, offset: %04x, data: %02x\n", offset, data)); |
5331 | 5331 | |
5332 | 5332 | switch (offset & 0x7003) |
5333 | 5333 | { |
5334 | 5334 | case 0x0001: |
5335 | set_nt_mirroring(space | |
5335 | set_nt_mirroring(space.machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
5336 | 5336 | break; |
5337 | 5337 | case 0x2000: |
5338 | 5338 | state->m_mmc_latch1 = data; |
r17963 | r17964 | |
5341 | 5341 | switch (state->m_mmc_latch1) |
5342 | 5342 | { |
5343 | 5343 | case 0: |
5344 | chr2_0(space | |
5344 | chr2_0(space.machine(), data >> 1, CHRROM); | |
5345 | 5345 | break; |
5346 | 5346 | case 1: |
5347 | chr1_5(space | |
5347 | chr1_5(space.machine(), data, CHRROM); | |
5348 | 5348 | break; |
5349 | 5349 | case 2: |
5350 | chr2_2(space | |
5350 | chr2_2(space.machine(), data >> 1, CHRROM); | |
5351 | 5351 | break; |
5352 | 5352 | case 3: |
5353 | chr1_7(space | |
5353 | chr1_7(space.machine(), data, CHRROM); | |
5354 | 5354 | break; |
5355 | 5355 | case 4: |
5356 | prg8_89(space | |
5356 | prg8_89(space.machine(), data); | |
5357 | 5357 | break; |
5358 | 5358 | case 5: |
5359 | prg8_ab(space | |
5359 | prg8_ab(space.machine(), data); | |
5360 | 5360 | break; |
5361 | 5361 | case 6: |
5362 | chr1_4(space | |
5362 | chr1_4(space.machine(), data, CHRROM); | |
5363 | 5363 | break; |
5364 | 5364 | case 7: |
5365 | chr1_6(space | |
5365 | chr1_6(space.machine(), data, CHRROM); | |
5366 | 5366 | break; |
5367 | 5367 | } |
5368 | 5368 | break; |
r17963 | r17964 | |
5401 | 5401 | switch (offset & 0x7080) |
5402 | 5402 | { |
5403 | 5403 | case 0x7000: |
5404 | chr4_0(space | |
5404 | chr4_0(space.machine(), data, CHRROM); | |
5405 | 5405 | break; |
5406 | 5406 | case 0x7080: |
5407 | chr4_4(space | |
5407 | chr4_4(space.machine(), data, CHRROM); | |
5408 | 5408 | break; |
5409 | 5409 | } |
5410 | 5410 | } |
r17963 | r17964 | |
5423 | 5423 | |
5424 | 5424 | static WRITE8_HANDLER( ks7022_w ) |
5425 | 5425 | { |
5426 | nes_state *state = space | |
5426 | nes_state *state = space.machine().driver_data<nes_state>(); | |
5427 | 5427 | LOG_MMC(("ks7022_w, offset: %04x, data: %02x\n", offset, data)); |
5428 | 5428 | |
5429 | 5429 | if (offset == 0) |
5430 | set_nt_mirroring(space | |
5430 | set_nt_mirroring(space.machine(), BIT(data, 2) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
5431 | 5431 | |
5432 | 5432 | if (offset == 0x2000) |
5433 | 5433 | state->m_mmc_latch1 = data & 0x0f; |
r17963 | r17964 | |
5435 | 5435 | |
5436 | 5436 | static READ8_HANDLER( ks7022_r ) |
5437 | 5437 | { |
5438 | nes_state *state = space | |
5438 | nes_state *state = space.machine().driver_data<nes_state>(); | |
5439 | 5439 | LOG_MMC(("ks7022_r, offset: %04x\n", offset)); |
5440 | 5440 | |
5441 | 5441 | if (offset == 0x7ffc) |
5442 | 5442 | { |
5443 | chr8(space->machine(), state->m_mmc_latch1, CHRROM); | |
5444 | prg16_89ab(space->machine(), state->m_mmc_latch1); | |
5445 | prg16_cdef(space->machine(), state->m_mmc_latch1); | |
5443 | chr8(space.machine(), state->m_mmc_latch1, CHRROM); | |
5444 | prg16_89ab(space.machine(), state->m_mmc_latch1); | |
5445 | prg16_cdef(space.machine(), state->m_mmc_latch1); | |
5446 | 5446 | } |
5447 | 5447 | |
5448 | return mmc_hi_access_rom(space | |
5448 | return mmc_hi_access_rom(space.machine(), offset); | |
5449 | 5449 | } |
5450 | 5450 | |
5451 | 5451 | /************************************************************* |
r17963 | r17964 | |
5489 | 5489 | |
5490 | 5490 | static WRITE8_HANDLER( ks7032_w ) |
5491 | 5491 | { |
5492 | nes_state *state = space | |
5492 | nes_state *state = space.machine().driver_data<nes_state>(); | |
5493 | 5493 | LOG_MMC(("ks7032_w, offset: %04x, data: %02x\n", offset, data)); |
5494 | 5494 | |
5495 | 5495 | switch (offset & 0x7000) |
r17963 | r17964 | |
5514 | 5514 | break; |
5515 | 5515 | case 0x7000: |
5516 | 5516 | state->m_mmc_reg[state->m_mmc_latch1] = data; |
5517 | ks7032_prg_update(space | |
5517 | ks7032_prg_update(space.machine()); | |
5518 | 5518 | break; |
5519 | 5519 | } |
5520 | 5520 | } |
r17963 | r17964 | |
5534 | 5534 | |
5535 | 5535 | static WRITE8_HANDLER( ks202_w ) |
5536 | 5536 | { |
5537 | nes_state *state = space | |
5537 | nes_state *state = space.machine().driver_data<nes_state>(); | |
5538 | 5538 | LOG_MMC(("ks202_w, offset: %04x, data: %02x\n", offset, data)); |
5539 | 5539 | |
5540 | 5540 | switch (offset & 0x7000) |
r17963 | r17964 | |
5559 | 5559 | break; |
5560 | 5560 | case 0x7000: |
5561 | 5561 | state->m_mmc_reg[state->m_mmc_latch1] = data; |
5562 | ks7032_prg_update(space | |
5562 | ks7032_prg_update(space.machine()); | |
5563 | 5563 | switch (offset & 0xc00) |
5564 | 5564 | { |
5565 | 5565 | case 0x800: |
5566 | set_nt_mirroring(space | |
5566 | set_nt_mirroring(space.machine(), BIT(data, 0) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ); | |
5567 | 5567 | break; |
5568 | 5568 | case 0xc00: |
5569 | chr1_x(space | |
5569 | chr1_x(space.machine(), offset & 0x07, data, CHRROM); | |
5570 | 5570 | break; |
5571 | 5571 | } |
5572 | 5572 | break; |
r17963 | r17964 | |
5604 | 5604 | |
5605 | 5605 | static WRITE8_HANDLER( ks7017_l_w ) |
5606 | 5606 | { |
5607 | nes_state *state = space | |
5607 | nes_state *state = space.machine().driver_data<nes_state>(); | |
5608 | 5608 | LOG_MMC(("ks7022_w, offset: %04x, data: %02x\n", offset, data)); |
5609 | 5609 | |
5610 | 5610 | offset += 0x100; |
r17963 | r17964 | |
5613 | 5613 | state->m_mmc_latch1 = ((offset >> 2) & 0x03) | ((offset >> 4) & 0x04); |
5614 | 5614 | |
5615 | 5615 | if (offset >= 0x1000 && offset < 0x1100) |
5616 | prg16_89ab(space | |
5616 | prg16_89ab(space.machine(), state->m_mmc_latch1); | |
5617 | 5617 | } |
5618 | 5618 | |
5619 | 5619 | WRITE8_HANDLER( ks7017_extra_w ) |
5620 | 5620 | { |
5621 | nes_state *state = space | |
5621 | nes_state *state = space.machine().driver_data<nes_state>(); | |
5622 | 5622 | LOG_MMC(("ks7017_extra_w, offset: %04x, data: %02x\n", offset, data)); |
5623 | 5623 | |
5624 | 5624 | offset += 0x20; |
r17963 | r17964 | |
5630 | 5630 | state->m_IRQ_count = (state->m_IRQ_count & 0x00ff) | (data << 8); |
5631 | 5631 | |
5632 | 5632 | if (offset == 0x0025) /* 0x4025 */ |
5633 | set_nt_mirroring(space | |
5633 | set_nt_mirroring(space.machine(), BIT(data, 3) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
5634 | 5634 | } |
5635 | 5635 | |
5636 | 5636 | READ8_HANDLER( ks7017_extra_r ) |
5637 | 5637 | { |
5638 | nes_state *state = space | |
5638 | nes_state *state = space.machine().driver_data<nes_state>(); | |
5639 | 5639 | LOG_MMC(("ks7017_extra_r, offset: %04x\n", offset)); |
5640 | 5640 | |
5641 | 5641 | state->m_IRQ_status &= ~0x01; |
r17963 | r17964 | |
5659 | 5659 | |
5660 | 5660 | static WRITE8_HANDLER( kay_pp_l_w ) |
5661 | 5661 | { |
5662 | nes_state *state = space | |
5662 | nes_state *state = space.machine().driver_data<nes_state>(); | |
5663 | 5663 | LOG_MMC(("kay_pp_l_w, offset: %04x, data: %02x\n", offset, data)); |
5664 | 5664 | offset += 0x100; |
5665 | 5665 | |
r17963 | r17964 | |
5683 | 5683 | |
5684 | 5684 | static READ8_HANDLER( kay_pp_l_r ) |
5685 | 5685 | { |
5686 | nes_state *state = space | |
5686 | nes_state *state = space.machine().driver_data<nes_state>(); | |
5687 | 5687 | LOG_MMC(("kay_pp_l_r, offset: %04x\n", offset)); |
5688 | 5688 | offset += 0x100; |
5689 | 5689 | |
r17963 | r17964 | |
5763 | 5763 | |
5764 | 5764 | static WRITE8_HANDLER( kay_pp_w ) |
5765 | 5765 | { |
5766 | nes_state *state = space | |
5766 | nes_state *state = space.machine().driver_data<nes_state>(); | |
5767 | 5767 | LOG_MMC(("kay_pp_w, offset: %04x, data: %02x\n", offset, data)); |
5768 | 5768 | |
5769 | 5769 | switch (offset & 0x6003) |
5770 | 5770 | { |
5771 | 5771 | case 0x0000: |
5772 | 5772 | txrom_w(space, offset, data); |
5773 | mmc3_set_prg(space | |
5773 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
5774 | 5774 | break; |
5775 | 5775 | |
5776 | 5776 | case 0x0001: |
5777 | 5777 | state->m_mmc_reg[6] = (BIT(data, 0) << 5) | (BIT(data, 1) << 4) | (BIT(data, 2) << 3) |
5778 | 5778 | | (BIT(data, 3) << 2) | (BIT(data, 4) << 1) | BIT(data, 5); |
5779 | 5779 | if (!state->m_mmc_reg[7]) |
5780 | kay_pp_update_regs(space | |
5780 | kay_pp_update_regs(space.machine()); | |
5781 | 5781 | txrom_w(space, offset, data); |
5782 | mmc3_set_prg(space | |
5782 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
5783 | 5783 | break; |
5784 | 5784 | |
5785 | 5785 | case 0x0003: |
5786 | 5786 | state->m_mmc_reg[5] = data; |
5787 | kay_pp_update_regs(space | |
5787 | kay_pp_update_regs(space.machine()); | |
5788 | 5788 | txrom_w(space, 0x0000, data); |
5789 | mmc3_set_prg(space | |
5789 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
5790 | 5790 | break; |
5791 | 5791 | |
5792 | 5792 | default: |
r17963 | r17964 | |
5821 | 5821 | |
5822 | 5822 | static WRITE8_HANDLER( kasing_m_w ) |
5823 | 5823 | { |
5824 | nes_state *state = space | |
5824 | nes_state *state = space.machine().driver_data<nes_state>(); | |
5825 | 5825 | LOG_MMC(("kasing_m_w, offset: %04x, data: %02x\n", offset, data)); |
5826 | 5826 | |
5827 | 5827 | switch (offset & 0x01) |
5828 | 5828 | { |
5829 | 5829 | case 0x00: |
5830 | 5830 | state->m_mmc_reg[0] = data; |
5831 | mmc3_set_prg(space | |
5831 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
5832 | 5832 | break; |
5833 | 5833 | case 0x01: |
5834 | 5834 | state->m_mmc_chr_base = (data & 0x01) ? 0x100 : 0x000; |
5835 | mmc3_set_chr(space | |
5835 | mmc3_set_chr(space.machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
5836 | 5836 | break; |
5837 | 5837 | } |
5838 | 5838 | } |
r17963 | r17964 | |
5856 | 5856 | { |
5857 | 5857 | LOG_MMC(("magics_md_w, offset: %04x, data: %02x\n", offset, data)); |
5858 | 5858 | |
5859 | prg32(space->machine(), data >> 1); | |
5860 | chr8(space->machine(), data, CHRROM); | |
5859 | prg32(space.machine(), data >> 1); | |
5860 | chr8(space.machine(), data, CHRROM); | |
5861 | 5861 | } |
5862 | 5862 | |
5863 | 5863 | /************************************************************* |
r17963 | r17964 | |
5895 | 5895 | |
5896 | 5896 | static WRITE8_HANDLER( nanjing_l_w ) |
5897 | 5897 | { |
5898 | nes_state *state = space | |
5898 | nes_state *state = space.machine().driver_data<nes_state>(); | |
5899 | 5899 | LOG_MMC(("nanjing_l_w, offset: %04x, data: %02x\n", offset, data)); |
5900 | 5900 | |
5901 | 5901 | offset += 0x100; |
r17963 | r17964 | |
5906 | 5906 | if (offset == 0x1100) // 0x5100 |
5907 | 5907 | { |
5908 | 5908 | if (data == 6) |
5909 | prg32(space | |
5909 | prg32(space.machine(), 3); | |
5910 | 5910 | return; |
5911 | 5911 | } |
5912 | 5912 | |
r17963 | r17964 | |
5925 | 5925 | case 0x200: |
5926 | 5926 | state->m_mmc_reg[BIT(offset, 9)] = data; |
5927 | 5927 | if (!BIT(state->m_mmc_reg[0], 7) && state->m_ppu->get_current_scanline() <= 127) |
5928 | chr8(space | |
5928 | chr8(space.machine(), 0, CHRRAM); | |
5929 | 5929 | break; |
5930 | 5930 | case 0x300: |
5931 | 5931 | state->m_mmc_latch1 = data; |
5932 | 5932 | break; |
5933 | 5933 | } |
5934 | 5934 | |
5935 | prg32(space | |
5935 | prg32(space.machine(), (state->m_mmc_reg[0] & 0x0f) | ((state->m_mmc_reg[1] & 0x0f) << 4)); | |
5936 | 5936 | } |
5937 | 5937 | |
5938 | 5938 | static READ8_HANDLER( nanjing_l_r ) |
5939 | 5939 | { |
5940 | nes_state *state = space | |
5940 | nes_state *state = space.machine().driver_data<nes_state>(); | |
5941 | 5941 | UINT8 value = 0; |
5942 | 5942 | LOG_MMC(("nanjing_l_r, offset: %04x\n", offset)); |
5943 | 5943 | |
r17963 | r17964 | |
6003 | 6003 | |
6004 | 6004 | static WRITE8_HANDLER( ntdec_asder_w ) |
6005 | 6005 | { |
6006 | nes_state *state = space | |
6006 | nes_state *state = space.machine().driver_data<nes_state>(); | |
6007 | 6007 | LOG_MMC(("ntdec_asder_w, offset: %04x, data: %02x\n", offset, data)); |
6008 | 6008 | |
6009 | 6009 | switch (offset) |
r17963 | r17964 | |
6015 | 6015 | switch (state->m_mmc_latch1) |
6016 | 6016 | { |
6017 | 6017 | case 0: |
6018 | prg8_89(space | |
6018 | prg8_89(space.machine(), data); | |
6019 | 6019 | break; |
6020 | 6020 | case 1: |
6021 | prg8_ab(space | |
6021 | prg8_ab(space.machine(), data); | |
6022 | 6022 | break; |
6023 | 6023 | case 2: |
6024 | 6024 | data &= 0xfe; |
6025 | chr1_0(space->machine(), data, CHRROM); | |
6026 | chr1_1(space->machine(), data + 1, CHRROM); | |
6025 | chr1_0(space.machine(), data, CHRROM); | |
6026 | chr1_1(space.machine(), data + 1, CHRROM); | |
6027 | 6027 | break; |
6028 | 6028 | case 3: |
6029 | 6029 | data &= 0xfe; |
6030 | chr1_2(space->machine(), data, CHRROM); | |
6031 | chr1_3(space->machine(), data + 1, CHRROM); | |
6030 | chr1_2(space.machine(), data, CHRROM); | |
6031 | chr1_3(space.machine(), data + 1, CHRROM); | |
6032 | 6032 | break; |
6033 | 6033 | case 4: |
6034 | chr1_4(space | |
6034 | chr1_4(space.machine(), data, CHRROM); | |
6035 | 6035 | break; |
6036 | 6036 | case 5: |
6037 | chr1_5(space | |
6037 | chr1_5(space.machine(), data, CHRROM); | |
6038 | 6038 | break; |
6039 | 6039 | case 6: |
6040 | chr1_6(space | |
6040 | chr1_6(space.machine(), data, CHRROM); | |
6041 | 6041 | break; |
6042 | 6042 | case 7: |
6043 | chr1_7(space | |
6043 | chr1_7(space.machine(), data, CHRROM); | |
6044 | 6044 | break; |
6045 | 6045 | } |
6046 | 6046 | break; |
6047 | 6047 | case 0x6000: |
6048 | set_nt_mirroring(space | |
6048 | set_nt_mirroring(space.machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
6049 | 6049 | break; |
6050 | 6050 | } |
6051 | 6051 | } |
r17963 | r17964 | |
6072 | 6072 | switch (offset & 0x03) |
6073 | 6073 | { |
6074 | 6074 | case 0: |
6075 | chr4_0(space | |
6075 | chr4_0(space.machine(), data >> 2, CHRROM); | |
6076 | 6076 | break; |
6077 | 6077 | case 1: |
6078 | chr2_4(space | |
6078 | chr2_4(space.machine(), data >> 1, CHRROM); | |
6079 | 6079 | break; |
6080 | 6080 | case 2: |
6081 | chr2_6(space | |
6081 | chr2_6(space.machine(), data >> 1 , CHRROM); | |
6082 | 6082 | break; |
6083 | 6083 | case 3: |
6084 | prg8_89(space | |
6084 | prg8_89(space.machine(), data); | |
6085 | 6085 | break; |
6086 | 6086 | } |
6087 | 6087 | } |
r17963 | r17964 | |
6103 | 6103 | |
6104 | 6104 | static WRITE8_HANDLER( daou306_w ) |
6105 | 6105 | { |
6106 | nes_state *state = space | |
6106 | nes_state *state = space.machine().driver_data<nes_state>(); | |
6107 | 6107 | LOG_MMC(("daou306_w, offset: %04x, data: %02x\n", offset, data)); |
6108 | 6108 | int reg = BIT(offset, 2) ? 8 : 0; |
6109 | 6109 | |
r17963 | r17964 | |
6112 | 6112 | case 0x4000: |
6113 | 6113 | case 0x4004: |
6114 | 6114 | state->m_mmc_reg[reg + 0] = data; |
6115 | chr1_0(space | |
6115 | chr1_0(space.machine(), state->m_mmc_reg[0] | (state->m_mmc_reg[8] << 8), CHRROM); | |
6116 | 6116 | break; |
6117 | 6117 | case 0x4001: |
6118 | 6118 | case 0x4005: |
6119 | 6119 | state->m_mmc_reg[reg + 1] = data; |
6120 | chr1_1(space | |
6120 | chr1_1(space.machine(), state->m_mmc_reg[1] | (state->m_mmc_reg[9] << 8), CHRROM); | |
6121 | 6121 | break; |
6122 | 6122 | case 0x4002: |
6123 | 6123 | case 0x4006: |
6124 | 6124 | state->m_mmc_reg[reg + 2] = data; |
6125 | chr1_2(space | |
6125 | chr1_2(space.machine(), state->m_mmc_reg[2] | (state->m_mmc_reg[10] << 8), CHRROM); | |
6126 | 6126 | break; |
6127 | 6127 | case 0x4003: |
6128 | 6128 | case 0x4007: |
6129 | 6129 | state->m_mmc_reg[reg + 3] = data; |
6130 | chr1_3(space | |
6130 | chr1_3(space.machine(), state->m_mmc_reg[3] | (state->m_mmc_reg[11] << 8), CHRROM); | |
6131 | 6131 | break; |
6132 | 6132 | case 0x4008: |
6133 | 6133 | case 0x400c: |
6134 | 6134 | state->m_mmc_reg[reg + 4] = data; |
6135 | chr1_4(space | |
6135 | chr1_4(space.machine(), state->m_mmc_reg[4] | (state->m_mmc_reg[12] << 8), CHRROM); | |
6136 | 6136 | break; |
6137 | 6137 | case 0x4009: |
6138 | 6138 | case 0x400d: |
6139 | 6139 | state->m_mmc_reg[reg + 5] = data; |
6140 | chr1_5(space | |
6140 | chr1_5(space.machine(), state->m_mmc_reg[5] | (state->m_mmc_reg[13] << 8), CHRROM); | |
6141 | 6141 | break; |
6142 | 6142 | case 0x400a: |
6143 | 6143 | case 0x400e: |
6144 | 6144 | state->m_mmc_reg[reg + 6] = data; |
6145 | chr1_6(space | |
6145 | chr1_6(space.machine(), state->m_mmc_reg[6] | (state->m_mmc_reg[14] << 8), CHRROM); | |
6146 | 6146 | break; |
6147 | 6147 | case 0x400b: |
6148 | 6148 | case 0x400f: |
6149 | 6149 | state->m_mmc_reg[reg + 7] = data; |
6150 | chr1_7(space | |
6150 | chr1_7(space.machine(), state->m_mmc_reg[7] | (state->m_mmc_reg[15] << 8), CHRROM); | |
6151 | 6151 | break; |
6152 | 6152 | case 0x4010: |
6153 | prg16_89ab(space | |
6153 | prg16_89ab(space.machine(), data); | |
6154 | 6154 | break; |
6155 | 6155 | case 0x4014: |
6156 | 6156 | if (data & 1) |
6157 | set_nt_mirroring(space | |
6157 | set_nt_mirroring(space.machine(), PPU_MIRROR_HORZ); | |
6158 | 6158 | else |
6159 | set_nt_mirroring(space | |
6159 | set_nt_mirroring(space.machine(), PPU_MIRROR_VERT); | |
6160 | 6160 | break; |
6161 | 6161 | } |
6162 | 6162 | } |
r17963 | r17964 | |
6178 | 6178 | |
6179 | 6179 | static WRITE8_HANDLER( gs2015_w ) |
6180 | 6180 | { |
6181 | nes_state *state = space | |
6181 | nes_state *state = space.machine().driver_data<nes_state>(); | |
6182 | 6182 | LOG_MMC(("gs2015_w, offset: %04x, data: %02x\n", offset, data)); |
6183 | 6183 | |
6184 | prg32(space->machine(), offset); | |
6185 | chr8(space->machine(), offset >> 1, state->m_mmc_chr_source); | |
6184 | prg32(space.machine(), offset); | |
6185 | chr8(space.machine(), offset >> 1, state->m_mmc_chr_source); | |
6186 | 6186 | } |
6187 | 6187 | |
6188 | 6188 | /************************************************************* |
r17963 | r17964 | |
6211 | 6211 | { |
6212 | 6212 | case 0x00: |
6213 | 6213 | case 0x30: |
6214 | prg32(space | |
6214 | prg32(space.machine(), offset & 0x0f); | |
6215 | 6215 | break; |
6216 | 6216 | case 0x10: |
6217 | 6217 | case 0x20: |
6218 | prg16_89ab(space->machine(), ((offset & 0x0f) << 1) | ((offset & 0x20) >> 4)); | |
6219 | prg16_cdef(space->machine(), ((offset & 0x0f) << 1) | ((offset & 0x20) >> 4)); | |
6218 | prg16_89ab(space.machine(), ((offset & 0x0f) << 1) | ((offset & 0x20) >> 4)); | |
6219 | prg16_cdef(space.machine(), ((offset & 0x0f) << 1) | ((offset & 0x20) >> 4)); | |
6220 | 6220 | break; |
6221 | 6221 | } |
6222 | set_nt_mirroring(space | |
6222 | set_nt_mirroring(space.machine(), BIT(data, 7) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
6223 | 6223 | } |
6224 | 6224 | |
6225 | 6225 | /************************************************************* |
r17963 | r17964 | |
6238 | 6238 | |
6239 | 6239 | static WRITE8_HANDLER( rex_dbz_l_w ) |
6240 | 6240 | { |
6241 | nes_state *state = space | |
6241 | nes_state *state = space.machine().driver_data<nes_state>(); | |
6242 | 6242 | LOG_MMC(("rex_dbz_l_w, offset: %04x, data: %02x\n", offset, data)); |
6243 | 6243 | |
6244 | 6244 | state->m_mmc_reg[0] = data; |
6245 | mmc3_set_chr(space | |
6245 | mmc3_set_chr(space.machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
6246 | 6246 | } |
6247 | 6247 | |
6248 | 6248 | /* we would need to use this read handler in 0x6000-0x7fff as well */ |
r17963 | r17964 | |
6330 | 6330 | |
6331 | 6331 | static WRITE8_HANDLER( rex_sl1632_w ) |
6332 | 6332 | { |
6333 | nes_state *state = space | |
6333 | nes_state *state = space.machine().driver_data<nes_state>(); | |
6334 | 6334 | UINT8 map14_helper1, map14_helper2, mmc_helper, cmd; |
6335 | 6335 | LOG_MMC(("rex_sl1632_w, offset: %04x, data: %02x\n", offset, data)); |
6336 | 6336 | |
6337 | 6337 | if (offset == 0x2131) |
6338 | 6338 | { |
6339 | 6339 | state->m_mmc_reg[0] = data; |
6340 | rex_sl1632_set_prg(space->machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
6341 | rex_sl1632_set_chr(space->machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
6340 | rex_sl1632_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
6341 | rex_sl1632_set_chr(space.machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
6342 | 6342 | |
6343 | 6343 | if (!(state->m_mmc_reg[0] & 0x02)) |
6344 | set_nt_mirroring(space | |
6344 | set_nt_mirroring(space.machine(), BIT(state->m_mmc_reg[1], 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
6345 | 6345 | } |
6346 | 6346 | |
6347 | 6347 | if (state->m_mmc_reg[0] & 0x02) |
r17963 | r17964 | |
6354 | 6354 | |
6355 | 6355 | /* Has PRG Mode changed? */ |
6356 | 6356 | if (mmc_helper & 0x40) |
6357 | rex_sl1632_set_prg(space | |
6357 | rex_sl1632_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
6358 | 6358 | |
6359 | 6359 | /* Has CHR Mode changed? */ |
6360 | 6360 | if (mmc_helper & 0x80) |
6361 | rex_sl1632_set_chr(space | |
6361 | rex_sl1632_set_chr(space.machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
6362 | 6362 | break; |
6363 | 6363 | |
6364 | 6364 | case 0x0001: |
r17963 | r17964 | |
6368 | 6368 | case 0: case 1: // these have to be changed due to the different way rex_sl1632_set_chr works (it handles 1k banks)! |
6369 | 6369 | state->m_mmc_vrom_bank[2 * cmd] = data; |
6370 | 6370 | state->m_mmc_vrom_bank[2 * cmd + 1] = data; |
6371 | rex_sl1632_set_chr(space | |
6371 | rex_sl1632_set_chr(space.machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
6372 | 6372 | break; |
6373 | 6373 | case 2: case 3: case 4: case 5: |
6374 | 6374 | state->m_mmc_vrom_bank[cmd + 2] = data; |
6375 | rex_sl1632_set_chr(space | |
6375 | rex_sl1632_set_chr(space.machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
6376 | 6376 | break; |
6377 | 6377 | case 6: |
6378 | 6378 | case 7: |
6379 | 6379 | state->m_mmc_prg_bank[cmd - 6] = data; |
6380 | rex_sl1632_set_prg(space | |
6380 | rex_sl1632_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
6381 | 6381 | break; |
6382 | 6382 | } |
6383 | 6383 | break; |
6384 | 6384 | |
6385 | 6385 | case 0x2000: |
6386 | set_nt_mirroring(space | |
6386 | set_nt_mirroring(space.machine(), BIT(state->m_mmc_reg[1], 0) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ); | |
6387 | 6387 | break; |
6388 | 6388 | |
6389 | 6389 | default: |
r17963 | r17964 | |
6397 | 6397 | offset = ((offset & 0x02) | (offset >> 10)) >> 1; |
6398 | 6398 | map14_helper2 = ((offset + 2) & 0x07) + 4; // '+4' because first 4 state->m_mmc_extra_banks are for PRG! |
6399 | 6399 | state->m_mmc_extra_bank[map14_helper2] = (state->m_mmc_extra_bank[map14_helper2] & (0xf0 >> map14_helper1)) | ((data & 0x0f) << map14_helper1); |
6400 | rex_sl1632_set_chr(space | |
6400 | rex_sl1632_set_chr(space.machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
6401 | 6401 | } |
6402 | 6402 | else |
6403 | 6403 | { |
r17963 | r17964 | |
6406 | 6406 | case 0x0000: |
6407 | 6407 | case 0x2000: |
6408 | 6408 | state->m_mmc_extra_bank[offset >> 13] = data; |
6409 | rex_sl1632_set_prg(space | |
6409 | rex_sl1632_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
6410 | 6410 | break; |
6411 | 6411 | |
6412 | 6412 | case 0x1000: |
6413 | 6413 | state->m_mmc_reg[1] = data; |
6414 | set_nt_mirroring(space | |
6414 | set_nt_mirroring(space.machine(), BIT(state->m_mmc_reg[1], 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
6415 | 6415 | break; |
6416 | 6416 | } |
6417 | 6417 | } |
r17963 | r17964 | |
6431 | 6431 | |
6432 | 6432 | static WRITE8_HANDLER( rumblestation_m_w ) |
6433 | 6433 | { |
6434 | nes_state *state = space | |
6434 | nes_state *state = space.machine().driver_data<nes_state>(); | |
6435 | 6435 | LOG_MMC(("rumblestation_m_w, offset: %04x, data: %02x\n", offset, data)); |
6436 | 6436 | |
6437 | 6437 | state->m_mmc_prg_bank[0] = (state->m_mmc_prg_bank[0] & 0x01) | ((data & 0x0f) << 1); |
6438 | 6438 | state->m_mmc_vrom_bank[0] = (state->m_mmc_vrom_bank[0] & 0x07) | ((data & 0xf0) >> 1); |
6439 | prg32(space->machine(), state->m_mmc_prg_bank[0]); | |
6440 | chr8(space->machine(), state->m_mmc_vrom_bank[0], CHRROM); | |
6439 | prg32(space.machine(), state->m_mmc_prg_bank[0]); | |
6440 | chr8(space.machine(), state->m_mmc_vrom_bank[0], CHRROM); | |
6441 | 6441 | } |
6442 | 6442 | |
6443 | 6443 | static WRITE8_HANDLER( rumblestation_w ) |
6444 | 6444 | { |
6445 | nes_state *state = space | |
6445 | nes_state *state = space.machine().driver_data<nes_state>(); | |
6446 | 6446 | LOG_MMC(("rumblestation_w, offset: %04x, data: %02x\n", offset, data)); |
6447 | 6447 | |
6448 | 6448 | state->m_mmc_prg_bank[0] = (state->m_mmc_prg_bank[0] & ~0x01) | (data & 0x01); |
6449 | 6449 | state->m_mmc_vrom_bank[0] = (state->m_mmc_vrom_bank[0] & ~0x07) | ((data & 0x70) >> 4); |
6450 | prg32(space->machine(), state->m_mmc_prg_bank[0]); | |
6451 | chr8(space->machine(), state->m_mmc_vrom_bank[0], CHRROM); | |
6450 | prg32(space.machine(), state->m_mmc_prg_bank[0]); | |
6451 | chr8(space.machine(), state->m_mmc_vrom_bank[0], CHRROM); | |
6452 | 6452 | } |
6453 | 6453 | |
6454 | 6454 | /************************************************************* |
r17963 | r17964 | |
6487 | 6487 | |
6488 | 6488 | static WRITE8_HANDLER( sachen_74x374_l_w ) |
6489 | 6489 | { |
6490 | nes_state *state = space | |
6490 | nes_state *state = space.machine().driver_data<nes_state>(); | |
6491 | 6491 | LOG_MMC(("sachen_74x374_l_w, offset: %04x, data: %02x\n", offset, data)); |
6492 | 6492 | |
6493 | 6493 | /* write happens only if we are at 0x4100 + k * 0x200, but 0x4100 is offset = 0 */ |
r17963 | r17964 | |
6501 | 6501 | { |
6502 | 6502 | case 0x02: |
6503 | 6503 | state->m_mmc_vrom_bank[0] = (state->m_mmc_vrom_bank[0] & ~0x08) | ((data << 3) & 0x08); |
6504 | chr8(space->machine(), state->m_mmc_vrom_bank[0], CHRROM); | |
6505 | prg32(space->machine(), data & 0x01); | |
6504 | chr8(space.machine(), state->m_mmc_vrom_bank[0], CHRROM); | |
6505 | prg32(space.machine(), data & 0x01); | |
6506 | 6506 | break; |
6507 | 6507 | case 0x04: |
6508 | 6508 | state->m_mmc_vrom_bank[0] = (state->m_mmc_vrom_bank[0] & ~0x04) | ((data << 2) & 0x04); |
6509 | chr8(space | |
6509 | chr8(space.machine(), state->m_mmc_vrom_bank[0], CHRROM); | |
6510 | 6510 | break; |
6511 | 6511 | case 0x05: |
6512 | prg32(space | |
6512 | prg32(space.machine(), data & 0x07); | |
6513 | 6513 | break; |
6514 | 6514 | case 0x06: |
6515 | 6515 | state->m_mmc_vrom_bank[0] = (state->m_mmc_vrom_bank[0] & ~0x03) | ((data << 0) & 0x03); |
6516 | chr8(space | |
6516 | chr8(space.machine(), state->m_mmc_vrom_bank[0], CHRROM); | |
6517 | 6517 | break; |
6518 | 6518 | case 0x07: |
6519 | sachen_set_mirror(space | |
6519 | sachen_set_mirror(space.machine(), (data >> 1) & 0x03); | |
6520 | 6520 | break; |
6521 | 6521 | default: |
6522 | 6522 | break; |
r17963 | r17964 | |
6527 | 6527 | |
6528 | 6528 | static READ8_HANDLER( sachen_74x374_l_r ) |
6529 | 6529 | { |
6530 | nes_state *state = space | |
6530 | nes_state *state = space.machine().driver_data<nes_state>(); | |
6531 | 6531 | LOG_MMC(("sachen_74x374_l_r, offset: %04x", offset)); |
6532 | 6532 | |
6533 | 6533 | /* read happens only if we are at 0x4100 + k * 0x200, but 0x4100 is offset = 0 */ |
r17963 | r17964 | |
6539 | 6539 | |
6540 | 6540 | static WRITE8_HANDLER( sachen_74x374a_l_w ) |
6541 | 6541 | { |
6542 | nes_state *state = space | |
6542 | nes_state *state = space.machine().driver_data<nes_state>(); | |
6543 | 6543 | LOG_MMC(("sachen_74x374a_l_w, offset: %04x, data: %02x\n", offset, data)); |
6544 | 6544 | |
6545 | 6545 | /* write happens only if we are at 0x4100 + k * 0x200, but 0x4100 is offset = 0 */ |
r17963 | r17964 | |
6552 | 6552 | switch (state->m_mmc_latch1 & 0x07) |
6553 | 6553 | { |
6554 | 6554 | case 0x00: |
6555 | prg32(space->machine(), 0); | |
6556 | chr8(space->machine(), 3, CHRROM); | |
6555 | prg32(space.machine(), 0); | |
6556 | chr8(space.machine(), 3, CHRROM); | |
6557 | 6557 | break; |
6558 | 6558 | case 0x02: |
6559 | 6559 | state->m_mmc_vrom_bank[0] = (state->m_mmc_vrom_bank[0] & ~0x08) | ((data << 3) & 0x08); |
6560 | chr8(space | |
6560 | chr8(space.machine(), state->m_mmc_vrom_bank[0], CHRROM); | |
6561 | 6561 | break; |
6562 | 6562 | case 0x04: |
6563 | 6563 | state->m_mmc_vrom_bank[0] = (state->m_mmc_vrom_bank[0] & ~0x01) | ((data << 0) & 0x01); |
6564 | chr8(space | |
6564 | chr8(space.machine(), state->m_mmc_vrom_bank[0], CHRROM); | |
6565 | 6565 | break; |
6566 | 6566 | case 0x05: |
6567 | prg32(space | |
6567 | prg32(space.machine(), data & 0x01); | |
6568 | 6568 | break; |
6569 | 6569 | case 0x06: |
6570 | 6570 | state->m_mmc_vrom_bank[0] = (state->m_mmc_vrom_bank[0] & ~0x06) | ((data << 1) & 0x06); |
6571 | chr8(space | |
6571 | chr8(space.machine(), state->m_mmc_vrom_bank[0], CHRROM); | |
6572 | 6572 | break; |
6573 | 6573 | case 0x07: |
6574 | sachen_set_mirror(space | |
6574 | sachen_set_mirror(space.machine(), BIT(data, 0)); | |
6575 | 6575 | break; |
6576 | 6576 | default: |
6577 | 6577 | break; |
r17963 | r17964 | |
6588 | 6588 | |
6589 | 6589 | *************************************************************/ |
6590 | 6590 | |
6591 | static void common_s8259_write_handler( address_space | |
6591 | static void common_s8259_write_handler( address_space &space, offs_t offset, UINT8 data, int board ) | |
6592 | 6592 | { |
6593 | nes_state *state = space | |
6593 | nes_state *state = space.machine().driver_data<nes_state>(); | |
6594 | 6594 | UINT8 bank_helper1, bank_helper2, shift, add1, add2, add3; |
6595 | 6595 | |
6596 | 6596 | /* write happens only if we are at 0x4100 + k * 0x200, but 0x4100 is offset = 0 */ |
r17963 | r17964 | |
6605 | 6605 | switch (state->m_mmc_latch1) |
6606 | 6606 | { |
6607 | 6607 | case 0x05: |
6608 | prg32(space | |
6608 | prg32(space.machine(), data); | |
6609 | 6609 | break; |
6610 | 6610 | case 0x07: |
6611 | sachen_set_mirror(space | |
6611 | sachen_set_mirror(space.machine(), BIT(data, 0) ? 0 : (data >> 1) & 0x03); | |
6612 | 6612 | break; |
6613 | 6613 | default: |
6614 | 6614 | if (board == SACHEN_8259D) |
6615 | 6615 | { |
6616 | 6616 | if (state->m_mmc_chr_source == CHRROM) |
6617 | 6617 | { |
6618 | chr1_0(space->machine(), (state->m_sachen_reg[0] & 0x07), CHRROM); | |
6619 | chr1_1(space->machine(), (state->m_sachen_reg[1] & 0x07) | (state->m_sachen_reg[4] << 4 & 0x10), CHRROM); | |
6620 | chr1_2(space->machine(), (state->m_sachen_reg[2] & 0x07) | (state->m_sachen_reg[4] << 3 & 0x10), CHRROM); | |
6621 | chr1_3(space->machine(), (state->m_sachen_reg[3] & 0x07) | (state->m_sachen_reg[4] << 2 & 0x10) | (state->m_sachen_reg[6] << 3 & 0x08), CHRROM); | |
6618 | chr1_0(space.machine(), (state->m_sachen_reg[0] & 0x07), CHRROM); | |
6619 | chr1_1(space.machine(), (state->m_sachen_reg[1] & 0x07) | (state->m_sachen_reg[4] << 4 & 0x10), CHRROM); | |
6620 | chr1_2(space.machine(), (state->m_sachen_reg[2] & 0x07) | (state->m_sachen_reg[4] << 3 & 0x10), CHRROM); | |
6621 | chr1_3(space.machine(), (state->m_sachen_reg[3] & 0x07) | (state->m_sachen_reg[4] << 2 & 0x10) | (state->m_sachen_reg[6] << 3 & 0x08), CHRROM); | |
6622 | 6622 | } |
6623 | 6623 | } |
6624 | 6624 | else |
r17963 | r17964 | |
6632 | 6632 | |
6633 | 6633 | if (state->m_mmc_chr_source == CHRROM) |
6634 | 6634 | { |
6635 | chr2_0(space->machine(), ((state->m_sachen_reg[bank_helper1 ? 0 : 0] & 0x07) | bank_helper2) << shift, CHRROM); | |
6636 | chr2_2(space->machine(), ((state->m_sachen_reg[bank_helper1 ? 0 : 1] & 0x07) | bank_helper2) << shift | add1, CHRROM); | |
6637 | chr2_4(space->machine(), ((state->m_sachen_reg[bank_helper1 ? 0 : 2] & 0x07) | bank_helper2) << shift | add2, CHRROM); | |
6638 | chr2_6(space->machine(), ((state->m_sachen_reg[bank_helper1 ? 0 : 3] & 0x07) | bank_helper2) << shift | add3, CHRROM); | |
6635 | chr2_0(space.machine(), ((state->m_sachen_reg[bank_helper1 ? 0 : 0] & 0x07) | bank_helper2) << shift, CHRROM); | |
6636 | chr2_2(space.machine(), ((state->m_sachen_reg[bank_helper1 ? 0 : 1] & 0x07) | bank_helper2) << shift | add1, CHRROM); | |
6637 | chr2_4(space.machine(), ((state->m_sachen_reg[bank_helper1 ? 0 : 2] & 0x07) | bank_helper2) << shift | add2, CHRROM); | |
6638 | chr2_6(space.machine(), ((state->m_sachen_reg[bank_helper1 ? 0 : 3] & 0x07) | bank_helper2) << shift | add3, CHRROM); | |
6639 | 6639 | } |
6640 | 6640 | } |
6641 | 6641 | break; |
r17963 | r17964 | |
6646 | 6646 | |
6647 | 6647 | static WRITE8_HANDLER( s8259_l_w ) |
6648 | 6648 | { |
6649 | nes_state *state = space | |
6649 | nes_state *state = space.machine().driver_data<nes_state>(); | |
6650 | 6650 | LOG_MMC(("s8259_w, type: %d, offset: %04x, data: %02x\n", state->m_pcb_id, offset, data)); |
6651 | 6651 | |
6652 | 6652 | common_s8259_write_handler(space, offset, data, state->m_pcb_id); |
r17963 | r17964 | |
6654 | 6654 | |
6655 | 6655 | static WRITE8_HANDLER( s8259_m_w ) |
6656 | 6656 | { |
6657 | nes_state *state = space | |
6657 | nes_state *state = space.machine().driver_data<nes_state>(); | |
6658 | 6658 | LOG_MMC(("s8259_w, type: %d, offset: %04x, data: %02x\n", state->m_pcb_id, offset, data)); |
6659 | 6659 | |
6660 | 6660 | common_s8259_write_handler(space, (offset + 0x100) & 0xfff, data, state->m_pcb_id); |
r17963 | r17964 | |
6675 | 6675 | |
6676 | 6676 | static WRITE8_HANDLER( sa009_l_w ) |
6677 | 6677 | { |
6678 | nes_state *state = space | |
6678 | nes_state *state = space.machine().driver_data<nes_state>(); | |
6679 | 6679 | LOG_MMC(("sa009_l_w, offset: %04x, data: %02x\n", offset, data)); |
6680 | 6680 | |
6681 | chr8(space | |
6681 | chr8(space.machine(), data, state->m_mmc_chr_source); | |
6682 | 6682 | } |
6683 | 6683 | |
6684 | 6684 | /************************************************************* |
r17963 | r17964 | |
6697 | 6697 | { |
6698 | 6698 | LOG_MMC(("sa0036_w, offset: %04x, data: %02x\n", offset, data)); |
6699 | 6699 | |
6700 | chr8(space | |
6700 | chr8(space.machine(), data >> 7, CHRROM); | |
6701 | 6701 | } |
6702 | 6702 | |
6703 | 6703 | /************************************************************* |
r17963 | r17964 | |
6716 | 6716 | { |
6717 | 6717 | LOG_MMC(("sa0037_w, offset: %04x, data: %02x\n", offset, data)); |
6718 | 6718 | |
6719 | prg32(space->machine(), data >> 3); | |
6720 | chr8(space->machine(), data, CHRROM); | |
6719 | prg32(space.machine(), data >> 3); | |
6720 | chr8(space.machine(), data, CHRROM); | |
6721 | 6721 | } |
6722 | 6722 | |
6723 | 6723 | /************************************************************* |
r17963 | r17964 | |
6738 | 6738 | |
6739 | 6739 | /* only if we are at 0x4100 + k * 0x200, but 0x4100 is offset = 0 */ |
6740 | 6740 | if (!(offset & 0x100)) |
6741 | chr8(space | |
6741 | chr8(space.machine(), data >> 7, CHRROM); | |
6742 | 6742 | } |
6743 | 6743 | |
6744 | 6744 | /************************************************************* |
r17963 | r17964 | |
6757 | 6757 | { |
6758 | 6758 | LOG_MMC(("sa72008_l_w, offset: %04x, data: %02x\n", offset, data)); |
6759 | 6759 | |
6760 | prg32(space->machine(), data >> 2); | |
6761 | chr8(space->machine(), data, CHRROM); | |
6760 | prg32(space.machine(), data >> 2); | |
6761 | chr8(space.machine(), data, CHRROM); | |
6762 | 6762 | } |
6763 | 6763 | |
6764 | 6764 | /************************************************************* |
r17963 | r17964 | |
6802 | 6802 | |
6803 | 6803 | if ((offset & 0x103) == 0x002) |
6804 | 6804 | { |
6805 | prg32(space->machine(), ((data >> 6) & 0x02) | ((data >> 2) & 0x01)); | |
6806 | chr8(space->machine(), data >> 3, CHRROM); | |
6805 | prg32(space.machine(), ((data >> 6) & 0x02) | ((data >> 2) & 0x01)); | |
6806 | chr8(space.machine(), data >> 3, CHRROM); | |
6807 | 6807 | } |
6808 | 6808 | } |
6809 | 6809 | |
r17963 | r17964 | |
6835 | 6835 | |
6836 | 6836 | static WRITE8_HANDLER( tcu02_l_w ) |
6837 | 6837 | { |
6838 | nes_state *state = space | |
6838 | nes_state *state = space.machine().driver_data<nes_state>(); | |
6839 | 6839 | LOG_MMC(("tcu02_l_w, offset: %04x, data: %02x\n", offset, data)); |
6840 | 6840 | |
6841 | 6841 | if ((offset & 0x103) == 0x002) |
6842 | 6842 | { |
6843 | 6843 | state->m_mmc_latch1 = (data & 0x30) | ((data + 3) & 0x0f); |
6844 | chr8(space | |
6844 | chr8(space.machine(), state->m_mmc_latch1, CHRROM); | |
6845 | 6845 | } |
6846 | 6846 | } |
6847 | 6847 | |
6848 | 6848 | static READ8_HANDLER( tcu02_l_r ) |
6849 | 6849 | { |
6850 | nes_state *state = space | |
6850 | nes_state *state = space.machine().driver_data<nes_state>(); | |
6851 | 6851 | LOG_MMC(("tcu02_l_r, offset: %04x\n", offset)); |
6852 | 6852 | |
6853 | 6853 | if ((offset & 0x103) == 0x000) |
r17963 | r17964 | |
6867 | 6867 | |
6868 | 6868 | static WRITE8_HANDLER( subor0_w ) |
6869 | 6869 | { |
6870 | nes_state *state = space | |
6870 | nes_state *state = space.machine().driver_data<nes_state>(); | |
6871 | 6871 | UINT8 subor_helper1, subor_helper2; |
6872 | 6872 | LOG_MMC(("subor0_w, offset: %04x, data: %02x\n", offset, data)); |
6873 | 6873 | |
r17963 | r17964 | |
6892 | 6892 | subor_helper2 = 0x20; |
6893 | 6893 | } |
6894 | 6894 | |
6895 | prg16_89ab(space->machine(), subor_helper1); | |
6896 | prg16_cdef(space->machine(), subor_helper2); | |
6895 | prg16_89ab(space.machine(), subor_helper1); | |
6896 | prg16_cdef(space.machine(), subor_helper2); | |
6897 | 6897 | } |
6898 | 6898 | |
6899 | 6899 | /************************************************************* |
r17963 | r17964 | |
6906 | 6906 | |
6907 | 6907 | static WRITE8_HANDLER( subor1_w ) |
6908 | 6908 | { |
6909 | nes_state *state = space | |
6909 | nes_state *state = space.machine().driver_data<nes_state>(); | |
6910 | 6910 | UINT8 subor_helper1, subor_helper2; |
6911 | 6911 | LOG_MMC(("subor1_w, offset: %04x, data: %02x\n", offset, data)); |
6912 | 6912 | |
r17963 | r17964 | |
6931 | 6931 | subor_helper2 = 0x07; |
6932 | 6932 | } |
6933 | 6933 | |
6934 | prg16_89ab(space->machine(), subor_helper1); | |
6935 | prg16_cdef(space->machine(), subor_helper2); | |
6934 | prg16_89ab(space.machine(), subor_helper1); | |
6935 | prg16_cdef(space.machine(), subor_helper2); | |
6936 | 6936 | } |
6937 | 6937 | |
6938 | 6938 | /************************************************************* |
r17963 | r17964 | |
6990 | 6990 | |
6991 | 6991 | static WRITE8_HANDLER( sgame_boog_l_w ) |
6992 | 6992 | { |
6993 | nes_state *state = space | |
6993 | nes_state *state = space.machine().driver_data<nes_state>(); | |
6994 | 6994 | LOG_MMC(("sgame_boog_l_w, offset: %04x, data: %02x\n", offset, data)); |
6995 | 6995 | offset += 0x100; |
6996 | 6996 | |
6997 | 6997 | if (offset == 0x1000) |
6998 | 6998 | { |
6999 | 6999 | state->m_mmc_reg[0] = data; |
7000 | sgame_boog_set_prg(space | |
7000 | sgame_boog_set_prg(space.machine()); | |
7001 | 7001 | } |
7002 | 7002 | else if (offset == 0x1001) |
7003 | 7003 | { |
7004 | 7004 | state->m_mmc_reg[1] = data; |
7005 | mmc3_set_chr(space | |
7005 | mmc3_set_chr(space.machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
7006 | 7006 | } |
7007 | 7007 | else if (offset == 0x1007) |
7008 | 7008 | { |
7009 | 7009 | state->m_mmc3_latch = 0; |
7010 | 7010 | state->m_mmc_reg[2] = data; |
7011 | sgame_boog_set_prg(space->machine()); | |
7012 | mmc3_set_chr(space->machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
7011 | sgame_boog_set_prg(space.machine()); | |
7012 | mmc3_set_chr(space.machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
7013 | 7013 | } |
7014 | 7014 | } |
7015 | 7015 | |
7016 | 7016 | static WRITE8_HANDLER( sgame_boog_m_w ) |
7017 | 7017 | { |
7018 | nes_state *state = space | |
7018 | nes_state *state = space.machine().driver_data<nes_state>(); | |
7019 | 7019 | LOG_MMC(("sgame_boog_m_w, offset: %04x, data: %02x\n", offset, data)); |
7020 | 7020 | |
7021 | 7021 | if (offset == 0x0000) |
7022 | 7022 | { |
7023 | 7023 | state->m_mmc_reg[0] = data; |
7024 | sgame_boog_set_prg(space | |
7024 | sgame_boog_set_prg(space.machine()); | |
7025 | 7025 | } |
7026 | 7026 | else if (offset == 0x0001) |
7027 | 7027 | { |
7028 | 7028 | state->m_mmc_reg[1] = data; |
7029 | mmc3_set_chr(space | |
7029 | mmc3_set_chr(space.machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
7030 | 7030 | } |
7031 | 7031 | else if (offset == 0x0007) |
7032 | 7032 | { |
7033 | 7033 | state->m_mmc3_latch = 0; |
7034 | 7034 | state->m_mmc_reg[2] = data; |
7035 | sgame_boog_set_prg(space->machine()); | |
7036 | mmc3_set_chr(space->machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
7035 | sgame_boog_set_prg(space.machine()); | |
7036 | mmc3_set_chr(space.machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
7037 | 7037 | } |
7038 | 7038 | } |
7039 | 7039 | |
7040 | 7040 | static WRITE8_HANDLER( sgame_boog_w ) |
7041 | 7041 | { |
7042 | nes_state *state = space | |
7042 | nes_state *state = space.machine().driver_data<nes_state>(); | |
7043 | 7043 | static const UINT8 conv_table[8] = {0,2,5,3,6,1,7,4}; |
7044 | 7044 | LOG_MMC(("sgame_boog_w, offset: %04x, data: %02x\n", offset, data)); |
7045 | 7045 | |
r17963 | r17964 | |
7076 | 7076 | if (!state->m_mmc_reg[2]) |
7077 | 7077 | txrom_w(space, 0x4000, data); |
7078 | 7078 | else |
7079 | set_nt_mirroring(space | |
7079 | set_nt_mirroring(space.machine(), ((data >> 7) | data) & 0x01 ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
7080 | 7080 | break; |
7081 | 7081 | |
7082 | 7082 | case 0x4001: |
r17963 | r17964 | |
7118 | 7118 | |
7119 | 7119 | static WRITE8_HANDLER( sgame_lion_m_w ) |
7120 | 7120 | { |
7121 | nes_state *state = space | |
7121 | nes_state *state = space.machine().driver_data<nes_state>(); | |
7122 | 7122 | LOG_MMC(("sgame_lion_m_w, offset: %04x, data: %02x\n", offset, data)); |
7123 | 7123 | |
7124 | 7124 | state->m_map114_reg = data; |
7125 | 7125 | |
7126 | 7126 | if (state->m_map114_reg & 0x80) |
7127 | 7127 | { |
7128 | prg16_89ab(space->machine(), data & 0x1f); | |
7129 | prg16_cdef(space->machine(), data & 0x1f); | |
7128 | prg16_89ab(space.machine(), data & 0x1f); | |
7129 | prg16_cdef(space.machine(), data & 0x1f); | |
7130 | 7130 | } |
7131 | 7131 | else |
7132 | mmc3_set_prg(space | |
7132 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
7133 | 7133 | |
7134 | 7134 | } |
7135 | 7135 | |
7136 | 7136 | static WRITE8_HANDLER( sgame_lion_w ) |
7137 | 7137 | { |
7138 | nes_state *state = space | |
7138 | nes_state *state = space.machine().driver_data<nes_state>(); | |
7139 | 7139 | static const UINT8 conv_table[8] = {0, 3, 1, 5, 6, 7, 2, 4}; |
7140 | 7140 | LOG_MMC(("sgame_lion_w, offset: %04x, data: %02x\n", offset, data)); |
7141 | 7141 | |
r17963 | r17964 | |
7144 | 7144 | switch (offset & 0x6000) |
7145 | 7145 | { |
7146 | 7146 | case 0x0000: |
7147 | set_nt_mirroring(space | |
7147 | set_nt_mirroring(space.machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
7148 | 7148 | break; |
7149 | 7149 | case 0x2000: |
7150 | 7150 | state->m_map114_reg_enabled = 1; |
r17963 | r17964 | |
7190 | 7190 | { |
7191 | 7191 | LOG_MMC(("tengen_800008_w, offset: %04x, data: %02x\n", offset, data)); |
7192 | 7192 | |
7193 | prg32(space->machine(), data >> 3); | |
7194 | chr8(space->machine(), data, CHRROM); | |
7193 | prg32(space.machine(), data >> 3); | |
7194 | chr8(space.machine(), data, CHRROM); | |
7195 | 7195 | } |
7196 | 7196 | |
7197 | 7197 | /************************************************************* |
r17963 | r17964 | |
7302 | 7302 | |
7303 | 7303 | static WRITE8_HANDLER( tengen_800032_w ) |
7304 | 7304 | { |
7305 | nes_state *state = space | |
7305 | nes_state *state = space.machine().driver_data<nes_state>(); | |
7306 | 7306 | UINT8 map64_helper, cmd; |
7307 | 7307 | LOG_MMC(("tengen_800032_w, offset: %04x, data: %02x\n", offset, data)); |
7308 | 7308 | |
r17963 | r17964 | |
7314 | 7314 | |
7315 | 7315 | /* Has PRG Mode changed? */ |
7316 | 7316 | if (map64_helper & 0x40) |
7317 | tengen_800032_set_prg(space | |
7317 | tengen_800032_set_prg(space.machine()); | |
7318 | 7318 | |
7319 | 7319 | /* Has CHR Mode changed? */ |
7320 | 7320 | if (map64_helper & 0xa0) |
7321 | tengen_800032_set_chr(space | |
7321 | tengen_800032_set_chr(space.machine()); | |
7322 | 7322 | break; |
7323 | 7323 | |
7324 | 7324 | case 0x0001: |
r17963 | r17964 | |
7329 | 7329 | case 2: case 3: |
7330 | 7330 | case 4: case 5: |
7331 | 7331 | state->m_mmc_vrom_bank[cmd] = data; |
7332 | tengen_800032_set_chr(space | |
7332 | tengen_800032_set_chr(space.machine()); | |
7333 | 7333 | break; |
7334 | 7334 | case 6: case 7: |
7335 | 7335 | state->m_mmc_prg_bank[cmd - 6] = data; |
7336 | tengen_800032_set_prg(space | |
7336 | tengen_800032_set_prg(space.machine()); | |
7337 | 7337 | break; |
7338 | 7338 | case 8: case 9: |
7339 | 7339 | state->m_mmc_vrom_bank[cmd - 2] = data; |
7340 | tengen_800032_set_chr(space | |
7340 | tengen_800032_set_chr(space.machine()); | |
7341 | 7341 | break; |
7342 | 7342 | case 0x0f: |
7343 | 7343 | state->m_mmc_prg_bank[2] = data; |
7344 | tengen_800032_set_prg(space | |
7344 | tengen_800032_set_prg(space.machine()); | |
7345 | 7345 | break; |
7346 | 7346 | } |
7347 | 7347 | break; |
7348 | 7348 | |
7349 | 7349 | case 0x2000: |
7350 | set_nt_mirroring(space | |
7350 | set_nt_mirroring(space.machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
7351 | 7351 | break; |
7352 | 7352 | |
7353 | 7353 | case 0x4000: |
r17963 | r17964 | |
7399 | 7399 | |
7400 | 7400 | static WRITE8_HANDLER( tengen_800037_w ) |
7401 | 7401 | { |
7402 | nes_state *state = space | |
7402 | nes_state *state = space.machine().driver_data<nes_state>(); | |
7403 | 7403 | UINT8 map158_helper, cmd; |
7404 | 7404 | LOG_MMC(("tengen_800037_w, offset: %04x, data: %02x\n", offset, data)); |
7405 | 7405 | |
r17963 | r17964 | |
7411 | 7411 | |
7412 | 7412 | /* Has PRG Mode changed? */ |
7413 | 7413 | if (map158_helper & 0x40) |
7414 | tengen_800032_set_prg(space | |
7414 | tengen_800032_set_prg(space.machine()); | |
7415 | 7415 | |
7416 | 7416 | /* Has CHR Mode changed? */ |
7417 | 7417 | if (map158_helper & 0xa0) |
7418 | 7418 | { |
7419 | tengen_800032_set_chr(space->machine()); | |
7420 | tengen_800037_set_mirror(space->machine()); | |
7419 | tengen_800032_set_chr(space.machine()); | |
7420 | tengen_800037_set_mirror(space.machine()); | |
7421 | 7421 | } |
7422 | 7422 | break; |
7423 | 7423 | |
r17963 | r17964 | |
7429 | 7429 | case 2: case 3: |
7430 | 7430 | case 4: case 5: |
7431 | 7431 | state->m_mmc_vrom_bank[cmd] = data; |
7432 | tengen_800032_set_chr(space->machine()); | |
7433 | tengen_800037_set_mirror(space->machine()); | |
7432 | tengen_800032_set_chr(space.machine()); | |
7433 | tengen_800037_set_mirror(space.machine()); | |
7434 | 7434 | break; |
7435 | 7435 | case 6: case 7: |
7436 | 7436 | state->m_mmc_prg_bank[cmd - 6] = data; |
7437 | tengen_800032_set_prg(space | |
7437 | tengen_800032_set_prg(space.machine()); | |
7438 | 7438 | break; |
7439 | 7439 | case 8: case 9: |
7440 | 7440 | state->m_mmc_vrom_bank[cmd - 2] = data; |
7441 | tengen_800032_set_chr(space->machine()); | |
7442 | tengen_800037_set_mirror(space->machine()); | |
7441 | tengen_800032_set_chr(space.machine()); | |
7442 | tengen_800037_set_mirror(space.machine()); | |
7443 | 7443 | break; |
7444 | 7444 | case 0x0f: |
7445 | 7445 | state->m_mmc_prg_bank[2] = data; |
7446 | tengen_800032_set_prg(space | |
7446 | tengen_800032_set_prg(space.machine()); | |
7447 | 7447 | break; |
7448 | 7448 | } |
7449 | 7449 | break; |
r17963 | r17964 | |
7475 | 7475 | |
7476 | 7476 | static WRITE8_HANDLER( txc_22211_l_w ) |
7477 | 7477 | { |
7478 | nes_state *state = space | |
7478 | nes_state *state = space.machine().driver_data<nes_state>(); | |
7479 | 7479 | LOG_MMC(("txc_22211_l_w, offset: %04x, data: %02x\n", offset, data)); |
7480 | 7480 | |
7481 | 7481 | if (offset < 4) |
r17963 | r17964 | |
7484 | 7484 | |
7485 | 7485 | static READ8_HANDLER( txc_22211_l_r ) |
7486 | 7486 | { |
7487 | nes_state *state = space | |
7487 | nes_state *state = space.machine().driver_data<nes_state>(); | |
7488 | 7488 | LOG_MMC(("txc_22211_l_r, offset: %04x\n", offset)); |
7489 | 7489 | |
7490 | 7490 | if (offset == 0x0000) |
r17963 | r17964 | |
7495 | 7495 | |
7496 | 7496 | static WRITE8_HANDLER( txc_22211_w ) |
7497 | 7497 | { |
7498 | nes_state *state = space | |
7498 | nes_state *state = space.machine().driver_data<nes_state>(); | |
7499 | 7499 | LOG_MMC(("txc_22211_w, offset: %04x, data: %02x\n", offset, data)); |
7500 | 7500 | |
7501 | prg32(space->machine(), state->m_txc_reg[2] >> 2); | |
7502 | chr8(space->machine(), state->m_txc_reg[2], CHRROM); | |
7501 | prg32(space.machine(), state->m_txc_reg[2] >> 2); | |
7502 | chr8(space.machine(), state->m_txc_reg[2], CHRROM); | |
7503 | 7503 | } |
7504 | 7504 | |
7505 | 7505 | /************************************************************* |
r17963 | r17964 | |
7519 | 7519 | |
7520 | 7520 | static WRITE8_HANDLER( txc_22211b_w ) |
7521 | 7521 | { |
7522 | nes_state *state = space | |
7522 | nes_state *state = space.machine().driver_data<nes_state>(); | |
7523 | 7523 | LOG_MMC(("txc_22211b_w, offset: %04x, data: %02x\n", offset, data)); |
7524 | 7524 | |
7525 | prg32(space->machine(), state->m_txc_reg[2] >> 2); | |
7526 | chr8(space->machine(), (((data ^ state->m_txc_reg[2]) >> 3) & 0x02) | (((data ^ state->m_txc_reg[2]) >> 5) & 0x01), CHRROM); | |
7525 | prg32(space.machine(), state->m_txc_reg[2] >> 2); | |
7526 | chr8(space.machine(), (((data ^ state->m_txc_reg[2]) >> 3) & 0x02) | (((data ^ state->m_txc_reg[2]) >> 5) & 0x01), CHRROM); | |
7527 | 7527 | } |
7528 | 7528 | |
7529 | 7529 | /************************************************************* |
r17963 | r17964 | |
7543 | 7543 | |
7544 | 7544 | static READ8_HANDLER( txc_22211c_l_r ) |
7545 | 7545 | { |
7546 | nes_state *state = space | |
7546 | nes_state *state = space.machine().driver_data<nes_state>(); | |
7547 | 7547 | LOG_MMC(("txc_22211c_l_r, offset: %04x\n", offset)); |
7548 | 7548 | |
7549 | 7549 | if (offset == 0x0000) |
r17963 | r17964 | |
7570 | 7570 | { |
7571 | 7571 | LOG_MMC(("txctw_l_w, offset: %04x, data: %02x\n", offset, data)); |
7572 | 7572 | |
7573 | prg32(space | |
7573 | prg32(space.machine(), (data >> 4) | data); | |
7574 | 7574 | } |
7575 | 7575 | |
7576 | 7576 | static WRITE8_HANDLER( txc_tw_m_w ) |
r17963 | r17964 | |
7606 | 7606 | |
7607 | 7607 | if ((offset >= 0x400) && (offset < 0x7fff)) |
7608 | 7608 | { |
7609 | prg32(space->machine(), data >> 4); | |
7610 | chr8(space->machine(), data & 0x0f, CHRROM); | |
7609 | prg32(space.machine(), data >> 4); | |
7610 | chr8(space.machine(), data & 0x0f, CHRROM); | |
7611 | 7611 | } |
7612 | 7612 | } |
7613 | 7613 | |
r17963 | r17964 | |
7636 | 7636 | { |
7637 | 7637 | LOG_MMC(("txc_mxmdhtwo_w, offset: %04x, data: %02x\n", offset, data)); |
7638 | 7638 | |
7639 | prg32(space | |
7639 | prg32(space.machine(), data); | |
7640 | 7640 | } |
7641 | 7641 | |
7642 | 7642 | /************************************************************* |
r17963 | r17964 | |
7698 | 7698 | switch (offset & 0x6001) |
7699 | 7699 | { |
7700 | 7700 | case 0x2000: |
7701 | waixing_set_mirror(space | |
7701 | waixing_set_mirror(space.machine(), data); //maybe data & 0x03? | |
7702 | 7702 | break; |
7703 | 7703 | |
7704 | 7704 | case 0x2001: |
r17963 | r17964 | |
7815 | 7815 | |
7816 | 7816 | static WRITE8_HANDLER( waixing_f_w ) |
7817 | 7817 | { |
7818 | nes_state *state = space | |
7818 | nes_state *state = space.machine().driver_data<nes_state>(); | |
7819 | 7819 | UINT8 cmd; |
7820 | 7820 | LOG_MMC(("waixing_f_w, offset: %04x, data: %02x\n", offset, data)); |
7821 | 7821 | |
r17963 | r17964 | |
7826 | 7826 | if (cmd >= 6) |
7827 | 7827 | { |
7828 | 7828 | state->m_mmc_prg_bank[cmd - 6] = data & ((data > 0x3f) ? 0x4f : 0x3f); |
7829 | mmc3_set_prg(space | |
7829 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
7830 | 7830 | } |
7831 | 7831 | else |
7832 | 7832 | waixing_a_w(space, offset, data); |
r17963 | r17964 | |
7876 | 7876 | |
7877 | 7877 | static WRITE8_HANDLER( waixing_g_w ) |
7878 | 7878 | { |
7879 | nes_state *state = space | |
7879 | nes_state *state = space.machine().driver_data<nes_state>(); | |
7880 | 7880 | UINT8 MMC3_helper, cmd; |
7881 | 7881 | LOG_MMC(("waixing_g_w, offset: %04x, data: %02x\n", offset, data)); |
7882 | 7882 | |
r17963 | r17964 | |
7888 | 7888 | |
7889 | 7889 | /* Has PRG Mode changed? */ |
7890 | 7890 | if (MMC3_helper & 0x40) |
7891 | mmc3_set_prg(space | |
7891 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
7892 | 7892 | |
7893 | 7893 | /* Has CHR Mode changed? */ |
7894 | 7894 | if (MMC3_helper & 0x80) |
7895 | waixing_g_set_chr(space | |
7895 | waixing_g_set_chr(space.machine(), state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
7896 | 7896 | break; |
7897 | 7897 | |
7898 | 7898 | case 0x0001: |
r17963 | r17964 | |
7902 | 7902 | case 0: case 1: // these do not need to be separated: we take care of them in set_chr! |
7903 | 7903 | case 2: case 3: case 4: case 5: |
7904 | 7904 | state->m_mmc_vrom_bank[cmd] = data; |
7905 | waixing_g_set_chr(space | |
7905 | waixing_g_set_chr(space.machine(), state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
7906 | 7906 | break; |
7907 | 7907 | case 6: |
7908 | 7908 | case 7: |
7909 | 7909 | case 8: |
7910 | 7910 | case 9: |
7911 | 7911 | state->m_mmc_prg_bank[cmd - 6] = data; |
7912 | mmc3_set_prg(space | |
7912 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
7913 | 7913 | break; |
7914 | 7914 | case 0x0a: case 0x0b: |
7915 | 7915 | state->m_mmc_vrom_bank[cmd - 4] = data; |
7916 | waixing_g_set_chr(space | |
7916 | waixing_g_set_chr(space.machine(), state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
7917 | 7917 | break; |
7918 | 7918 | } |
7919 | 7919 | break; |
r17963 | r17964 | |
7947 | 7947 | |
7948 | 7948 | static WRITE8_HANDLER( waixing_h_w ) |
7949 | 7949 | { |
7950 | nes_state *state = space | |
7950 | nes_state *state = space.machine().driver_data<nes_state>(); | |
7951 | 7951 | UINT8 cmd; |
7952 | 7952 | LOG_MMC(("waixing_h_w, offset: %04x, data: %02x\n", offset, data)); |
7953 | 7953 | |
r17963 | r17964 | |
7960 | 7960 | case 0: // in this case we set prg_base in addition to state->m_mmc_vrom_bank! |
7961 | 7961 | state->m_mmc_prg_base = (data << 5) & 0x40; |
7962 | 7962 | state->m_mmc_prg_mask = 0x3f; |
7963 | mmc3_set_prg(space | |
7963 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
7964 | 7964 | txrom_w(space, offset, data); |
7965 | 7965 | default: |
7966 | 7966 | txrom_w(space, offset, data); |
r17963 | r17964 | |
7993 | 7993 | |
7994 | 7994 | static WRITE8_HANDLER( waixing_sgz_w ) |
7995 | 7995 | { |
7996 | nes_state *state = space | |
7996 | nes_state *state = space.machine().driver_data<nes_state>(); | |
7997 | 7997 | UINT8 mmc_helper, bank; |
7998 | 7998 | LOG_MMC(("waixing_sgz_w, offset: %04x, data: %02x\n", offset, data)); |
7999 | 7999 | |
8000 | 8000 | switch (offset & 0x7000) |
8001 | 8001 | { |
8002 | 8002 | case 0x0000: |
8003 | prg8_89(space | |
8003 | prg8_89(space.machine(), data); | |
8004 | 8004 | break; |
8005 | 8005 | case 0x2000: |
8006 | prg8_ab(space | |
8006 | prg8_ab(space.machine(), data); | |
8007 | 8007 | break; |
8008 | 8008 | case 0x3000: |
8009 | 8009 | case 0x4000: |
r17963 | r17964 | |
8015 | 8015 | state->m_mmc_vrom_bank[bank] = (state->m_mmc_vrom_bank[bank] & 0x0f) | ((data & 0x0f) << 4); |
8016 | 8016 | else |
8017 | 8017 | state->m_mmc_vrom_bank[bank] = (state->m_mmc_vrom_bank[bank] & 0xf0) | (data & 0x0f); |
8018 | chr1_x(space | |
8018 | chr1_x(space.machine(), bank, state->m_mmc_vrom_bank[bank], CHRROM); | |
8019 | 8019 | break; |
8020 | 8020 | case 0x7000: |
8021 | 8021 | switch (offset & 0x0c) |
r17963 | r17964 | |
8056 | 8056 | |
8057 | 8057 | static WRITE8_HANDLER( waixing_sgzlz_l_w ) |
8058 | 8058 | { |
8059 | nes_state *state = space | |
8059 | nes_state *state = space.machine().driver_data<nes_state>(); | |
8060 | 8060 | LOG_MMC(("waixing_sgzlz_l_w, offset: %04x, data: %02x\n", offset, data)); |
8061 | 8061 | |
8062 | 8062 | switch (offset) |
8063 | 8063 | { |
8064 | 8064 | case 0x700: |
8065 | set_nt_mirroring(space | |
8065 | set_nt_mirroring(space.machine(), data ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
8066 | 8066 | break; |
8067 | 8067 | case 0x701: |
8068 | 8068 | state->m_mmc_latch1 = (state->m_mmc_latch1 & 0x0c) | ((data >> 1) & 0x03); |
8069 | prg32(space | |
8069 | prg32(space.machine(), state->m_mmc_latch1); | |
8070 | 8070 | break; |
8071 | 8071 | case 0x702: |
8072 | 8072 | state->m_mmc_latch1 = (state->m_mmc_latch1 & 0x03) | ((data << 2) & 0x0c); |
r17963 | r17964 | |
8089 | 8089 | |
8090 | 8090 | static WRITE8_HANDLER( waixing_ffv_l_w ) |
8091 | 8091 | { |
8092 | nes_state *state = space | |
8092 | nes_state *state = space.machine().driver_data<nes_state>(); | |
8093 | 8093 | UINT8 mmc_helper; |
8094 | 8094 | LOG_MMC(("waixing_ffv_l_w, offset: %04x, data: %02x\n", offset, data)); |
8095 | 8095 | offset += 0x100; /* the checks work better on addresses */ |
r17963 | r17964 | |
8104 | 8104 | case 0x20: |
8105 | 8105 | case 0x40: |
8106 | 8106 | case 0x60: |
8107 | prg16_89ab(space->machine(), mmc_helper | ((state->m_mmc_reg[0] >> 1) & 0x10) | (state->m_mmc_reg[0] & 0x0f)); | |
8108 | prg16_cdef(space->machine(), mmc_helper & 0x1f); | |
8107 | prg16_89ab(space.machine(), mmc_helper | ((state->m_mmc_reg[0] >> 1) & 0x10) | (state->m_mmc_reg[0] & 0x0f)); | |
8108 | prg16_cdef(space.machine(), mmc_helper & 0x1f); | |
8109 | 8109 | break; |
8110 | 8110 | case 0x50: |
8111 | prg32(space | |
8111 | prg32(space.machine(), (mmc_helper >> 1) | (state->m_mmc_reg[0] & 0x0f)); | |
8112 | 8112 | break; |
8113 | 8113 | case 0x70: |
8114 | prg16_89ab(space->machine(), mmc_helper | ((state->m_mmc_reg[0] << 1) & 0x10) | (state->m_mmc_reg[0] & 0x0f)); | |
8115 | prg16_cdef(space->machine(), mmc_helper & 0x1f); | |
8114 | prg16_89ab(space.machine(), mmc_helper | ((state->m_mmc_reg[0] << 1) & 0x10) | (state->m_mmc_reg[0] & 0x0f)); | |
8115 | prg16_cdef(space.machine(), mmc_helper & 0x1f); | |
8116 | 8116 | break; |
8117 | 8117 | } |
8118 | 8118 | } |
r17963 | r17964 | |
8141 | 8141 | { |
8142 | 8142 | LOG_MMC(("waixing_zs_w, offset: %04x, data: %02x\n", offset, data)); |
8143 | 8143 | |
8144 | prg32(space | |
8144 | prg32(space.machine(), offset >> 3); | |
8145 | 8145 | |
8146 | 8146 | switch (data & 0x03) |
8147 | 8147 | { |
8148 | case 0: set_nt_mirroring(space->machine(), PPU_MIRROR_VERT); break; | |
8149 | case 1: set_nt_mirroring(space->machine(), PPU_MIRROR_HORZ); break; | |
8150 | case 2: set_nt_mirroring(space->machine(), PPU_MIRROR_LOW); break; | |
8151 | case 3: set_nt_mirroring(space->machine(), PPU_MIRROR_HIGH); break; | |
8148 | case 0: set_nt_mirroring(space.machine(), PPU_MIRROR_VERT); break; | |
8149 | case 1: set_nt_mirroring(space.machine(), PPU_MIRROR_HORZ); break; | |
8150 | case 2: set_nt_mirroring(space.machine(), PPU_MIRROR_LOW); break; | |
8151 | case 3: set_nt_mirroring(space.machine(), PPU_MIRROR_HIGH); break; | |
8152 | 8152 | } |
8153 | 8153 | } |
8154 | 8154 | |
r17963 | r17964 | |
8171 | 8171 | { |
8172 | 8172 | LOG_MMC(("waixing_dq8_w, offset: %04x, data: %02x\n", offset, data)); |
8173 | 8173 | |
8174 | prg32(space | |
8174 | prg32(space.machine(), offset >> 3); | |
8175 | 8175 | } |
8176 | 8176 | |
8177 | 8177 | |
r17963 | r17964 | |
8194 | 8194 | |
8195 | 8195 | LOG_MMC(("waixing_ps2_w, offset: %04x, data: %02x\n", offset, data)); |
8196 | 8196 | |
8197 | set_nt_mirroring(space | |
8197 | set_nt_mirroring(space.machine(), BIT(data, 6) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
8198 | 8198 | |
8199 | 8199 | switch (offset & 0x0fff) |
8200 | 8200 | { |
8201 | 8201 | case 0x000: |
8202 | prg8_89(space->machine(), (map15_helper + 0) ^ map15_flip); | |
8203 | prg8_ab(space->machine(), (map15_helper + 1) ^ map15_flip); | |
8204 | prg8_cd(space->machine(), (map15_helper + 2) ^ map15_flip); | |
8205 | prg8_ef(space->machine(), (map15_helper + 3) ^ map15_flip); | |
8202 | prg8_89(space.machine(), (map15_helper + 0) ^ map15_flip); | |
8203 | prg8_ab(space.machine(), (map15_helper + 1) ^ map15_flip); | |
8204 | prg8_cd(space.machine(), (map15_helper + 2) ^ map15_flip); | |
8205 | prg8_ef(space.machine(), (map15_helper + 3) ^ map15_flip); | |
8206 | 8206 | break; |
8207 | 8207 | case 0x001: |
8208 | 8208 | map15_helper |= map15_flip; |
8209 | prg8_89(space->machine(), map15_helper); | |
8210 | prg8_ab(space->machine(), map15_helper + 1); | |
8211 | prg8_cd(space->machine(), map15_helper + 1); | |
8212 | prg8_ef(space->machine(), map15_helper + 1); | |
8209 | prg8_89(space.machine(), map15_helper); | |
8210 | prg8_ab(space.machine(), map15_helper + 1); | |
8211 | prg8_cd(space.machine(), map15_helper + 1); | |
8212 | prg8_ef(space.machine(), map15_helper + 1); | |
8213 | 8213 | break; |
8214 | 8214 | case 0x002: |
8215 | 8215 | map15_helper |= map15_flip; |
8216 | prg8_89(space->machine(), map15_helper); | |
8217 | prg8_ab(space->machine(), map15_helper); | |
8218 | prg8_cd(space->machine(), map15_helper); | |
8219 | prg8_ef(space->machine(), map15_helper); | |
8216 | prg8_89(space.machine(), map15_helper); | |
8217 | prg8_ab(space.machine(), map15_helper); | |
8218 | prg8_cd(space.machine(), map15_helper); | |
8219 | prg8_ef(space.machine(), map15_helper); | |
8220 | 8220 | break; |
8221 | 8221 | case 0x003: |
8222 | 8222 | map15_helper |= map15_flip; |
8223 | prg8_89(space->machine(), map15_helper); | |
8224 | prg8_ab(space->machine(), map15_helper + 1); | |
8225 | prg8_cd(space->machine(), map15_helper); | |
8226 | prg8_ef(space->machine(), map15_helper + 1); | |
8223 | prg8_89(space.machine(), map15_helper); | |
8224 | prg8_ab(space.machine(), map15_helper + 1); | |
8225 | prg8_cd(space.machine(), map15_helper); | |
8226 | prg8_ef(space.machine(), map15_helper + 1); | |
8227 | 8227 | break; |
8228 | 8228 | } |
8229 | 8229 | } |
r17963 | r17964 | |
8266 | 8266 | |
8267 | 8267 | static WRITE8_HANDLER( waixing_sec_l_w ) |
8268 | 8268 | { |
8269 | nes_state *state = space | |
8269 | nes_state *state = space.machine().driver_data<nes_state>(); | |
8270 | 8270 | LOG_MMC(("waixing_sec_l_w, offset: %04x, data: %02x\n", offset, data)); |
8271 | 8271 | |
8272 | 8272 | offset += 0x100; |
r17963 | r17964 | |
8274 | 8274 | if (offset == 0x1000) |
8275 | 8275 | { |
8276 | 8276 | state->m_mmc_reg[0] = data & 0x02; |
8277 | mmc3_set_prg(space->machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
8278 | mmc3_set_chr(space->machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
8277 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
8278 | mmc3_set_chr(space.machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
8279 | 8279 | } |
8280 | 8280 | } |
8281 | 8281 | |
r17963 | r17964 | |
8303 | 8303 | |
8304 | 8304 | READ8_HANDLER( waixing_sh2_chr_r ) |
8305 | 8305 | { |
8306 | nes_state *state = space | |
8306 | nes_state *state = space.machine().driver_data<nes_state>(); | |
8307 | 8307 | int bank = offset >> 10; |
8308 | 8308 | UINT8 val = state->m_chr_map[bank].access[offset & 0x3ff]; // this would be usual return value |
8309 | 8309 | int chr_helper; |
r17963 | r17964 | |
8317 | 8317 | |
8318 | 8318 | state->m_mmc_reg[offset >> 12] = chr_helper; |
8319 | 8319 | if (offset & 0x1000) |
8320 | chr4_4(space | |
8320 | chr4_4(space.machine(), state->m_mmc_reg[1], state->m_mmc_reg[1] ? CHRRAM : CHRROM); | |
8321 | 8321 | else |
8322 | chr4_0(space | |
8322 | chr4_0(space.machine(), state->m_mmc_reg[0], state->m_mmc_reg[0] ? CHRRAM : CHRROM); | |
8323 | 8323 | |
8324 | 8324 | return val; |
8325 | 8325 | } |
r17963 | r17964 | |
8354 | 8354 | |
8355 | 8355 | static WRITE8_HANDLER( unl_8237_l_w ) |
8356 | 8356 | { |
8357 | nes_state *state = space | |
8357 | nes_state *state = space.machine().driver_data<nes_state>(); | |
8358 | 8358 | LOG_MMC(("unl_8237_l_w offset: %04x, data: %02x\n", offset, data)); |
8359 | 8359 | offset += 0x100; |
8360 | 8360 | |
r17963 | r17964 | |
8364 | 8364 | if (state->m_mmc_reg[0] & 0x80) |
8365 | 8365 | { |
8366 | 8366 | if (state->m_mmc_reg[0] & 0x20) |
8367 | prg32(space | |
8367 | prg32(space.machine(), (state->m_mmc_reg[0] & 0x0f) >> 1); | |
8368 | 8368 | else |
8369 | 8369 | { |
8370 | prg16_89ab(space->machine(), state->m_mmc_reg[0] & 0x1f); | |
8371 | prg16_cdef(space->machine(), state->m_mmc_reg[0] & 0x1f); | |
8370 | prg16_89ab(space.machine(), state->m_mmc_reg[0] & 0x1f); | |
8371 | prg16_cdef(space.machine(), state->m_mmc_reg[0] & 0x1f); | |
8372 | 8372 | } |
8373 | 8373 | } |
8374 | 8374 | else |
8375 | mmc3_set_prg(space | |
8375 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
8376 | 8376 | } |
8377 | 8377 | |
8378 | 8378 | if (offset == 0x1001) |
8379 | 8379 | { |
8380 | 8380 | state->m_mmc_reg[1] = data; |
8381 | mmc3_set_chr(space | |
8381 | mmc3_set_chr(space.machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
8382 | 8382 | } |
8383 | 8383 | } |
8384 | 8384 | |
8385 | 8385 | static WRITE8_HANDLER( unl_8237_w ) |
8386 | 8386 | { |
8387 | nes_state *state = space | |
8387 | nes_state *state = space.machine().driver_data<nes_state>(); | |
8388 | 8388 | static const UINT8 conv_table[8] = {0, 2, 6, 1, 7, 3, 4, 5}; |
8389 | 8389 | LOG_MMC(("unl_8237_w offset: %04x, data: %02x\n", offset, data)); |
8390 | 8390 | |
r17963 | r17964 | |
8392 | 8392 | { |
8393 | 8393 | case 0x0000: |
8394 | 8394 | case 0x1000: |
8395 | set_nt_mirroring(space | |
8395 | set_nt_mirroring(space.machine(), (data | (data >> 7)) & 0x01 ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
8396 | 8396 | break; |
8397 | 8397 | |
8398 | 8398 | case 0x2000: |
r17963 | r17964 | |
8441 | 8441 | |
8442 | 8442 | static WRITE8_HANDLER( unl_ax5705_w ) |
8443 | 8443 | { |
8444 | nes_state *state = space | |
8444 | nes_state *state = space.machine().driver_data<nes_state>(); | |
8445 | 8445 | UINT8 bank; |
8446 | 8446 | LOG_MMC(("unl_ax5705_w offset: %04x, data: %02x\n", offset, data)); |
8447 | 8447 | |
r17963 | r17964 | |
8449 | 8449 | { |
8450 | 8450 | case 0x0000: |
8451 | 8451 | state->m_mmc_prg_bank[0] = (data & 0x05) | ((data & 0x08) >> 2) | ((data & 0x02) << 2); |
8452 | unl_ax5705_set_prg(space | |
8452 | unl_ax5705_set_prg(space.machine()); | |
8453 | 8453 | break; |
8454 | 8454 | case 0x0008: |
8455 | set_nt_mirroring(space | |
8455 | set_nt_mirroring(space.machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
8456 | 8456 | break; |
8457 | 8457 | case 0x2000: |
8458 | 8458 | state->m_mmc_prg_bank[1] = (data & 0x05) | ((data & 0x08) >> 2) | ((data & 0x02) << 2); |
8459 | unl_ax5705_set_prg(space | |
8459 | unl_ax5705_set_prg(space.machine()); | |
8460 | 8460 | break; |
8461 | 8461 | /* CHR banks 0, 1, 4, 5 */ |
8462 | 8462 | case 0x2008: |
r17963 | r17964 | |
8465 | 8465 | case 0x400a: |
8466 | 8466 | bank = ((offset & 0x4000) ? 4 : 0) + ((offset & 0x0002) ? 1 : 0); |
8467 | 8467 | state->m_mmc_vrom_bank[bank] = (state->m_mmc_vrom_bank[bank] & 0xf0) | (data & 0x0f); |
8468 | chr1_x(space | |
8468 | chr1_x(space.machine(), bank, state->m_mmc_vrom_bank[bank], CHRROM); | |
8469 | 8469 | break; |
8470 | 8470 | case 0x2009: |
8471 | 8471 | case 0x200b: |
r17963 | r17964 | |
8473 | 8473 | case 0x400b: |
8474 | 8474 | bank = ((offset & 0x4000) ? 4 : 0) + ((offset & 0x0002) ? 1 : 0); |
8475 | 8475 | state->m_mmc_vrom_bank[bank] = (state->m_mmc_vrom_bank[bank] & 0x0f) | ((data & 0x04) << 3) | ((data & 0x02) << 5) | ((data & 0x09) << 4); |
8476 | chr1_x(space | |
8476 | chr1_x(space.machine(), bank, state->m_mmc_vrom_bank[bank], CHRROM); | |
8477 | 8477 | break; |
8478 | 8478 | /* CHR banks 2, 3, 6, 7 */ |
8479 | 8479 | case 0x4000: |
r17963 | r17964 | |
8482 | 8482 | case 0x6002: |
8483 | 8483 | bank = 2 + ((offset & 0x2000) ? 4 : 0) + ((offset & 0x0002) ? 1 : 0); |
8484 | 8484 | state->m_mmc_vrom_bank[bank] = (state->m_mmc_vrom_bank[bank] & 0xf0) | (data & 0x0f); |
8485 | chr1_x(space | |
8485 | chr1_x(space.machine(), bank, state->m_mmc_vrom_bank[bank], CHRROM); | |
8486 | 8486 | break; |
8487 | 8487 | case 0x4001: |
8488 | 8488 | case 0x4003: |
r17963 | r17964 | |
8490 | 8490 | case 0x6003: |
8491 | 8491 | bank = 2 + ((offset & 0x2000) ? 4 : 0) + ((offset & 0x0002) ? 1 : 0); |
8492 | 8492 | state->m_mmc_vrom_bank[bank] = (state->m_mmc_vrom_bank[bank] & 0x0f) | ((data & 0x04) << 3) | ((data & 0x02) << 5) | ((data & 0x09) << 4); |
8493 | chr1_x(space | |
8493 | chr1_x(space.machine(), bank, state->m_mmc_vrom_bank[bank], CHRROM); | |
8494 | 8494 | break; |
8495 | 8495 | } |
8496 | 8496 | } |
r17963 | r17964 | |
8509 | 8509 | { |
8510 | 8510 | LOG_MMC(("unl_cc21_w offset: %04x, data: %02x\n", offset, data)); |
8511 | 8511 | |
8512 | set_nt_mirroring(space->machine(), BIT(data, 1) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW); | |
8513 | chr8(space->machine(), (offset & 0x01), CHRROM); | |
8512 | set_nt_mirroring(space.machine(), BIT(data, 1) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW); | |
8513 | chr8(space.machine(), (offset & 0x01), CHRROM); | |
8514 | 8514 | } |
8515 | 8515 | |
8516 | 8516 | /************************************************************* |
r17963 | r17964 | |
8605 | 8605 | |
8606 | 8606 | static WRITE8_HANDLER( unl_t230_w ) |
8607 | 8607 | { |
8608 | nes_state *state = space | |
8608 | nes_state *state = space.machine().driver_data<nes_state>(); | |
8609 | 8609 | UINT8 bank; |
8610 | 8610 | LOG_MMC(("unl_t230_w offset: %04x, data: %02x\n", offset, data)); |
8611 | 8611 | |
r17963 | r17964 | |
8614 | 8614 | case 0x0000: |
8615 | 8615 | break; |
8616 | 8616 | case 0x2000: |
8617 | prg16_89ab(space | |
8617 | prg16_89ab(space.machine(), data); | |
8618 | 8618 | break; |
8619 | 8619 | |
8620 | 8620 | // the part below works like VRC-2. how was the original board wired up? |
r17963 | r17964 | |
8625 | 8625 | case 0x100c: |
8626 | 8626 | switch (data & 0x03) |
8627 | 8627 | { |
8628 | case 0x00: set_nt_mirroring(space->machine(), PPU_MIRROR_VERT); break; | |
8629 | case 0x01: set_nt_mirroring(space->machine(), PPU_MIRROR_HORZ); break; | |
8630 | case 0x02: set_nt_mirroring(space->machine(), PPU_MIRROR_LOW); break; | |
8631 | case 0x03: set_nt_mirroring(space->machine(), PPU_MIRROR_HIGH); break; | |
8628 | case 0x00: set_nt_mirroring(space.machine(), PPU_MIRROR_VERT); break; | |
8629 | case 0x01: set_nt_mirroring(space.machine(), PPU_MIRROR_HORZ); break; | |
8630 | case 0x02: set_nt_mirroring(space.machine(), PPU_MIRROR_LOW); break; | |
8631 | case 0x03: set_nt_mirroring(space.machine(), PPU_MIRROR_HIGH); break; | |
8632 | 8632 | } |
8633 | 8633 | break; |
8634 | 8634 | |
r17963 | r17964 | |
8654 | 8654 | else |
8655 | 8655 | state->m_mmc_vrom_bank[bank] = (state->m_mmc_vrom_bank[bank] & 0xf0) | (data & 0x0f); |
8656 | 8656 | |
8657 | chr1_x(space | |
8657 | chr1_x(space.machine(), bank, state->m_mmc_vrom_bank[bank], state->m_mmc_chr_source); | |
8658 | 8658 | break; |
8659 | 8659 | case 0x7000: |
8660 | 8660 | state->m_IRQ_count_latch &= ~0x0f; |
r17963 | r17964 | |
8714 | 8714 | |
8715 | 8715 | static WRITE8_HANDLER( kof96_l_w ) |
8716 | 8716 | { |
8717 | nes_state *state = space | |
8717 | nes_state *state = space.machine().driver_data<nes_state>(); | |
8718 | 8718 | UINT8 new_bank; |
8719 | 8719 | LOG_MMC(("kof96_l_w, offset: %04x, data: %02x\n", offset, data)); |
8720 | 8720 | offset += 0x100; |
r17963 | r17964 | |
8728 | 8728 | new_bank = (state->m_mmc_reg[0] & 0x1f); |
8729 | 8729 | |
8730 | 8730 | if (state->m_mmc_reg[0] & 0x20) |
8731 | prg32(space | |
8731 | prg32(space.machine(), new_bank >> 2); | |
8732 | 8732 | else |
8733 | 8733 | { |
8734 | prg16_89ab(space->machine(), new_bank); | |
8735 | prg16_cdef(space->machine(), new_bank); | |
8734 | prg16_89ab(space.machine(), new_bank); | |
8735 | prg16_cdef(space.machine(), new_bank); | |
8736 | 8736 | } |
8737 | 8737 | } |
8738 | 8738 | else |
8739 | mmc3_set_prg(space | |
8739 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
8740 | 8740 | } |
8741 | 8741 | |
8742 | 8742 | if (offset >= 0x1000) |
r17963 | r17964 | |
8760 | 8760 | if (!state->m_mmc_reg[3] && offset > 0x1000) |
8761 | 8761 | { |
8762 | 8762 | state->m_mmc_reg[3] = 1; |
8763 | space | |
8763 | space.write_byte(0x4017, 0x40); | |
8764 | 8764 | } |
8765 | 8765 | } |
8766 | 8766 | |
8767 | 8767 | static READ8_HANDLER( kof96_l_r ) |
8768 | 8768 | { |
8769 | nes_state *state = space | |
8769 | nes_state *state = space.machine().driver_data<nes_state>(); | |
8770 | 8770 | LOG_MMC(("kof96_l_r, offset: %04x\n", offset)); |
8771 | 8771 | offset += 0x100; |
8772 | 8772 | |
r17963 | r17964 | |
8778 | 8778 | |
8779 | 8779 | static WRITE8_HANDLER( kof96_w ) |
8780 | 8780 | { |
8781 | nes_state *state = space | |
8781 | nes_state *state = space.machine().driver_data<nes_state>(); | |
8782 | 8782 | LOG_MMC(("kof96_w, offset: %04x, data: %02x\n", offset, data)); |
8783 | 8783 | |
8784 | 8784 | switch (offset & 0x6003) |
r17963 | r17964 | |
8800 | 8800 | state->m_mmc_reg[2] = 0; |
8801 | 8801 | |
8802 | 8802 | if (data == 0x28) |
8803 | prg8_cd(space | |
8803 | prg8_cd(space.machine(), 0x17); | |
8804 | 8804 | else if (data == 0x2a) |
8805 | prg8_ab(space | |
8805 | prg8_ab(space.machine(), 0x0f); | |
8806 | 8806 | break; |
8807 | 8807 | |
8808 | 8808 | default: |
r17963 | r17964 | |
8829 | 8829 | |
8830 | 8830 | static WRITE8_HANDLER( mk2_m_w ) |
8831 | 8831 | { |
8832 | nes_state *state = space | |
8832 | nes_state *state = space.machine().driver_data<nes_state>(); | |
8833 | 8833 | LOG_MMC(("mk2_m_w, offset: %04x, data: %02x\n", offset, data)); |
8834 | 8834 | |
8835 | 8835 | switch (offset & 0x1000) |
r17963 | r17964 | |
8837 | 8837 | case 0x0000: |
8838 | 8838 | switch (offset & 0x03) |
8839 | 8839 | { |
8840 | case 0x00: chr2_0(space->machine(), data, CHRROM); break; | |
8841 | case 0x01: chr2_2(space->machine(), data, CHRROM); break; | |
8842 | case 0x02: chr2_4(space->machine(), data, CHRROM); break; | |
8843 | case 0x03: chr2_6(space->machine(), data, CHRROM); break; | |
8840 | case 0x00: chr2_0(space.machine(), data, CHRROM); break; | |
8841 | case 0x01: chr2_2(space.machine(), data, CHRROM); break; | |
8842 | case 0x02: chr2_4(space.machine(), data, CHRROM); break; | |
8843 | case 0x03: chr2_6(space.machine(), data, CHRROM); break; | |
8844 | 8844 | } |
8845 | 8845 | break; |
8846 | 8846 | case 0x1000: |
8847 | 8847 | switch (offset & 0x03) |
8848 | 8848 | { |
8849 | case 0x00: prg8_89(space->machine(), data); break; | |
8850 | case 0x01: prg8_ab(space->machine(), data); break; | |
8849 | case 0x00: prg8_89(space.machine(), data); break; | |
8850 | case 0x01: prg8_ab(space.machine(), data); break; | |
8851 | 8851 | case 0x02: state->m_IRQ_enable = 0; state->m_IRQ_count = 0; break; |
8852 | 8852 | case 0x03: state->m_IRQ_enable = 1; state->m_IRQ_count = 7; break; |
8853 | 8853 | } |
r17963 | r17964 | |
8885 | 8885 | |
8886 | 8886 | static WRITE8_HANDLER( n625092_w ) |
8887 | 8887 | { |
8888 | nes_state *state = space | |
8888 | nes_state *state = space.machine().driver_data<nes_state>(); | |
8889 | 8889 | LOG_MMC(("n625092_w, offset: %04x, data: %02x\n", offset, data)); |
8890 | 8890 | |
8891 | 8891 | if (offset < 0x4000) |
8892 | 8892 | { |
8893 | set_nt_mirroring(space | |
8893 | set_nt_mirroring(space.machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
8894 | 8894 | offset = (offset >> 1) & 0xff; |
8895 | 8895 | |
8896 | 8896 | if (state->m_mmc_latch1 != offset) |
8897 | 8897 | { |
8898 | 8898 | state->m_mmc_latch1 = offset; |
8899 | n625092_set_prg(space | |
8899 | n625092_set_prg(space.machine(), state->m_mmc_latch1, state->m_mmc_latch2); | |
8900 | 8900 | } |
8901 | 8901 | } |
8902 | 8902 | else |
r17963 | r17964 | |
8906 | 8906 | if (state->m_mmc_latch2 != offset) |
8907 | 8907 | { |
8908 | 8908 | state->m_mmc_latch2 = offset; |
8909 | n625092_set_prg(space | |
8909 | n625092_set_prg(space.machine(), state->m_mmc_latch1, state->m_mmc_latch2); | |
8910 | 8910 | } |
8911 | 8911 | } |
8912 | 8912 | } |
r17963 | r17964 | |
8943 | 8943 | |
8944 | 8944 | static WRITE8_HANDLER( sc127_w ) |
8945 | 8945 | { |
8946 | nes_state *state = space | |
8946 | nes_state *state = space.machine().driver_data<nes_state>(); | |
8947 | 8947 | LOG_MMC(("sc127_w, offset: %04x, data: %02x\n", offset, data)); |
8948 | 8948 | |
8949 | 8949 | switch (offset) |
8950 | 8950 | { |
8951 | 8951 | case 0x0000: |
8952 | prg8_89(space | |
8952 | prg8_89(space.machine(), data); | |
8953 | 8953 | break; |
8954 | 8954 | case 0x0001: |
8955 | prg8_ab(space | |
8955 | prg8_ab(space.machine(), data); | |
8956 | 8956 | break; |
8957 | 8957 | case 0x0002: |
8958 | 8958 | // state->m_mmc_prg_bank[offset & 0x02] = data; |
8959 | prg8_cd(space | |
8959 | prg8_cd(space.machine(), data); | |
8960 | 8960 | break; |
8961 | 8961 | case 0x1000: |
8962 | 8962 | case 0x1001: |
r17963 | r17964 | |
8967 | 8967 | case 0x1006: |
8968 | 8968 | case 0x1007: |
8969 | 8969 | // state->m_mmc_vrom_bank[offset & 0x07] = data; |
8970 | chr1_x(space | |
8970 | chr1_x(space.machine(), offset & 0x07, data, CHRROM); | |
8971 | 8971 | break; |
8972 | 8972 | case 0x4002: |
8973 | 8973 | state->m_IRQ_enable = 0; |
r17963 | r17964 | |
8979 | 8979 | state->m_IRQ_count = data; |
8980 | 8980 | break; |
8981 | 8981 | case 0x5001: |
8982 | set_nt_mirroring(space | |
8982 | set_nt_mirroring(space.machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
8983 | 8983 | break; |
8984 | 8984 | } |
8985 | 8985 | } |
r17963 | r17964 | |
8999 | 8999 | |
9000 | 9000 | static WRITE8_HANDLER( smb2j_w ) |
9001 | 9001 | { |
9002 | nes_state *state = space | |
9002 | nes_state *state = space.machine().driver_data<nes_state>(); | |
9003 | 9003 | int bank = (((offset >> 8) & 0x03) * 0x20) + (offset & 0x1f); |
9004 | 9004 | |
9005 | 9005 | LOG_MMC(("smb2j_w, offset: %04x, data: %02x\n", offset, data)); |
9006 | 9006 | |
9007 | set_nt_mirroring(space | |
9007 | set_nt_mirroring(space.machine(), (offset & 0x2000) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
9008 | 9008 | |
9009 | 9009 | if (offset & 0x0800) |
9010 | 9010 | { |
r17963 | r17964 | |
9018 | 9018 | else |
9019 | 9019 | { |
9020 | 9020 | LOG_MMC(("smb2j_w, selecting upper 16KB bank of #%02x\n", bank)); |
9021 | prg16_cdef(space | |
9021 | prg16_cdef(space.machine(), 2 * bank + 1); | |
9022 | 9022 | } |
9023 | 9023 | } |
9024 | 9024 | else |
r17963 | r17964 | |
9031 | 9031 | else |
9032 | 9032 | { |
9033 | 9033 | LOG_MMC(("smb2j_w, selecting lower 16KB bank of #%02x\n", bank)); |
9034 | prg16_89ab(space | |
9034 | prg16_89ab(space.machine(), 2 * bank); | |
9035 | 9035 | } |
9036 | 9036 | } |
9037 | 9037 | } |
r17963 | r17964 | |
9047 | 9047 | else |
9048 | 9048 | { |
9049 | 9049 | LOG_MMC(("smb2j_w, selecting 32KB bank #%02x\n", bank)); |
9050 | prg32(space | |
9050 | prg32(space.machine(), bank); | |
9051 | 9051 | } |
9052 | 9052 | } |
9053 | 9053 | } |
r17963 | r17964 | |
9087 | 9087 | |
9088 | 9088 | static WRITE8_HANDLER( smb2jb_l_w ) |
9089 | 9089 | { |
9090 | nes_state *state = space | |
9090 | nes_state *state = space.machine().driver_data<nes_state>(); | |
9091 | 9091 | UINT8 prg; |
9092 | 9092 | LOG_MMC(("smb2jb_l_w, offset: %04x, data: %02x\n", offset, data)); |
9093 | 9093 | offset += 0x100; |
r17963 | r17964 | |
9096 | 9096 | { |
9097 | 9097 | case 0x020: |
9098 | 9098 | prg = (data & 0x08) | ((data & 0x06) >> 1) | ((data & 0x01) << 2); |
9099 | prg8_cd(space | |
9099 | prg8_cd(space.machine(), prg); | |
9100 | 9100 | break; |
9101 | 9101 | case 0x120: |
9102 | 9102 | state->m_IRQ_enable = data & 0x01; |
r17963 | r17964 | |
9111 | 9111 | LOG_MMC(("smb2jb_extra_w, offset: %04x, data: %02x\n", offset, data)); |
9112 | 9112 | |
9113 | 9113 | prg = (data & 0x08) | ((data & 0x06) >> 1) | ((data & 0x01) << 2); |
9114 | prg8_cd(space | |
9114 | prg8_cd(space.machine(), prg); | |
9115 | 9115 | } |
9116 | 9116 | |
9117 | 9117 | /************************************************************* |
r17963 | r17964 | |
9136 | 9136 | |
9137 | 9137 | static WRITE8_HANDLER( unl_sf3_w ) |
9138 | 9138 | { |
9139 | nes_state *state = space | |
9139 | nes_state *state = space.machine().driver_data<nes_state>(); | |
9140 | 9140 | UINT8 mmc_helper, cmd; |
9141 | 9141 | LOG_MMC(("unl_sf3_w, offset: %04x, data: %02x\n", offset, data)); |
9142 | 9142 | |
r17963 | r17964 | |
9148 | 9148 | |
9149 | 9149 | /* Has PRG Mode changed? */ |
9150 | 9150 | if (mmc_helper & 0x40) |
9151 | mmc3_set_prg(space | |
9151 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
9152 | 9152 | |
9153 | 9153 | /* Has CHR Mode changed? */ |
9154 | 9154 | if (mmc_helper & 0x80) |
9155 | unl_sf3_set_chr(space | |
9155 | unl_sf3_set_chr(space.machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
9156 | 9156 | break; |
9157 | 9157 | |
9158 | 9158 | case 0x0001: |
r17963 | r17964 | |
9161 | 9161 | { |
9162 | 9162 | case 0: case 2: case 4: |
9163 | 9163 | state->m_mmc_vrom_bank[cmd >> 1] = data; |
9164 | unl_sf3_set_chr(space | |
9164 | unl_sf3_set_chr(space.machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
9165 | 9165 | break; |
9166 | 9166 | case 6: |
9167 | 9167 | case 7: |
9168 | 9168 | state->m_mmc_prg_bank[cmd - 6] = data; |
9169 | mmc3_set_prg(space | |
9169 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
9170 | 9170 | break; |
9171 | 9171 | } |
9172 | 9172 | break; |
r17963 | r17964 | |
9199 | 9199 | switch (offset) |
9200 | 9200 | { |
9201 | 9201 | case 0x1ef1: /* 0x5ff1 */ |
9202 | prg32(space | |
9202 | prg32(space.machine(), data >> 1); | |
9203 | 9203 | break; |
9204 | 9204 | case 0x1ef2: /* 0x5ff2 */ |
9205 | chr8(space | |
9205 | chr8(space.machine(), data, CHRROM); | |
9206 | 9206 | break; |
9207 | 9207 | } |
9208 | 9208 | } |
r17963 | r17964 | |
9225 | 9225 | |
9226 | 9226 | static WRITE8_HANDLER( unl_racmate_w ) |
9227 | 9227 | { |
9228 | nes_state *state = space | |
9228 | nes_state *state = space.machine().driver_data<nes_state>(); | |
9229 | 9229 | LOG_MMC(("unl_racmate_w offset: %04x, data: %02x\n", offset, data)); |
9230 | 9230 | |
9231 | 9231 | if (offset == 0x3000) |
9232 | 9232 | { |
9233 | 9233 | state->m_mmc_latch1 = data; |
9234 | racmate_update_banks(space | |
9234 | racmate_update_banks(space.machine()); | |
9235 | 9235 | } |
9236 | 9236 | } |
9237 | 9237 | |
r17963 | r17964 | |
9250 | 9250 | |
9251 | 9251 | static WRITE8_HANDLER( unl_fs304_l_w ) |
9252 | 9252 | { |
9253 | nes_state *state = space | |
9253 | nes_state *state = space.machine().driver_data<nes_state>(); | |
9254 | 9254 | LOG_MMC(("unl_fs304_l_w, offset: %04x, data: %02x\n", offset, data)); |
9255 | 9255 | int bank; |
9256 | 9256 | offset += 0x100; |
r17963 | r17964 | |
9259 | 9259 | { |
9260 | 9260 | state->m_mmc_reg[(offset >> 8) & 3] = data; |
9261 | 9261 | bank = ((state->m_mmc_reg[2] & 0x0f) << 4) | BIT(state->m_mmc_reg[1], 1) | (state->m_mmc_reg[0] & 0x0e); |
9262 | prg32(space->machine(), bank); | |
9263 | chr8(space->machine(), 0, CHRRAM); | |
9262 | prg32(space.machine(), bank); | |
9263 | chr8(space.machine(), 0, CHRRAM); | |
9264 | 9264 | } |
9265 | 9265 | } |
9266 | 9266 | |
r17963 | r17964 | |
9308 | 9308 | // is the code fine for ai senshi nicol?!? |
9309 | 9309 | static WRITE8_HANDLER( btl_mariobaby_w ) |
9310 | 9310 | { |
9311 | nes_state *state = space | |
9311 | nes_state *state = space.machine().driver_data<nes_state>(); | |
9312 | 9312 | LOG_MMC(("btl_mariobaby_w, offset: %04x, data: %02x\n", offset, data)); |
9313 | 9313 | |
9314 | 9314 | if (offset >= 0x7000) |
r17963 | r17964 | |
9316 | 9316 | switch (offset & 0x03) |
9317 | 9317 | { |
9318 | 9318 | case 0x00: |
9319 | prg8_67(space | |
9319 | prg8_67(space.machine(), data); | |
9320 | 9320 | break; |
9321 | 9321 | case 0x01: |
9322 | set_nt_mirroring(space | |
9322 | set_nt_mirroring(space.machine(), BIT(data, 3) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
9323 | 9323 | break; |
9324 | 9324 | case 0x02: |
9325 | 9325 | /* Check if IRQ is being enabled */ |
r17963 | r17964 | |
9369 | 9369 | |
9370 | 9370 | static WRITE8_HANDLER( btl_smb2a_w ) |
9371 | 9371 | { |
9372 | nes_state *state = space | |
9372 | nes_state *state = space.machine().driver_data<nes_state>(); | |
9373 | 9373 | LOG_MMC(("btl_smb2a_w, offset: %04x, data: %02x\n", offset, data)); |
9374 | 9374 | |
9375 | 9375 | switch (offset & 0x6000) |
r17963 | r17964 | |
9382 | 9382 | state->m_IRQ_enable = 1; |
9383 | 9383 | break; |
9384 | 9384 | case 0x6000: |
9385 | prg8_cd(space | |
9385 | prg8_cd(space.machine(), data); | |
9386 | 9386 | break; |
9387 | 9387 | } |
9388 | 9388 | } |
r17963 | r17964 | |
9402 | 9402 | static WRITE8_HANDLER( whirl2706_w ) |
9403 | 9403 | { |
9404 | 9404 | LOG_MMC(("whirl2706_w, offset: %04x, data: %02x\n", offset, data)); |
9405 | prg8_67(space | |
9405 | prg8_67(space.machine(), data); | |
9406 | 9406 | } |
9407 | 9407 | |
9408 | 9408 | /************************************************************* |
r17963 | r17964 | |
9423 | 9423 | offset += 0x100; |
9424 | 9424 | |
9425 | 9425 | if ((offset & 0x43c0) == 0x41c0) |
9426 | prg8_67(space | |
9426 | prg8_67(space.machine(), data & 0x07); | |
9427 | 9427 | } |
9428 | 9428 | |
9429 | 9429 | /************************************************************* |
r17963 | r17964 | |
9456 | 9456 | |
9457 | 9457 | static WRITE8_HANDLER( btl_smb3_w ) |
9458 | 9458 | { |
9459 | nes_state *state = space | |
9459 | nes_state *state = space.machine().driver_data<nes_state>(); | |
9460 | 9460 | LOG_MMC(("btl_smb3_w, offset: %04x, data: %02x\n", offset, data)); |
9461 | 9461 | switch (offset & 0x0f) |
9462 | 9462 | { |
9463 | 9463 | case 0x00: |
9464 | 9464 | case 0x02: |
9465 | chr1_x(space | |
9465 | chr1_x(space.machine(), offset & 0x07, data & 0xfe, CHRROM); | |
9466 | 9466 | break; |
9467 | 9467 | case 0x01: |
9468 | 9468 | case 0x03: |
9469 | chr1_x(space | |
9469 | chr1_x(space.machine(), offset & 0x07, data | 0x01, CHRROM); | |
9470 | 9470 | break; |
9471 | 9471 | case 0x04: case 0x05: |
9472 | 9472 | case 0x06: case 0x07: |
9473 | chr1_x(space | |
9473 | chr1_x(space.machine(), offset & 0x07, data, CHRROM); | |
9474 | 9474 | break; |
9475 | 9475 | case 0x08: |
9476 | prg8_89(space | |
9476 | prg8_89(space.machine(), data | 0x10); | |
9477 | 9477 | break; |
9478 | 9478 | case 0x09: |
9479 | prg8_ab(space | |
9479 | prg8_ab(space.machine(), data); | |
9480 | 9480 | break; |
9481 | 9481 | case 0x0a: |
9482 | prg8_cd(space | |
9482 | prg8_cd(space.machine(), data); | |
9483 | 9483 | break; |
9484 | 9484 | case 0x0b: |
9485 | prg8_ef(space | |
9485 | prg8_ef(space.machine(), data | 0x10); | |
9486 | 9486 | break; |
9487 | 9487 | case 0x0c: |
9488 | set_nt_mirroring(space | |
9488 | set_nt_mirroring(space.machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
9489 | 9489 | break; |
9490 | 9490 | case 0x0d: |
9491 | 9491 | state->m_IRQ_count = 0; |
r17963 | r17964 | |
9531 | 9531 | |
9532 | 9532 | static WRITE8_HANDLER( btl_dn_w ) |
9533 | 9533 | { |
9534 | nes_state *state = space | |
9534 | nes_state *state = space.machine().driver_data<nes_state>(); | |
9535 | 9535 | UINT8 bank; |
9536 | 9536 | LOG_MMC(("btl_dn_w, offset: %04x, data: %02x\n", offset, data)); |
9537 | 9537 | |
9538 | 9538 | switch (offset & 0x7003) |
9539 | 9539 | { |
9540 | 9540 | case 0x0000: |
9541 | prg8_89(space | |
9541 | prg8_89(space.machine(), data); | |
9542 | 9542 | break; |
9543 | 9543 | case 0x1000: |
9544 | set_nt_mirroring(space | |
9544 | set_nt_mirroring(space.machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
9545 | 9545 | break; |
9546 | 9546 | case 0x2000: |
9547 | prg8_ab(space | |
9547 | prg8_ab(space.machine(), data); | |
9548 | 9548 | break; |
9549 | 9549 | case 0x3000: |
9550 | 9550 | case 0x3002: |
r17963 | r17964 | |
9555 | 9555 | case 0x6000: |
9556 | 9556 | case 0x6002: |
9557 | 9557 | bank = ((offset & 0x7000) - 0x3000) / 0x0800 + ((offset & 0x0002) >> 3); |
9558 | chr1_x(space | |
9558 | chr1_x(space.machine(), bank, data, CHRROM); | |
9559 | 9559 | break; |
9560 | 9560 | case 0x7000: |
9561 | 9561 | state->m_IRQ_count = data; |
r17963 | r17964 | |
9577 | 9577 | |
9578 | 9578 | static WRITE8_HANDLER( btl_pika_y2k_w ) |
9579 | 9579 | { |
9580 | nes_state *state = space | |
9580 | nes_state *state = space.machine().driver_data<nes_state>(); | |
9581 | 9581 | LOG_MMC(("btl_pika_y2k_w, offset: %04x, data: %02x\n", offset, data)); |
9582 | 9582 | |
9583 | 9583 | switch (offset & 0x6001) |
r17963 | r17964 | |
9597 | 9597 | // strange WRAM usage: it is protected at start, and gets unprotected after the first write to 0xa000 |
9598 | 9598 | static WRITE8_HANDLER( btl_pika_y2k_m_w ) |
9599 | 9599 | { |
9600 | nes_state *state = space | |
9600 | nes_state *state = space.machine().driver_data<nes_state>(); | |
9601 | 9601 | LOG_MMC(("btl_pika_y2k_m_w, offset: %04x, data: %02x\n", offset, data)); |
9602 | 9602 | |
9603 | 9603 | state->m_wram[offset] = data; |
r17963 | r17964 | |
9605 | 9605 | |
9606 | 9606 | static READ8_HANDLER( btl_pika_y2k_m_r ) |
9607 | 9607 | { |
9608 | nes_state *state = space | |
9608 | nes_state *state = space.machine().driver_data<nes_state>(); | |
9609 | 9609 | LOG_MMC(("btl_pika_y2k_m_r, offset: %04x\n", offset)); |
9610 | 9610 | |
9611 | 9611 | return state->m_wram[offset] ^ (state->m_mmc_latch2 & state->m_mmc_reg[0]); |
r17963 | r17964 | |
9716 | 9716 | |
9717 | 9717 | static WRITE8_HANDLER( fk23c_l_w ) |
9718 | 9718 | { |
9719 | nes_state *state = space | |
9719 | nes_state *state = space.machine().driver_data<nes_state>(); | |
9720 | 9720 | LOG_MMC(("fk23c_l_w, offset: %04x, data: %02x\n", offset, data)); |
9721 | 9721 | offset += 0x100; |
9722 | 9722 | |
r17963 | r17964 | |
9726 | 9726 | { |
9727 | 9727 | state->m_mmc_reg[offset & 0x03] = data; |
9728 | 9728 | |
9729 | fk23c_set_prg(space->machine()); | |
9730 | fk23c_set_chr(space->machine()); | |
9729 | fk23c_set_prg(space.machine()); | |
9730 | fk23c_set_chr(space.machine()); | |
9731 | 9731 | } |
9732 | 9732 | } |
9733 | 9733 | } |
9734 | 9734 | |
9735 | 9735 | static WRITE8_HANDLER( fk23c_w ) |
9736 | 9736 | { |
9737 | nes_state *state = space | |
9737 | nes_state *state = space.machine().driver_data<nes_state>(); | |
9738 | 9738 | LOG_MMC(("fk23c_w, offset: %04x, data: %02x\n", offset, data)); |
9739 | 9739 | |
9740 | 9740 | if (state->m_mmc_reg[0] & 0x40) |
r17963 | r17964 | |
9744 | 9744 | else |
9745 | 9745 | { |
9746 | 9746 | state->m_mmc_cmd1 = data & 0x03; |
9747 | fk23c_set_chr(space | |
9747 | fk23c_set_chr(space.machine()); | |
9748 | 9748 | } |
9749 | 9749 | } |
9750 | 9750 | else |
r17963 | r17964 | |
9755 | 9755 | if ((state->m_mmc_reg[3] & 0x02) && (state->m_mmc3_latch & 0x08)) |
9756 | 9756 | { |
9757 | 9757 | state->m_mmc_reg[4 | (state->m_mmc3_latch & 0x03)] = data; |
9758 | fk23c_set_prg(space->machine()); | |
9759 | fk23c_set_chr(space->machine()); | |
9758 | fk23c_set_prg(space.machine()); | |
9759 | fk23c_set_chr(space.machine()); | |
9760 | 9760 | } |
9761 | 9761 | else |
9762 | 9762 | txrom_w(space, offset, data); |
9763 | 9763 | break; |
9764 | 9764 | |
9765 | 9765 | case 0x2000: |
9766 | set_nt_mirroring(space | |
9766 | set_nt_mirroring(space.machine(), data ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
9767 | 9767 | break; |
9768 | 9768 | |
9769 | 9769 | default: |
r17963 | r17964 | |
9806 | 9806 | |
9807 | 9807 | static WRITE8_HANDLER( bmc_64in1nr_l_w ) |
9808 | 9808 | { |
9809 | nes_state *state = space | |
9809 | nes_state *state = space.machine().driver_data<nes_state>(); | |
9810 | 9810 | LOG_MMC(("bmc_64in1nr_l_w offset: %04x, data: %02x\n", offset, data)); |
9811 | 9811 | offset += 0x100; |
9812 | 9812 | |
r17963 | r17964 | |
9817 | 9817 | case 0x1002: |
9818 | 9818 | case 0x1003: |
9819 | 9819 | state->m_mmc_reg[offset & 0x03] = data; |
9820 | bmc_64in1nr_set_prg(space->machine()); | |
9821 | chr8(space->machine(), ((state->m_mmc_reg[0] >> 1) & 0x03) | (state->m_mmc_reg[2] << 2), CHRROM); | |
9820 | bmc_64in1nr_set_prg(space.machine()); | |
9821 | chr8(space.machine(), ((state->m_mmc_reg[0] >> 1) & 0x03) | (state->m_mmc_reg[2] << 2), CHRROM); | |
9822 | 9822 | break; |
9823 | 9823 | } |
9824 | 9824 | if (offset == 0x1000) /* reg[0] also sets mirroring */ |
9825 | set_nt_mirroring(space | |
9825 | set_nt_mirroring(space.machine(), BIT(data, 5) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
9826 | 9826 | } |
9827 | 9827 | |
9828 | 9828 | static WRITE8_HANDLER( bmc_64in1nr_w ) |
9829 | 9829 | { |
9830 | nes_state *state = space | |
9830 | nes_state *state = space.machine().driver_data<nes_state>(); | |
9831 | 9831 | LOG_MMC(("bmc_64in1nr_w offset: %04x, data: %02x\n", offset, data)); |
9832 | 9832 | |
9833 | 9833 | state->m_mmc_reg[3] = data; // reg[3] is currently unused?!? |
r17963 | r17964 | |
9847 | 9847 | { |
9848 | 9848 | LOG_MMC(("bmc_190in1_w offset: %04x, data: %02x\n", offset, data)); |
9849 | 9849 | |
9850 | set_nt_mirroring(space | |
9850 | set_nt_mirroring(space.machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
9851 | 9851 | offset >>= 2; |
9852 | prg16_89ab(space->machine(), offset); | |
9853 | prg16_cdef(space->machine(), offset); | |
9854 | chr8(space->machine(), offset, CHRROM); | |
9852 | prg16_89ab(space.machine(), offset); | |
9853 | prg16_cdef(space.machine(), offset); | |
9854 | chr8(space.machine(), offset, CHRROM); | |
9855 | 9855 | } |
9856 | 9856 | |
9857 | 9857 | /************************************************************* |
r17963 | r17964 | |
9870 | 9870 | LOG_MMC(("bmc_a65as_w offset: %04x, data: %02x\n", offset, data)); |
9871 | 9871 | |
9872 | 9872 | if (data & 0x80) |
9873 | set_nt_mirroring(space | |
9873 | set_nt_mirroring(space.machine(), BIT(data, 5) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW); | |
9874 | 9874 | else |
9875 | set_nt_mirroring(space | |
9875 | set_nt_mirroring(space.machine(), BIT(data, 3) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
9876 | 9876 | |
9877 | 9877 | if (data & 0x40) |
9878 | prg32(space | |
9878 | prg32(space.machine(), data >> 1); | |
9879 | 9879 | else |
9880 | 9880 | { |
9881 | prg16_89ab(space->machine(), helper | (data & 0x07)); | |
9882 | prg16_cdef(space->machine(), helper | 0x07); | |
9881 | prg16_89ab(space.machine(), helper | (data & 0x07)); | |
9882 | prg16_cdef(space.machine(), helper | 0x07); | |
9883 | 9883 | } |
9884 | 9884 | } |
9885 | 9885 | |
r17963 | r17964 | |
9898 | 9898 | { |
9899 | 9899 | LOG_MMC(("bmc_gs2004_w offset: %04x, data: %02x\n", offset, data)); |
9900 | 9900 | |
9901 | prg32(space | |
9901 | prg32(space.machine(), data); | |
9902 | 9902 | } |
9903 | 9903 | |
9904 | 9904 | /************************************************************* |
r17963 | r17964 | |
9917 | 9917 | LOG_MMC(("bmc_gs2013_w offset: %04x, data: %02x\n", offset, data)); |
9918 | 9918 | |
9919 | 9919 | if (data & 0x08) |
9920 | prg32(space | |
9920 | prg32(space.machine(), data & 0x09); | |
9921 | 9921 | else |
9922 | prg32(space | |
9922 | prg32(space.machine(), data & 0x07); | |
9923 | 9923 | } |
9924 | 9924 | |
9925 | 9925 | /************************************************************* |
r17963 | r17964 | |
9954 | 9954 | |
9955 | 9955 | static WRITE8_HANDLER( bmc_s24in1sc03_l_w ) |
9956 | 9956 | { |
9957 | nes_state *state = space | |
9957 | nes_state *state = space.machine().driver_data<nes_state>(); | |
9958 | 9958 | LOG_MMC(("bmc_s24in1sc03_l_w offset: %04x, data: %02x\n", offset, data)); |
9959 | 9959 | offset += 0x100; |
9960 | 9960 | |
9961 | 9961 | if (offset == 0x1ff0) |
9962 | 9962 | { |
9963 | 9963 | state->m_mmc_reg[0] = data; |
9964 | mmc3_set_chr(space->machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
9965 | mmc3_set_prg(space->machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
9964 | mmc3_set_chr(space.machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
9965 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
9966 | 9966 | } |
9967 | 9967 | |
9968 | 9968 | if (offset == 0x1ff1) |
9969 | 9969 | { |
9970 | 9970 | state->m_mmc_reg[1] = data; |
9971 | mmc3_set_prg(space | |
9971 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
9972 | 9972 | } |
9973 | 9973 | |
9974 | 9974 | if (offset == 0x1ff2) |
9975 | 9975 | { |
9976 | 9976 | state->m_mmc_reg[2] = data; |
9977 | mmc3_set_chr(space | |
9977 | mmc3_set_chr(space.machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
9978 | 9978 | } |
9979 | 9979 | } |
9980 | 9980 | |
r17963 | r17964 | |
9990 | 9990 | |
9991 | 9991 | static WRITE8_HANDLER( bmc_t262_w ) |
9992 | 9992 | { |
9993 | nes_state *state = space | |
9993 | nes_state *state = space.machine().driver_data<nes_state>(); | |
9994 | 9994 | UINT8 mmc_helper; |
9995 | 9995 | LOG_MMC(("bmc_t262_w offset: %04x, data: %02x\n", offset, data)); |
9996 | 9996 | |
9997 | 9997 | if (state->m_mmc_latch2 || offset == 0) |
9998 | 9998 | { |
9999 | 9999 | state->m_mmc_latch1 = (state->m_mmc_latch1 & 0x38) | (data & 0x07); |
10000 | prg16_89ab(space | |
10000 | prg16_89ab(space.machine(), state->m_mmc_latch1); | |
10001 | 10001 | } |
10002 | 10002 | else |
10003 | 10003 | { |
10004 | 10004 | state->m_mmc_latch2 = 1; |
10005 | set_nt_mirroring(space | |
10005 | set_nt_mirroring(space.machine(), BIT(data, 1) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
10006 | 10006 | mmc_helper = ((offset >> 3) & 0x20) | ((offset >> 2) & 0x18); |
10007 | 10007 | state->m_mmc_latch1 = mmc_helper | (state->m_mmc_latch1 & 0x07); |
10008 | prg16_89ab(space->machine(), state->m_mmc_latch1); | |
10009 | prg16_cdef(space->machine(), mmc_helper | 0x07); | |
10008 | prg16_89ab(space.machine(), state->m_mmc_latch1); | |
10009 | prg16_cdef(space.machine(), mmc_helper | 0x07); | |
10010 | 10010 | } |
10011 | 10011 | } |
10012 | 10012 | |
r17963 | r17964 | |
10023 | 10023 | |
10024 | 10024 | static WRITE8_HANDLER( bmc_ws_m_w ) |
10025 | 10025 | { |
10026 | nes_state *state = space | |
10026 | nes_state *state = space.machine().driver_data<nes_state>(); | |
10027 | 10027 | UINT8 mmc_helper; |
10028 | 10028 | LOG_MMC(("bmc_ws_m_w offset: %04x, data: %02x\n", offset, data)); |
10029 | 10029 | |
r17963 | r17964 | |
10035 | 10035 | if (!state->m_mmc_latch1) |
10036 | 10036 | { |
10037 | 10037 | state->m_mmc_latch1 = data & 0x20; |
10038 | set_nt_mirroring(space | |
10038 | set_nt_mirroring(space.machine(), BIT(data, 4) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
10039 | 10039 | mmc_helper = (~data & 0x08) >> 3; |
10040 | prg16_89ab(space->machine(), data & ~mmc_helper); | |
10041 | prg16_cdef(space->machine(), data | mmc_helper); | |
10040 | prg16_89ab(space.machine(), data & ~mmc_helper); | |
10041 | prg16_cdef(space.machine(), data | mmc_helper); | |
10042 | 10042 | } |
10043 | 10043 | break; |
10044 | 10044 | case 1: |
10045 | 10045 | if (!state->m_mmc_latch1) |
10046 | 10046 | { |
10047 | chr8(space | |
10047 | chr8(space.machine(), data, CHRROM); | |
10048 | 10048 | } |
10049 | 10049 | break; |
10050 | 10050 | } |
r17963 | r17964 | |
10072 | 10072 | { |
10073 | 10073 | LOG_MMC(("novel1_w, offset: %04x, data: %02x\n", offset, data)); |
10074 | 10074 | |
10075 | prg32(space->machine(), offset & 0x03); | |
10076 | chr8(space->machine(), offset & 0x07, CHRROM); | |
10075 | prg32(space.machine(), offset & 0x03); | |
10076 | chr8(space.machine(), offset & 0x07, CHRROM); | |
10077 | 10077 | } |
10078 | 10078 | |
10079 | 10079 | static WRITE8_HANDLER( novel2_w ) |
10080 | 10080 | { |
10081 | 10081 | LOG_MMC(("novel2_w, offset: %04x, data: %02x\n", offset, data)); |
10082 | 10082 | |
10083 | prg32(space->machine(), offset >> 1); | |
10084 | chr8(space->machine(), offset >> 3, CHRROM); | |
10083 | prg32(space.machine(), offset >> 1); | |
10084 | chr8(space.machine(), offset >> 3, CHRROM); | |
10085 | 10085 | } |
10086 | 10086 | |
10087 | 10087 | /************************************************************* |
r17963 | r17964 | |
10099 | 10099 | |
10100 | 10100 | static WRITE8_HANDLER( bmc_gka_w ) |
10101 | 10101 | { |
10102 | nes_state *state = space | |
10102 | nes_state *state = space.machine().driver_data<nes_state>(); | |
10103 | 10103 | LOG_MMC(("bmc_gka_w, offset: %04x, data: %02x\n", offset, data)); |
10104 | 10104 | |
10105 | 10105 | if (offset & 0x0800) |
r17963 | r17964 | |
10108 | 10108 | state->m_mmc_latch1 = data; |
10109 | 10109 | |
10110 | 10110 | if (state->m_mmc_latch2 & 0x80) |
10111 | prg32(space | |
10111 | prg32(space.machine(), 2 | (state->m_mmc_latch2 >> 6)); | |
10112 | 10112 | else |
10113 | 10113 | { |
10114 | prg16_89ab(space->machine(), (state->m_mmc_latch2 >> 5) & 0x03); | |
10115 | prg16_cdef(space->machine(), (state->m_mmc_latch2 >> 5) & 0x03); | |
10114 | prg16_89ab(space.machine(), (state->m_mmc_latch2 >> 5) & 0x03); | |
10115 | prg16_cdef(space.machine(), (state->m_mmc_latch2 >> 5) & 0x03); | |
10116 | 10116 | } |
10117 | 10117 | |
10118 | set_nt_mirroring(space | |
10118 | set_nt_mirroring(space.machine(), (state->m_mmc_latch2 & 0x08) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
10119 | 10119 | |
10120 | chr8(space | |
10120 | chr8(space.machine(), (state->m_mmc_latch1 & 0x03) | (state->m_mmc_latch2 & 0x07) | ((state->m_mmc_latch2 & 0x10) >> 1), CHRROM); | |
10121 | 10121 | } |
10122 | 10122 | |
10123 | 10123 | |
r17963 | r17964 | |
10137 | 10137 | static WRITE8_HANDLER( sng32_w ) |
10138 | 10138 | { |
10139 | 10139 | LOG_MMC(("sng32_w, offset: %04x, data: %02x\n", offset, data)); |
10140 | prg32(space | |
10140 | prg32(space.machine(), data); | |
10141 | 10141 | } |
10142 | 10142 | |
10143 | 10143 | /************************************************************* |
r17963 | r17964 | |
10155 | 10155 | |
10156 | 10156 | static WRITE8_HANDLER( bmc_gkb_w ) |
10157 | 10157 | { |
10158 | nes_state *state = space | |
10158 | nes_state *state = space.machine().driver_data<nes_state>(); | |
10159 | 10159 | UINT8 bank = (offset & 0x40) ? 0 : 1; |
10160 | 10160 | LOG_MMC(("bmc_gkb_w, offset: %04x, data: %02x\n", offset, data)); |
10161 | 10161 | |
10162 | prg16_89ab(space->machine(), offset & ~bank); | |
10163 | prg16_cdef(space->machine(), offset | bank); | |
10164 | chr8(space->machine(), offset >> 3, state->m_mmc_chr_source); | |
10165 | set_nt_mirroring(space->machine(), BIT(data, 7) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
10162 | prg16_89ab(space.machine(), offset & ~bank); | |
10163 | prg16_cdef(space.machine(), offset | bank); | |
10164 | chr8(space.machine(), offset >> 3, state->m_mmc_chr_source); | |
10165 | set_nt_mirroring(space.machine(), BIT(data, 7) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
10166 | 10166 | } |
10167 | 10167 | |
10168 | 10168 | /************************************************************* |
r17963 | r17964 | |
10182 | 10182 | { |
10183 | 10183 | LOG_MMC(("bmc_super700in1_w, offset :%04x, data: %02x\n", offset, data)); |
10184 | 10184 | |
10185 | chr8(space | |
10185 | chr8(space.machine(), ((offset & 0x1f) << 2) | (data & 0x03), CHRROM); | |
10186 | 10186 | |
10187 | 10187 | if (offset & 0x20) |
10188 | 10188 | { |
10189 | prg16_89ab(space->machine(), (offset & 0x40) | ((offset >> 8) & 0x3f)); | |
10190 | prg16_cdef(space->machine(), (offset & 0x40) | ((offset >> 8) & 0x3f)); | |
10189 | prg16_89ab(space.machine(), (offset & 0x40) | ((offset >> 8) & 0x3f)); | |
10190 | prg16_cdef(space.machine(), (offset & 0x40) | ((offset >> 8) & 0x3f)); | |
10191 | 10191 | } |
10192 | 10192 | else |
10193 | 10193 | { |
10194 | prg32(space | |
10194 | prg32(space.machine(), ((offset & 0x40) | ((offset >> 8) & 0x3f)) >> 1); | |
10195 | 10195 | } |
10196 | 10196 | |
10197 | set_nt_mirroring(space | |
10197 | set_nt_mirroring(space.machine(), BIT(data, 7) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
10198 | 10198 | } |
10199 | 10199 | |
10200 | 10200 | /************************************************************* |
r17963 | r17964 | |
10214 | 10214 | { |
10215 | 10215 | LOG_MMC(("bmc_36in1_w, offset: %04x, data: %02x\n", offset, data)); |
10216 | 10216 | |
10217 | prg16_89ab(space->machine(), offset & 0x07); | |
10218 | prg16_cdef(space->machine(), offset & 0x07); | |
10219 | chr8(space->machine(), offset & 0x07, CHRROM); | |
10217 | prg16_89ab(space.machine(), offset & 0x07); | |
10218 | prg16_cdef(space.machine(), offset & 0x07); | |
10219 | chr8(space.machine(), offset & 0x07, CHRROM); | |
10220 | 10220 | |
10221 | set_nt_mirroring(space | |
10221 | set_nt_mirroring(space.machine(), BIT(data, 3) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
10222 | 10222 | } |
10223 | 10223 | |
10224 | 10224 | /************************************************************* |
r17963 | r17964 | |
10238 | 10238 | { |
10239 | 10239 | LOG_MMC(("bmc_21in1_w, offset: %04x, data: %02x\n", offset, data)); |
10240 | 10240 | |
10241 | prg32(space->machine(), offset & 0x03); | |
10242 | chr8(space->machine(), offset & 0x03, CHRROM); | |
10241 | prg32(space.machine(), offset & 0x03); | |
10242 | chr8(space.machine(), offset & 0x03, CHRROM); | |
10243 | 10243 | } |
10244 | 10244 | |
10245 | 10245 | /************************************************************* |
r17963 | r17964 | |
10261 | 10261 | |
10262 | 10262 | LOG_MMC(("bmc_150in1_w, offset: %04x, data: %02x\n", offset, data)); |
10263 | 10263 | |
10264 | prg16_89ab(space->machine(), bank); | |
10265 | prg16_cdef(space->machine(), bank + (((bank & 0x06) == 0x06) ? 1 : 0)); | |
10266 | chr8(space->machine(), bank, CHRROM); | |
10264 | prg16_89ab(space.machine(), bank); | |
10265 | prg16_cdef(space.machine(), bank + (((bank & 0x06) == 0x06) ? 1 : 0)); | |
10266 | chr8(space.machine(), bank, CHRROM); | |
10267 | 10267 | |
10268 | set_nt_mirroring(space | |
10268 | set_nt_mirroring(space.machine(), BIT(data, 0) ? PPU_MIRROR_HORZ: PPU_MIRROR_VERT); | |
10269 | 10269 | } |
10270 | 10270 | |
10271 | 10271 | /************************************************************* |
r17963 | r17964 | |
10285 | 10285 | { |
10286 | 10286 | LOG_MMC(("bmc_35in1_w, offset: %04x, data: %02x\n", offset, data)); |
10287 | 10287 | |
10288 | prg16_89ab(space->machine(), (data >> 2) & 0x03); | |
10289 | prg16_cdef(space->machine(), (data >> 2) & 0x03); | |
10290 | chr8(space->machine(), data & 0x03, CHRROM); | |
10288 | prg16_89ab(space.machine(), (data >> 2) & 0x03); | |
10289 | prg16_cdef(space.machine(), (data >> 2) & 0x03); | |
10290 | chr8(space.machine(), data & 0x03, CHRROM); | |
10291 | 10291 | } |
10292 | 10292 | |
10293 | 10293 | /************************************************************* |
r17963 | r17964 | |
10309 | 10309 | |
10310 | 10310 | LOG_MMC(("bmc_64in1_w, offset: %04x, data: %02x\n", offset, data)); |
10311 | 10311 | |
10312 | prg16_89ab(space->machine(), offset & ~bank); | |
10313 | prg16_cdef(space->machine(), offset | bank); | |
10314 | chr8(space->machine(), offset & ~bank, CHRROM); | |
10312 | prg16_89ab(space.machine(), offset & ~bank); | |
10313 | prg16_cdef(space.machine(), offset | bank); | |
10314 | chr8(space.machine(), offset & ~bank, CHRROM); | |
10315 | 10315 | |
10316 | set_nt_mirroring(space | |
10316 | set_nt_mirroring(space.machine(), BIT(data, 4) ? PPU_MIRROR_HORZ: PPU_MIRROR_VERT); | |
10317 | 10317 | } |
10318 | 10318 | |
10319 | 10319 | /************************************************************* |
r17963 | r17964 | |
10331 | 10331 | |
10332 | 10332 | static WRITE8_HANDLER( bmc_15in1_m_w ) |
10333 | 10333 | { |
10334 | nes_state *state = space | |
10334 | nes_state *state = space.machine().driver_data<nes_state>(); | |
10335 | 10335 | LOG_MMC(("bmc_15in1_m_w, offset: %04x, data: %02x\n", offset, data)); |
10336 | 10336 | |
10337 | 10337 | if (offset & 0x0800) |
r17963 | r17964 | |
10340 | 10340 | state->m_mmc_prg_mask = (data & 0x02) ? 0x0f : 0x1f; |
10341 | 10341 | state->m_mmc_chr_base = (data & 0x03) << 7; |
10342 | 10342 | state->m_mmc_chr_mask = (data & 0x02) ? 0x7f : 0xff; |
10343 | mmc3_set_prg(space->machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
10344 | mmc3_set_chr(space->machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
10343 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
10344 | mmc3_set_chr(space.machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
10345 | 10345 | } |
10346 | 10346 | } |
10347 | 10347 | |
r17963 | r17964 | |
10362 | 10362 | { |
10363 | 10363 | LOG_MMC(("bmc_hik300_w, offset: %04x, data: %02x\n", offset, data)); |
10364 | 10364 | |
10365 | set_nt_mirroring(space->machine(), BIT(data, 3) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
10366 | chr8(space->machine(), offset, CHRROM); | |
10365 | set_nt_mirroring(space.machine(), BIT(data, 3) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
10366 | chr8(space.machine(), offset, CHRROM); | |
10367 | 10367 | |
10368 | 10368 | if (offset < 0x4000) |
10369 | 10369 | { |
10370 | prg16_89ab(space->machine(), offset); | |
10371 | prg16_cdef(space->machine(), offset); | |
10370 | prg16_89ab(space.machine(), offset); | |
10371 | prg16_cdef(space.machine(), offset); | |
10372 | 10372 | } |
10373 | 10373 | else |
10374 | prg32(space | |
10374 | prg32(space.machine(), offset >> 1); | |
10375 | 10375 | } |
10376 | 10376 | |
10377 | 10377 | /************************************************************* |
r17963 | r17964 | |
10391 | 10391 | { |
10392 | 10392 | LOG_MMC(("supergun20in1_w, offset: %04x, data: %02x\n", offset, data)); |
10393 | 10393 | |
10394 | prg16_89ab(space->machine(), offset >> 2); | |
10395 | prg16_cdef(space->machine(), offset >> 2); | |
10396 | chr8(space->machine(), offset, CHRROM); | |
10394 | prg16_89ab(space.machine(), offset >> 2); | |
10395 | prg16_cdef(space.machine(), offset >> 2); | |
10396 | chr8(space.machine(), offset, CHRROM); | |
10397 | 10397 | } |
10398 | 10398 | |
10399 | 10399 | /************************************************************* |
r17963 | r17964 | |
10417 | 10417 | |
10418 | 10418 | LOG_MMC(("bmc_72in1_w, offset: %04x, data: %02x\n", offset, data)); |
10419 | 10419 | |
10420 | chr8(space->machine(), offset, CHRROM); | |
10421 | set_nt_mirroring(space->machine(), (offset & 0x2000) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
10420 | chr8(space.machine(), offset, CHRROM); | |
10421 | set_nt_mirroring(space.machine(), (offset & 0x2000) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
10422 | 10422 | |
10423 | 10423 | hi_bank = offset & 0x40; |
10424 | 10424 | size_16 = offset & 0x1000; |
r17963 | r17964 | |
10429 | 10429 | if (hi_bank) |
10430 | 10430 | bank ++; |
10431 | 10431 | |
10432 | prg16_89ab(space->machine(), bank); | |
10433 | prg16_cdef(space->machine(), bank); | |
10432 | prg16_89ab(space.machine(), bank); | |
10433 | prg16_cdef(space.machine(), bank); | |
10434 | 10434 | } |
10435 | 10435 | else |
10436 | prg32(space | |
10436 | prg32(space.machine(), bank); | |
10437 | 10437 | } |
10438 | 10438 | |
10439 | 10439 | /************************************************************* |
r17963 | r17964 | |
10452 | 10452 | // does this work for super42in1 as well?!? |
10453 | 10453 | static WRITE8_HANDLER( bmc_76in1_w ) |
10454 | 10454 | { |
10455 | nes_state *state = space | |
10455 | nes_state *state = space.machine().driver_data<nes_state>(); | |
10456 | 10456 | int hi_bank; |
10457 | 10457 | int size_16; |
10458 | 10458 | int bank; |
r17963 | r17964 | |
10464 | 10464 | else |
10465 | 10465 | state->m_mmc_latch1 = data; |
10466 | 10466 | |
10467 | set_nt_mirroring(space | |
10467 | set_nt_mirroring(space.machine(), BIT(state->m_mmc_latch1, 6) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
10468 | 10468 | |
10469 | 10469 | hi_bank = state->m_mmc_latch1 & 0x01; |
10470 | 10470 | size_16 = state->m_mmc_latch1 & 0x20; |
r17963 | r17964 | |
10476 | 10476 | if (hi_bank) |
10477 | 10477 | bank ++; |
10478 | 10478 | |
10479 | prg16_89ab(space->machine(), bank); | |
10480 | prg16_cdef(space->machine(), bank); | |
10479 | prg16_89ab(space.machine(), bank); | |
10480 | prg16_cdef(space.machine(), bank); | |
10481 | 10481 | } |
10482 | 10482 | else |
10483 | prg32(space | |
10483 | prg32(space.machine(), bank); | |
10484 | 10484 | } |
10485 | 10485 | |
10486 | 10486 | /************************************************************* |
r17963 | r17964 | |
10513 | 10513 | if (hi_bank) |
10514 | 10514 | bank ++; |
10515 | 10515 | |
10516 | prg16_89ab(space->machine(), bank); | |
10517 | prg16_cdef(space->machine(), bank); | |
10516 | prg16_89ab(space.machine(), bank); | |
10517 | prg16_cdef(space.machine(), bank); | |
10518 | 10518 | } |
10519 | 10519 | else |
10520 | prg32(space | |
10520 | prg32(space.machine(), bank); | |
10521 | 10521 | |
10522 | 10522 | if (!(offset & 0x80)) |
10523 | 10523 | { |
10524 | 10524 | if (offset & 0x200) |
10525 | prg16_cdef(space | |
10525 | prg16_cdef(space.machine(), ((bank << 1) & 0x38) + 7); | |
10526 | 10526 | else |
10527 | prg16_cdef(space | |
10527 | prg16_cdef(space.machine(), ((bank << 1) & 0x38)); | |
10528 | 10528 | } |
10529 | 10529 | |
10530 | set_nt_mirroring(space | |
10530 | set_nt_mirroring(space.machine(), BIT(data, 1) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
10531 | 10531 | } |
10532 | 10532 | |
10533 | 10533 | /************************************************************* |
r17963 | r17964 | |
10547 | 10547 | { |
10548 | 10548 | LOG_MMC(("bmc_31in1_w, offset: %04x, data: %02x\n", offset, data)); |
10549 | 10549 | |
10550 | set_nt_mirroring(space->machine(), BIT(data, 5) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
10551 | chr8(space->machine(), offset, CHRROM); | |
10550 | set_nt_mirroring(space.machine(), BIT(data, 5) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
10551 | chr8(space.machine(), offset, CHRROM); | |
10552 | 10552 | |
10553 | 10553 | if ((offset & 0x1e) == 0) |
10554 | 10554 | { |
10555 | prg16_89ab(space->machine(), 0); | |
10556 | prg16_89ab(space->machine(), 1); | |
10555 | prg16_89ab(space.machine(), 0); | |
10556 | prg16_89ab(space.machine(), 1); | |
10557 | 10557 | } |
10558 | 10558 | else |
10559 | 10559 | { |
10560 | prg16_89ab(space->machine(), offset & 0x1f); | |
10561 | prg16_89ab(space->machine(), offset & 0x1f); | |
10560 | prg16_89ab(space.machine(), offset & 0x1f); | |
10561 | prg16_89ab(space.machine(), offset & 0x1f); | |
10562 | 10562 | } |
10563 | 10563 | } |
10564 | 10564 | |
r17963 | r17964 | |
10582 | 10582 | |
10583 | 10583 | if (1) // this should flip at reset |
10584 | 10584 | { |
10585 | prg16_89ab(space | |
10585 | prg16_89ab(space.machine(), data & 0x07); | |
10586 | 10586 | } |
10587 | 10587 | else |
10588 | 10588 | { |
10589 | 10589 | if (data & 0x20) |
10590 | 10590 | { |
10591 | prg16_89ab(space->machine(), (data & 0x1f) + 8); | |
10592 | prg16_cdef(space->machine(), (data & 0x1f) + 8); | |
10591 | prg16_89ab(space.machine(), (data & 0x1f) + 8); | |
10592 | prg16_cdef(space.machine(), (data & 0x1f) + 8); | |
10593 | 10593 | } |
10594 | 10594 | else |
10595 | 10595 | { |
10596 | prg16_89ab(space->machine(), (data & 0x1f) + 8); | |
10597 | prg16_cdef(space->machine(), (data & 0x1f) + 9); | |
10596 | prg16_89ab(space.machine(), (data & 0x1f) + 8); | |
10597 | prg16_cdef(space.machine(), (data & 0x1f) + 9); | |
10598 | 10598 | } |
10599 | set_nt_mirroring(space | |
10599 | set_nt_mirroring(space.machine(), BIT(data, 6) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ); | |
10600 | 10600 | } |
10601 | 10601 | } |
10602 | 10602 | |
r17963 | r17964 | |
10617 | 10617 | { |
10618 | 10618 | LOG_MMC(("bmc_20in1_w, offset: %04x, data: %02x\n", offset, data)); |
10619 | 10619 | |
10620 | set_nt_mirroring(space | |
10620 | set_nt_mirroring(space.machine(), BIT(data, 7) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
10621 | 10621 | |
10622 | prg16_89ab(space->machine(), (offset & 0x1e)); | |
10623 | prg16_cdef(space->machine(), (offset & 0x1e) | ((offset & 0x20) ? 1 : 0)); | |
10622 | prg16_89ab(space.machine(), (offset & 0x1e)); | |
10623 | prg16_cdef(space.machine(), (offset & 0x1e) | ((offset & 0x20) ? 1 : 0)); | |
10624 | 10624 | } |
10625 | 10625 | |
10626 | 10626 | /************************************************************* |
r17963 | r17964 | |
10643 | 10643 | |
10644 | 10644 | LOG_MMC(("bmc_110in1_w, offset: %04x, data: %02x\n", offset, data)); |
10645 | 10645 | |
10646 | set_nt_mirroring(space->machine(), (offset & 0x2000) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
10647 | prg16_89ab(space->machine(), map255_helper1 & ~map255_helper2); | |
10648 | prg16_cdef(space->machine(), map255_helper1 | map255_helper2); | |
10649 | chr8(space->machine(), ((offset >> 8) & 0x40) | (offset & 0x3f), CHRROM); | |
10646 | set_nt_mirroring(space.machine(), (offset & 0x2000) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
10647 | prg16_89ab(space.machine(), map255_helper1 & ~map255_helper2); | |
10648 | prg16_cdef(space.machine(), map255_helper1 | map255_helper2); | |
10649 | chr8(space.machine(), ((offset >> 8) & 0x40) | (offset & 0x3f), CHRROM); | |
10650 | 10650 | } |
10651 | 10651 | |
10652 | 10652 | /************************************************************* |
r17963 | r17964 | |
10664 | 10664 | |
10665 | 10665 | static WRITE8_HANDLER( bmc_sbig7_w ) |
10666 | 10666 | { |
10667 | nes_state *state = space | |
10667 | nes_state *state = space.machine().driver_data<nes_state>(); | |
10668 | 10668 | UINT8 page; |
10669 | 10669 | LOG_MMC(("bmc_sbig7_w, offset: %04x, data: %02x\n", offset, data)); |
10670 | 10670 | |
r17963 | r17964 | |
10679 | 10679 | state->m_mmc_prg_mask = (page > 5) ? 0x1f : 0x0f; |
10680 | 10680 | state->m_mmc_chr_base = page << 7; |
10681 | 10681 | state->m_mmc_chr_mask = (page > 5) ? 0xff : 0x7f; |
10682 | mmc3_set_prg(space->machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
10683 | mmc3_set_chr(space->machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
10682 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
10683 | mmc3_set_chr(space.machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
10684 | 10684 | break; |
10685 | 10685 | |
10686 | 10686 | default: |
r17963 | r17964 | |
10704 | 10704 | |
10705 | 10705 | static WRITE8_HANDLER( bmc_hik8_m_w ) |
10706 | 10706 | { |
10707 | nes_state *state = space | |
10707 | nes_state *state = space.machine().driver_data<nes_state>(); | |
10708 | 10708 | LOG_MMC(("bmc_hik8_m_w, offset: %04x, data: %02x\n", offset, data)); |
10709 | 10709 | |
10710 | 10710 | /* This bit is the "register lock". Once register are locked, writes go to WRAM |
r17963 | r17964 | |
10731 | 10731 | else |
10732 | 10732 | state->m_mmc_chr_mask = 0xff; // i.e. we use the vrom_bank with no masking |
10733 | 10733 | |
10734 | mmc3_set_prg(space->machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
10735 | mmc3_set_chr(space->machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
10734 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
10735 | mmc3_set_chr(space.machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
10736 | 10736 | } |
10737 | 10737 | } |
10738 | 10738 | } |
r17963 | r17964 | |
10752 | 10752 | |
10753 | 10753 | static WRITE8_HANDLER( bmc_hik4in1_m_w ) |
10754 | 10754 | { |
10755 | nes_state *state = space | |
10755 | nes_state *state = space.machine().driver_data<nes_state>(); | |
10756 | 10756 | LOG_MMC(("bmc_hik4in1_m_w, offset: %04x, data: %02x\n", offset, data)); |
10757 | 10757 | |
10758 | 10758 | /* mid writes only work when WRAM is enabled. not sure if I should |
r17963 | r17964 | |
10764 | 10764 | { |
10765 | 10765 | state->m_mmc_prg_base = (data & 0xc0) >> 2; |
10766 | 10766 | state->m_mmc_prg_mask = 0x0f; |
10767 | mmc3_set_prg(space | |
10767 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
10768 | 10768 | } |
10769 | 10769 | else |
10770 | prg32(space | |
10770 | prg32(space.machine(), (data & 0x30) >> 4); | |
10771 | 10771 | |
10772 | 10772 | state->m_mmc_chr_base = (data & 0xc0) << 1; |
10773 | 10773 | state->m_mmc_chr_mask = 0x7f; |
10774 | mmc3_set_chr(space | |
10774 | mmc3_set_chr(space.machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
10775 | 10775 | } |
10776 | 10776 | } |
10777 | 10777 | |
r17963 | r17964 | |
10806 | 10806 | |
10807 | 10807 | static WRITE8_HANDLER( bmc_ball11_m_w ) |
10808 | 10808 | { |
10809 | nes_state *state = space | |
10809 | nes_state *state = space.machine().driver_data<nes_state>(); | |
10810 | 10810 | |
10811 | 10811 | LOG_MMC(("bmc_ball11_m_w, offset: %04x, data: %02x\n", offset, data)); |
10812 | 10812 | |
10813 | 10813 | state->m_mmc_reg[0] = ((data >> 1) & 0x01) | ((data >> 3) & 0x02); |
10814 | bmc_ball11_set_banks(space | |
10814 | bmc_ball11_set_banks(space.machine()); | |
10815 | 10815 | } |
10816 | 10816 | |
10817 | 10817 | static WRITE8_HANDLER( bmc_ball11_w ) |
10818 | 10818 | { |
10819 | nes_state *state = space | |
10819 | nes_state *state = space.machine().driver_data<nes_state>(); | |
10820 | 10820 | |
10821 | 10821 | LOG_MMC(("bmc_ball11_w, offset: %04x, data: %02x\n", offset, data)); |
10822 | 10822 | |
r17963 | r17964 | |
10828 | 10828 | case 0x2000: |
10829 | 10829 | case 0x6000: |
10830 | 10830 | state->m_mmc_reg[1] = data & 0x0f; |
10831 | bmc_ball11_set_banks(space | |
10831 | bmc_ball11_set_banks(space.machine()); | |
10832 | 10832 | break; |
10833 | 10833 | } |
10834 | 10834 | } |
r17963 | r17964 | |
10850 | 10850 | |
10851 | 10851 | static WRITE8_HANDLER( bmc_mario7in1_m_w ) |
10852 | 10852 | { |
10853 | nes_state *state = space | |
10853 | nes_state *state = space.machine().driver_data<nes_state>(); | |
10854 | 10854 | UINT8 map52_helper1, map52_helper2; |
10855 | 10855 | LOG_MMC(("bmc_mario7in1_m_w, offset: %04x, data: %02x\n", offset, data)); |
10856 | 10856 | |
r17963 | r17964 | |
10866 | 10866 | state->m_mmc_prg_mask = map52_helper1 ? 0x0f : 0x1f; |
10867 | 10867 | state->m_mmc_chr_base = ((data & 0x20) << 4) | ((data & 0x04) << 6) | (map52_helper2 ? ((data & 0x10) << 3) : 0); |
10868 | 10868 | state->m_mmc_chr_mask = map52_helper2 ? 0x7f : 0xff; |
10869 | mmc3_set_prg(space->machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
10870 | mmc3_set_chr(space->machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
10869 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
10870 | mmc3_set_chr(space.machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
10871 | 10871 | |
10872 | 10872 | state->m_map52_reg_written = 1; |
10873 | 10873 | } |
r17963 | r17964 | |
10893 | 10893 | |
10894 | 10894 | static WRITE8_HANDLER( bmc_gold7in1_m_w ) |
10895 | 10895 | { |
10896 | nes_state *state = space | |
10896 | nes_state *state = space.machine().driver_data<nes_state>(); | |
10897 | 10897 | UINT8 map52_helper1, map52_helper2; |
10898 | 10898 | LOG_MMC(("bmc_gold7in1_m_w, offset: %04x, data: %02x\n", offset, data)); |
10899 | 10899 | |
r17963 | r17964 | |
10906 | 10906 | state->m_mmc_prg_mask = map52_helper1 ? 0x0f : 0x1f; |
10907 | 10907 | state->m_mmc_chr_base = ((data & 0x20) << 3) | ((data & 0x04) << 7) | (map52_helper2 ? ((data & 0x10) << 3) : 0); |
10908 | 10908 | state->m_mmc_chr_mask = map52_helper2 ? 0x7f : 0xff; |
10909 | mmc3_set_prg(space->machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
10910 | mmc3_set_chr(space->machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
10909 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
10910 | mmc3_set_chr(space.machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
10911 | 10911 | |
10912 | 10912 | state->m_map52_reg_written = BIT(data, 7); // mc_2hikg & mc_s3nt3 write here multiple time |
10913 | 10913 | } |
r17963 | r17964 | |
10963 | 10963 | |
10964 | 10964 | static WRITE8_HANDLER( bmc_gc6in1_l_w ) |
10965 | 10965 | { |
10966 | nes_state *state = space | |
10966 | nes_state *state = space.machine().driver_data<nes_state>(); | |
10967 | 10967 | UINT8 bank; |
10968 | 10968 | LOG_MMC(("bmc_gc6in1_l_w, offset: %04x, data: %02x\n", offset, data)); |
10969 | 10969 | offset += 0x100; |
r17963 | r17964 | |
10974 | 10974 | if (data & 0x80) |
10975 | 10975 | { |
10976 | 10976 | bank = (data & 0x0f) | ((state->m_mmc_reg[1] & 0x03) << 4); |
10977 | prg16_89ab(space->machine(), bank); | |
10978 | prg16_cdef(space->machine(), bank); | |
10977 | prg16_89ab(space.machine(), bank); | |
10978 | prg16_cdef(space.machine(), bank); | |
10979 | 10979 | } |
10980 | 10980 | else |
10981 | bmc_gc6in1_set_prg(space | |
10981 | bmc_gc6in1_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
10982 | 10982 | } |
10983 | 10983 | else if (offset == 0x1001) |
10984 | 10984 | { |
10985 | 10985 | state->m_mmc_reg[1] = data; |
10986 | bmc_gc6in1_set_prg(space | |
10986 | bmc_gc6in1_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
10987 | 10987 | } |
10988 | 10988 | else if (offset == 0x1007) |
10989 | 10989 | { |
r17963 | r17964 | |
10993 | 10993 | |
10994 | 10994 | static WRITE8_HANDLER( bmc_gc6in1_w ) |
10995 | 10995 | { |
10996 | nes_state *state = space | |
10996 | nes_state *state = space.machine().driver_data<nes_state>(); | |
10997 | 10997 | UINT8 mmc_helper, cmd; |
10998 | 10998 | static const UINT8 conv_table[8] = {0, 6, 3, 7, 5, 2, 4, 1}; |
10999 | 10999 | LOG_MMC(("bmc_gc6in1_w, offset: %04x, data: %02x\n", offset, data)); |
r17963 | r17964 | |
11008 | 11008 | |
11009 | 11009 | /* Has PRG Mode changed? */ |
11010 | 11010 | if (mmc_helper & 0x40) |
11011 | bmc_gc6in1_set_prg(space | |
11011 | bmc_gc6in1_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
11012 | 11012 | |
11013 | 11013 | /* Has CHR Mode changed? */ |
11014 | 11014 | if (mmc_helper & 0x80) |
11015 | bmc_gc6in1_set_chr(space | |
11015 | bmc_gc6in1_set_chr(space.machine(), state->m_mmc_chr_source); | |
11016 | 11016 | break; |
11017 | 11017 | |
11018 | 11018 | case 0x0001: |
r17963 | r17964 | |
11022 | 11022 | case 0: case 1: // these do not need to be separated: we take care of them in set_chr! |
11023 | 11023 | case 2: case 3: case 4: case 5: |
11024 | 11024 | state->m_mmc_vrom_bank[cmd] = data; |
11025 | bmc_gc6in1_set_chr(space | |
11025 | bmc_gc6in1_set_chr(space.machine(), state->m_mmc_chr_source); | |
11026 | 11026 | break; |
11027 | 11027 | case 6: |
11028 | 11028 | case 7: |
11029 | 11029 | state->m_mmc_prg_bank[cmd - 6] = data; |
11030 | bmc_gc6in1_set_prg(space | |
11030 | bmc_gc6in1_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
11031 | 11031 | break; |
11032 | 11032 | } |
11033 | 11033 | break; |
r17963 | r17964 | |
11052 | 11052 | |
11053 | 11053 | /* Has PRG Mode changed? */ |
11054 | 11054 | if (mmc_helper & 0x40) |
11055 | bmc_gc6in1_set_prg(space | |
11055 | bmc_gc6in1_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
11056 | 11056 | |
11057 | 11057 | /* Has CHR Mode changed? */ |
11058 | 11058 | if (mmc_helper & 0x80) |
11059 | bmc_gc6in1_set_chr(space | |
11059 | bmc_gc6in1_set_chr(space.machine(), state->m_mmc_chr_source); | |
11060 | 11060 | |
11061 | 11061 | state->m_mmc_reg[3] = 1; |
11062 | 11062 | break; |
r17963 | r17964 | |
11071 | 11071 | case 0: case 1: // these do not need to be separated: we take care of them in set_chr! |
11072 | 11072 | case 2: case 3: case 4: case 5: |
11073 | 11073 | state->m_mmc_vrom_bank[cmd] = data; |
11074 | bmc_gc6in1_set_chr(space | |
11074 | bmc_gc6in1_set_chr(space.machine(), state->m_mmc_chr_source); | |
11075 | 11075 | break; |
11076 | 11076 | case 6: |
11077 | 11077 | case 7: |
11078 | 11078 | state->m_mmc_prg_bank[cmd - 6] = data; |
11079 | bmc_gc6in1_set_prg(space | |
11079 | bmc_gc6in1_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
11080 | 11080 | break; |
11081 | 11081 | } |
11082 | 11082 | } |
r17963 | r17964 | |
11084 | 11084 | |
11085 | 11085 | |
11086 | 11086 | case 0x2001: |
11087 | set_nt_mirroring(space | |
11087 | set_nt_mirroring(space.machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
11088 | 11088 | break; |
11089 | 11089 | |
11090 | 11090 | default: |
r17963 | r17964 | |
11111 | 11111 | |
11112 | 11112 | static WRITE8_HANDLER( bmc_family4646_m_w ) |
11113 | 11113 | { |
11114 | nes_state *state = space | |
11114 | nes_state *state = space.machine().driver_data<nes_state>(); | |
11115 | 11115 | LOG_MMC(("bmc_family4646_m_w, offset: %04x, data: %02x\n", offset, data)); |
11116 | 11116 | |
11117 | 11117 | if (offset == 0x01) |
r17963 | r17964 | |
11120 | 11120 | state->m_mmc_prg_mask = 0x1f; |
11121 | 11121 | state->m_mmc_chr_base = (data & 0x20) << 3; |
11122 | 11122 | state->m_mmc_chr_mask = 0xff; |
11123 | mmc3_set_prg(space->machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
11124 | mmc3_set_chr(space->machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
11123 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
11124 | mmc3_set_chr(space.machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
11125 | 11125 | } |
11126 | 11126 | } |
11127 | 11127 | |
r17963 | r17964 | |
11133 | 11133 | |
11134 | 11134 | static WRITE8_HANDLER( bmc_vt5201_w ) |
11135 | 11135 | { |
11136 | nes_state *state = space | |
11136 | nes_state *state = space.machine().driver_data<nes_state>(); | |
11137 | 11137 | LOG_MMC(("bmc_vt5201_w, offset: %04x, data: %02x\n", offset, data)); |
11138 | 11138 | |
11139 | 11139 | state->m_mmc_latch1 = BIT(offset, 8); |
11140 | 11140 | |
11141 | 11141 | // not sure about this mirroring bit!! |
11142 | 11142 | // without it TN 95 in 1 has glitches in Lunar Ball; with it TN 95 in 1 has glitches in Galaxian! |
11143 | set_nt_mirroring(space | |
11143 | set_nt_mirroring(space.machine(), BIT(data, 3) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
11144 | 11144 | if (BIT(offset, 7)) |
11145 | 11145 | { |
11146 | prg16_89ab(space->machine(), (offset >> 4) & 0x07); | |
11147 | prg16_cdef(space->machine(), (offset >> 4) & 0x07); | |
11146 | prg16_89ab(space.machine(), (offset >> 4) & 0x07); | |
11147 | prg16_cdef(space.machine(), (offset >> 4) & 0x07); | |
11148 | 11148 | } |
11149 | 11149 | else |
11150 | prg32(space->machine(), (offset >> 5) & 0x03); | |
11151 | chr8(space->machine(), offset, CHRROM); | |
11150 | prg32(space.machine(), (offset >> 5) & 0x03); | |
11151 | chr8(space.machine(), offset, CHRROM); | |
11152 | 11152 | } |
11153 | 11153 | |
11154 | 11154 | static READ8_HANDLER( bmc_vt5201_r ) |
11155 | 11155 | { |
11156 | nes_state *state = space | |
11156 | nes_state *state = space.machine().driver_data<nes_state>(); | |
11157 | 11157 | LOG_MMC(("bmc_vt5201_r, offset: %04x\n", offset)); |
11158 | 11158 | // state->m_mmc_dipsetting = state->ioport("CARTDIPS")->read(); |
11159 | 11159 | |
11160 | 11160 | if (state->m_mmc_latch1) |
11161 | 11161 | return state->m_mmc_dipsetting; // cart mode, depending on the Dip Switches (always zero atm, given we have no way to add cart-based DIPs) |
11162 | 11162 | else |
11163 | return mmc_hi_access_rom(space | |
11163 | return mmc_hi_access_rom(space.machine(), offset); | |
11164 | 11164 | } |
11165 | 11165 | |
11166 | 11166 | /************************************************************* |
r17963 | r17964 | |
11187 | 11187 | |
11188 | 11188 | static WRITE8_HANDLER( bmc_bs5_w ) |
11189 | 11189 | { |
11190 | nes_state *state = space | |
11190 | nes_state *state = space.machine().driver_data<nes_state>(); | |
11191 | 11191 | UINT8 bs5_helper = (offset & 0xc00) >> 10; |
11192 | 11192 | LOG_MMC(("bmc_bs5_w, offset: %04x, data: %02x\n", offset, data)); |
11193 | 11193 | // state->m_mmc_dipsetting = state->ioport("CARTDIPS")->read(); |
r17963 | r17964 | |
11202 | 11202 | state->m_mmc_prg_bank[bs5_helper] = offset & 0x0f; |
11203 | 11203 | break; |
11204 | 11204 | } |
11205 | bmc_bs5_update_banks(space | |
11205 | bmc_bs5_update_banks(space.machine()); | |
11206 | 11206 | } |
11207 | 11207 | |
11208 | 11208 | /************************************************************* |
r17963 | r17964 | |
11220 | 11220 | |
11221 | 11221 | if (!BIT(offset, 6)) |
11222 | 11222 | { |
11223 | prg16_89ab(space->machine(), (bank << 1) | BIT(offset, 5)); | |
11224 | prg16_cdef(space->machine(), (bank << 1) | BIT(offset, 5)); | |
11223 | prg16_89ab(space.machine(), (bank << 1) | BIT(offset, 5)); | |
11224 | prg16_cdef(space.machine(), (bank << 1) | BIT(offset, 5)); | |
11225 | 11225 | } |
11226 | 11226 | else |
11227 | prg32(space | |
11227 | prg32(space.machine(), bank); | |
11228 | 11228 | |
11229 | set_nt_mirroring(space | |
11229 | set_nt_mirroring(space.machine(), BIT(offset, 4) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
11230 | 11230 | |
11231 | chr8(space | |
11231 | chr8(space.machine(), offset & 0x0f, CHRROM); | |
11232 | 11232 | } |
11233 | 11233 | |
11234 | 11234 | /************************************************************* |
r17963 | r17964 | |
11247 | 11247 | |
11248 | 11248 | if (BIT(offset, 7)) |
11249 | 11249 | { |
11250 | prg16_89ab(space->machine(), pbank | BIT(offset, 6)); | |
11251 | prg16_cdef(space->machine(), pbank | BIT(offset, 6)); | |
11250 | prg16_89ab(space.machine(), pbank | BIT(offset, 6)); | |
11251 | prg16_cdef(space.machine(), pbank | BIT(offset, 6)); | |
11252 | 11252 | } |
11253 | 11253 | else |
11254 | prg32(space | |
11254 | prg32(space.machine(), pbank >> 1); | |
11255 | 11255 | |
11256 | set_nt_mirroring(space | |
11256 | set_nt_mirroring(space.machine(), BIT(offset, 10) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
11257 | 11257 | |
11258 | chr8(space | |
11258 | chr8(space.machine(), cbank, CHRROM); | |
11259 | 11259 | } |
11260 | 11260 | |
11261 | 11261 | /************************************************************* |
r17963 | r17964 | |
11288 | 11288 | |
11289 | 11289 | static WRITE8_HANDLER( bmc_gb63_w ) |
11290 | 11290 | { |
11291 | nes_state *state = space | |
11291 | nes_state *state = space.machine().driver_data<nes_state>(); | |
11292 | 11292 | LOG_MMC(("bmc_gb63_w, offset: %04x, data: %02x\n", offset, data)); |
11293 | 11293 | |
11294 | 11294 | state->m_mmc_reg[offset & 1] = data; |
r17963 | r17964 | |
11298 | 11298 | |
11299 | 11299 | static READ8_HANDLER( bmc_gb63_r ) |
11300 | 11300 | { |
11301 | nes_state *state = space | |
11301 | nes_state *state = space.machine().driver_data<nes_state>(); | |
11302 | 11302 | LOG_MMC(("bmc_gb63_r, offset: %04x\n", offset)); |
11303 | 11303 | // state->m_mmc_dipsetting = state->ioport("CARTDIPS")->read(); |
11304 | 11304 | |
11305 | 11305 | if (state->m_mmc_latch1 == 1) |
11306 | 11306 | return 0xff; // open bus |
11307 | 11307 | else |
11308 | return mmc_hi_access_rom(space | |
11308 | return mmc_hi_access_rom(space.machine(), offset); | |
11309 | 11309 | } |
11310 | 11310 | |
11311 | 11311 | /************************************************************* |
r17963 | r17964 | |
11318 | 11318 | { |
11319 | 11319 | LOG_MMC(("edu2k_w, offset: %04x, data: %02x\n", offset, data)); |
11320 | 11320 | |
11321 | prg32(space->machine(), data & 0x1f); | |
11322 | wram_bank(space->machine(), (data & 0xc0) >> 6, NES_WRAM); | |
11321 | prg32(space.machine(), data & 0x1f); | |
11322 | wram_bank(space.machine(), (data & 0xc0) >> 6, NES_WRAM); | |
11323 | 11323 | } |
11324 | 11324 | |
11325 | 11325 | /************************************************************* |
r17963 | r17964 | |
11338 | 11338 | |
11339 | 11339 | static WRITE8_HANDLER( h2288_l_w ) |
11340 | 11340 | { |
11341 | nes_state *state = space | |
11341 | nes_state *state = space.machine().driver_data<nes_state>(); | |
11342 | 11342 | LOG_MMC(("h2288_l_w offset: %04x, data: %02x\n", offset, data)); |
11343 | 11343 | offset += 0x100; |
11344 | 11344 | |
r17963 | r17964 | |
11349 | 11349 | { |
11350 | 11350 | UINT8 helper1 = (state->m_mmc_reg[0] & 0x05) | ((state->m_mmc_reg[0] >> 2) & 0x0a); |
11351 | 11351 | UINT8 helper2 = BIT(state->m_mmc_reg[0], 1); |
11352 | prg16_89ab(space->machine(), helper1 & ~helper2); | |
11353 | prg16_cdef(space->machine(), helper1 | helper2); | |
11352 | prg16_89ab(space.machine(), helper1 & ~helper2); | |
11353 | prg16_cdef(space.machine(), helper1 | helper2); | |
11354 | 11354 | } |
11355 | 11355 | else |
11356 | mmc3_set_prg(space | |
11356 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
11357 | 11357 | } |
11358 | 11358 | } |
11359 | 11359 | |
r17963 | r17964 | |
11444 | 11444 | |
11445 | 11445 | static WRITE8_HANDLER( shjy3_w ) |
11446 | 11446 | { |
11447 | nes_state *state = space | |
11447 | nes_state *state = space.machine().driver_data<nes_state>(); | |
11448 | 11448 | UINT8 mmc_helper, shift; |
11449 | 11449 | LOG_MMC(("shjy3_w, offset: %04x, data: %02x\n", offset, data)); |
11450 | 11450 | |
r17963 | r17964 | |
11472 | 11472 | case 0x1400: |
11473 | 11473 | switch (data & 0x03) |
11474 | 11474 | { |
11475 | case 0: set_nt_mirroring(space->machine(), PPU_MIRROR_VERT); break; | |
11476 | case 1: set_nt_mirroring(space->machine(), PPU_MIRROR_HORZ); break; | |
11477 | case 2: set_nt_mirroring(space->machine(), PPU_MIRROR_LOW); break; | |
11478 | case 3: set_nt_mirroring(space->machine(), PPU_MIRROR_HIGH); break; | |
11475 | case 0: set_nt_mirroring(space.machine(), PPU_MIRROR_VERT); break; | |
11476 | case 1: set_nt_mirroring(space.machine(), PPU_MIRROR_HORZ); break; | |
11477 | case 2: set_nt_mirroring(space.machine(), PPU_MIRROR_LOW); break; | |
11478 | case 3: set_nt_mirroring(space.machine(), PPU_MIRROR_HIGH); break; | |
11479 | 11479 | } |
11480 | 11480 | break; |
11481 | 11481 | case 0x7000: |
r17963 | r17964 | |
11491 | 11491 | break; |
11492 | 11492 | } |
11493 | 11493 | } |
11494 | shjy3_update(space | |
11494 | shjy3_update(space.machine()); | |
11495 | 11495 | } |
11496 | 11496 | |
11497 | 11497 | /************************************************************* |
r17963 | r17964 | |
11506 | 11506 | |
11507 | 11507 | WRITE8_HANDLER( unl_6035052_extra_w ) |
11508 | 11508 | { |
11509 | nes_state *state = space | |
11509 | nes_state *state = space.machine().driver_data<nes_state>(); | |
11510 | 11510 | LOG_MMC(("unl_6035052_extra_w, offset: %04x, data: %02x\n", offset, data)); |
11511 | 11511 | state->m_mmc_latch1 = data & 0x03; |
11512 | 11512 | if (state->m_mmc_latch1 == 1) |
r17963 | r17964 | |
11515 | 11515 | |
11516 | 11516 | READ8_HANDLER( unl_6035052_extra_r ) |
11517 | 11517 | { |
11518 | nes_state *state = space | |
11518 | nes_state *state = space.machine().driver_data<nes_state>(); | |
11519 | 11519 | LOG_MMC(("unl_6035052_extra_r, offset: %04x\n", offset)); |
11520 | 11520 | return state->m_mmc_latch1; |
11521 | 11521 | } |
r17963 | r17964 | |
11572 | 11572 | |
11573 | 11573 | static WRITE8_HANDLER( pjoy84_m_w ) |
11574 | 11574 | { |
11575 | nes_state *state = space | |
11575 | nes_state *state = space.machine().driver_data<nes_state>(); | |
11576 | 11576 | LOG_MMC(("pjoy84_m_w offset: %04x, data: %02x\n", offset, data)); |
11577 | 11577 | |
11578 | 11578 | switch (offset & 0x03) |
r17963 | r17964 | |
11584 | 11584 | case 0x01: |
11585 | 11585 | case 0x02: |
11586 | 11586 | state->m_mmc_reg[offset & 0x03] = data; |
11587 | pjoy84_set_base_mask(space | |
11587 | pjoy84_set_base_mask(space.machine()); | |
11588 | 11588 | if (state->m_mmc_reg[3] & 0x10) |
11589 | chr8(space | |
11589 | chr8(space.machine(), (state->m_mmc_chr_base >> 3) | (state->m_mmc_reg[2] & 0x0f), state->m_mmc_chr_source); | |
11590 | 11590 | else |
11591 | mmc3_set_chr(space->machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
11592 | mmc3_set_prg(space->machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
11591 | mmc3_set_chr(space.machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
11592 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
11593 | 11593 | break; |
11594 | 11594 | } |
11595 | 11595 | } |
r17963 | r17964 | |
11652 | 11652 | |
11653 | 11653 | static WRITE8_HANDLER( someri_mmc1_w ) |
11654 | 11654 | { |
11655 | nes_state *state = space | |
11655 | nes_state *state = space.machine().driver_data<nes_state>(); | |
11656 | 11656 | |
11657 | 11657 | assert(state->m_mmc_cmd1 == 2); |
11658 | 11658 | |
r17963 | r17964 | |
11662 | 11662 | state->m_mmc1_latch = 0; |
11663 | 11663 | |
11664 | 11664 | state->m_mmc_reg[0] |= 0x0c; |
11665 | someri_mmc1_set_prg(space | |
11665 | someri_mmc1_set_prg(space.machine()); | |
11666 | 11666 | return; |
11667 | 11667 | } |
11668 | 11668 | |
r17963 | r17964 | |
11682 | 11682 | state->m_mmc_reg[0] = state->m_mmc1_latch; |
11683 | 11683 | switch (state->m_mmc_reg[0] & 0x03) |
11684 | 11684 | { |
11685 | case 0: set_nt_mirroring(space->machine(), PPU_MIRROR_LOW); break; | |
11686 | case 1: set_nt_mirroring(space->machine(), PPU_MIRROR_HIGH); break; | |
11687 | case 2: set_nt_mirroring(space->machine(), PPU_MIRROR_VERT); break; | |
11688 | case 3: set_nt_mirroring(space->machine(), PPU_MIRROR_HORZ); break; | |
11685 | case 0: set_nt_mirroring(space.machine(), PPU_MIRROR_LOW); break; | |
11686 | case 1: set_nt_mirroring(space.machine(), PPU_MIRROR_HIGH); break; | |
11687 | case 2: set_nt_mirroring(space.machine(), PPU_MIRROR_VERT); break; | |
11688 | case 3: set_nt_mirroring(space.machine(), PPU_MIRROR_HORZ); break; | |
11689 | 11689 | } |
11690 | someri_mmc1_set_chr(space->machine()); | |
11691 | someri_mmc1_set_prg(space->machine()); | |
11690 | someri_mmc1_set_chr(space.machine()); | |
11691 | someri_mmc1_set_prg(space.machine()); | |
11692 | 11692 | break; |
11693 | 11693 | case 0x2000: |
11694 | 11694 | state->m_mmc_reg[1] = state->m_mmc1_latch; |
11695 | someri_mmc1_set_chr(space->machine()); | |
11696 | someri_mmc1_set_prg(space->machine()); | |
11695 | someri_mmc1_set_chr(space.machine()); | |
11696 | someri_mmc1_set_prg(space.machine()); | |
11697 | 11697 | break; |
11698 | 11698 | case 0x4000: |
11699 | 11699 | state->m_mmc_reg[2] = state->m_mmc1_latch; |
11700 | someri_mmc1_set_chr(space | |
11700 | someri_mmc1_set_chr(space.machine()); | |
11701 | 11701 | break; |
11702 | 11702 | case 0x6000: |
11703 | 11703 | state->m_mmc_reg[3] = state->m_mmc1_latch; |
11704 | someri_mmc1_set_prg(space | |
11704 | someri_mmc1_set_prg(space.machine()); | |
11705 | 11705 | break; |
11706 | 11706 | } |
11707 | 11707 | |
r17963 | r17964 | |
11712 | 11712 | // MMC3 Mode emulation |
11713 | 11713 | static WRITE8_HANDLER( someri_mmc3_w ) |
11714 | 11714 | { |
11715 | nes_state *state = space | |
11715 | nes_state *state = space.machine().driver_data<nes_state>(); | |
11716 | 11716 | UINT8 mmc_helper, cmd; |
11717 | 11717 | |
11718 | 11718 | assert(state->m_mmc_cmd1 == 1); |
r17963 | r17964 | |
11723 | 11723 | state->m_mmc3_latch = data; |
11724 | 11724 | |
11725 | 11725 | if (mmc_helper & 0x40) |
11726 | mmc3_set_prg(space | |
11726 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
11727 | 11727 | |
11728 | 11728 | if (mmc_helper & 0x80) |
11729 | mmc3_set_chr(space | |
11729 | mmc3_set_chr(space.machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
11730 | 11730 | break; |
11731 | 11731 | |
11732 | 11732 | case 0x0001: |
r17963 | r17964 | |
11736 | 11736 | case 0: case 1: |
11737 | 11737 | case 2: case 3: case 4: case 5: |
11738 | 11738 | state->m_mmc_vrom_bank[cmd] = data; |
11739 | mmc3_set_chr(space | |
11739 | mmc3_set_chr(space.machine(), state->m_mmc_chr_source, state->m_mmc_chr_base, state->m_mmc_chr_mask); | |
11740 | 11740 | break; |
11741 | 11741 | case 6: |
11742 | 11742 | case 7: |
11743 | 11743 | state->m_mmc_prg_bank[cmd - 6] = data; |
11744 | mmc3_set_prg(space | |
11744 | mmc3_set_prg(space.machine(), state->m_mmc_prg_base, state->m_mmc_prg_mask); | |
11745 | 11745 | break; |
11746 | 11746 | } |
11747 | 11747 | break; |
11748 | 11748 | |
11749 | 11749 | case 0x2000: |
11750 | set_nt_mirroring(space | |
11750 | set_nt_mirroring(space.machine(), BIT(data, 0) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); | |
11751 | 11751 | break; |
11752 | 11752 | case 0x2001: break; |
11753 | 11753 | case 0x4000: state->m_IRQ_count_latch = data; break; |
r17963 | r17964 | |
11760 | 11760 | // VRC2 Mode emulation |
11761 | 11761 | static WRITE8_HANDLER( someri_vrc2_w ) |
11762 | 11762 | { |
11763 | nes_state *state = space | |
11763 | nes_state *state = space.machine().driver_data<nes_state>(); | |
11764 | 11764 | UINT8 bank, shift; |
11765 | 11765 | |
11766 | 11766 | assert(state->m_mmc_cmd1 == 0); |
r17963 | r17964 | |
11768 | 11768 | if (offset < 0x1000) |
11769 | 11769 | { |
11770 | 11770 | state->m_mmc_prg_bank[4] = data; |
11771 | prg8_89(space | |
11771 | prg8_89(space.machine(), state->m_mmc_prg_bank[4]); | |
11772 | 11772 | } |
11773 | 11773 | else if (offset < 0x2000) |
11774 | 11774 | { |
11775 | 11775 | switch (data & 0x03) |
11776 | 11776 | { |
11777 | case 0x00: set_nt_mirroring(space->machine(), PPU_MIRROR_VERT); break; | |
11778 | case 0x01: set_nt_mirroring(space->machine(), PPU_MIRROR_HORZ); break; | |
11779 | case 0x02: set_nt_mirroring(space->machine(), PPU_MIRROR_LOW); break; | |
11780 | case 0x03: set_nt_mirroring(space->machine(), PPU_MIRROR_HIGH); break; | |
11777 | case 0x00: set_nt_mirroring(space.machine(), PPU_MIRROR_VERT); break; | |
11778 | case 0x01: set_nt_mirroring(space.machine(), PPU_MIRROR_HORZ); break; | |
11779 | case 0x02: set_nt_mirroring(space.machine(), PPU_MIRROR_LOW); break; | |
11780 | case 0x03: set_nt_mirroring(space.machine(), PPU_MIRROR_HIGH); break; | |
11781 | 11781 | } |
11782 | 11782 | } |
11783 | 11783 | else if (offset < 0x3000) |
11784 | 11784 | { |
11785 | 11785 | state->m_mmc_prg_bank[5] = data; |
11786 | prg8_ab(space | |
11786 | prg8_ab(space.machine(), state->m_mmc_prg_bank[5]); | |
11787 | 11787 | } |
11788 | 11788 | else if (offset < 0x7000) |
11789 | 11789 | { |
r17963 | r17964 | |
11791 | 11791 | shift = BIT(offset, 2) * 4; |
11792 | 11792 | data = (data & 0x0f) << shift; |
11793 | 11793 | state->m_mmc_vrom_bank[6 + bank] = data | state->m_mmc_chr_base; |
11794 | chr1_x(space | |
11794 | chr1_x(space.machine(), bank, state->m_mmc_vrom_bank[6 + bank], CHRROM); | |
11795 | 11795 | } |
11796 | 11796 | } |
11797 | 11797 | |
11798 | 11798 | static WRITE8_HANDLER( someri_w ) |
11799 | 11799 | { |
11800 | nes_state *state = space | |
11800 | nes_state *state = space.machine().driver_data<nes_state>(); | |
11801 | 11801 | LOG_MMC(("someri_w mode %d, offset: %04x, data: %02x\n", state->m_mmc_cmd1, offset, data)); |
11802 | 11802 | |
11803 | 11803 | switch (state->m_mmc_cmd1) |
r17963 | r17964 | |
11834 | 11834 | |
11835 | 11835 | static WRITE8_HANDLER( someri_l_w ) |
11836 | 11836 | { |
11837 | nes_state *state = space | |
11837 | nes_state *state = space.machine().driver_data<nes_state>(); | |
11838 | 11838 | LOG_MMC(("someri_l_w, offset: %04x, data: %02x\n", offset, data)); |
11839 | 11839 | offset += 0x100; |
11840 | 11840 | |
r17963 | r17964 | |
11844 | 11844 | state->m_mmc_chr_base = ((state->m_mmc_cmd1 & 0x04) << 6); |
11845 | 11845 | if (state->m_mmc_cmd1 != 1) |
11846 | 11846 | state->m_IRQ_enable = 0; |
11847 | someri_mode_update(space | |
11847 | someri_mode_update(space.machine()); | |
11848 | 11848 | } |
11849 | 11849 | } |
11850 | 11850 | |
r17963 | r17964 | |
11859 | 11859 | |
11860 | 11860 | static WRITE8_HANDLER( fujiya_m_w ) |
11861 | 11861 | { |
11862 | nes_state *state = space | |
11862 | nes_state *state = space.machine().driver_data<nes_state>(); | |
11863 | 11863 | LOG_MMC(("fujiya_m_w, offset: %04x, data: %02x\n", offset, data)); |
11864 | 11864 | offset += 0x6000; |
11865 | 11865 | |
r17963 | r17964 | |
11869 | 11869 | |
11870 | 11870 | static READ8_HANDLER( fujiya_m_r ) |
11871 | 11871 | { |
11872 | nes_state *state = space | |
11872 | nes_state *state = space.machine().driver_data<nes_state>(); | |
11873 | 11873 | LOG_MMC(("fujiya_m_r, offset: %04x\n", offset)); |
11874 | 11874 | offset += 0x6000; |
11875 | 11875 |
r17963 | r17964 | |
---|---|---|
152 | 152 | |
153 | 153 | MACHINE_RESET_MEMBER(llc_state,llc2) |
154 | 154 | { |
155 | address_space | |
155 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
156 | 156 | |
157 | space | |
157 | space.unmap_write(0x0000, 0x3fff); | |
158 | 158 | membank("bank1")->set_base(machine().root_device().memregion("maincpu")->base()); |
159 | 159 | |
160 | space | |
160 | space.unmap_write(0x4000, 0x5fff); | |
161 | 161 | membank("bank2")->set_base(machine().root_device().memregion("maincpu")->base() + 0x4000); |
162 | 162 | |
163 | space | |
163 | space.unmap_write(0x6000, 0xbfff); | |
164 | 164 | membank("bank3")->set_base(machine().root_device().memregion("maincpu")->base() + 0x6000); |
165 | 165 | |
166 | space | |
166 | space.install_write_bank(0xc000, 0xffff, "bank4"); | |
167 | 167 | membank("bank4")->set_base(machine().device<ram_device>(RAM_TAG)->pointer() + 0xc000); |
168 | 168 | |
169 | 169 | } |
r17963 | r17964 | |
---|---|---|
165 | 165 | |
166 | 166 | WRITE8_HANDLER ( pc_t1t_p37x_w ) |
167 | 167 | { |
168 | // DBG_LOG(2,"T1T_p37x_w",("%.5x #%d $%02x\n", space | |
168 | // DBG_LOG(2,"T1T_p37x_w",("%.5x #%d $%02x\n", space.device().safe_pc( ),offset, data)); | |
169 | 169 | if (offset!=4) |
170 | logerror("T1T_p37x_w %.5x #%d $%02x\n", space | |
170 | logerror("T1T_p37x_w %.5x #%d $%02x\n", space.device().safe_pc( ),offset, data); | |
171 | 171 | tandy.data[offset]=data; |
172 | 172 | switch( offset ) |
173 | 173 | { |
r17963 | r17964 | |
180 | 180 | READ8_HANDLER ( pc_t1t_p37x_r ) |
181 | 181 | { |
182 | 182 | int data = tandy.data[offset]; |
183 | // DBG_LOG(1,"T1T_p37x_r",("%.5x #%d $%02x\n", space | |
183 | // DBG_LOG(1,"T1T_p37x_r",("%.5x #%d $%02x\n", space.device().safe_pc( ), offset, data)); | |
184 | 184 | return data; |
185 | 185 | } |
186 | 186 | |
r17963 | r17964 | |
203 | 203 | { |
204 | 204 | case 1: |
205 | 205 | tandy_ppi.portb = data; |
206 | pit8253_gate2_w(space->machine().device("pit8253"), BIT(data, 0)); | |
207 | pc_speaker_set_spkrdata( space->machine(), data & 0x02 ); | |
206 | pit8253_gate2_w(space.machine().device("pit8253"), BIT(data, 0)); | |
207 | pc_speaker_set_spkrdata( space.machine(), data & 0x02 ); | |
208 | 208 | pc_keyb_set_clock(data&0x40); |
209 | 209 | if ( data & 0x80 ) |
210 | 210 | { |
r17963 | r17964 | |
214 | 214 | case 2: |
215 | 215 | tandy_ppi.portc = data; |
216 | 216 | if (data & 8) |
217 | space | |
217 | space.machine().device("maincpu")->set_clock_scale(1); | |
218 | 218 | else |
219 | space | |
219 | space.machine().device("maincpu")->set_clock_scale(4.77/8); | |
220 | 220 | break; |
221 | 221 | } |
222 | 222 | } |
r17963 | r17964 | |
261 | 261 | { |
262 | 262 | UINT8 data = 0xFF; |
263 | 263 | |
264 | logerror( "%s: tandy1000_bank_r: offset = %x\n", space | |
264 | logerror( "%s: tandy1000_bank_r: offset = %x\n", space.machine().describe_context(), offset ); | |
265 | 265 | |
266 | 266 | switch( offset ) |
267 | 267 | { |
r17963 | r17964 | |
276 | 276 | |
277 | 277 | WRITE8_HANDLER( tandy1000_bank_w ) |
278 | 278 | { |
279 | logerror( "%s: tandy1000_bank_w: offset = %x, data = %02x\n", space | |
279 | logerror( "%s: tandy1000_bank_w: offset = %x, data = %02x\n", space.machine().describe_context(), offset, data ); | |
280 | 280 | |
281 | 281 | switch( offset ) |
282 | 282 | { |
283 | 283 | case 0x00: /* FFEA */ |
284 | 284 | tandy.bios_bank = data; |
285 | tandy1000_set_bios_bank(space | |
285 | tandy1000_set_bios_bank(space.machine()); | |
286 | 286 | break; |
287 | 287 | } |
288 | 288 | } |
r17963 | r17964 | |
---|---|---|
38 | 38 | } |
39 | 39 | } |
40 | 40 | |
41 | inline void ti8x_update_bank(address_space | |
41 | inline void ti8x_update_bank(address_space &space, UINT8 bank, UINT8 *base, UINT8 page, bool is_ram) | |
42 | 42 | { |
43 | ti85_state *state = space | |
43 | ti85_state *state = space.machine().driver_data<ti85_state>(); | |
44 | 44 | static const char *const tag[] = {"bank1", "bank2", "bank3", "bank4"}; |
45 | 45 | |
46 | 46 | state->membank(tag[bank&3])->set_base(base + (0x4000 * page)); |
47 | 47 | |
48 | 48 | if (is_ram) |
49 | space | |
49 | space.install_write_bank(bank * 0x4000, bank * 0x4000 + 0x3fff, tag[bank&3]); | |
50 | 50 | else |
51 | space | |
51 | space.nop_write(bank * 0x4000, bank * 0x4000 + 0x3fff); | |
52 | 52 | } |
53 | 53 | |
54 | 54 | static void update_ti85_memory (running_machine &machine) |
r17963 | r17964 | |
60 | 60 | static void update_ti83p_memory (running_machine &machine) |
61 | 61 | { |
62 | 62 | ti85_state *state = machine.driver_data<ti85_state>(); |
63 | address_space | |
63 | address_space &space = *state->m_maincpu->space(AS_PROGRAM); | |
64 | 64 | |
65 | 65 | if (state->m_ti8x_memory_page_1 & 0x40) |
66 | 66 | { |
r17963 | r17964 | |
84 | 84 | static void update_ti86_memory (running_machine &machine) |
85 | 85 | { |
86 | 86 | ti85_state *state = machine.driver_data<ti85_state>(); |
87 | address_space | |
87 | address_space &space = *state->m_maincpu->space(AS_PROGRAM); | |
88 | 88 | |
89 | 89 | if (state->m_ti8x_memory_page_1 & 0x40) |
90 | 90 | { |
r17963 | r17964 | |
112 | 112 | |
113 | 113 | void ti85_state::machine_start() |
114 | 114 | { |
115 | address_space | |
115 | address_space &space = *m_maincpu->space(AS_PROGRAM); | |
116 | 116 | m_bios = memregion("bios")->base(); |
117 | 117 | |
118 | 118 | m_timer_interrupt_mask = 0; |
r17963 | r17964 | |
133 | 133 | |
134 | 134 | machine().scheduler().timer_pulse(attotime::from_hz(200), FUNC(ti85_timer_callback)); |
135 | 135 | |
136 | space->unmap_write(0x0000, 0x3fff); | |
137 | space->unmap_write(0x4000, 0x7fff); | |
136 | space.unmap_write(0x0000, 0x3fff); | |
137 | space.unmap_write(0x4000, 0x7fff); | |
138 | 138 | membank("bank1")->set_base(m_bios); |
139 | 139 | membank("bank2")->set_base(m_bios + 0x04000); |
140 | 140 | } |
r17963 | r17964 | |
149 | 149 | |
150 | 150 | MACHINE_START_MEMBER(ti85_state,ti83p) |
151 | 151 | { |
152 | address_space | |
152 | address_space &space = *m_maincpu->space(AS_PROGRAM); | |
153 | 153 | m_bios = memregion("bios")->base(); |
154 | 154 | |
155 | 155 | m_timer_interrupt_mask = 0; |
r17963 | r17964 | |
171 | 171 | m_ti8x_ram = auto_alloc_array(machine(), UINT8, 32*1024); |
172 | 172 | memset(m_ti8x_ram, 0, sizeof(UINT8)*32*1024); |
173 | 173 | |
174 | space->unmap_write(0x0000, 0x3fff); | |
175 | space->unmap_write(0x4000, 0x7fff); | |
176 | space->unmap_write(0x8000, 0xbfff); | |
174 | space.unmap_write(0x0000, 0x3fff); | |
175 | space.unmap_write(0x4000, 0x7fff); | |
176 | space.unmap_write(0x8000, 0xbfff); | |
177 | 177 | |
178 | 178 | membank("bank1")->set_base(m_bios); |
179 | 179 | membank("bank2")->set_base(m_bios); |
r17963 | r17964 | |
187 | 187 | |
188 | 188 | MACHINE_START_MEMBER(ti85_state,ti86) |
189 | 189 | { |
190 | address_space | |
190 | address_space &space = *m_maincpu->space(AS_PROGRAM); | |
191 | 191 | m_bios = memregion("bios")->base(); |
192 | 192 | |
193 | 193 | m_timer_interrupt_mask = 0; |
r17963 | r17964 | |
209 | 209 | m_ti8x_ram = auto_alloc_array(machine(), UINT8, 128*1024); |
210 | 210 | memset(m_ti8x_ram, 0, sizeof(UINT8)*128*1024); |
211 | 211 | |
212 | space | |
212 | space.unmap_write(0x0000, 0x3fff); | |
213 | 213 | |
214 | 214 | membank("bank1")->set_base(m_bios); |
215 | 215 | membank("bank2")->set_base(m_bios + 0x04000); |
r17963 | r17964 | |
608 | 608 | static void ti85_setup_snapshot (running_machine &machine, UINT8 * data) |
609 | 609 | { |
610 | 610 | ti85_state *state = machine.driver_data<ti85_state>(); |
611 | address_space | |
611 | address_space &space = *state->m_maincpu->space(AS_PROGRAM); | |
612 | 612 | int i; |
613 | 613 | unsigned char lo,hi; |
614 | 614 | unsigned char * hdw = data + 0x8000 + 0x94; |
r17963 | r17964 | |
617 | 617 | |
618 | 618 | /* Memory dump */ |
619 | 619 | for (i = 0; i < 0x8000; i++) |
620 | space | |
620 | space.write_byte(i + 0x8000, data[i+0x94]); | |
621 | 621 | |
622 | 622 | state->m_keypad_mask = hdw[0x00]&0x7f; |
623 | 623 |
r17963 | r17964 | |
---|---|---|
155 | 155 | |
156 | 156 | DRIVER_INIT_MEMBER(galaxy_state,galaxy) |
157 | 157 | { |
158 | address_space *space = machine().device("maincpu")->memory().space(AS_PROGRAM); | |
159 | space->install_readwrite_bank( 0x2800, 0x2800 + machine().device<ram_device>(RAM_TAG)->size() - 1, "bank1"); | |
158 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
159 | space.install_readwrite_bank( 0x2800, 0x2800 + machine().device<ram_device>(RAM_TAG)->size() - 1, "bank1"); | |
160 | 160 | membank("bank1")->set_base(machine().device<ram_device>(RAM_TAG)->pointer()); |
161 | 161 | |
162 | 162 | if (machine().device<ram_device>(RAM_TAG)->size() < (6 + 48) * 1024) |
163 | 163 | { |
164 | space | |
164 | space.nop_readwrite( 0x2800 + machine().device<ram_device>(RAM_TAG)->size(), 0xffff); | |
165 | 165 | } |
166 | 166 | } |
167 | 167 | |
r17963 | r17964 | |
171 | 171 | |
172 | 172 | MACHINE_RESET_MEMBER(galaxy_state,galaxy) |
173 | 173 | { |
174 | address_space | |
174 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
175 | 175 | |
176 | 176 | /* ROM 2 enable/disable */ |
177 | 177 | if (machine().root_device().ioport("ROM2")->read()) { |
178 | space | |
178 | space.install_read_bank(0x1000, 0x1fff, "bank10"); | |
179 | 179 | } else { |
180 | space | |
180 | space.nop_read(0x1000, 0x1fff); | |
181 | 181 | } |
182 | space | |
182 | space.nop_write(0x1000, 0x1fff); | |
183 | 183 | |
184 | 184 | if (machine().root_device().ioport("ROM2")->read()) |
185 | 185 | membank("bank10")->set_base(machine().root_device().memregion("maincpu")->base() + 0x1000); |
r17963 | r17964 | |
196 | 196 | MACHINE_RESET_MEMBER(galaxy_state,galaxyp) |
197 | 197 | { |
198 | 198 | UINT8 *ROM = machine().root_device().memregion("maincpu")->base(); |
199 | address_space | |
199 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
200 | 200 | |
201 | 201 | machine().device("maincpu")->execute().set_irq_acknowledge_callback(galaxy_irq_callback); |
202 | 202 | |
r17963 | r17964 | |
205 | 205 | ROM[0x03fa] = 0x00; |
206 | 206 | ROM[0x03fb] = 0xe0; |
207 | 207 | |
208 | space->install_read_bank(0xe000, 0xefff, "bank11"); | |
209 | space->nop_write(0xe000, 0xefff); | |
208 | space.install_read_bank(0xe000, 0xefff, "bank11"); | |
209 | space.nop_write(0xe000, 0xefff); | |
210 | 210 | membank("bank11")->set_base(memregion("maincpu")->base() + 0xe000); |
211 | 211 | m_interrupts_enabled = TRUE; |
212 | 212 | } |
r17963 | r17964 | |
---|---|---|
31 | 31 | static void mwa_bank(running_machine &machine, int bank, int offs, int data); |
32 | 32 | |
33 | 33 | /* wrappers for bank #1 to #4 */ |
34 | static WRITE8_HANDLER ( mwa_bank1 ) { mwa_bank(space->machine(), 0,offset,data); } | |
35 | static WRITE8_HANDLER ( mwa_bank2 ) { mwa_bank(space->machine(), 1,offset,data); } | |
36 | static WRITE8_HANDLER ( mwa_bank3 ) { mwa_bank(space->machine(), 2,offset,data); } | |
37 | static WRITE8_HANDLER ( mwa_bank4 ) { mwa_bank(space->machine(), 3,offset,data); } | |
34 | static WRITE8_HANDLER ( mwa_bank1 ) { mwa_bank(space.machine(), 0,offset,data); } | |
35 | static WRITE8_HANDLER ( mwa_bank2 ) { mwa_bank(space.machine(), 1,offset,data); } | |
36 | static WRITE8_HANDLER ( mwa_bank3 ) { mwa_bank(space.machine(), 2,offset,data); } | |
37 | static WRITE8_HANDLER ( mwa_bank4 ) { mwa_bank(space.machine(), 3,offset,data); } | |
38 | 38 | |
39 | 39 | /* read from banked memory (handle memory mapped i/o) */ |
40 | 40 | static int mra_bank(running_machine &machine, int bank, int offs); |
41 | 41 | |
42 | 42 | /* wrappers for bank #1 to #4 */ |
43 | static READ8_HANDLER ( mra_bank1 ) { return mra_bank(space->machine(),0,offset); } | |
44 | static READ8_HANDLER ( mra_bank2 ) { return mra_bank(space->machine(),1,offset); } | |
45 | static READ8_HANDLER ( mra_bank3 ) { return mra_bank(space->machine(),2,offset); } | |
46 | static READ8_HANDLER ( mra_bank4 ) { return mra_bank(space->machine(),3,offset); } | |
43 | static READ8_HANDLER ( mra_bank1 ) { return mra_bank(space.machine(),0,offset); } | |
44 | static READ8_HANDLER ( mra_bank2 ) { return mra_bank(space.machine(),1,offset); } | |
45 | static READ8_HANDLER ( mra_bank3 ) { return mra_bank(space.machine(),2,offset); } | |
46 | static READ8_HANDLER ( mra_bank4 ) { return mra_bank(space.machine(),3,offset); } | |
47 | 47 | |
48 | 48 | /* read banked memory (handle memory mapped i/o) */ |
49 | 49 | static const struct { read8_space_func func; const char *name; } mra_bank_soft[4] = |
r17963 | r17964 | |
---|---|---|
1622 | 1622 | c->xmit_bytes = 0; // We don't have anything more to say |
1623 | 1623 | c->recv_bytes = 0; // No active commands |
1624 | 1624 | |
1625 | space | |
1625 | space.machine().scheduler().timer_set((attotime::from_usec(INTERBYTE_DELAY)), FUNC(corvus_hdc_callback), CALLBACK_HTC_MODE); | |
1626 | 1626 | |
1627 | 1627 | // c->status &= ~(CONTROLLER_DIRECTION | CONTROLLER_BUSY); // Put us in Idle, Host-to-Controller mode |
1628 | 1628 | } else { |
1629 | 1629 | // |
1630 | 1630 | // Not finished with this packet. Insert an interbyte delay and then let the host continue |
1631 | 1631 | // |
1632 | space | |
1632 | space.machine().scheduler().timer_set((attotime::from_usec(INTERBYTE_DELAY)), FUNC(corvus_hdc_callback), CALLBACK_SAME_MODE); | |
1633 | 1633 | } |
1634 | 1634 | |
1635 | 1635 | return result; |
r17963 | r17964 | |
1692 | 1692 | // to the user with us Ready for more data and in Host-to-Controller mode. |
1693 | 1693 | // |
1694 | 1694 | if(c->offset == c->recv_bytes) { // We've received enough data to process |
1695 | corvus_process_command_packet(space | |
1695 | corvus_process_command_packet(space.machine(), c->invalid_command_flag); | |
1696 | 1696 | } else { |
1697 | 1697 | // |
1698 | 1698 | // Reset the four-second timer since we received some data |
r17963 | r17964 | |
1703 | 1703 | // Make the controller busy for a few microseconds while the command is processed |
1704 | 1704 | // |
1705 | 1705 | c->status |= CONTROLLER_BUSY; |
1706 | space | |
1706 | space.machine().scheduler().timer_set((attotime::from_usec(INTERBYTE_DELAY)), FUNC(corvus_hdc_callback), CALLBACK_SAME_MODE); | |
1707 | 1707 | } |
1708 | 1708 | } |
r17963 | r17964 | |
---|---|---|
13 | 13 | #define DEBUG_ZX81_PORTS 1 |
14 | 14 | #define DEBUG_ZX81_VSYNC 1 |
15 | 15 | |
16 | #define LOG_ZX81_IOR(_comment) do { if (DEBUG_ZX81_PORTS) logerror("ZX81 IOR: %04x, Data: %02x, Scanline: %d (%s)\n", offset, data, space->machine().primary_screen->vpos(), _comment); } while (0) | |
17 | #define LOG_ZX81_IOW(_comment) do { if (DEBUG_ZX81_PORTS) logerror("ZX81 IOW: %04x, Data: %02x, Scanline: %d (%s)\n", offset, data, space->machine().primary_screen->vpos(), _comment); } while (0) | |
18 | #define LOG_ZX81_VSYNC do { if (DEBUG_ZX81_VSYNC) logerror("VSYNC starts in scanline: %d\n", space->machine().primary_screen->vpos()); } while (0) | |
16 | #define LOG_ZX81_IOR(_comment) do { if (DEBUG_ZX81_PORTS) logerror("ZX81 IOR: %04x, Data: %02x, Scanline: %d (%s)\n", offset, data, space.machine().primary_screen->vpos(), _comment); } while (0) | |
17 | #define LOG_ZX81_IOW(_comment) do { if (DEBUG_ZX81_PORTS) logerror("ZX81 IOW: %04x, Data: %02x, Scanline: %d (%s)\n", offset, data, space.machine().primary_screen->vpos(), _comment); } while (0) | |
18 | #define LOG_ZX81_VSYNC do { if (DEBUG_ZX81_VSYNC) logerror("VSYNC starts in scanline: %d\n", space.machine().primary_screen->vpos()); } while (0) | |
19 | 19 | |
20 | 20 | |
21 | 21 | WRITE8_MEMBER(zx_state::zx_ram_w) |
r17963 | r17964 | |
44 | 44 | |
45 | 45 | DRIVER_INIT_MEMBER(zx_state,zx) |
46 | 46 | { |
47 | address_space | |
47 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
48 | 48 | |
49 | space->install_read_bank(0x4000, 0x4000 + machine().device<ram_device>(RAM_TAG)->size() - 1, "bank1"); | |
50 | space->install_write_handler(0x4000, 0x4000 + machine().device<ram_device>(RAM_TAG)->size() - 1, write8_delegate(FUNC(zx_state::zx_ram_w),this)); | |
49 | space.install_read_bank(0x4000, 0x4000 + machine().device<ram_device>(RAM_TAG)->size() - 1, "bank1"); | |
50 | space.install_write_handler(0x4000, 0x4000 + machine().device<ram_device>(RAM_TAG)->size() - 1, write8_delegate(FUNC(zx_state::zx_ram_w),this)); | |
51 | 51 | membank("bank1")->set_base(memregion("maincpu")->base() + 0x4000); |
52 | 52 | } |
53 | 53 |
r17963 | r17964 | |
---|---|---|
212 | 212 | offs_t memory_size, void *memory_data, int is_rom, const char *bank) |
213 | 213 | { |
214 | 214 | mac_state *state = machine.driver_data<mac_state>(); |
215 | address_space | |
215 | address_space& space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
216 | 216 | offs_t memory_mask; |
217 | 217 | |
218 | 218 | memory_size = MIN(memory_size, (memory_end + 1 - memory_begin)); |
r17963 | r17964 | |
220 | 220 | |
221 | 221 | if (!is_rom) |
222 | 222 | { |
223 | space | |
223 | space.install_readwrite_bank(memory_begin, memory_end, memory_mask, 0, bank); | |
224 | 224 | } |
225 | 225 | else |
226 | 226 | { |
227 | space->unmap_write(memory_begin, memory_end, memory_mask, 0); | |
228 | space->install_read_bank(memory_begin, memory_end, memory_mask, 0, bank); | |
227 | space.unmap_write(memory_begin, memory_end, memory_mask, 0); | |
228 | space.install_read_bank(memory_begin, memory_end, memory_mask, 0, bank); | |
229 | 229 | } |
230 | 230 | |
231 | 231 | state->membank(bank)->set_base(memory_data); |
r17963 | r17964 | |
410 | 410 | } |
411 | 411 | else |
412 | 412 | { |
413 | address_space | |
413 | address_space& space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
414 | 414 | UINT32 onboard_amt, simm_amt, simm_size; |
415 | 415 | static const UINT32 simm_sizes[4] = { 0, 2*1024*1024, 4*1024*1024, 8*1024*1024 }; |
416 | 416 | |
417 | 417 | // force unmap of entire RAM region |
418 | space | |
418 | space.unmap_write(0, 0x9fffff, 0x9fffff, 0); | |
419 | 419 | |
420 | 420 | // LC and Classic II have 2 MB built-in, all other V8-style machines have 4 MB |
421 | 421 | // we reserve the first 2 or 4 MB of mess_ram for the onboard, |
r17963 | r17964 | |
501 | 501 | } |
502 | 502 | else if ((m_model == MODEL_MAC_PORTABLE) || (m_model == MODEL_MAC_PB100) || (m_model == MODEL_MAC_IIVX) || (m_model == MODEL_MAC_IIFX)) |
503 | 503 | { |
504 | address_space* space = machine().device("maincpu")->memory().space(AS_PROGRAM); | |
505 | space->unmap_write(0x000000, 0x9fffff, 0x9fffff, 0); | |
504 | address_space& space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
505 | space.unmap_write(0x000000, 0x9fffff, 0x9fffff, 0); | |
506 | 506 | mac_install_memory(machine(), 0x000000, memory_size-1, memory_size, memory_data, is_rom, "bank1"); |
507 | 507 | } |
508 | 508 | else if ((m_model == MODEL_MAC_PB140) || (m_model == MODEL_MAC_PB160) || ((m_model >= MODEL_MAC_PBDUO_210) && (m_model <= MODEL_MAC_PBDUO_270c))) |
509 | 509 | { |
510 | address_space* space = machine().device("maincpu")->memory().space(AS_PROGRAM); | |
511 | space->unmap_write(0x000000, 0xffffff, 0xffffff, 0); | |
510 | address_space& space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
511 | space.unmap_write(0x000000, 0xffffff, 0xffffff, 0); | |
512 | 512 | mac_install_memory(machine(), 0x000000, memory_size-1, memory_size, memory_data, is_rom, "bank1"); |
513 | 513 | } |
514 | 514 | else if ((m_model >= MODEL_MAC_II) && (m_model <= MODEL_MAC_SE30)) |
r17963 | r17964 | |
1049 | 1049 | { |
1050 | 1050 | int reg = (offset>>3) & 0xf; |
1051 | 1051 | |
1052 | // logerror("macplus_scsi_w: data %x offset %x mask %x (PC=%x)\n", data, offset, mem_mask, space | |
1052 | // logerror("macplus_scsi_w: data %x offset %x mask %x (PC=%x)\n", data, offset, mem_mask, space.device().safe_pc()); | |
1053 | 1053 | |
1054 | 1054 | if ((reg == 0) && (offset == 0x100)) |
1055 | 1055 | { |
r17963 | r17964 | |
1814 | 1814 | |
1815 | 1815 | if (m_model >= MODEL_MAC_POWERMAC_6100 && m_model <= MODEL_MAC_POWERMAC_8100) |
1816 | 1816 | { |
1817 | m_awacs->set_dma_base(m_maincpu->space(AS_PROGRAM), 0x10000, 0x12000); | |
1817 | m_awacs->set_dma_base(*m_maincpu->space(AS_PROGRAM), 0x10000, 0x12000); | |
1818 | 1818 | } |
1819 | 1819 | |
1820 | 1820 | // start 60.15 Hz timer for most systems |
r17963 | r17964 | |
---|---|---|
82 | 82 | return; |
83 | 83 | |
84 | 84 | /* otherwise, generate the IRQ */ |
85 | amiga_custom_w(machine.device("maincpu")->memory().space(AS_PROGRAM), REG_INTREQ, 0x8000 | INTENA_PORTS, 0xffff); | |
85 | amiga_custom_w(*machine.device("maincpu")->memory().space(AS_PROGRAM), REG_INTREQ, 0x8000 | INTENA_PORTS, 0xffff); | |
86 | 86 | } |
87 | 87 | |
88 | 88 | static TIMER_CALLBACK(dmac_dma_proc) |
r17963 | r17964 | |
131 | 131 | case 0x20: |
132 | 132 | { |
133 | 133 | UINT8 v = dmac_data.istr; |
134 | LOG(( "DMAC: PC=%08x - ISTR Read(%04x)\n", space | |
134 | LOG(( "DMAC: PC=%08x - ISTR Read(%04x)\n", space.device().safe_pc(), dmac_data.istr )); | |
135 | 135 | |
136 | 136 | dmac_data.istr &= ~0x0f; |
137 | 137 | return v; |
r17963 | r17964 | |
140 | 140 | |
141 | 141 | case 0x21: |
142 | 142 | { |
143 | LOG(( "DMAC: PC=%08x - CNTR Read(%04x)\n", space | |
143 | LOG(( "DMAC: PC=%08x - CNTR Read(%04x)\n", space.device().safe_pc(), dmac_data.cntr )); | |
144 | 144 | return dmac_data.cntr; |
145 | 145 | } |
146 | 146 | break; |
147 | 147 | |
148 | 148 | case 0x40: /* wtc hi */ |
149 | 149 | { |
150 | LOG(( "DMAC: PC=%08x - WTC HI Read\n", space | |
150 | LOG(( "DMAC: PC=%08x - WTC HI Read\n", space.device().safe_pc() )); | |
151 | 151 | return (dmac_data.wtc >> 16); |
152 | 152 | } |
153 | 153 | break; |
154 | 154 | |
155 | 155 | case 0x41: /* wtc lo */ |
156 | 156 | { |
157 | LOG(( "DMAC: PC=%08x - WTC LO Read\n", space | |
157 | LOG(( "DMAC: PC=%08x - WTC LO Read\n", space.device().safe_pc() )); | |
158 | 158 | return dmac_data.wtc; |
159 | 159 | } |
160 | 160 | break; |
161 | 161 | |
162 | 162 | case 0x42: /* acr hi */ |
163 | 163 | { |
164 | LOG(( "DMAC: PC=%08x - ACR HI Read\n", space | |
164 | LOG(( "DMAC: PC=%08x - ACR HI Read\n", space.device().safe_pc() )); | |
165 | 165 | return (dmac_data.acr >> 16); |
166 | 166 | } |
167 | 167 | break; |
168 | 168 | |
169 | 169 | case 0x43: /* acr lo */ |
170 | 170 | { |
171 | LOG(( "DMAC: PC=%08x - ACR LO Read\n", space | |
171 | LOG(( "DMAC: PC=%08x - ACR LO Read\n", space.device().safe_pc() )); | |
172 | 172 | return dmac_data.acr; |
173 | 173 | } |
174 | 174 | break; |
r17963 | r17964 | |
176 | 176 | case 0x48: /* wd33c93 SCSI expansion */ |
177 | 177 | case 0x49: |
178 | 178 | { |
179 | LOG(( "DMAC: PC=%08x - WD33C93 Read(%d)\n", space | |
179 | LOG(( "DMAC: PC=%08x - WD33C93 Read(%d)\n", space.device().safe_pc(), offset & 1 )); | |
180 | 180 | return 0x00; /* Not available without SCSI expansion */ |
181 | 181 | } |
182 | 182 | break; |
183 | 183 | |
184 | 184 | case 0x50: |
185 | 185 | { |
186 | LOG(( "DMAC: PC=%08x - CDROM RESP Read\n", space->device().safe_pc() )); | |
187 | return matsucd_response_r(space->machine()); | |
186 | LOG(( "DMAC: PC=%08x - CDROM RESP Read\n", space.device().safe_pc() )); | |
187 | return matsucd_response_r(space.machine()); | |
188 | 188 | } |
189 | 189 | break; |
190 | 190 | |
r17963 | r17964 | |
192 | 192 | case 0x52: |
193 | 193 | case 0x53: |
194 | 194 | { |
195 | LOG(( "DMAC: PC=%08x - XT IO Read(%d)\n", space | |
195 | LOG(( "DMAC: PC=%08x - XT IO Read(%d)\n", space.device().safe_pc(), (offset & 3)-1 )); | |
196 | 196 | return 0xff; |
197 | 197 | } |
198 | 198 | break; |
r17963 | r17964 | |
214 | 214 | case 0x66: |
215 | 215 | case 0x67: |
216 | 216 | { |
217 | device_t *tpi = space->machine().device("tpi6525"); | |
218 | LOG(( "DMAC: PC=%08x - TPI6525 Read(%d)\n", space->device().safe_pc(), (offset - 0x58) )); | |
219 | return tpi6525_r(tpi, *space, offset - 0x58); | |
217 | device_t *tpi = space.machine().device("tpi6525"); | |
218 | LOG(( "DMAC: PC=%08x - TPI6525 Read(%d)\n", space.device().safe_pc(), (offset - 0x58) )); | |
219 | return tpi6525_r(tpi, space, offset - 0x58); | |
220 | 220 | } |
221 | 221 | break; |
222 | 222 | |
223 | 223 | case 0x70: /* DMA start strobe */ |
224 | 224 | { |
225 | LOG(( "DMAC: PC=%08x - DMA Start Strobe\n", space | |
225 | LOG(( "DMAC: PC=%08x - DMA Start Strobe\n", space.device().safe_pc() )); | |
226 | 226 | dmac_data.dma_timer->adjust(attotime::from_msec( CD_SECTOR_TIME )); |
227 | 227 | } |
228 | 228 | break; |
229 | 229 | |
230 | 230 | case 0x71: /* DMA stop strobe */ |
231 | 231 | { |
232 | LOG(( "DMAC: PC=%08x - DMA Stop Strobe\n", space | |
232 | LOG(( "DMAC: PC=%08x - DMA Stop Strobe\n", space.device().safe_pc() )); | |
233 | 233 | dmac_data.dma_timer->reset( ); |
234 | 234 | } |
235 | 235 | break; |
236 | 236 | |
237 | 237 | case 0x72: /* Clear IRQ strobe */ |
238 | 238 | { |
239 | LOG(( "DMAC: PC=%08x - IRQ Clear Strobe\n", space | |
239 | LOG(( "DMAC: PC=%08x - IRQ Clear Strobe\n", space.device().safe_pc() )); | |
240 | 240 | dmac_data.istr &= ~ISTR_INT_P; |
241 | 241 | } |
242 | 242 | break; |
243 | 243 | |
244 | 244 | case 0x74: /* Flush strobe */ |
245 | 245 | { |
246 | LOG(( "DMAC: PC=%08x - Flush Strobe\n", space | |
246 | LOG(( "DMAC: PC=%08x - Flush Strobe\n", space.device().safe_pc() )); | |
247 | 247 | dmac_data.istr |= ISTR_FE_FLG; |
248 | 248 | } |
249 | 249 | break; |
250 | 250 | |
251 | 251 | default: |
252 | logerror( "DMAC-READ: PC=%08x, offset = %02x\n", space | |
252 | logerror( "DMAC-READ: PC=%08x, offset = %02x\n", space.device().safe_pc(), offset ); | |
253 | 253 | break; |
254 | 254 | } |
255 | 255 | |
r17963 | r17964 | |
264 | 264 | { |
265 | 265 | case 0x21: /* control write */ |
266 | 266 | { |
267 | LOG(( "DMAC: PC=%08x - CNTR Write(%04x)\n", space | |
267 | LOG(( "DMAC: PC=%08x - CNTR Write(%04x)\n", space.device().safe_pc(), data )); | |
268 | 268 | dmac_data.cntr = data; |
269 | check_interrupts(space | |
269 | check_interrupts(space.machine()); | |
270 | 270 | } |
271 | 271 | break; |
272 | 272 | |
273 | 273 | case 0x40: /* wtc hi */ |
274 | 274 | { |
275 | LOG(( "DMAC: PC=%08x - WTC HI Write - data = %04x\n", space | |
275 | LOG(( "DMAC: PC=%08x - WTC HI Write - data = %04x\n", space.device().safe_pc(), data )); | |
276 | 276 | dmac_data.wtc &= 0x0000ffff; |
277 | 277 | dmac_data.wtc |= ((UINT32)data) << 16; |
278 | 278 | } |
r17963 | r17964 | |
280 | 280 | |
281 | 281 | case 0x41: /* wtc lo */ |
282 | 282 | { |
283 | LOG(( "DMAC: PC=%08x - WTC LO Write - data = %04x\n", space | |
283 | LOG(( "DMAC: PC=%08x - WTC LO Write - data = %04x\n", space.device().safe_pc(), data )); | |
284 | 284 | dmac_data.wtc &= 0xffff0000; |
285 | 285 | dmac_data.wtc |= data; |
286 | 286 | } |
r17963 | r17964 | |
288 | 288 | |
289 | 289 | case 0x42: /* acr hi */ |
290 | 290 | { |
291 | LOG(( "DMAC: PC=%08x - ACR HI Write - data = %04x\n", space | |
291 | LOG(( "DMAC: PC=%08x - ACR HI Write - data = %04x\n", space.device().safe_pc(), data )); | |
292 | 292 | dmac_data.acr &= 0x0000ffff; |
293 | 293 | dmac_data.acr |= ((UINT32)data) << 16; |
294 | 294 | } |
r17963 | r17964 | |
296 | 296 | |
297 | 297 | case 0x43: /* acr lo */ |
298 | 298 | { |
299 | LOG(( "DMAC: PC=%08x - ACR LO Write - data = %04x\n", space | |
299 | LOG(( "DMAC: PC=%08x - ACR LO Write - data = %04x\n", space.device().safe_pc(), data )); | |
300 | 300 | dmac_data.acr &= 0xffff0000; |
301 | 301 | dmac_data.acr |= data; |
302 | 302 | } |
r17963 | r17964 | |
304 | 304 | |
305 | 305 | case 0x47: /* dawr */ |
306 | 306 | { |
307 | LOG(( "DMAC: PC=%08x - DAWR Write - data = %04x\n", space | |
307 | LOG(( "DMAC: PC=%08x - DAWR Write - data = %04x\n", space.device().safe_pc(), data )); | |
308 | 308 | dmac_data.dawr = data; |
309 | 309 | } |
310 | 310 | break; |
r17963 | r17964 | |
312 | 312 | case 0x48: /* wd33c93 SCSI expansion */ |
313 | 313 | case 0x49: |
314 | 314 | { |
315 | LOG(( "DMAC: PC=%08x - WD33C93 Write(%d) - data = %04x\n", space | |
315 | LOG(( "DMAC: PC=%08x - WD33C93 Write(%d) - data = %04x\n", space.device().safe_pc(), offset & 1, data )); | |
316 | 316 | /* Not available without SCSI expansion */ |
317 | 317 | } |
318 | 318 | break; |
319 | 319 | |
320 | 320 | case 0x50: |
321 | 321 | { |
322 | LOG(( "DMAC: PC=%08x - CDROM CMD Write - data = %04x\n", space->device().safe_pc(), data )); | |
323 | matsucd_command_w(space->machine(), data ); | |
322 | LOG(( "DMAC: PC=%08x - CDROM CMD Write - data = %04x\n", space.device().safe_pc(), data )); | |
323 | matsucd_command_w(space.machine(), data ); | |
324 | 324 | } |
325 | 325 | break; |
326 | 326 | |
r17963 | r17964 | |
341 | 341 | case 0x66: |
342 | 342 | case 0x67: |
343 | 343 | { |
344 | device_t *tpi = space->machine().device("tpi6525"); | |
345 | LOG(( "DMAC: PC=%08x - TPI6525 Write(%d) - data = %04x\n", space->device().safe_pc(), (offset - 0x58), data )); | |
346 | tpi6525_w(tpi, *space, offset - 0x58, data); | |
344 | device_t *tpi = space.machine().device("tpi6525"); | |
345 | LOG(( "DMAC: PC=%08x - TPI6525 Write(%d) - data = %04x\n", space.device().safe_pc(), (offset - 0x58), data )); | |
346 | tpi6525_w(tpi, space, offset - 0x58, data); | |
347 | 347 | } |
348 | 348 | break; |
349 | 349 | |
350 | 350 | case 0x70: /* DMA start strobe */ |
351 | 351 | { |
352 | LOG(( "DMAC: PC=%08x - DMA Start Strobe\n", space | |
352 | LOG(( "DMAC: PC=%08x - DMA Start Strobe\n", space.device().safe_pc() )); | |
353 | 353 | dmac_data.dma_timer->adjust(attotime::from_msec( CD_SECTOR_TIME )); |
354 | 354 | } |
355 | 355 | break; |
356 | 356 | |
357 | 357 | case 0x71: /* DMA stop strobe */ |
358 | 358 | { |
359 | LOG(( "DMAC: PC=%08x - DMA Stop Strobe\n", space | |
359 | LOG(( "DMAC: PC=%08x - DMA Stop Strobe\n", space.device().safe_pc() )); | |
360 | 360 | dmac_data.dma_timer->reset( ); |
361 | 361 | } |
362 | 362 | break; |
363 | 363 | |
364 | 364 | case 0x72: /* Clear IRQ strobe */ |
365 | 365 | { |
366 | LOG(( "DMAC: PC=%08x - IRQ Clear Strobe\n", space | |
366 | LOG(( "DMAC: PC=%08x - IRQ Clear Strobe\n", space.device().safe_pc() )); | |
367 | 367 | dmac_data.istr &= ~ISTR_INT_P; |
368 | 368 | } |
369 | 369 | break; |
370 | 370 | |
371 | 371 | case 0x74: /* Flush Strobe */ |
372 | 372 | { |
373 | LOG(( "DMAC: PC=%08x - Flush Strobe\n", space | |
373 | LOG(( "DMAC: PC=%08x - Flush Strobe\n", space.device().safe_pc() )); | |
374 | 374 | dmac_data.istr |= ISTR_FE_FLG; |
375 | 375 | } |
376 | 376 | break; |
377 | 377 | |
378 | 378 | default: |
379 | logerror( "DMAC-WRITE: PC=%08x, offset = %02x, data = %04x\n", space | |
379 | logerror( "DMAC-WRITE: PC=%08x, offset = %02x, data = %04x\n", space.device().safe_pc(), offset, data ); | |
380 | 380 | break; |
381 | 381 | } |
382 | 382 | } |
r17963 | r17964 | |
389 | 389 | |
390 | 390 | static void dmac_install(running_machine &machine, offs_t base) |
391 | 391 | { |
392 | address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); | |
393 | space->install_legacy_read_handler(base, base + 0xFFFF, FUNC(amiga_dmac_r)); | |
394 | space->install_legacy_write_handler(base, base + 0xFFFF, FUNC(amiga_dmac_w)); | |
392 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
393 | space.install_legacy_read_handler(base, base + 0xFFFF, FUNC(amiga_dmac_r)); | |
394 | space.install_legacy_write_handler(base, base + 0xFFFF, FUNC(amiga_dmac_w)); | |
395 | 395 | } |
396 | 396 | |
397 | 397 | static void dmac_uninstall(running_machine &machine, offs_t base) |
398 | 398 | { |
399 | address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); | |
400 | space->unmap_readwrite(base, base + 0xFFFF); | |
399 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
400 | space.unmap_readwrite(base, base + 0xFFFF); | |
401 | 401 | } |
402 | 402 | |
403 | 403 | static const amiga_autoconfig_device dmac_device = |
r17963 | r17964 | |
457 | 457 | |
458 | 458 | if ( (CUSTOM_REG(REG_INTREQ) & INTENA_PORTS) == 0 ) |
459 | 459 | { |
460 | amiga_custom_w(machine.device("maincpu")->memory().space(AS_PROGRAM), REG_INTREQ, 0x8000 | INTENA_PORTS, 0xffff); | |
460 | amiga_custom_w(*machine.device("maincpu")->memory().space(AS_PROGRAM), REG_INTREQ, 0x8000 | INTENA_PORTS, 0xffff); | |
461 | 461 | } |
462 | 462 | else |
463 | 463 | { |
r17963 | r17964 | |
474 | 474 | { |
475 | 475 | if ( (CUSTOM_REG(REG_INTREQ) & INTENA_PORTS) == 0 ) |
476 | 476 | { |
477 | amiga_custom_w(device->machine().device("maincpu")->memory().space(AS_PROGRAM), REG_INTREQ, 0x8000 | INTENA_PORTS, 0xffff); | |
477 | amiga_custom_w(*device->machine().device("maincpu")->memory().space(AS_PROGRAM), REG_INTREQ, 0x8000 | INTENA_PORTS, 0xffff); | |
478 | 478 | } |
479 | 479 | else |
480 | 480 | { |
r17963 | r17964 | |
---|---|---|
276 | 276 | { |
277 | 277 | int slot = ((offset >> 4) & 7) - 1; |
278 | 278 | if (m_expansion_slots[slot].reg_read) |
279 | return m_expansion_slots[slot].reg_read( | |
279 | return m_expansion_slots[slot].reg_read(space, offset & 0xf); | |
280 | 280 | } |
281 | 281 | break; |
282 | 282 | |
r17963 | r17964 | |
299 | 299 | int slot = ((offset >> 8) & 7) - 1; |
300 | 300 | LOG(("concept_io_r: Slot ROM memory accessed for slot %d at address 0x03%4.4x\n", slot, offset << 1)); |
301 | 301 | if (m_expansion_slots[slot].rom_read) |
302 | return m_expansion_slots[slot].rom_read( | |
302 | return m_expansion_slots[slot].rom_read(space, offset & 0xff); | |
303 | 303 | } |
304 | 304 | break; |
305 | 305 | |
r17963 | r17964 | |
418 | 418 | LOG(("concept_io_w: Slot I/O register written for slot %d at address 0x03%4.4x, data: 0x%4.4x\n", |
419 | 419 | slot, offset << 1, data)); |
420 | 420 | if (m_expansion_slots[slot].reg_write) |
421 | m_expansion_slots[slot].reg_write( | |
421 | m_expansion_slots[slot].reg_write(space, offset & 0xf, data); | |
422 | 422 | } |
423 | 423 | break; |
424 | 424 | |
r17963 | r17964 | |
441 | 441 | int slot = ((offset >> 8) & 7) - 1; |
442 | 442 | LOG(("concept_io_w: Slot ROM memory written to for slot %d at address 0x03%4.4x, data: 0x%4.4x\n", slot, offset << 1, data)); |
443 | 443 | if (m_expansion_slots[slot].rom_write) |
444 | m_expansion_slots[slot].rom_write( | |
444 | m_expansion_slots[slot].rom_write(space, offset & 0xff, data); | |
445 | 445 | } |
446 | 446 | break; |
447 | 447 | |
r17963 | r17964 | |
589 | 589 | |
590 | 590 | static READ8_HANDLER(concept_fdc_reg_r) |
591 | 591 | { |
592 | concept_state *state = space->machine().driver_data<concept_state>(); | |
593 | device_t *fdc = space->machine().device("wd179x"); | |
592 | concept_state *state = space.machine().driver_data<concept_state>(); | |
593 | device_t *fdc = space.machine().device("wd179x"); | |
594 | 594 | switch (offset) |
595 | 595 | { |
596 | 596 | case 0: |
r17963 | r17964 | |
599 | 599 | |
600 | 600 | case 8: |
601 | 601 | /* FDC STATUS REG */ |
602 | return wd17xx_status_r(fdc, | |
602 | return wd17xx_status_r(fdc, space, offset); | |
603 | 603 | |
604 | 604 | case 9: |
605 | 605 | /* FDC TRACK REG */ |
606 | return wd17xx_track_r(fdc, | |
606 | return wd17xx_track_r(fdc, space, offset); | |
607 | 607 | |
608 | 608 | case 10: |
609 | 609 | /* FDC SECTOR REG */ |
610 | return wd17xx_sector_r(fdc, | |
610 | return wd17xx_sector_r(fdc, space, offset); | |
611 | 611 | |
612 | 612 | case 11: |
613 | 613 | /* FDC DATA REG */ |
614 | return wd17xx_data_r(fdc, | |
614 | return wd17xx_data_r(fdc, space, offset); | |
615 | 615 | } |
616 | 616 | |
617 | 617 | return 0; |
r17963 | r17964 | |
619 | 619 | |
620 | 620 | static WRITE8_HANDLER(concept_fdc_reg_w) |
621 | 621 | { |
622 | concept_state *state = space | |
622 | concept_state *state = space.machine().driver_data<concept_state>(); | |
623 | 623 | int current_drive; |
624 | device_t *fdc = space | |
624 | device_t *fdc = space.machine().device("wd179x"); | |
625 | 625 | switch (offset) |
626 | 626 | { |
627 | 627 | case 0: |
r17963 | r17964 | |
635 | 635 | // floppy_drive_set_motor_state(floppy_get_device(machine, current_drive), (data & LC_MOTOROF_mask) == 0 ? 1 : 0); |
636 | 636 | /*flp_8in = (data & LC_FLP8IN_mask) != 0;*/ |
637 | 637 | wd17xx_dden_w(fdc, BIT(data, 7)); |
638 | floppy_drive_set_ready_state(floppy_get_device(space | |
638 | floppy_drive_set_ready_state(floppy_get_device(space.machine(), current_drive), 1, 0); | |
639 | 639 | break; |
640 | 640 | |
641 | 641 | case 8: |
642 | 642 | /* FDC COMMAMD REG */ |
643 | wd17xx_command_w(fdc, | |
643 | wd17xx_command_w(fdc, space, offset, data); | |
644 | 644 | break; |
645 | 645 | |
646 | 646 | case 9: |
647 | 647 | /* FDC TRACK REG */ |
648 | wd17xx_track_w(fdc, | |
648 | wd17xx_track_w(fdc, space, offset, data); | |
649 | 649 | break; |
650 | 650 | |
651 | 651 | case 10: |
652 | 652 | /* FDC SECTOR REG */ |
653 | wd17xx_sector_w(fdc, | |
653 | wd17xx_sector_w(fdc, space, offset, data); | |
654 | 654 | break; |
655 | 655 | |
656 | 656 | case 11: |
657 | 657 | /* FDC DATA REG */ |
658 | wd17xx_data_w(fdc, | |
658 | wd17xx_data_w(fdc, space, offset, data); | |
659 | 659 | break; |
660 | 660 | } |
661 | 661 | } |
r17963 | r17964 | |
---|---|---|
196 | 196 | |
197 | 197 | WRITE8_HANDLER( mboard_write_board_8 ) |
198 | 198 | { |
199 | write_board(space | |
199 | write_board(space.machine(),data); | |
200 | 200 | logerror("Write Board Port Data = %02x\n",data); |
201 | 201 | } |
202 | 202 | |
203 | 203 | WRITE16_HANDLER( mboard_write_board_16 ) |
204 | 204 | { |
205 | if (data & 0xff) write_board(space | |
205 | if (data & 0xff) write_board(space.machine(),data); | |
206 | 206 | logerror("write board 16 %08x\n",data); |
207 | write_board(space | |
207 | write_board(space.machine(),data>>8); | |
208 | 208 | } |
209 | 209 | |
210 | 210 | WRITE32_HANDLER( mboard_write_board_32 ) |
r17963 | r17964 | |
212 | 212 | // data |= data << 24; |
213 | 213 | //printf("write board %08x %08x\n",offset,data); |
214 | 214 | logerror("write board 32 o: %08x d: %08x\n",offset,data); |
215 | if (offset) write_board(space->machine(),data); | |
216 | else write_board(space->machine(),data>>24); | |
215 | if (offset) write_board(space.machine(),data); | |
216 | else write_board(space.machine(),data>>24); | |
217 | 217 | } |
218 | 218 | |
219 | 219 | WRITE8_HANDLER( mboard_write_LED_8 ) |
220 | 220 | { |
221 | 221 | write_LED(data); |
222 | space | |
222 | space.device().execute().spin_until_time(attotime::from_usec(7)); | |
223 | 223 | } |
224 | 224 | |
225 | 225 | WRITE16_HANDLER( mboard_write_LED_16 ) |
226 | 226 | { |
227 | 227 | write_LED(data >> 8); |
228 | space | |
228 | space.device().execute().spin_until_time(attotime::from_usec(9)); | |
229 | 229 | } |
230 | 230 | |
231 | 231 | WRITE32_HANDLER( mboard_write_LED_32 ) |
r17963 | r17964 | |
235 | 235 | if (offset) write_LED(data); |
236 | 236 | else write_LED(data >> 24); |
237 | 237 | logerror("write LED 32 o: %08x d: %08x\n",offset,data); |
238 | // space | |
238 | // space.device().execute().spin_until_time(ATTOTIME_IN_USEC(20)); | |
239 | 239 | } |
240 | 240 | |
241 | 241 |
r17963 | r17964 | |
---|---|---|
627 | 627 | // { |
628 | 628 | // logerror("mz800_display_mode_w: switching mode to %s\n", (BIT(data, 3) ? "mz700" : "mz800")); |
629 | 629 | // m_mz700_mode = BIT(data, 3); |
630 | // mz700_bank_4_w(machine().device("maincpu")->memory().&space(AS_PROGRAM), 0, 0); | |
630 | // mz700_bank_4_w(*machine().device("maincpu")->memory().&space(AS_PROGRAM), 0, 0); | |
631 | 631 | // } |
632 | 632 | } |
633 | 633 |
r17963 | r17964 | |
---|---|---|
237 | 237 | { |
238 | 238 | lisa_state *state = machine.driver_data<lisa_state>(); |
239 | 239 | via6522_device *via_0 = machine.device<via6522_device>("via6522_0"); |
240 | address_space | |
240 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
241 | 241 | |
242 | 242 | if ((! state->m_hold_COPS_data) && state->m_fifo_size && (! state->m_COPS_Ready)) |
243 | 243 | { |
244 | 244 | // printf("COPsim: sending %02x to VIA\n", state->m_fifo_data[state->m_fifo_head]); |
245 | 245 | |
246 | via_0->write_porta( | |
246 | via_0->write_porta(space, 0, state->m_fifo_data[state->m_fifo_head]); /* output data */ | |
247 | 247 | if (state->m_fifo_head == state->m_mouse_data_offset) |
248 | 248 | state->m_mouse_data_offset = -1; /* we just phased out the mouse data in buffer */ |
249 | 249 | state->m_fifo_head = (state->m_fifo_head+1) & 0x7; |
r17963 | r17964 | |
427 | 427 | lisa_state *state = machine.driver_data<lisa_state>(); |
428 | 428 | int command; |
429 | 429 | via6522_device *via_0 = machine.device<via6522_device>("via6522_0"); |
430 | address_space | |
430 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
431 | 431 | |
432 | 432 | state->m_COPS_Ready = 0; |
433 | 433 | |
r17963 | r17964 | |
435 | 435 | COPS_send_data_if_possible(machine); |
436 | 436 | |
437 | 437 | /* some pull-ups allow the COPS to read 1s when the VIA port is not set as output */ |
438 | command = (state->m_COPS_command | (~ via_0->read( | |
438 | command = (state->m_COPS_command | (~ via_0->read(space, VIA_DDRA))) & 0xff; | |
439 | 439 | |
440 | 440 | // printf("Dropping Ready, command = %02x\n", command); |
441 | 441 |
r17963 | r17964 | |
---|---|---|
1655 | 1655 | |
1656 | 1656 | static READ8_HANDLER(lynx_uart_r) |
1657 | 1657 | { |
1658 | lynx_state *state = space | |
1658 | lynx_state *state = space.machine().driver_data<lynx_state>(); | |
1659 | 1659 | UINT8 value = 0x00; |
1660 | 1660 | switch (offset) |
1661 | 1661 | { |
r17963 | r17964 | |
1769 | 1769 | |
1770 | 1770 | case 0x8c: |
1771 | 1771 | case 0x8d: |
1772 | value = lynx_uart_r( | |
1772 | value = lynx_uart_r(space, offset); | |
1773 | 1773 | break; |
1774 | 1774 | |
1775 | 1775 | default: |
r17963 | r17964 | |
---|---|---|
19 | 19 | #include "machine/ram.h" |
20 | 20 | |
21 | 21 | #define AYWriteReg(chip,port,value) \ |
22 | ay8910_address_w(ay8910, *space, 0,port); \ | |
23 | ay8910_data_w(ay8910, *space, 0,value) | |
22 | ay8910_address_w(ay8910, space, 0,port); \ | |
23 | ay8910_data_w(ay8910, space, 0,value) | |
24 | 24 | |
25 | 25 | #define TAPE_HEADER "Colour Genie - Virtual Tape File" |
26 | 26 | |
r17963 | r17964 | |
47 | 47 | |
48 | 48 | void cgenie_state::machine_reset() |
49 | 49 | { |
50 | address_space | |
50 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
51 | 51 | device_t *ay8910 = machine().device("ay8910"); |
52 | 52 | UINT8 *ROM = memregion("maincpu")->base(); |
53 | 53 | |
r17963 | r17964 | |
84 | 84 | { |
85 | 85 | if ( machine().root_device().ioport("DSW0")->read() & 0x80 ) |
86 | 86 | { |
87 | space->install_read_bank(0xc000, 0xdfff, "bank10"); | |
88 | space->nop_write(0xc000, 0xdfff); | |
87 | space.install_read_bank(0xc000, 0xdfff, "bank10"); | |
88 | space.nop_write(0xc000, 0xdfff); | |
89 | 89 | membank("bank10")->set_base(&ROM[0x0c000]); |
90 | 90 | logerror("cgenie DOS enabled\n"); |
91 | 91 | memcpy(&ROM[0x0c000],&ROM[0x10000], 0x2000); |
92 | 92 | } |
93 | 93 | else |
94 | 94 | { |
95 | space | |
95 | space.nop_readwrite(0xc000, 0xdfff); | |
96 | 96 | logerror("cgenie DOS disabled (no floppy image given)\n"); |
97 | 97 | } |
98 | 98 | } |
99 | 99 | else |
100 | 100 | { |
101 | space | |
101 | space.nop_readwrite(0xc000, 0xdfff); | |
102 | 102 | logerror("cgenie DOS disabled\n"); |
103 | 103 | memset(&machine().root_device().memregion("maincpu")->base()[0x0c000], 0x00, 0x2000); |
104 | 104 | } |
r17963 | r17964 | |
106 | 106 | /* copy EXT ROM, if enabled or wipe out that memory area */ |
107 | 107 | if( machine().root_device().ioport("DSW0")->read() & 0x20 ) |
108 | 108 | { |
109 | space | |
109 | space.install_rom(0xe000, 0xefff, 0); // mess 0135u3 need to check | |
110 | 110 | logerror("cgenie EXT enabled\n"); |
111 | 111 | memcpy(&machine().root_device().memregion("maincpu")->base()[0x0e000], |
112 | 112 | &machine().root_device().memregion("maincpu")->base()[0x12000], 0x1000); |
113 | 113 | } |
114 | 114 | else |
115 | 115 | { |
116 | space | |
116 | space.nop_readwrite(0xe000, 0xefff); | |
117 | 117 | logerror("cgenie EXT disabled\n"); |
118 | 118 | memset(&machine().root_device().memregion("maincpu")->base()[0x0e000], 0x00, 0x1000); |
119 | 119 | } |
r17963 | r17964 | |
124 | 124 | |
125 | 125 | void cgenie_state::machine_start() |
126 | 126 | { |
127 | address_space | |
127 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
128 | 128 | UINT8 *gfx = memregion("gfx2")->base(); |
129 | 129 | int i; |
130 | 130 | |
r17963 | r17964 | |
147 | 147 | memset(gfx + i * 8, i, 8); |
148 | 148 | |
149 | 149 | /* set up RAM */ |
150 | space->install_read_bank(0x4000, 0x4000 + machine().device<ram_device>(RAM_TAG)->size() - 1, "bank1"); | |
151 | space->install_legacy_write_handler(0x4000, 0x4000 + machine().device<ram_device>(RAM_TAG)->size() - 1, FUNC(cgenie_videoram_w)); | |
150 | space.install_read_bank(0x4000, 0x4000 + machine().device<ram_device>(RAM_TAG)->size() - 1, "bank1"); | |
151 | space.install_legacy_write_handler(0x4000, 0x4000 + machine().device<ram_device>(RAM_TAG)->size() - 1, FUNC(cgenie_videoram_w)); | |
152 | 152 | m_videoram = machine().device<ram_device>(RAM_TAG)->pointer(); |
153 | 153 | membank("bank1")->set_base(machine().device<ram_device>(RAM_TAG)->pointer()); |
154 | 154 | machine().scheduler().timer_pulse(attotime::from_hz(11025), FUNC(handle_cassette_input)); |
r17963 | r17964 | |
173 | 173 | |
174 | 174 | WRITE8_HANDLER( cgenie_port_ff_w ) |
175 | 175 | { |
176 | cgenie_state *state = space | |
176 | cgenie_state *state = space.machine().driver_data<cgenie_state>(); | |
177 | 177 | int port_ff_changed = state->m_port_ff ^ data; |
178 | 178 | |
179 | space | |
179 | space.machine().device<cassette_image_device>(CASSETTE_TAG)->output(data & 0x01 ? -1.0 : 1.0 ); | |
180 | 180 | |
181 | 181 | /* background bits changed ? */ |
182 | 182 | if( port_ff_changed & FF_BGD ) |
r17963 | r17964 | |
224 | 224 | b = 15; |
225 | 225 | } |
226 | 226 | } |
227 | palette_set_color_rgb(space | |
227 | palette_set_color_rgb(space.machine(), 0, r, g, b); | |
228 | 228 | } |
229 | 229 | |
230 | 230 | /* character mode changed ? */ |
r17963 | r17964 | |
237 | 237 | /* graphics mode changed ? */ |
238 | 238 | if( port_ff_changed & FF_FGR ) |
239 | 239 | { |
240 | cgenie_mode_select(space | |
240 | cgenie_mode_select(space.machine(), data & FF_FGR); | |
241 | 241 | } |
242 | 242 | |
243 | 243 | state->m_port_ff = data; |
r17963 | r17964 | |
246 | 246 | |
247 | 247 | READ8_HANDLER( cgenie_port_ff_r ) |
248 | 248 | { |
249 | cgenie_state *state = space | |
249 | cgenie_state *state = space.machine().driver_data<cgenie_state>(); | |
250 | 250 | UINT8 data = state->m_port_ff & ~0x01; |
251 | 251 | |
252 | 252 | data |= state->m_cass_bit; |
r17963 | r17964 | |
268 | 268 | |
269 | 269 | READ8_HANDLER( cgenie_psg_port_a_r ) |
270 | 270 | { |
271 | cgenie_state *state = space | |
271 | cgenie_state *state = space.machine().driver_data<cgenie_state>(); | |
272 | 272 | return state->m_psg_a_inp; |
273 | 273 | } |
274 | 274 | |
275 | 275 | READ8_HANDLER( cgenie_psg_port_b_r ) |
276 | 276 | { |
277 | cgenie_state *state = space | |
277 | cgenie_state *state = space.machine().driver_data<cgenie_state>(); | |
278 | 278 | if( state->m_psg_a_out < 0xd0 ) |
279 | 279 | { |
280 | 280 | /* comparator value */ |
281 | 281 | state->m_psg_b_inp = 0x00; |
282 | 282 | |
283 | if( space | |
283 | if( space.machine().root_device().ioport("JOY0")->read() > state->m_psg_a_out ) | |
284 | 284 | state->m_psg_b_inp |= 0x80; |
285 | 285 | |
286 | if( space | |
286 | if( space.machine().root_device().ioport("JOY1")->read() > state->m_psg_a_out ) | |
287 | 287 | state->m_psg_b_inp |= 0x40; |
288 | 288 | |
289 | if( space | |
289 | if( space.machine().root_device().ioport("JOY2")->read() > state->m_psg_a_out ) | |
290 | 290 | state->m_psg_b_inp |= 0x20; |
291 | 291 | |
292 | 292 | if( state->ioport("JOY3")->read() > state->m_psg_a_out ) |
r17963 | r17964 | |
298 | 298 | state->m_psg_b_inp = 0xFF; |
299 | 299 | |
300 | 300 | if( !(state->m_psg_a_out & 0x01) ) |
301 | state->m_psg_b_inp &= ~space | |
301 | state->m_psg_b_inp &= ~space.machine().root_device().ioport("KP0")->read(); | |
302 | 302 | |
303 | 303 | if( !(state->m_psg_a_out & 0x02) ) |
304 | state->m_psg_b_inp &= ~space | |
304 | state->m_psg_b_inp &= ~space.machine().root_device().ioport("KP1")->read(); | |
305 | 305 | |
306 | 306 | if( !(state->m_psg_a_out & 0x04) ) |
307 | state->m_psg_b_inp &= ~space | |
307 | state->m_psg_b_inp &= ~space.machine().root_device().ioport("KP2")->read(); | |
308 | 308 | |
309 | 309 | if( !(state->m_psg_a_out & 0x08) ) |
310 | state->m_psg_b_inp &= ~space | |
310 | state->m_psg_b_inp &= ~space.machine().root_device().ioport("KP3")->read(); | |
311 | 311 | |
312 | 312 | if( !(state->m_psg_a_out & 0x10) ) |
313 | state->m_psg_b_inp &= ~space | |
313 | state->m_psg_b_inp &= ~space.machine().root_device().ioport("KP4")->read(); | |
314 | 314 | |
315 | 315 | if( !(state->m_psg_a_out & 0x20) ) |
316 | state->m_psg_b_inp &= ~space | |
316 | state->m_psg_b_inp &= ~space.machine().root_device().ioport("KP5")->read(); | |
317 | 317 | } |
318 | 318 | return state->m_psg_b_inp; |
319 | 319 | } |
320 | 320 | |
321 | 321 | WRITE8_HANDLER( cgenie_psg_port_a_w ) |
322 | 322 | { |
323 | cgenie_state *state = space | |
323 | cgenie_state *state = space.machine().driver_data<cgenie_state>(); | |
324 | 324 | state->m_psg_a_out = data; |
325 | 325 | } |
326 | 326 | |
327 | 327 | WRITE8_HANDLER( cgenie_psg_port_b_w ) |
328 | 328 | { |
329 | cgenie_state *state = space | |
329 | cgenie_state *state = space.machine().driver_data<cgenie_state>(); | |
330 | 330 | state->m_psg_b_out = data; |
331 | 331 | } |
332 | 332 | |
333 | 333 | READ8_HANDLER( cgenie_status_r ) |
334 | 334 | { |
335 | device_t *fdc = space | |
335 | device_t *fdc = space.machine().device("wd179x"); | |
336 | 336 | /* If the floppy isn't emulated, return 0 */ |
337 | if( (space | |
337 | if( (space.machine().root_device().ioport("DSW0")->read() & 0x80) == 0 ) | |
338 | 338 | return 0; |
339 | return wd17xx_status_r(fdc, | |
339 | return wd17xx_status_r(fdc, space, offset); | |
340 | 340 | } |
341 | 341 | |
342 | 342 | READ8_HANDLER( cgenie_track_r ) |
343 | 343 | { |
344 | device_t *fdc = space | |
344 | device_t *fdc = space.machine().device("wd179x"); | |
345 | 345 | /* If the floppy isn't emulated, return 0xff */ |
346 | if( (space | |
346 | if( (space.machine().root_device().ioport("DSW0")->read() & 0x80) == 0 ) | |
347 | 347 | return 0xff; |
348 | return wd17xx_track_r(fdc, | |
348 | return wd17xx_track_r(fdc, space, offset); | |
349 | 349 | } |
350 | 350 | |
351 | 351 | READ8_HANDLER( cgenie_sector_r ) |
352 | 352 | { |
353 | device_t *fdc = space | |
353 | device_t *fdc = space.machine().device("wd179x"); | |
354 | 354 | /* If the floppy isn't emulated, return 0xff */ |
355 | if( (space | |
355 | if( (space.machine().root_device().ioport("DSW0")->read() & 0x80) == 0 ) | |
356 | 356 | return 0xff; |
357 | return wd17xx_sector_r(fdc, | |
357 | return wd17xx_sector_r(fdc, space, offset); | |
358 | 358 | } |
359 | 359 | |
360 | 360 | READ8_HANDLER(cgenie_data_r ) |
361 | 361 | { |
362 | device_t *fdc = space | |
362 | device_t *fdc = space.machine().device("wd179x"); | |
363 | 363 | /* If the floppy isn't emulated, return 0xff */ |
364 | if( (space | |
364 | if( (space.machine().root_device().ioport("DSW0")->read() & 0x80) == 0 ) | |
365 | 365 | return 0xff; |
366 | return wd17xx_data_r(fdc, | |
366 | return wd17xx_data_r(fdc, space, offset); | |
367 | 367 | } |
368 | 368 | |
369 | 369 | WRITE8_HANDLER( cgenie_command_w ) |
370 | 370 | { |
371 | device_t *fdc = space | |
371 | device_t *fdc = space.machine().device("wd179x"); | |
372 | 372 | /* If the floppy isn't emulated, return immediately */ |
373 | if( (space | |
373 | if( (space.machine().root_device().ioport("DSW0")->read() & 0x80) == 0 ) | |
374 | 374 | return; |
375 | wd17xx_command_w(fdc, | |
375 | wd17xx_command_w(fdc, space, offset, data); | |
376 | 376 | } |
377 | 377 | |
378 | 378 | WRITE8_HANDLER( cgenie_track_w ) |
379 | 379 | { |
380 | device_t *fdc = space | |
380 | device_t *fdc = space.machine().device("wd179x"); | |
381 | 381 | /* If the floppy isn't emulated, ignore the write */ |
382 | if( (space | |
382 | if( (space.machine().root_device().ioport("DSW0")->read() & 0x80) == 0 ) | |
383 | 383 | return; |
384 | wd17xx_track_w(fdc, | |
384 | wd17xx_track_w(fdc, space, offset, data); | |
385 | 385 | } |
386 | 386 | |
387 | 387 | WRITE8_HANDLER( cgenie_sector_w ) |
388 | 388 | { |
389 | device_t *fdc = space | |
389 | device_t *fdc = space.machine().device("wd179x"); | |
390 | 390 | /* If the floppy isn't emulated, ignore the write */ |
391 | if( (space | |
391 | if( (space.machine().root_device().ioport("DSW0")->read() & 0x80) == 0 ) | |
392 | 392 | return; |
393 | wd17xx_sector_w(fdc, | |
393 | wd17xx_sector_w(fdc, space, offset, data); | |
394 | 394 | } |
395 | 395 | |
396 | 396 | WRITE8_HANDLER( cgenie_data_w ) |
397 | 397 | { |
398 | device_t *fdc = space | |
398 | device_t *fdc = space.machine().device("wd179x"); | |
399 | 399 | /* If the floppy isn't emulated, ignore the write */ |
400 | if( (space | |
400 | if( (space.machine().root_device().ioport("DSW0")->read() & 0x80) == 0 ) | |
401 | 401 | return; |
402 | wd17xx_data_w(fdc, | |
402 | wd17xx_data_w(fdc, space, offset, data); | |
403 | 403 | } |
404 | 404 | |
405 | 405 | READ8_HANDLER( cgenie_irq_status_r ) |
406 | 406 | { |
407 | cgenie_state *state = space | |
407 | cgenie_state *state = space.machine().driver_data<cgenie_state>(); | |
408 | 408 | int result = state->m_irq_status; |
409 | 409 | |
410 | 410 | state->m_irq_status &= ~(IRQ_TIMER | IRQ_FDC); |
r17963 | r17964 | |
452 | 452 | |
453 | 453 | WRITE8_HANDLER( cgenie_motor_w ) |
454 | 454 | { |
455 | cgenie_state *state = space->machine().driver_data<cgenie_state>(); | |
456 | device_t *fdc = space->machine().device("wd179x"); | |
455 | cgenie_state *state = space.machine().driver_data<cgenie_state>(); | |
456 | device_t *fdc = space.machine().device("wd179x"); | |
457 | 457 | UINT8 drive = 255; |
458 | 458 | |
459 | 459 | logerror("cgenie motor_w $%02X\n", data); |
r17963 | r17964 | |
488 | 488 | int result = 0; |
489 | 489 | |
490 | 490 | if( offset & 0x01 ) |
491 | result |= space | |
491 | result |= space.machine().root_device().ioport("ROW0")->read(); | |
492 | 492 | |
493 | 493 | if( offset & 0x02 ) |
494 | result |= space | |
494 | result |= space.machine().root_device().ioport("ROW1")->read(); | |
495 | 495 | |
496 | 496 | if( offset & 0x04 ) |
497 | result |= space | |
497 | result |= space.machine().root_device().ioport("ROW2")->read(); | |
498 | 498 | |
499 | 499 | if( offset & 0x08 ) |
500 | result |= space | |
500 | result |= space.machine().root_device().ioport("ROW3")->read(); | |
501 | 501 | |
502 | 502 | if( offset & 0x10 ) |
503 | result |= space | |
503 | result |= space.machine().root_device().ioport("ROW4")->read(); | |
504 | 504 | |
505 | 505 | if( offset & 0x20 ) |
506 | result |= space | |
506 | result |= space.machine().root_device().ioport("ROW5")->read(); | |
507 | 507 | |
508 | 508 | if( offset & 0x40 ) |
509 | result |= space | |
509 | result |= space.machine().root_device().ioport("ROW6")->read(); | |
510 | 510 | |
511 | 511 | if( offset & 0x80 ) |
512 | result |= space | |
512 | result |= space.machine().root_device().ioport("ROW7")->read(); | |
513 | 513 | |
514 | 514 | return result; |
515 | 515 | } |
r17963 | r17964 | |
527 | 527 | |
528 | 528 | WRITE8_HANDLER( cgenie_videoram_w ) |
529 | 529 | { |
530 | cgenie_state *state = space | |
530 | cgenie_state *state = space.machine().driver_data<cgenie_state>(); | |
531 | 531 | UINT8 *videoram = state->m_videoram; |
532 | 532 | /* write to video RAM */ |
533 | 533 | if( data == videoram[offset] ) |
r17963 | r17964 | |
537 | 537 | |
538 | 538 | READ8_HANDLER( cgenie_colorram_r ) |
539 | 539 | { |
540 | cgenie_state *state = space | |
540 | cgenie_state *state = space.machine().driver_data<cgenie_state>(); | |
541 | 541 | return state->m_colorram[offset] | 0xf0; |
542 | 542 | } |
543 | 543 | |
544 | 544 | WRITE8_HANDLER( cgenie_colorram_w ) |
545 | 545 | { |
546 | cgenie_state *state = space | |
546 | cgenie_state *state = space.machine().driver_data<cgenie_state>(); | |
547 | 547 | /* only bits 0 to 3 */ |
548 | 548 | data &= 15; |
549 | 549 | /* nothing changed ? */ |
r17963 | r17964 | |
553 | 553 | /* set new value */ |
554 | 554 | state->m_colorram[offset] = data; |
555 | 555 | /* make offset relative to video frame buffer offset */ |
556 | offset = (offset + (cgenie_get_register(space | |
556 | offset = (offset + (cgenie_get_register(space.machine(), 12) << 8) + cgenie_get_register(space.machine(), 13)) & 0x3ff; | |
557 | 557 | } |
558 | 558 | |
559 | 559 | READ8_HANDLER( cgenie_fontram_r ) |
560 | 560 | { |
561 | cgenie_state *state = space | |
561 | cgenie_state *state = space.machine().driver_data<cgenie_state>(); | |
562 | 562 | return state->m_fontram[offset]; |
563 | 563 | } |
564 | 564 | |
565 | 565 | WRITE8_HANDLER( cgenie_fontram_w ) |
566 | 566 | { |
567 | cgenie_state *state = space | |
567 | cgenie_state *state = space.machine().driver_data<cgenie_state>(); | |
568 | 568 | UINT8 *dp; |
569 | 569 | |
570 | 570 | if( data == state->m_fontram[offset] ) |
r17963 | r17964 | |
574 | 574 | state->m_fontram[offset] = data; |
575 | 575 | |
576 | 576 | /* convert eight pixels */ |
577 | dp = const_cast<UINT8 *>(space | |
577 | dp = const_cast<UINT8 *>(space.machine().gfx[0]->get_data(256 + offset/8) + (offset % 8) * space.machine().gfx[0]->width()); | |
578 | 578 | dp[0] = (data & 0x80) ? 1 : 0; |
579 | 579 | dp[1] = (data & 0x40) ? 1 : 0; |
580 | 580 | dp[2] = (data & 0x20) ? 1 : 0; |
r17963 | r17964 | |
599 | 599 | state->m_tv_mode = state->ioport("DSW0")->read() & 0x10; |
600 | 600 | /* force setting of background color */ |
601 | 601 | state->m_port_ff ^= FF_BGD0; |
602 | cgenie_port_ff_w(device->machine().device("maincpu")->memory().space(AS_PROGRAM), 0, state->m_port_ff ^ FF_BGD0); | |
602 | cgenie_port_ff_w(*device->machine().device("maincpu")->memory().space(AS_PROGRAM), 0, state->m_port_ff ^ FF_BGD0); | |
603 | 603 | } |
604 | 604 | } |
605 | 605 |
r17963 | r17964 | |
---|---|---|
327 | 327 | |
328 | 328 | void isa8_device::install_bank(offs_t start, offs_t end, offs_t mask, offs_t mirror, const char *tag, UINT8 *data) |
329 | 329 | { |
330 | address_space *space = m_maincpu->space(AS_PROGRAM); | |
331 | space->install_readwrite_bank(start, end, mask, mirror, tag ); | |
330 | address_space &space = *m_maincpu->space(AS_PROGRAM); | |
331 | space.install_readwrite_bank(start, end, mask, mirror, tag ); | |
332 | 332 | machine().root_device().membank(tag)->set_base(data); |
333 | 333 | } |
334 | 334 | |
335 | 335 | void isa8_device::unmap_bank(offs_t start, offs_t end, offs_t mask, offs_t mirror) |
336 | 336 | { |
337 | address_space *space = m_maincpu->space(AS_PROGRAM); | |
338 | space->unmap_readwrite(start, end, mask, mirror); | |
337 | address_space &space = *m_maincpu->space(AS_PROGRAM); | |
338 | space.unmap_readwrite(start, end, mask, mirror); | |
339 | 339 | } |
340 | 340 | |
341 | 341 | void isa8_device::install_rom(device_t *dev, offs_t start, offs_t end, offs_t mask, offs_t mirror, const char *tag, const char *region) |
r17963 | r17964 | |
346 | 346 | UINT8 *dest = machine().root_device().memregion("isa")->base() + start - 0xc0000; |
347 | 347 | memcpy(dest,src, end - start + 1); |
348 | 348 | } else { |
349 | address_space *space = m_maincpu->space(AS_PROGRAM); | |
350 | space->install_read_bank(start, end, mask, mirror, tag); | |
351 | space->unmap_write(start, end, mask, mirror); | |
349 | address_space &space = *m_maincpu->space(AS_PROGRAM); | |
350 | space.install_read_bank(start, end, mask, mirror, tag); | |
351 | space.unmap_write(start, end, mask, mirror); | |
352 | 352 | machine().root_device().membank(tag)->set_base(machine().root_device().memregion(dev->subtag(tempstring, region))->base()); |
353 | 353 | } |
354 | 354 | } |
355 | 355 | |
356 | 356 | void isa8_device::unmap_rom(offs_t start, offs_t end, offs_t mask, offs_t mirror) |
357 | 357 | { |
358 | address_space *space = m_maincpu->space(AS_PROGRAM); | |
359 | space->unmap_read(start, end, mask, mirror); | |
358 | address_space &space = *m_maincpu->space(AS_PROGRAM); | |
359 | space.unmap_read(start, end, mask, mirror); | |
360 | 360 | } |
361 | 361 | |
362 | 362 | bool isa8_device::is_option_rom_space_available(offs_t start, int size) |
363 | 363 | { |
364 | 364 | m_maincpu = machine().device<cpu_device>(m_cputag); |
365 | address_space | |
365 | address_space &space = *m_maincpu->space(AS_PROGRAM); | |
366 | 366 | for(int i = 0; i < size; i += 4096) // 4KB granularity should be enough |
367 | if(space | |
367 | if(space.get_read_ptr(start + i)) return false; | |
368 | 368 | return true; |
369 | 369 | } |
370 | 370 |
r17963 | r17964 | |
---|---|---|
232 | 232 | |
233 | 233 | void lviv_state::machine_reset() |
234 | 234 | { |
235 | address_space | |
235 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
236 | 236 | UINT8 *mem; |
237 | 237 | |
238 | space | |
238 | space.set_direct_update_handler(direct_update_delegate(FUNC(lviv_state::lviv_directoverride), this)); | |
239 | 239 | |
240 | 240 | m_video_ram = machine().device<ram_device>(RAM_TAG)->pointer() + 0xc000; |
241 | 241 | |
242 | 242 | m_startup_mem_map = 1; |
243 | 243 | |
244 | space->unmap_write(0x0000, 0x3fff); | |
245 | space->unmap_write(0x4000, 0x7fff); | |
246 | space->unmap_write(0x8000, 0xbfff); | |
247 | space->unmap_write(0xC000, 0xffff); | |
244 | space.unmap_write(0x0000, 0x3fff); | |
245 | space.unmap_write(0x4000, 0x7fff); | |
246 | space.unmap_write(0x8000, 0xbfff); | |
247 | space.unmap_write(0xC000, 0xffff); | |
248 | 248 | |
249 | 249 | mem = memregion("maincpu")->base(); |
250 | 250 | membank("bank1")->set_base(mem + 0x010000); |
r17963 | r17964 | |
---|---|---|
339 | 339 | static void set_ram_size(running_machine &machine) |
340 | 340 | { |
341 | 341 | mbc55x_state *state = machine.driver_data<mbc55x_state>(); |
342 | address_space | |
342 | address_space &space = *machine.device( MAINCPU_TAG)->memory().space( AS_PROGRAM ); | |
343 | 343 | int ramsize = state->m_ram->size(); |
344 | 344 | int nobanks = ramsize / RAM_BANK_SIZE; |
345 | 345 | char bank[10]; |
r17963 | r17964 | |
363 | 363 | if(bankno<nobanks) |
364 | 364 | { |
365 | 365 | state->membank(bank)->set_base(map_base); |
366 | space | |
366 | space.install_readwrite_bank(bank_base, bank_base+(RAM_BANK_SIZE-1), bank); | |
367 | 367 | logerror("Mapping bank %d at %05X to RAM\n",bankno,bank_base); |
368 | 368 | } |
369 | 369 | else |
370 | 370 | { |
371 | space | |
371 | space.nop_readwrite(bank_base, bank_base+(RAM_BANK_SIZE-1)); | |
372 | 372 | logerror("Mapping bank %d at %05X to NOP\n",bankno,bank_base); |
373 | 373 | } |
374 | 374 | } |
375 | 375 | |
376 | 376 | // Graphics red and blue plane memory mapping, green is in main memory |
377 | 377 | state->membank(RED_PLANE_TAG)->set_base(&state->m_video_mem[RED_PLANE_OFFSET]); |
378 | space | |
378 | space.install_readwrite_bank(RED_PLANE_MEMBASE, RED_PLANE_MEMBASE+(COLOUR_PLANE_SIZE-1), RED_PLANE_TAG); | |
379 | 379 | state->membank(BLUE_PLANE_TAG)->set_base(&state->m_video_mem[BLUE_PLANE_OFFSET]); |
380 | space | |
380 | space.install_readwrite_bank(BLUE_PLANE_MEMBASE, BLUE_PLANE_MEMBASE+(COLOUR_PLANE_SIZE-1), BLUE_PLANE_TAG); | |
381 | 381 | } |
382 | 382 | |
383 | 383 | DRIVER_INIT_MEMBER(mbc55x_state,mbc55x) |
r17963 | r17964 | |
434 | 434 | static int instruction_hook(device_t &device, offs_t curpc) |
435 | 435 | { |
436 | 436 | mbc55x_state *state = device.machine().driver_data<mbc55x_state>(); |
437 | address_space | |
437 | address_space &space = *device.memory().space(AS_PROGRAM); | |
438 | 438 | UINT8 *addr_ptr; |
439 | 439 | |
440 | addr_ptr = (UINT8*)space | |
440 | addr_ptr = (UINT8*)space.get_read_ptr(curpc); | |
441 | 441 | |
442 | 442 | if ((addr_ptr !=NULL) && (addr_ptr[0]==0xCD)) |
443 | 443 | { |
r17963 | r17964 | |
---|---|---|
19 | 19 | |
20 | 20 | WRITE8_HANDLER(pc1403_asic_write) |
21 | 21 | { |
22 | pc1403_state *state = space | |
22 | pc1403_state *state = space.machine().driver_data<pc1403_state>(); | |
23 | 23 | state->m_asic[offset>>9]=data; |
24 | 24 | switch( (offset>>9) ){ |
25 | 25 | case 0/*0x3800*/: |
r17963 | r17964 | |
39 | 39 | |
40 | 40 | READ8_HANDLER(pc1403_asic_read) |
41 | 41 | { |
42 | pc1403_state *state = space | |
42 | pc1403_state *state = space.machine().driver_data<pc1403_state>(); | |
43 | 43 | UINT8 data=state->m_asic[offset>>9]; |
44 | 44 | switch( (offset>>9) ){ |
45 | 45 | case 0: case 1: case 2: |
r17963 | r17964 | |
---|---|---|
143 | 143 | |
144 | 144 | DRIVER_INIT_MEMBER(apple1_state,apple1) |
145 | 145 | { |
146 | address_space | |
146 | address_space& space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
147 | 147 | /* Set up the handlers for MESS's dynamically-sized RAM. */ |
148 | space | |
148 | space.install_readwrite_bank(0x0000, machine().device<ram_device>(RAM_TAG)->size() - 1, "bank1"); | |
149 | 149 | membank("bank1")->set_base(machine().device<ram_device>(RAM_TAG)->pointer()); |
150 | 150 | |
151 | 151 | /* Poll the keyboard input ports periodically. These include both |
r17963 | r17964 | |
---|---|---|
136 | 136 | |
137 | 137 | void special_state::specimx_set_bank(offs_t i, UINT8 data) |
138 | 138 | { |
139 | address_space | |
139 | address_space &space = *m_maincpu->space(AS_PROGRAM); | |
140 | 140 | UINT8 *ram = m_ram->pointer(); |
141 | 141 | |
142 | space->install_write_bank(0xc000, 0xffbf, "bank3"); | |
143 | space->install_write_bank(0xffc0, 0xffdf, "bank4"); | |
142 | space.install_write_bank(0xc000, 0xffbf, "bank3"); | |
143 | space.install_write_bank(0xffc0, 0xffdf, "bank4"); | |
144 | 144 | membank("bank4")->set_base(ram + 0xffc0); |
145 | 145 | switch(i) |
146 | 146 | { |
147 | 147 | case 0 : |
148 | space->install_write_bank(0x0000, 0x8fff, "bank1"); | |
149 | space->install_write_handler(0x9000, 0xbfff, write8_delegate(FUNC(special_state::video_memory_w), this)); | |
148 | space.install_write_bank(0x0000, 0x8fff, "bank1"); | |
149 | space.install_write_handler(0x9000, 0xbfff, write8_delegate(FUNC(special_state::video_memory_w), this)); | |
150 | 150 | |
151 | 151 | membank("bank1")->set_base(ram); |
152 | 152 | membank("bank2")->set_base(ram + 0x9000); |
153 | 153 | membank("bank3")->set_base(ram + 0xc000); |
154 | 154 | break; |
155 | 155 | case 1 : |
156 | space->install_write_bank(0x0000, 0x8fff, "bank1"); | |
157 | space->install_write_bank(0x9000, 0xbfff, "bank2"); | |
156 | space.install_write_bank(0x0000, 0x8fff, "bank1"); | |
157 | space.install_write_bank(0x9000, 0xbfff, "bank2"); | |
158 | 158 | |
159 | 159 | membank("bank1")->set_base(ram + 0x10000); |
160 | 160 | membank("bank2")->set_base(ram + 0x19000); |
161 | 161 | membank("bank3")->set_base(ram + 0x1c000); |
162 | 162 | break; |
163 | 163 | case 2 : |
164 | space->unmap_write(0x0000, 0x8fff); | |
165 | space->unmap_write(0x9000, 0xbfff); | |
164 | space.unmap_write(0x0000, 0x8fff); | |
165 | space.unmap_write(0x9000, 0xbfff); | |
166 | 166 | |
167 | 167 | membank("bank1")->set_base(machine().root_device().memregion("maincpu")->base() + 0x10000); |
168 | 168 | membank("bank2")->set_base(machine().root_device().memregion("maincpu")->base() + 0x19000); |
r17963 | r17964 | |
273 | 273 | UINT8 bank4 = (m_RR_register >> 6) & 3; |
274 | 274 | UINT8 *mem = memregion("maincpu")->base(); |
275 | 275 | UINT8 *ram = m_ram->pointer(); |
276 | address_space | |
276 | address_space &space = *m_maincpu->space(AS_PROGRAM); | |
277 | 277 | |
278 | space->install_write_bank(0x0000, 0x3fff, "bank1"); | |
279 | space->install_write_bank(0x4000, 0x8fff, "bank2"); | |
280 | space->install_write_bank(0x9000, 0xbfff, "bank3"); | |
281 | space->install_write_bank(0xc000, 0xefff, "bank4"); | |
282 | space->install_write_bank(0xf000, 0xf7ff, "bank5"); | |
283 | space->install_write_bank(0xf800, 0xffff, "bank6"); | |
278 | space.install_write_bank(0x0000, 0x3fff, "bank1"); | |
279 | space.install_write_bank(0x4000, 0x8fff, "bank2"); | |
280 | space.install_write_bank(0x9000, 0xbfff, "bank3"); | |
281 | space.install_write_bank(0xc000, 0xefff, "bank4"); | |
282 | space.install_write_bank(0xf000, 0xf7ff, "bank5"); | |
283 | space.install_write_bank(0xf800, 0xffff, "bank6"); | |
284 | 284 | |
285 | 285 | switch(bank1) |
286 | 286 | { |
r17963 | r17964 | |
290 | 290 | membank("bank1")->set_base(ram + 0x10000*(bank1-1)); |
291 | 291 | break; |
292 | 292 | case 0: |
293 | space | |
293 | space.unmap_write(0x0000, 0x3fff); | |
294 | 294 | membank("bank1")->set_base(mem + 0x10000); |
295 | 295 | break; |
296 | 296 | } |
r17963 | r17964 | |
302 | 302 | membank("bank2")->set_base(ram + 0x10000*(bank2-1) + 0x4000); |
303 | 303 | break; |
304 | 304 | case 0: |
305 | space | |
305 | space.unmap_write(0x4000, 0x8fff); | |
306 | 306 | membank("bank2")->set_base(mem + 0x14000); |
307 | 307 | break; |
308 | 308 | } |
r17963 | r17964 | |
314 | 314 | membank("bank3")->set_base(ram + 0x10000*(bank3-1) + 0x9000); |
315 | 315 | break; |
316 | 316 | case 0: |
317 | space | |
317 | space.unmap_write(0x9000, 0xbfff); | |
318 | 318 | membank("bank3")->set_base(mem + 0x19000); |
319 | 319 | break; |
320 | 320 | } |
r17963 | r17964 | |
328 | 328 | membank("bank6")->set_base(ram + 0x10000*(bank4-1) + 0x0f800); |
329 | 329 | break; |
330 | 330 | case 0: |
331 | space | |
331 | space.unmap_write(0xc000, 0xefff); | |
332 | 332 | membank("bank4")->set_base(mem + 0x1c000); |
333 | space->unmap_write(0xf000, 0xf7ff); | |
334 | space->nop_read(0xf000, 0xf7ff); | |
335 | space->install_readwrite_handler(0xf800, 0xf803, 0, 0x7fc, read8_delegate(FUNC(i8255_device::read), (i8255_device*)m_ppi), write8_delegate(FUNC(i8255_device::write), (i8255_device*)m_ppi)); | |
333 | space.unmap_write(0xf000, 0xf7ff); | |
334 | space.nop_read(0xf000, 0xf7ff); | |
335 | space.install_readwrite_handler(0xf800, 0xf803, 0, 0x7fc, read8_delegate(FUNC(i8255_device::read), (i8255_device*)m_ppi), write8_delegate(FUNC(i8255_device::write), (i8255_device*)m_ppi)); | |
336 | 336 | break; |
337 | 337 | } |
338 | 338 | } |
r17963 | r17964 | |
---|---|---|
1346 | 1346 | static int instruction_hook(device_t &device, offs_t curpc) |
1347 | 1347 | { |
1348 | 1348 | rmnimbus_state *state = device.machine().driver_data<rmnimbus_state>(); |
1349 | address_space | |
1349 | address_space &space = *device.memory().space(AS_PROGRAM); | |
1350 | 1350 | UINT8 *addr_ptr; |
1351 | 1351 | |
1352 | addr_ptr = (UINT8*)space | |
1352 | addr_ptr = (UINT8*)space.get_read_ptr(curpc); | |
1353 | 1353 | |
1354 | 1354 | if ((addr_ptr !=NULL) && (addr_ptr[0]==0xCD)) |
1355 | 1355 | { |
r17963 | r17964 | |
1713 | 1713 | } |
1714 | 1714 | } |
1715 | 1715 | |
1716 | static void *get_dssi_ptr(address_space | |
1716 | static void *get_dssi_ptr(address_space &space, UINT16 ds, UINT16 si) | |
1717 | 1717 | { |
1718 | 1718 | int addr; |
1719 | 1719 | |
1720 | 1720 | addr=((ds<<4)+si); |
1721 | 1721 | // OUTPUT_SEGOFS("DS:SI",ds,si); |
1722 | 1722 | |
1723 | return space | |
1723 | return space.get_read_ptr(addr); | |
1724 | 1724 | } |
1725 | 1725 | |
1726 | 1726 | static void decode_dssi_generic(device_t *device,UINT16 ds, UINT16 si, UINT8 raw_flag) |
1727 | 1727 | { |
1728 | address_space | |
1728 | address_space &space = *device->machine().device(MAINCPU_TAG)->memory().space(AS_PROGRAM); | |
1729 | 1729 | UINT16 *params; |
1730 | 1730 | int count; |
1731 | 1731 | |
r17963 | r17964 | |
1743 | 1743 | |
1744 | 1744 | static void decode_dssi_f_fill_area(device_t *device,UINT16 ds, UINT16 si, UINT8 raw_flag) |
1745 | 1745 | { |
1746 | address_space | |
1746 | address_space &space = *device->machine().device(MAINCPU_TAG)->memory().space(AS_PROGRAM); | |
1747 | 1747 | |
1748 | 1748 | UINT16 *addr_ptr; |
1749 | 1749 | t_area_params *area_params; |
r17963 | r17964 | |
1755 | 1755 | if (!raw_flag) |
1756 | 1756 | OUTPUT_SEGOFS("SegBrush:OfsBrush",area_params->seg_brush,area_params->ofs_brush); |
1757 | 1757 | |
1758 | brush=(t_nimbus_brush *)space | |
1758 | brush=(t_nimbus_brush *)space.get_read_ptr(LINEAR_ADDR(area_params->seg_brush,area_params->ofs_brush)); | |
1759 | 1759 | |
1760 | 1760 | if(raw_flag) |
1761 | 1761 | { |
r17963 | r17964 | |
1776 | 1776 | OUTPUT_SEGOFS("SegData:OfsData",area_params->seg_data,area_params->ofs_data); |
1777 | 1777 | } |
1778 | 1778 | |
1779 | addr_ptr = (UINT16 *)space | |
1779 | addr_ptr = (UINT16 *)space.get_read_ptr(LINEAR_ADDR(area_params->seg_data,area_params->ofs_data)); | |
1780 | 1780 | for(cocount=0; cocount < area_params->count; cocount++) |
1781 | 1781 | { |
1782 | 1782 | if(raw_flag) |
r17963 | r17964 | |
1796 | 1796 | |
1797 | 1797 | static void decode_dssi_f_plot_character_string(device_t *device,UINT16 ds, UINT16 si, UINT8 raw_flag) |
1798 | 1798 | { |
1799 | address_space | |
1799 | address_space &space = *device->machine().device(MAINCPU_TAG)->memory().space(AS_PROGRAM); | |
1800 | 1800 | |
1801 | 1801 | UINT8 *char_ptr; |
1802 | 1802 | t_plot_string_params *plot_string_params; |
r17963 | r17964 | |
1812 | 1812 | |
1813 | 1813 | logerror("x=%d, y=%d, length=%d\n",plot_string_params->x,plot_string_params->y,plot_string_params->length); |
1814 | 1814 | |
1815 | char_ptr=(UINT8*)space | |
1815 | char_ptr=(UINT8*)space.get_read_ptr(LINEAR_ADDR(plot_string_params->seg_data,plot_string_params->ofs_data)); | |
1816 | 1816 | |
1817 | 1817 | if (plot_string_params->length==0xFFFF) |
1818 | 1818 | logerror("%s",char_ptr); |
r17963 | r17964 | |
1825 | 1825 | |
1826 | 1826 | static void decode_dssi_f_set_new_clt(device_t *device,UINT16 ds, UINT16 si, UINT8 raw_flag) |
1827 | 1827 | { |
1828 | address_space | |
1828 | address_space &space = *device->machine().device(MAINCPU_TAG)->memory().space(AS_PROGRAM); | |
1829 | 1829 | UINT16 *new_colours; |
1830 | 1830 | int colour; |
1831 | 1831 | new_colours=(UINT16 *)get_dssi_ptr(space,ds,si); |
r17963 | r17964 | |
1842 | 1842 | |
1843 | 1843 | static void decode_dssi_f_plonk_char(device_t *device,UINT16 ds, UINT16 si, UINT8 raw_flag) |
1844 | 1844 | { |
1845 | address_space | |
1845 | address_space &space = *device->machine().device(MAINCPU_TAG)->memory().space(AS_PROGRAM); | |
1846 | 1846 | UINT16 *params; |
1847 | 1847 | params=(UINT16 *)get_dssi_ptr(space,ds,si); |
1848 | 1848 | |
r17963 | r17964 | |
1856 | 1856 | |
1857 | 1857 | static void decode_dssi_f_rw_sectors(device_t *device,UINT16 ds, UINT16 si, UINT8 raw_flag) |
1858 | 1858 | { |
1859 | address_space | |
1859 | address_space &space = *device->machine().device(MAINCPU_TAG)->memory().space(AS_PROGRAM); | |
1860 | 1860 | UINT16 *params; |
1861 | 1861 | int param_no; |
1862 | 1862 | |
r17963 | r17964 | |
1992 | 1992 | static void nimbus_bank_memory(running_machine &machine) |
1993 | 1993 | { |
1994 | 1994 | rmnimbus_state *state = machine.driver_data<rmnimbus_state>(); |
1995 | address_space | |
1995 | address_space &space = *machine.device( MAINCPU_TAG)->memory().space( AS_PROGRAM ); | |
1996 | 1996 | int ramsize = machine.device<ram_device>(RAM_TAG)->size(); |
1997 | 1997 | int ramblock = 0; |
1998 | 1998 | int blockno; |
r17963 | r17964 | |
2049 | 2049 | map_base=(ramsel==0x07) ? map_blocks[map_blockno] : &map_blocks[map_blockno][block_ofs*1024]; |
2050 | 2050 | |
2051 | 2051 | state->membank(bank)->set_base(map_base); |
2052 | space | |
2052 | space.install_readwrite_bank(memmap[blockno].start, memmap[blockno].end, bank); | |
2053 | 2053 | //if(LOG_RAM) logerror(", base=%X\n",(int)map_base); |
2054 | 2054 | } |
2055 | 2055 | else |
2056 | 2056 | { |
2057 | space | |
2057 | space.nop_readwrite(memmap[blockno].start, memmap[blockno].end); | |
2058 | 2058 | if(LOG_RAM) logerror("NOP\n"); |
2059 | 2059 | } |
2060 | 2060 | } |
r17963 | r17964 | |
---|---|---|
85 | 85 | { |
86 | 86 | pp01_state *state = machine.driver_data<pp01_state>(); |
87 | 87 | UINT8 *mem = state->memregion("maincpu")->base(); |
88 | address_space | |
88 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
89 | 89 | UINT16 startaddr = block*0x1000; |
90 | 90 | UINT16 endaddr = ((block+1)*0x1000)-1; |
91 | 91 | UINT8 blocknum = block + 1; |
r17963 | r17964 | |
93 | 93 | sprintf(bank,"bank%d",blocknum); |
94 | 94 | if (data>=0xE0 && data<=0xEF) { |
95 | 95 | // This is RAM |
96 | space | |
96 | space.install_read_bank (startaddr, endaddr, bank); | |
97 | 97 | switch(data) { |
98 | 98 | case 0xe6 : |
99 | space | |
99 | space.install_write_handler(startaddr, endaddr, write8_delegate(FUNC(pp01_state::pp01_video_r_1_w),state)); | |
100 | 100 | break; |
101 | 101 | case 0xe7 : |
102 | space | |
102 | space.install_write_handler(startaddr, endaddr, write8_delegate(FUNC(pp01_state::pp01_video_r_2_w),state)); | |
103 | 103 | break; |
104 | 104 | case 0xea : |
105 | space | |
105 | space.install_write_handler(startaddr, endaddr, write8_delegate(FUNC(pp01_state::pp01_video_g_1_w),state)); | |
106 | 106 | break; |
107 | 107 | case 0xeb : |
108 | space | |
108 | space.install_write_handler(startaddr, endaddr, write8_delegate(FUNC(pp01_state::pp01_video_g_2_w),state)); | |
109 | 109 | break; |
110 | 110 | case 0xee : |
111 | space | |
111 | space.install_write_handler(startaddr, endaddr, write8_delegate(FUNC(pp01_state::pp01_video_b_1_w),state)); | |
112 | 112 | break; |
113 | 113 | case 0xef : |
114 | space | |
114 | space.install_write_handler(startaddr, endaddr, write8_delegate(FUNC(pp01_state::pp01_video_b_2_w),state)); | |
115 | 115 | break; |
116 | 116 | |
117 | 117 | default : |
118 | space | |
118 | space.install_write_bank(startaddr, endaddr, bank); | |
119 | 119 | break; |
120 | 120 | } |
121 | 121 | |
122 | 122 | state->membank(bank)->set_base(machine.device<ram_device>(RAM_TAG)->pointer() + (data & 0x0F)* 0x1000); |
123 | 123 | } else if (data>=0xF8) { |
124 | space->install_read_bank (startaddr, endaddr, bank); | |
125 | space->unmap_write(startaddr, endaddr); | |
124 | space.install_read_bank (startaddr, endaddr, bank); | |
125 | space.unmap_write(startaddr, endaddr); | |
126 | 126 | state->membank(bank)->set_base(mem + ((data & 0x0F)-8)* 0x1000+0x10000); |
127 | 127 | } else { |
128 | 128 | logerror("%02x %02x\n",block,data); |
129 | space | |
129 | space.unmap_readwrite (startaddr, endaddr); | |
130 | 130 | } |
131 | 131 | } |
132 | 132 |
r17963 | r17964 | |
---|---|---|
59 | 59 | void apple2_update_memory(running_machine &machine) |
60 | 60 | { |
61 | 61 | apple2_state *state = machine.driver_data<apple2_state>(); |
62 | address_space | |
62 | address_space& space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
63 | 63 | int i, bank; |
64 | 64 | char rbank[10], wbank[10]; |
65 | 65 | int full_update = 0; |
r17963 | r17964 | |
166 | 166 | /* install the actual handlers */ |
167 | 167 | if (begin <= end_r) { |
168 | 168 | if (rh) { |
169 | space | |
169 | space.install_read_handler(begin, end_r, *rh); | |
170 | 170 | } else { |
171 | space | |
171 | space.install_read_bank(begin, end_r, rbank); | |
172 | 172 | } |
173 | 173 | } |
174 | 174 | |
175 | 175 | /* did we 'go past the end?' */ |
176 | 176 | if (end_r < state->m_mem_config.memmap[i].end) |
177 | space | |
177 | space.nop_read(end_r + 1, state->m_mem_config.memmap[i].end); | |
178 | 178 | |
179 | 179 | /* set the memory bank */ |
180 | 180 | if (rbase) |
r17963 | r17964 | |
254 | 254 | /* install the actual handlers */ |
255 | 255 | if (begin <= end_w) { |
256 | 256 | if (wh) { |
257 | space | |
257 | space.install_write_handler(begin, end_w, *wh); | |
258 | 258 | } else { |
259 | 259 | if (wh_nop) { |
260 | space | |
260 | space.nop_write(begin, end_w); | |
261 | 261 | } else { |
262 | space | |
262 | space.install_write_bank(begin, end_w, wbank); | |
263 | 263 | } |
264 | 264 | } |
265 | 265 | } |
266 | 266 | |
267 | 267 | /* did we 'go past the end?' */ |
268 | 268 | if (end_w < state->m_mem_config.memmap[i].end) |
269 | space | |
269 | space.nop_write(end_w + 1, state->m_mem_config.memmap[i].end); | |
270 | 270 | |
271 | 271 | /* set the memory bank */ |
272 | 272 | if (wbase) |
r17963 | r17964 | |
---|---|---|
231 | 231 | static void pk8020_set_bank(running_machine &machine,UINT8 data) |
232 | 232 | { |
233 | 233 | pk8020_state *state = machine.driver_data<pk8020_state>(); |
234 | address_space | |
234 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
235 | 235 | UINT8 *mem = state->memregion("maincpu")->base(); |
236 | 236 | UINT8 *ram = machine.device<ram_device>(RAM_TAG)->pointer(); |
237 | 237 | |
r17963 | r17964 | |
239 | 239 | case 0x00 : |
240 | 240 | { |
241 | 241 | // ROM |
242 | space->install_read_bank (0x0000, 0x37ff, "bank1"); | |
243 | space->install_write_bank(0x0000, 0x37ff, "bank2"); | |
242 | space.install_read_bank (0x0000, 0x37ff, "bank1"); | |
243 | space.install_write_bank(0x0000, 0x37ff, "bank2"); | |
244 | 244 | state->membank("bank1")->set_base(mem + 0x10000); |
245 | 245 | state->membank("bank2")->set_base(ram + 0x0000); |
246 | 246 | // Keyboard |
247 | space->install_read_handler (0x3800, 0x39ff, read8_delegate(FUNC(pk8020_state::keyboard_r),state)); | |
248 | space->install_write_bank(0x3800, 0x39ff, "bank3"); | |
247 | space.install_read_handler (0x3800, 0x39ff, read8_delegate(FUNC(pk8020_state::keyboard_r),state)); | |
248 | space.install_write_bank(0x3800, 0x39ff, "bank3"); | |
249 | 249 | state->membank("bank3")->set_base(ram + 0x3800); |
250 | 250 | // System reg |
251 | space->install_read_handler (0x3a00, 0x3aff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
252 | space->install_write_handler(0x3a00, 0x3aff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
251 | space.install_read_handler (0x3a00, 0x3aff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
252 | space.install_write_handler(0x3a00, 0x3aff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
253 | 253 | // Devices |
254 | space->install_read_handler (0x3b00, 0x3bff, read8_delegate(FUNC(pk8020_state::devices_r),state)); | |
255 | space->install_write_handler(0x3b00, 0x3bff, write8_delegate(FUNC(pk8020_state::devices_w),state)); | |
254 | space.install_read_handler (0x3b00, 0x3bff, read8_delegate(FUNC(pk8020_state::devices_r),state)); | |
255 | space.install_write_handler(0x3b00, 0x3bff, write8_delegate(FUNC(pk8020_state::devices_w),state)); | |
256 | 256 | // Text Video Memory |
257 | space->install_read_handler (0x3c00, 0x3fff, read8_delegate(FUNC(pk8020_state::text_r),state)); | |
258 | space->install_write_handler(0x3c00, 0x3fff, write8_delegate(FUNC(pk8020_state::text_w),state)); | |
257 | space.install_read_handler (0x3c00, 0x3fff, read8_delegate(FUNC(pk8020_state::text_r),state)); | |
258 | space.install_write_handler(0x3c00, 0x3fff, write8_delegate(FUNC(pk8020_state::text_w),state)); | |
259 | 259 | // RAM |
260 | space->install_read_bank (0x4000, 0xffff, "bank4"); | |
261 | space->install_write_bank(0x4000, 0xffff, "bank5"); | |
260 | space.install_read_bank (0x4000, 0xffff, "bank4"); | |
261 | space.install_write_bank(0x4000, 0xffff, "bank5"); | |
262 | 262 | state->membank("bank4")->set_base(ram + 0x4000); |
263 | 263 | state->membank("bank5")->set_base(ram + 0x4000); |
264 | 264 | } |
265 | 265 | break; |
266 | 266 | case 0x01 : { |
267 | 267 | // ROM |
268 | space->install_read_bank (0x0000, 0x1fff, "bank1"); | |
269 | space->install_write_bank(0x0000, 0x1fff, "bank2"); | |
268 | space.install_read_bank (0x0000, 0x1fff, "bank1"); | |
269 | space.install_write_bank(0x0000, 0x1fff, "bank2"); | |
270 | 270 | state->membank("bank1")->set_base(mem + 0x10000); |
271 | 271 | state->membank("bank2")->set_base(ram + 0x0000); |
272 | 272 | // RAM |
273 | space->install_read_bank (0x2000, 0xffff, "bank3"); | |
274 | space->install_write_bank(0x2000, 0xffff, "bank4"); | |
273 | space.install_read_bank (0x2000, 0xffff, "bank3"); | |
274 | space.install_write_bank(0x2000, 0xffff, "bank4"); | |
275 | 275 | state->membank("bank3")->set_base(ram + 0x2000); |
276 | 276 | state->membank("bank4")->set_base(ram + 0x2000); |
277 | 277 | } |
278 | 278 | break; |
279 | 279 | case 0x02 : { |
280 | 280 | // ROM |
281 | space->install_read_bank (0x0000, 0x3fff, "bank1"); | |
282 | space->install_write_bank(0x0000, 0x3fff, "bank2"); | |
281 | space.install_read_bank (0x0000, 0x3fff, "bank1"); | |
282 | space.install_write_bank(0x0000, 0x3fff, "bank2"); | |
283 | 283 | state->membank("bank1")->set_base(mem + 0x10000); |
284 | 284 | state->membank("bank2")->set_base(ram + 0x0000); |
285 | 285 | // RAM |
286 | space->install_read_bank (0x4000, 0xffff, "bank3"); | |
287 | space->install_write_bank(0x4000, 0xffff, "bank4"); | |
286 | space.install_read_bank (0x4000, 0xffff, "bank3"); | |
287 | space.install_write_bank(0x4000, 0xffff, "bank4"); | |
288 | 288 | state->membank("bank3")->set_base(ram + 0x4000); |
289 | 289 | state->membank("bank4")->set_base(ram + 0x4000); |
290 | 290 | } |
291 | 291 | break; |
292 | 292 | case 0x03 : { |
293 | 293 | // RAM |
294 | space->install_read_bank (0x0000, 0xffff, "bank1"); | |
295 | space->install_write_bank(0x0000, 0xffff, "bank2"); | |
294 | space.install_read_bank (0x0000, 0xffff, "bank1"); | |
295 | space.install_write_bank(0x0000, 0xffff, "bank2"); | |
296 | 296 | state->membank("bank1")->set_base(ram); |
297 | 297 | state->membank("bank2")->set_base(ram); |
298 | 298 | } |
r17963 | r17964 | |
301 | 301 | case 0x05 : |
302 | 302 | { |
303 | 303 | // ROM |
304 | space->install_read_bank (0x0000, 0x1fff, "bank1"); | |
305 | space->install_write_bank(0x0000, 0x1fff, "bank2"); | |
304 | space.install_read_bank (0x0000, 0x1fff, "bank1"); | |
305 | space.install_write_bank(0x0000, 0x1fff, "bank2"); | |
306 | 306 | state->membank("bank1")->set_base(mem + 0x10000); |
307 | 307 | state->membank("bank2")->set_base(ram + 0x0000); |
308 | 308 | // RAM |
309 | space->install_read_bank (0x2000, 0xf7ff, "bank3"); | |
310 | space->install_write_bank(0x2000, 0xf7ff, "bank4"); | |
309 | space.install_read_bank (0x2000, 0xf7ff, "bank3"); | |
310 | space.install_write_bank(0x2000, 0xf7ff, "bank4"); | |
311 | 311 | state->membank("bank3")->set_base(ram + 0x2000); |
312 | 312 | state->membank("bank4")->set_base(ram + 0x2000); |
313 | 313 | // Keyboard |
314 | space->install_read_handler (0xf800, 0xf9ff, read8_delegate(FUNC(pk8020_state::keyboard_r),state)); | |
315 | space->install_write_bank(0xf800, 0xf9ff, "bank5"); | |
314 | space.install_read_handler (0xf800, 0xf9ff, read8_delegate(FUNC(pk8020_state::keyboard_r),state)); | |
315 | space.install_write_bank(0xf800, 0xf9ff, "bank5"); | |
316 | 316 | state->membank("bank5")->set_base(ram + 0xf800); |
317 | 317 | // System reg |
318 | space->install_read_handler (0xfa00, 0xfaff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
319 | space->install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
318 | space.install_read_handler (0xfa00, 0xfaff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
319 | space.install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
320 | 320 | // Devices |
321 | space->install_read_handler (0xfb00, 0xfbff, read8_delegate(FUNC(pk8020_state::devices_r),state)); | |
322 | space->install_write_handler(0xfb00, 0xfbff, write8_delegate(FUNC(pk8020_state::devices_w),state)); | |
321 | space.install_read_handler (0xfb00, 0xfbff, read8_delegate(FUNC(pk8020_state::devices_r),state)); | |
322 | space.install_write_handler(0xfb00, 0xfbff, write8_delegate(FUNC(pk8020_state::devices_w),state)); | |
323 | 323 | // Text Video Memory |
324 | space->install_read_handler (0xfc00, 0xffff, read8_delegate(FUNC(pk8020_state::text_r),state)); | |
325 | space->install_write_handler(0xfc00, 0xffff, write8_delegate(FUNC(pk8020_state::text_w),state)); | |
324 | space.install_read_handler (0xfc00, 0xffff, read8_delegate(FUNC(pk8020_state::text_r),state)); | |
325 | space.install_write_handler(0xfc00, 0xffff, write8_delegate(FUNC(pk8020_state::text_w),state)); | |
326 | 326 | } |
327 | 327 | break; |
328 | 328 | case 0x06 : |
329 | 329 | { |
330 | 330 | // ROM |
331 | space->install_read_bank (0x0000, 0x3fff, "bank1"); | |
332 | space->install_write_bank(0x0000, 0x3fff, "bank2"); | |
331 | space.install_read_bank (0x0000, 0x3fff, "bank1"); | |
332 | space.install_write_bank(0x0000, 0x3fff, "bank2"); | |
333 | 333 | state->membank("bank1")->set_base(mem + 0x10000); |
334 | 334 | state->membank("bank2")->set_base(ram + 0x0000); |
335 | 335 | // RAM |
336 | space->install_read_bank (0x4000, 0xf7ff, "bank3"); | |
337 | space->install_write_bank(0x4000, 0xf7ff, "bank4"); | |
336 | space.install_read_bank (0x4000, 0xf7ff, "bank3"); | |
337 | space.install_write_bank(0x4000, 0xf7ff, "bank4"); | |
338 | 338 | state->membank("bank3")->set_base(ram + 0x4000); |
339 | 339 | state->membank("bank4")->set_base(ram + 0x4000); |
340 | 340 | // Keyboard |
341 | space->install_read_handler (0xf800, 0xf9ff, read8_delegate(FUNC(pk8020_state::keyboard_r),state)); | |
342 | space->install_write_bank(0xf800, 0xf9ff, "bank5"); | |
341 | space.install_read_handler (0xf800, 0xf9ff, read8_delegate(FUNC(pk8020_state::keyboard_r),state)); | |
342 | space.install_write_bank(0xf800, 0xf9ff, "bank5"); | |
343 | 343 | state->membank("bank5")->set_base(ram + 0xf800); |
344 | 344 | // System reg |
345 | space->install_read_handler (0xfa00, 0xfaff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
346 | space->install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
345 | space.install_read_handler (0xfa00, 0xfaff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
346 | space.install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
347 | 347 | // Devices |
348 | space->install_read_handler (0xfb00, 0xfbff, read8_delegate(FUNC(pk8020_state::devices_r),state)); | |
349 | space->install_write_handler(0xfb00, 0xfbff, write8_delegate(FUNC(pk8020_state::devices_w),state)); | |
348 | space.install_read_handler (0xfb00, 0xfbff, read8_delegate(FUNC(pk8020_state::devices_r),state)); | |
349 | space.install_write_handler(0xfb00, 0xfbff, write8_delegate(FUNC(pk8020_state::devices_w),state)); | |
350 | 350 | // Text Video Memory |
351 | space->install_read_handler (0xfc00, 0xffff, read8_delegate(FUNC(pk8020_state::text_r),state)); | |
352 | space->install_write_handler(0xfc00, 0xffff, write8_delegate(FUNC(pk8020_state::text_w),state)); | |
351 | space.install_read_handler (0xfc00, 0xffff, read8_delegate(FUNC(pk8020_state::text_r),state)); | |
352 | space.install_write_handler(0xfc00, 0xffff, write8_delegate(FUNC(pk8020_state::text_w),state)); | |
353 | 353 | } |
354 | 354 | break; |
355 | 355 | case 0x07 : |
356 | 356 | { |
357 | 357 | // RAM |
358 | space->install_read_bank (0x0000, 0xf7ff, "bank1"); | |
359 | space->install_write_bank(0x0000, 0xf7ff, "bank2"); | |
358 | space.install_read_bank (0x0000, 0xf7ff, "bank1"); | |
359 | space.install_write_bank(0x0000, 0xf7ff, "bank2"); | |
360 | 360 | state->membank("bank1")->set_base(ram); |
361 | 361 | state->membank("bank2")->set_base(ram); |
362 | 362 | // Keyboard |
363 | space->install_read_handler (0xf800, 0xf9ff, read8_delegate(FUNC(pk8020_state::keyboard_r),state)); | |
364 | space->install_write_bank(0xf800, 0xf9ff, "bank3"); | |
363 | space.install_read_handler (0xf800, 0xf9ff, read8_delegate(FUNC(pk8020_state::keyboard_r),state)); | |
364 | space.install_write_bank(0xf800, 0xf9ff, "bank3"); | |
365 | 365 | state->membank("bank3")->set_base(ram + 0xf800); |
366 | 366 | // System reg |
367 | space->install_read_handler (0xfa00, 0xfaff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
368 | space->install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
367 | space.install_read_handler (0xfa00, 0xfaff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
368 | space.install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
369 | 369 | // Devices |
370 | space->install_read_handler (0xfb00, 0xfbff, read8_delegate(FUNC(pk8020_state::devices_r),state)); | |
371 | space->install_write_handler(0xfb00, 0xfbff, write8_delegate(FUNC(pk8020_state::devices_w),state)); | |
370 | space.install_read_handler (0xfb00, 0xfbff, read8_delegate(FUNC(pk8020_state::devices_r),state)); | |
371 | space.install_write_handler(0xfb00, 0xfbff, write8_delegate(FUNC(pk8020_state::devices_w),state)); | |
372 | 372 | // Text Video Memory |
373 | space->install_read_handler (0xfc00, 0xffff, read8_delegate(FUNC(pk8020_state::text_r),state)); | |
374 | space->install_write_handler(0xfc00, 0xffff, write8_delegate(FUNC(pk8020_state::text_w),state)); | |
373 | space.install_read_handler (0xfc00, 0xffff, read8_delegate(FUNC(pk8020_state::text_r),state)); | |
374 | space.install_write_handler(0xfc00, 0xffff, write8_delegate(FUNC(pk8020_state::text_w),state)); | |
375 | 375 | } |
376 | 376 | break; |
377 | 377 | case 0x08 : |
378 | 378 | { |
379 | 379 | // ROM |
380 | space->install_read_bank (0x0000, 0x3fff, "bank1"); | |
381 | space->install_write_bank(0x0000, 0x3fff, "bank2"); | |
380 | space.install_read_bank (0x0000, 0x3fff, "bank1"); | |
381 | space.install_write_bank(0x0000, 0x3fff, "bank2"); | |
382 | 382 | state->membank("bank1")->set_base(mem + 0x10000); |
383 | 383 | state->membank("bank2")->set_base(ram + 0x0000); |
384 | 384 | // Keyboard |
385 | space->install_read_handler (0x3800, 0x39ff, read8_delegate(FUNC(pk8020_state::keyboard_r),state)); | |
386 | space->install_write_bank(0x3800, 0x39ff, "bank3"); | |
385 | space.install_read_handler (0x3800, 0x39ff, read8_delegate(FUNC(pk8020_state::keyboard_r),state)); | |
386 | space.install_write_bank(0x3800, 0x39ff, "bank3"); | |
387 | 387 | state->membank("bank3")->set_base(ram + 0x3800); |
388 | 388 | // System reg |
389 | space->install_read_handler (0x3a00, 0x3aff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
390 | space->install_write_handler(0x3a00, 0x3aff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
389 | space.install_read_handler (0x3a00, 0x3aff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
390 | space.install_write_handler(0x3a00, 0x3aff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
391 | 391 | // Devices |
392 | space->install_read_handler (0x3b00, 0x3bff, read8_delegate(FUNC(pk8020_state::devices_r),state)); | |
393 | space->install_write_handler(0x3b00, 0x3bff, write8_delegate(FUNC(pk8020_state::devices_w),state)); | |
392 | space.install_read_handler (0x3b00, 0x3bff, read8_delegate(FUNC(pk8020_state::devices_r),state)); | |
393 | space.install_write_handler(0x3b00, 0x3bff, write8_delegate(FUNC(pk8020_state::devices_w),state)); | |
394 | 394 | // Text Video Memory |
395 | space->install_read_handler (0x3c00, 0x3fff, read8_delegate(FUNC(pk8020_state::text_r),state)); | |
396 | space->install_write_handler(0x3c00, 0x3fff, write8_delegate(FUNC(pk8020_state::text_w),state)); | |
395 | space.install_read_handler (0x3c00, 0x3fff, read8_delegate(FUNC(pk8020_state::text_r),state)); | |
396 | space.install_write_handler(0x3c00, 0x3fff, write8_delegate(FUNC(pk8020_state::text_w),state)); | |
397 | 397 | // RAM |
398 | space->install_read_bank (0x4000, 0xbfff, "bank4"); | |
399 | space->install_write_bank(0x4000, 0xbfff, "bank5"); | |
398 | space.install_read_bank (0x4000, 0xbfff, "bank4"); | |
399 | space.install_write_bank(0x4000, 0xbfff, "bank5"); | |
400 | 400 | state->membank("bank4")->set_base(ram + 0x4000); |
401 | 401 | state->membank("bank5")->set_base(ram + 0x4000); |
402 | 402 | // Video RAM |
403 | space->install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),state)); | |
404 | space->install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),state)); | |
403 | space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),state)); | |
404 | space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),state)); | |
405 | 405 | |
406 | 406 | } |
407 | 407 | break; |
408 | 408 | case 0x09 : |
409 | 409 | { |
410 | 410 | // ROM |
411 | space->install_read_bank (0x0000, 0x1fff, "bank1"); | |
412 | space->install_write_bank(0x0000, 0x1fff, "bank2"); | |
411 | space.install_read_bank (0x0000, 0x1fff, "bank1"); | |
412 | space.install_write_bank(0x0000, 0x1fff, "bank2"); | |
413 | 413 | state->membank("bank1")->set_base(mem + 0x10000); |
414 | 414 | state->membank("bank2")->set_base(ram + 0x0000); |
415 | 415 | // RAM |
416 | space->install_read_bank (0x2000, 0xbfff, "bank3"); | |
417 | space->install_write_bank(0x2000, 0xbfff, "bank4"); | |
416 | space.install_read_bank (0x2000, 0xbfff, "bank3"); | |
417 | space.install_write_bank(0x2000, 0xbfff, "bank4"); | |
418 | 418 | state->membank("bank3")->set_base(ram + 0x2000); |
419 | 419 | state->membank("bank4")->set_base(ram + 0x2000); |
420 | 420 | // Video RAM |
421 | space->install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),state)); | |
422 | space->install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),state)); | |
421 | space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),state)); | |
422 | space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),state)); | |
423 | 423 | } |
424 | 424 | break; |
425 | 425 | case 0x0A : |
426 | 426 | { |
427 | 427 | // ROM |
428 | space->install_read_bank (0x0000, 0x3fff, "bank1"); | |
429 | space->install_write_bank(0x0000, 0x3fff, "bank2"); | |
428 | space.install_read_bank (0x0000, 0x3fff, "bank1"); | |
429 | space.install_write_bank(0x0000, 0x3fff, "bank2"); | |
430 | 430 | state->membank("bank1")->set_base(mem + 0x10000); |
431 | 431 | state->membank("bank2")->set_base(ram + 0x0000); |
432 | 432 | // RAM |
433 | space->install_read_bank (0x4000, 0xbfff, "bank3"); | |
434 | space->install_write_bank(0x4000, 0xbfff, "bank4"); | |
433 | space.install_read_bank (0x4000, 0xbfff, "bank3"); | |
434 | space.install_write_bank(0x4000, 0xbfff, "bank4"); | |
435 | 435 | state->membank("bank3")->set_base(ram + 0x4000); |
436 | 436 | state->membank("bank4")->set_base(ram + 0x4000); |
437 | 437 | // Video RAM |
438 | space->install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),state)); | |
439 | space->install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),state)); | |
438 | space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),state)); | |
439 | space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),state)); | |
440 | 440 | } |
441 | 441 | break; |
442 | 442 | case 0x0B : |
443 | 443 | { |
444 | 444 | // RAM |
445 | space->install_read_bank (0x0000, 0xbfff, "bank1"); | |
446 | space->install_write_bank(0x0000, 0xbfff, "bank2"); | |
445 | space.install_read_bank (0x0000, 0xbfff, "bank1"); | |
446 | space.install_write_bank(0x0000, 0xbfff, "bank2"); | |
447 | 447 | state->membank("bank1")->set_base(ram + 0x0000); |
448 | 448 | state->membank("bank2")->set_base(ram + 0x0000); |
449 | 449 | // Video RAM |
450 | space->install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),state)); | |
451 | space->install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),state)); | |
450 | space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),state)); | |
451 | space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),state)); | |
452 | 452 | } |
453 | 453 | break; |
454 | 454 | case 0x0C : |
455 | 455 | case 0x0D : |
456 | 456 | { |
457 | 457 | // ROM |
458 | space->install_read_bank (0x0000, 0x1fff, "bank1"); | |
459 | space->install_write_bank(0x0000, 0x1fff, "bank2"); | |
458 | space.install_read_bank (0x0000, 0x1fff, "bank1"); | |
459 | space.install_write_bank(0x0000, 0x1fff, "bank2"); | |
460 | 460 | state->membank("bank1")->set_base(mem + 0x10000); |
461 | 461 | state->membank("bank2")->set_base(ram + 0x0000); |
462 | 462 | // RAM |
463 | space->install_read_bank (0x2000, 0x3fff, "bank3"); | |
464 | space->install_write_bank(0x2000, 0x3fff, "bank4"); | |
463 | space.install_read_bank (0x2000, 0x3fff, "bank3"); | |
464 | space.install_write_bank(0x2000, 0x3fff, "bank4"); | |
465 | 465 | state->membank("bank3")->set_base(ram + 0x2000); |
466 | 466 | state->membank("bank4")->set_base(ram + 0x2000); |
467 | 467 | // Video RAM |
468 | space->install_read_handler (0x4000, 0x7fff, read8_delegate(FUNC(pk8020_state::gzu_r),state)); | |
469 | space->install_write_handler(0x4000, 0x7fff, write8_delegate(FUNC(pk8020_state::gzu_w),state)); | |
468 | space.install_read_handler (0x4000, 0x7fff, read8_delegate(FUNC(pk8020_state::gzu_r),state)); | |
469 | space.install_write_handler(0x4000, 0x7fff, write8_delegate(FUNC(pk8020_state::gzu_w),state)); | |
470 | 470 | // RAM |
471 | space->install_read_bank (0x8000, 0xfdff, "bank5"); | |
472 | space->install_write_bank(0x8000, 0xfdff, "bank6"); | |
471 | space.install_read_bank (0x8000, 0xfdff, "bank5"); | |
472 | space.install_write_bank(0x8000, 0xfdff, "bank6"); | |
473 | 473 | state->membank("bank5")->set_base(ram + 0x8000); |
474 | 474 | state->membank("bank6")->set_base(ram + 0x8000); |
475 | 475 | // Devices |
476 | space->install_read_handler (0xfe00, 0xfeff, read8_delegate(FUNC(pk8020_state::devices_r),state)); | |
477 | space->install_write_handler(0xfe00, 0xfeff, write8_delegate(FUNC(pk8020_state::devices_w),state)); | |
476 | space.install_read_handler (0xfe00, 0xfeff, read8_delegate(FUNC(pk8020_state::devices_r),state)); | |
477 | space.install_write_handler(0xfe00, 0xfeff, write8_delegate(FUNC(pk8020_state::devices_w),state)); | |
478 | 478 | // System reg |
479 | space->install_read_handler (0xff00, 0xffff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
480 | space->install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
479 | space.install_read_handler (0xff00, 0xffff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
480 | space.install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
481 | 481 | } |
482 | 482 | break; |
483 | 483 | case 0x0E : |
484 | 484 | { |
485 | 485 | // ROM |
486 | space->install_read_bank (0x0000, 0x3fff, "bank1"); | |
487 | space->install_write_bank(0x0000, 0x3fff, "bank2"); | |
486 | space.install_read_bank (0x0000, 0x3fff, "bank1"); | |
487 | space.install_write_bank(0x0000, 0x3fff, "bank2"); | |
488 | 488 | state->membank("bank1")->set_base(mem + 0x10000); |
489 | 489 | state->membank("bank2")->set_base(ram + 0x0000); |
490 | 490 | // Video RAM |
491 | space->install_read_handler (0x4000, 0x7fff, read8_delegate(FUNC(pk8020_state::gzu_r),state)); | |
492 | space->install_write_handler(0x4000, 0x7fff, write8_delegate(FUNC(pk8020_state::gzu_w),state)); | |
491 | space.install_read_handler (0x4000, 0x7fff, read8_delegate(FUNC(pk8020_state::gzu_r),state)); | |
492 | space.install_write_handler(0x4000, 0x7fff, write8_delegate(FUNC(pk8020_state::gzu_w),state)); | |
493 | 493 | // RAM |
494 | space->install_read_bank (0x8000, 0xfdff, "bank5"); | |
495 | space->install_write_bank(0x8000, 0xfdff, "bank6"); | |
494 | space.install_read_bank (0x8000, 0xfdff, "bank5"); | |
495 | space.install_write_bank(0x8000, 0xfdff, "bank6"); | |
496 | 496 | state->membank("bank5")->set_base(ram + 0x8000); |
497 | 497 | state->membank("bank6")->set_base(ram + 0x8000); |
498 | 498 | // Devices |
499 | space->install_read_handler (0xfe00, 0xfeff, read8_delegate(FUNC(pk8020_state::devices_r),state)); | |
500 | space->install_write_handler(0xfe00, 0xfeff, write8_delegate(FUNC(pk8020_state::devices_w),state)); | |
499 | space.install_read_handler (0xfe00, 0xfeff, read8_delegate(FUNC(pk8020_state::devices_r),state)); | |
500 | space.install_write_handler(0xfe00, 0xfeff, write8_delegate(FUNC(pk8020_state::devices_w),state)); | |
501 | 501 | // System reg |
502 | space->install_read_handler (0xff00, 0xffff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
503 | space->install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
502 | space.install_read_handler (0xff00, 0xffff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
503 | space.install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
504 | 504 | } |
505 | 505 | break; |
506 | 506 | case 0x0F : |
507 | 507 | { |
508 | 508 | // RAM |
509 | space->install_read_bank (0x0000, 0x3fff, "bank1"); | |
510 | space->install_write_bank(0x0000, 0x3fff, "bank2"); | |
509 | space.install_read_bank (0x0000, 0x3fff, "bank1"); | |
510 | space.install_write_bank(0x0000, 0x3fff, "bank2"); | |
511 | 511 | state->membank("bank1")->set_base(ram + 0x0000); |
512 | 512 | state->membank("bank2")->set_base(ram + 0x0000); |
513 | 513 | // Video RAM |
514 | space->install_read_handler (0x4000, 0x7fff, read8_delegate(FUNC(pk8020_state::gzu_r),state)); | |
515 | space->install_write_handler(0x4000, 0x7fff, write8_delegate(FUNC(pk8020_state::gzu_w),state)); | |
514 | space.install_read_handler (0x4000, 0x7fff, read8_delegate(FUNC(pk8020_state::gzu_r),state)); | |
515 | space.install_write_handler(0x4000, 0x7fff, write8_delegate(FUNC(pk8020_state::gzu_w),state)); | |
516 | 516 | // RAM |
517 | space->install_read_bank (0x8000, 0xfdff, "bank3"); | |
518 | space->install_write_bank(0x8000, 0xfdff, "bank4"); | |
517 | space.install_read_bank (0x8000, 0xfdff, "bank3"); | |
518 | space.install_write_bank(0x8000, 0xfdff, "bank4"); | |
519 | 519 | state->membank("bank3")->set_base(ram + 0x8000); |
520 | 520 | state->membank("bank4")->set_base(ram + 0x8000); |
521 | 521 | // Devices |
522 | space->install_read_handler (0xfe00, 0xfeff, read8_delegate(FUNC(pk8020_state::devices_r),state)); | |
523 | space->install_write_handler(0xfe00, 0xfeff, write8_delegate(FUNC(pk8020_state::devices_w),state)); | |
522 | space.install_read_handler (0xfe00, 0xfeff, read8_delegate(FUNC(pk8020_state::devices_r),state)); | |
523 | space.install_write_handler(0xfe00, 0xfeff, write8_delegate(FUNC(pk8020_state::devices_w),state)); | |
524 | 524 | // System reg |
525 | space->install_read_handler (0xff00, 0xffff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
526 | space->install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
525 | space.install_read_handler (0xff00, 0xffff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
526 | space.install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
527 | 527 | } |
528 | 528 | break; |
529 | 529 | case 0x10 : |
530 | 530 | { |
531 | 531 | // ROM |
532 | space->install_read_bank (0x0000, 0x5fff, "bank1"); | |
533 | space->install_write_bank(0x0000, 0x5fff, "bank2"); | |
532 | space.install_read_bank (0x0000, 0x5fff, "bank1"); | |
533 | space.install_write_bank(0x0000, 0x5fff, "bank2"); | |
534 | 534 | state->membank("bank1")->set_base(mem + 0x10000); |
535 | 535 | state->membank("bank2")->set_base(ram + 0x0000); |
536 | 536 | // RAM |
537 | space->install_read_bank (0x6000, 0xf7ff, "bank3"); | |
538 | space->install_write_bank(0x6000, 0xf7ff, "bank4"); | |
537 | space.install_read_bank (0x6000, 0xf7ff, "bank3"); | |
538 | space.install_write_bank(0x6000, 0xf7ff, "bank4"); | |
539 | 539 | state->membank("bank3")->set_base(ram + 0x6000); |
540 | 540 | state->membank("bank4")->set_base(ram + 0x6000); |
541 | 541 | // Keyboard |
542 | space->install_read_handler (0xf800, 0xf9ff, read8_delegate(FUNC(pk8020_state::keyboard_r),state)); | |
543 | space->install_write_bank(0xf800, 0xf9ff, "bank5"); | |
542 | space.install_read_handler (0xf800, 0xf9ff, read8_delegate(FUNC(pk8020_state::keyboard_r),state)); | |
543 | space.install_write_bank(0xf800, 0xf9ff, "bank5"); | |
544 | 544 | state->membank("bank5")->set_base(ram + 0xf800); |
545 | 545 | // System reg |
546 | space->install_read_handler (0xfa00, 0xfaff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
547 | space->install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
546 | space.install_read_handler (0xfa00, 0xfaff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
547 | space.install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
548 | 548 | // Devices |
549 | space->install_read_handler (0xfb00, 0xfbff, read8_delegate(FUNC(pk8020_state::devices_r),state)); | |
550 | space->install_write_handler(0xfb00, 0xfbff, write8_delegate(FUNC(pk8020_state::devices_w),state)); | |
549 | space.install_read_handler (0xfb00, 0xfbff, read8_delegate(FUNC(pk8020_state::devices_r),state)); | |
550 | space.install_write_handler(0xfb00, 0xfbff, write8_delegate(FUNC(pk8020_state::devices_w),state)); | |
551 | 551 | // Text Video Memory |
552 | space->install_read_handler (0xfc00, 0xffff, read8_delegate(FUNC(pk8020_state::text_r),state)); | |
553 | space->install_write_handler(0xfc00, 0xffff, write8_delegate(FUNC(pk8020_state::text_w),state)); | |
552 | space.install_read_handler (0xfc00, 0xffff, read8_delegate(FUNC(pk8020_state::text_r),state)); | |
553 | space.install_write_handler(0xfc00, 0xffff, write8_delegate(FUNC(pk8020_state::text_w),state)); | |
554 | 554 | } |
555 | 555 | break; |
556 | 556 | case 0x11 : |
557 | 557 | { |
558 | 558 | // ROM |
559 | space->install_read_bank (0x0000, 0x1fff, "bank1"); | |
560 | space->install_write_bank(0x0000, 0x1fff, "bank2"); | |
559 | space.install_read_bank (0x0000, 0x1fff, "bank1"); | |
560 | space.install_write_bank(0x0000, 0x1fff, "bank2"); | |
561 | 561 | state->membank("bank1")->set_base(mem + 0x10000); |
562 | 562 | state->membank("bank2")->set_base(ram + 0x0000); |
563 | 563 | // RAM |
564 | space->install_read_bank (0x2000, 0xf7ff, "bank3"); | |
565 | space->install_write_bank(0x2000, 0xf7ff, "bank4"); | |
564 | space.install_read_bank (0x2000, 0xf7ff, "bank3"); | |
565 | space.install_write_bank(0x2000, 0xf7ff, "bank4"); | |
566 | 566 | state->membank("bank3")->set_base(ram + 0x2000); |
567 | 567 | state->membank("bank4")->set_base(ram + 0x2000); |
568 | 568 | // Keyboard |
569 | space->install_read_handler (0xf800, 0xf9ff, read8_delegate(FUNC(pk8020_state::keyboard_r),state)); | |
570 | space->install_write_bank(0xf800, 0xf9ff, "bank5"); | |
569 | space.install_read_handler (0xf800, 0xf9ff, read8_delegate(FUNC(pk8020_state::keyboard_r),state)); | |
570 | space.install_write_bank(0xf800, 0xf9ff, "bank5"); | |
571 | 571 | state->membank("bank5")->set_base(ram + 0xf800); |
572 | 572 | // System reg |
573 | space->install_read_handler (0xfa00, 0xfaff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
574 | space->install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
573 | space.install_read_handler (0xfa00, 0xfaff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
574 | space.install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
575 | 575 | // Devices |
576 | space->install_read_handler (0xfb00, 0xfbff, read8_delegate(FUNC(pk8020_state::devices_r),state)); | |
577 | space->install_write_handler(0xfb00, 0xfbff, write8_delegate(FUNC(pk8020_state::devices_w),state)); | |
576 | space.install_read_handler (0xfb00, 0xfbff, read8_delegate(FUNC(pk8020_state::devices_r),state)); | |
577 | space.install_write_handler(0xfb00, 0xfbff, write8_delegate(FUNC(pk8020_state::devices_w),state)); | |
578 | 578 | // Text Video Memory |
579 | space->install_read_handler (0xfc00, 0xffff, read8_delegate(FUNC(pk8020_state::text_r),state)); | |
580 | space->install_write_handler(0xfc00, 0xffff, write8_delegate(FUNC(pk8020_state::text_w),state)); | |
579 | space.install_read_handler (0xfc00, 0xffff, read8_delegate(FUNC(pk8020_state::text_r),state)); | |
580 | space.install_write_handler(0xfc00, 0xffff, write8_delegate(FUNC(pk8020_state::text_w),state)); | |
581 | 581 | } |
582 | 582 | break; |
583 | 583 | case 0x12 : |
584 | 584 | { |
585 | 585 | // ROM |
586 | space->install_read_bank (0x0000, 0x3fff, "bank1"); | |
587 | space->install_write_bank(0x0000, 0x3fff, "bank2"); | |
586 | space.install_read_bank (0x0000, 0x3fff, "bank1"); | |
587 | space.install_write_bank(0x0000, 0x3fff, "bank2"); | |
588 | 588 | state->membank("bank1")->set_base(mem + 0x10000); |
589 | 589 | state->membank("bank2")->set_base(ram + 0x0000); |
590 | 590 | // RAM |
591 | space->install_read_bank (0x4000, 0xf7ff, "bank3"); | |
592 | space->install_write_bank(0x4000, 0xf7ff, "bank4"); | |
591 | space.install_read_bank (0x4000, 0xf7ff, "bank3"); | |
592 | space.install_write_bank(0x4000, 0xf7ff, "bank4"); | |
593 | 593 | state->membank("bank3")->set_base(ram + 0x4000); |
594 | 594 | state->membank("bank4")->set_base(ram + 0x4000); |
595 | 595 | // Keyboard |
596 | space->install_read_handler (0xf800, 0xf9ff, read8_delegate(FUNC(pk8020_state::keyboard_r),state)); | |
597 | space->install_write_bank(0xf800, 0xf9ff, "bank5"); | |
596 | space.install_read_handler (0xf800, 0xf9ff, read8_delegate(FUNC(pk8020_state::keyboard_r),state)); | |
597 | space.install_write_bank(0xf800, 0xf9ff, "bank5"); | |
598 | 598 | state->membank("bank5")->set_base(ram + 0xf800); |
599 | 599 | // System reg |
600 | space->install_read_handler (0xfa00, 0xfaff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
601 | space->install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
600 | space.install_read_handler (0xfa00, 0xfaff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
601 | space.install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
602 | 602 | // Devices |
603 | space->install_read_handler (0xfb00, 0xfbff, read8_delegate(FUNC(pk8020_state::devices_r),state)); | |
604 | space->install_write_handler(0xfb00, 0xfbff, write8_delegate(FUNC(pk8020_state::devices_w),state)); | |
603 | space.install_read_handler (0xfb00, 0xfbff, read8_delegate(FUNC(pk8020_state::devices_r),state)); | |
604 | space.install_write_handler(0xfb00, 0xfbff, write8_delegate(FUNC(pk8020_state::devices_w),state)); | |
605 | 605 | // Text Video Memory |
606 | space->install_read_handler (0xfc00, 0xffff, read8_delegate(FUNC(pk8020_state::text_r),state)); | |
607 | space->install_write_handler(0xfc00, 0xffff, write8_delegate(FUNC(pk8020_state::text_w),state)); | |
606 | space.install_read_handler (0xfc00, 0xffff, read8_delegate(FUNC(pk8020_state::text_r),state)); | |
607 | space.install_write_handler(0xfc00, 0xffff, write8_delegate(FUNC(pk8020_state::text_w),state)); | |
608 | 608 | } |
609 | 609 | break; |
610 | 610 | case 0x13 : |
611 | 611 | { |
612 | 612 | // RAM |
613 | space->install_read_bank (0x0000, 0xf7ff, "bank1"); | |
614 | space->install_write_bank(0x0000, 0xf7ff, "bank2"); | |
613 | space.install_read_bank (0x0000, 0xf7ff, "bank1"); | |
614 | space.install_write_bank(0x0000, 0xf7ff, "bank2"); | |
615 | 615 | state->membank("bank1")->set_base(ram + 0x0000); |
616 | 616 | state->membank("bank2")->set_base(ram + 0x0000); |
617 | 617 | // Keyboard |
618 | space->install_read_handler (0xf800, 0xf9ff, read8_delegate(FUNC(pk8020_state::keyboard_r),state)); | |
619 | space->install_write_bank(0xf800, 0xf9ff, "bank3"); | |
618 | space.install_read_handler (0xf800, 0xf9ff, read8_delegate(FUNC(pk8020_state::keyboard_r),state)); | |
619 | space.install_write_bank(0xf800, 0xf9ff, "bank3"); | |
620 | 620 | state->membank("bank3")->set_base(ram + 0xf800); |
621 | 621 | // System reg |
622 | space->install_read_handler (0xfa00, 0xfaff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
623 | space->install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
622 | space.install_read_handler (0xfa00, 0xfaff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
623 | space.install_write_handler(0xfa00, 0xfaff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
624 | 624 | // Devices |
625 | space->install_read_handler (0xfb00, 0xfbff, read8_delegate(FUNC(pk8020_state::devices_r),state)); | |
626 | space->install_write_handler(0xfb00, 0xfbff, write8_delegate(FUNC(pk8020_state::devices_w),state)); | |
625 | space.install_read_handler (0xfb00, 0xfbff, read8_delegate(FUNC(pk8020_state::devices_r),state)); | |
626 | space.install_write_handler(0xfb00, 0xfbff, write8_delegate(FUNC(pk8020_state::devices_w),state)); | |
627 | 627 | // Text Video Memory |
628 | space->install_read_handler (0xfc00, 0xffff, read8_delegate(FUNC(pk8020_state::text_r),state)); | |
629 | space->install_write_handler(0xfc00, 0xffff, write8_delegate(FUNC(pk8020_state::text_w),state)); | |
628 | space.install_read_handler (0xfc00, 0xffff, read8_delegate(FUNC(pk8020_state::text_r),state)); | |
629 | space.install_write_handler(0xfc00, 0xffff, write8_delegate(FUNC(pk8020_state::text_w),state)); | |
630 | 630 | } |
631 | 631 | break; |
632 | 632 | case 0x14 : |
633 | 633 | { |
634 | 634 | // ROM |
635 | space->install_read_bank (0x0000, 0x5fff, "bank1"); | |
636 | space->install_write_bank(0x0000, 0x5fff, "bank2"); | |
635 | space.install_read_bank (0x0000, 0x5fff, "bank1"); | |
636 | space.install_write_bank(0x0000, 0x5fff, "bank2"); | |
637 | 637 | state->membank("bank1")->set_base(mem + 0x10000); |
638 | 638 | state->membank("bank2")->set_base(ram + 0x0000); |
639 | 639 | // RAM |
640 | space->install_read_bank (0x6000, 0xfdff, "bank3"); | |
641 | space->install_write_bank(0x6000, 0xfdff, "bank4"); | |
640 | space.install_read_bank (0x6000, 0xfdff, "bank3"); | |
641 | space.install_write_bank(0x6000, 0xfdff, "bank4"); | |
642 | 642 | state->membank("bank3")->set_base(ram + 0x6000); |
643 | 643 | state->membank("bank4")->set_base(ram + 0x6000); |
644 | 644 | // Devices |
645 | space->install_read_handler (0xfe00, 0xfeff, read8_delegate(FUNC(pk8020_state::devices_r),state)); | |
646 | space->install_write_handler(0xfe00, 0xfeff, write8_delegate(FUNC(pk8020_state::devices_w),state)); | |
645 | space.install_read_handler (0xfe00, 0xfeff, read8_delegate(FUNC(pk8020_state::devices_r),state)); | |
646 | space.install_write_handler(0xfe00, 0xfeff, write8_delegate(FUNC(pk8020_state::devices_w),state)); | |
647 | 647 | // System reg |
648 | space->install_read_handler (0xff00, 0xffff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
649 | space->install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
648 | space.install_read_handler (0xff00, 0xffff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
649 | space.install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
650 | 650 | } |
651 | 651 | break; |
652 | 652 | case 0x15 : |
653 | 653 | { |
654 | 654 | // ROM |
655 | space->install_read_bank (0x0000, 0x1fff, "bank1"); | |
656 | space->install_write_bank(0x0000, 0x1fff, "bank2"); | |
655 | space.install_read_bank (0x0000, 0x1fff, "bank1"); | |
656 | space.install_write_bank(0x0000, 0x1fff, "bank2"); | |
657 | 657 | state->membank("bank1")->set_base(mem + 0x10000); |
658 | 658 | state->membank("bank2")->set_base(ram + 0x0000); |
659 | 659 | // RAM |
660 | space->install_read_bank (0x2000, 0xfdff, "bank3"); | |
661 | space->install_write_bank(0x2000, 0xfdff, "bank4"); | |
660 | space.install_read_bank (0x2000, 0xfdff, "bank3"); | |
661 | space.install_write_bank(0x2000, 0xfdff, "bank4"); | |
662 | 662 | state->membank("bank3")->set_base(ram + 0x2000); |
663 | 663 | state->membank("bank4")->set_base(ram + 0x2000); |
664 | 664 | // Devices |
665 | space->install_read_handler (0xfe00, 0xfeff, read8_delegate(FUNC(pk8020_state::devices_r),state)); | |
666 | space->install_write_handler(0xfe00, 0xfeff, write8_delegate(FUNC(pk8020_state::devices_w),state)); | |
665 | space.install_read_handler (0xfe00, 0xfeff, read8_delegate(FUNC(pk8020_state::devices_r),state)); | |
666 | space.install_write_handler(0xfe00, 0xfeff, write8_delegate(FUNC(pk8020_state::devices_w),state)); | |
667 | 667 | // System reg |
668 | space->install_read_handler (0xff00, 0xffff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
669 | space->install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
668 | space.install_read_handler (0xff00, 0xffff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
669 | space.install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
670 | 670 | } |
671 | 671 | break; |
672 | 672 | case 0x16 : |
673 | 673 | { |
674 | 674 | // ROM |
675 | space->install_read_bank (0x0000, 0x3fff, "bank1"); | |
676 | space->install_write_bank(0x0000, 0x3fff, "bank2"); | |
675 | space.install_read_bank (0x0000, 0x3fff, "bank1"); | |
676 | space.install_write_bank(0x0000, 0x3fff, "bank2"); | |
677 | 677 | state->membank("bank1")->set_base(mem + 0x10000); |
678 | 678 | state->membank("bank2")->set_base(ram + 0x0000); |
679 | 679 | // RAM |
680 | space->install_read_bank (0x4000, 0xfdff, "bank3"); | |
681 | space->install_write_bank(0x4000, 0xfdff, "bank4"); | |
680 | space.install_read_bank (0x4000, 0xfdff, "bank3"); | |
681 | space.install_write_bank(0x4000, 0xfdff, "bank4"); | |
682 | 682 | state->membank("bank3")->set_base(ram + 0x4000); |
683 | 683 | state->membank("bank4")->set_base(ram + 0x4000); |
684 | 684 | // Devices |
685 | space->install_read_handler (0xfe00, 0xfeff, read8_delegate(FUNC(pk8020_state::devices_r),state)); | |
686 | space->install_write_handler(0xfe00, 0xfeff, write8_delegate(FUNC(pk8020_state::devices_w),state)); | |
685 | space.install_read_handler (0xfe00, 0xfeff, read8_delegate(FUNC(pk8020_state::devices_r),state)); | |
686 | space.install_write_handler(0xfe00, 0xfeff, write8_delegate(FUNC(pk8020_state::devices_w),state)); | |
687 | 687 | // System reg |
688 | space->install_read_handler (0xff00, 0xffff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
689 | space->install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
688 | space.install_read_handler (0xff00, 0xffff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
689 | space.install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
690 | 690 | } |
691 | 691 | break; |
692 | 692 | case 0x17 : |
693 | 693 | { |
694 | 694 | // RAM |
695 | space->install_read_bank (0x0000, 0xfdff, "bank1"); | |
696 | space->install_write_bank(0x0000, 0xfdff, "bank2"); | |
695 | space.install_read_bank (0x0000, 0xfdff, "bank1"); | |
696 | space.install_write_bank(0x0000, 0xfdff, "bank2"); | |
697 | 697 | state->membank("bank1")->set_base(ram); |
698 | 698 | state->membank("bank2")->set_base(ram); |
699 | 699 | // Devices |
700 | space->install_read_handler (0xfe00, 0xfeff, read8_delegate(FUNC(pk8020_state::devices_r),state)); | |
701 | space->install_write_handler(0xfe00, 0xfeff, write8_delegate(FUNC(pk8020_state::devices_w),state)); | |
700 | space.install_read_handler (0xfe00, 0xfeff, read8_delegate(FUNC(pk8020_state::devices_r),state)); | |
701 | space.install_write_handler(0xfe00, 0xfeff, write8_delegate(FUNC(pk8020_state::devices_w),state)); | |
702 | 702 | // System reg |
703 | space->install_read_handler (0xff00, 0xffff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
704 | space->install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
703 | space.install_read_handler (0xff00, 0xffff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
704 | space.install_write_handler(0xff00, 0xffff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
705 | 705 | } |
706 | 706 | break; |
707 | 707 | case 0x18 : |
708 | 708 | { |
709 | 709 | // ROM |
710 | space->install_read_bank (0x0000, 0x5fff, "bank1"); | |
711 | space->install_write_bank(0x0000, 0x5fff, "bank2"); | |
710 | space.install_read_bank (0x0000, 0x5fff, "bank1"); | |
711 | space.install_write_bank(0x0000, 0x5fff, "bank2"); | |
712 | 712 | state->membank("bank1")->set_base(mem + 0x10000); |
713 | 713 | state->membank("bank2")->set_base(ram + 0x0000); |
714 | 714 | // RAM |
715 | space->install_read_bank (0x6000, 0xbeff, "bank3"); | |
716 | space->install_write_bank(0x6000, 0xbeff, "bank4"); | |
715 | space.install_read_bank (0x6000, 0xbeff, "bank3"); | |
716 | space.install_write_bank(0x6000, 0xbeff, "bank4"); | |
717 | 717 | state->membank("bank3")->set_base(ram + 0x6000); |
718 | 718 | state->membank("bank4")->set_base(ram + 0x6000); |
719 | 719 | // System reg |
720 | space->install_read_handler (0xbf00, 0xbfff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
721 | space->install_write_handler(0xbf00, 0xbfff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
720 | space.install_read_handler (0xbf00, 0xbfff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
721 | space.install_write_handler(0xbf00, 0xbfff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
722 | 722 | // Video RAM |
723 | space->install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),state)); | |
724 | space->install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),state)); | |
723 | space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),state)); | |
724 | space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),state)); | |
725 | 725 | } |
726 | 726 | break; |
727 | 727 | case 0x19 : |
728 | 728 | { |
729 | 729 | // ROM |
730 | space->install_read_bank (0x0000, 0x1fff, "bank1"); | |
731 | space->install_write_bank(0x0000, 0x1fff, "bank2"); | |
730 | space.install_read_bank (0x0000, 0x1fff, "bank1"); | |
731 | space.install_write_bank(0x0000, 0x1fff, "bank2"); | |
732 | 732 | state->membank("bank1")->set_base(mem + 0x10000); |
733 | 733 | state->membank("bank2")->set_base(ram + 0x0000); |
734 | 734 | // RAM |
735 | space->install_read_bank (0x2000, 0xbeff, "bank3"); | |
736 | space->install_write_bank(0x2000, 0xbeff, "bank4"); | |
735 | space.install_read_bank (0x2000, 0xbeff, "bank3"); | |
736 | space.install_write_bank(0x2000, 0xbeff, "bank4"); | |
737 | 737 | state->membank("bank3")->set_base(ram + 0x2000); |
738 | 738 | state->membank("bank4")->set_base(ram + 0x2000); |
739 | 739 | // System reg |
740 | space->install_read_handler (0xbf00, 0xbfff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
741 | space->install_write_handler(0xbf00, 0xbfff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
740 | space.install_read_handler (0xbf00, 0xbfff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
741 | space.install_write_handler(0xbf00, 0xbfff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
742 | 742 | // Video RAM |
743 | space->install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),state)); | |
744 | space->install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),state)); | |
743 | space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),state)); | |
744 | space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),state)); | |
745 | 745 | } |
746 | 746 | break; |
747 | 747 | case 0x1A : |
748 | 748 | { |
749 | 749 | // ROM |
750 | space->install_read_bank (0x0000, 0x3fff, "bank1"); | |
751 | space->install_write_bank(0x0000, 0x3fff, "bank2"); | |
750 | space.install_read_bank (0x0000, 0x3fff, "bank1"); | |
751 | space.install_write_bank(0x0000, 0x3fff, "bank2"); | |
752 | 752 | state->membank("bank1")->set_base(mem + 0x10000); |
753 | 753 | state->membank("bank2")->set_base(ram + 0x0000); |
754 | 754 | // RAM |
755 | space->install_read_bank (0x4000, 0xbeff, "bank3"); | |
756 | space->install_write_bank(0x4000, 0xbeff, "bank4"); | |
755 | space.install_read_bank (0x4000, 0xbeff, "bank3"); | |
756 | space.install_write_bank(0x4000, 0xbeff, "bank4"); | |
757 | 757 | state->membank("bank3")->set_base(ram + 0x4000); |
758 | 758 | state->membank("bank4")->set_base(ram + 0x4000); |
759 | 759 | // System reg |
760 | space->install_read_handler (0xbf00, 0xbfff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
761 | space->install_write_handler(0xbf00, 0xbfff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
760 | space.install_read_handler (0xbf00, 0xbfff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
761 | space.install_write_handler(0xbf00, 0xbfff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
762 | 762 | // Video RAM |
763 | space->install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),state)); | |
764 | space->install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),state)); | |
763 | space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),state)); | |
764 | space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),state)); | |
765 | 765 | } |
766 | 766 | break; |
767 | 767 | case 0x1B : |
768 | 768 | { |
769 | 769 | // RAM |
770 | space->install_read_bank (0x0000, 0xbeff, "bank1"); | |
771 | space->install_write_bank(0x0000, 0xbeff, "bank2"); | |
770 | space.install_read_bank (0x0000, 0xbeff, "bank1"); | |
771 | space.install_write_bank(0x0000, 0xbeff, "bank2"); | |
772 | 772 | state->membank("bank1")->set_base(ram); |
773 | 773 | state->membank("bank2")->set_base(ram); |
774 | 774 | // System reg |
775 | space->install_read_handler (0xbf00, 0xbfff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
776 | space->install_write_handler(0xbf00, 0xbfff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
775 | space.install_read_handler (0xbf00, 0xbfff, read8_delegate(FUNC(pk8020_state::sysreg_r),state)); | |
776 | space.install_write_handler(0xbf00, 0xbfff, write8_delegate(FUNC(pk8020_state::sysreg_w),state)); | |
777 | 777 | // Video RAM |
778 | space->install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),state)); | |
779 | space->install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),state)); | |
778 | space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),state)); | |
779 | space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),state)); | |
780 | 780 | } |
781 | 781 | break; |
782 | 782 | case 0x1C : |
783 | 783 | { |
784 | 784 | // ROM |
785 | space->install_read_bank (0x0000, 0x5fff, "bank1"); | |
786 | space->install_write_bank(0x0000, 0x5fff, "bank2"); | |
785 | space.install_read_bank (0x0000, 0x5fff, "bank1"); | |
786 | space.install_write_bank(0x0000, 0x5fff, "bank2"); | |
787 | 787 | state->membank("bank1")->set_base(mem + 0x10000); |
788 | 788 | state->membank("bank2")->set_base(ram + 0x0000); |
789 | 789 | // RAM |
790 | space->install_read_bank (0x6000, 0xbfff, "bank3"); | |
791 | space->install_write_bank(0x6000, 0xbfff, "bank4"); | |
790 | space.install_read_bank (0x6000, 0xbfff, "bank3"); | |
791 | space.install_write_bank(0x6000, 0xbfff, "bank4"); | |
792 | 792 | state->membank("bank3")->set_base(ram + 0x6000); |
793 | 793 | state->membank("bank4")->set_base(ram + 0x6000); |
794 | 794 | // Video RAM |
795 | space->install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),state)); | |
796 | space->install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),state)); | |
795 | space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),state)); | |
796 | space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),state)); | |
797 | 797 | } |
798 | 798 | break; |
799 | 799 | case 0x1D : |
800 | 800 | { |
801 | 801 | // ROM |
802 | space->install_read_bank (0x0000, 0x1fff, "bank1"); | |
803 | space->install_write_bank(0x0000, 0x1fff, "bank2"); | |
802 | space.install_read_bank (0x0000, 0x1fff, "bank1"); | |
803 | space.install_write_bank(0x0000, 0x1fff, "bank2"); | |
804 | 804 | state->membank("bank1")->set_base(mem + 0x10000); |
805 | 805 | state->membank("bank2")->set_base(ram + 0x0000); |
806 | 806 | // RAM |
807 | space->install_read_bank (0x2000, 0xbfff, "bank3"); | |
808 | space->install_write_bank(0x2000, 0xbfff, "bank4"); | |
807 | space.install_read_bank (0x2000, 0xbfff, "bank3"); | |
808 | space.install_write_bank(0x2000, 0xbfff, "bank4"); | |
809 | 809 | state->membank("bank3")->set_base(ram + 0x2000); |
810 | 810 | state->membank("bank4")->set_base(ram + 0x2000); |
811 | 811 | // Video RAM |
812 | space->install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),state)); | |
813 | space->install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),state)); | |
812 | space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),state)); | |
813 | space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),state)); | |
814 | 814 | } |
815 | 815 | break; |
816 | 816 | case 0x1E : |
817 | 817 | { |
818 | 818 | // ROM |
819 | space->install_read_bank (0x0000, 0x3fff, "bank1"); | |
820 | space->install_write_bank(0x0000, 0x3fff, "bank2"); | |
819 | space.install_read_bank (0x0000, 0x3fff, "bank1"); | |
820 | space.install_write_bank(0x0000, 0x3fff, "bank2"); | |
821 | 821 | state->membank("bank1")->set_base(mem + 0x10000); |
822 | 822 | state->membank("bank2")->set_base(ram + 0x0000); |
823 | 823 | // RAM |
824 | space->install_read_bank (0x4000, 0xbfff, "bank3"); | |
825 | space->install_write_bank(0x4000, 0xbfff, "bank4"); | |
824 | space.install_read_bank (0x4000, 0xbfff, "bank3"); | |
825 | space.install_write_bank(0x4000, 0xbfff, "bank4"); | |
826 | 826 | state->membank("bank3")->set_base(ram + 0x4000); |
827 | 827 | state->membank("bank4")->set_base(ram + 0x4000); |
828 | 828 | // Video RAM |
829 | space->install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),state)); | |
830 | space->install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),state)); | |
829 | space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),state)); | |
830 | space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),state)); | |
831 | 831 | } |
832 | 832 | break; |
833 | 833 | case 0x1F : |
834 | 834 | { |
835 | 835 | // RAM |
836 | space->install_read_bank (0x0000, 0xbfff, "bank1"); | |
837 | space->install_write_bank(0x0000, 0xbfff, "bank2"); | |
836 | space.install_read_bank (0x0000, 0xbfff, "bank1"); | |
837 | space.install_write_bank(0x0000, 0xbfff, "bank2"); | |
838 | 838 | state->membank("bank1")->set_base(ram); |
839 | 839 | state->membank("bank2")->set_base(ram); |
840 | 840 | // Video RAM |
841 | space->install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),state)); | |
842 | space->install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),state)); | |
841 | space.install_read_handler (0xc000, 0xffff, read8_delegate(FUNC(pk8020_state::gzu_r),state)); | |
842 | space.install_write_handler(0xc000, 0xffff, write8_delegate(FUNC(pk8020_state::gzu_w),state)); | |
843 | 843 | } |
844 | 844 | break; |
845 | 845 |
r17963 | r17964 | |
---|---|---|
61 | 61 | datasize = image.length() - 128; |
62 | 62 | } |
63 | 63 | |
64 | address_space | |
64 | address_space &space = *state->m_maincpu->space( AS_PROGRAM ); | |
65 | 65 | |
66 | 66 | for (i=0; i<datasize; i++) |
67 | space | |
67 | space.write_byte((addr+i) & 0xffff, data[i+128]); | |
68 | 68 | |
69 | 69 | if (execution_address != 0 && header->number_addresses >= 3 ) |
70 | 70 | { |
r17963 | r17964 | |
290 | 290 | /* update status of memory area 0x0000-0x03fff */ |
291 | 291 | void kc_state::update_0x00000() |
292 | 292 | { |
293 | address_space | |
293 | address_space &space = *m_maincpu->space( AS_PROGRAM ); | |
294 | 294 | |
295 | 295 | /* access ram? */ |
296 | 296 | if (m_pio_data[0] & (1<<1)) |
r17963 | r17964 | |
298 | 298 | LOG(("ram0 enabled\n")); |
299 | 299 | |
300 | 300 | /* yes; set address of bank */ |
301 | space | |
301 | space.install_read_bank(0x0000, 0x3fff, "bank1"); | |
302 | 302 | membank("bank1")->set_base(m_ram_base); |
303 | 303 | |
304 | 304 | /* write protect ram? */ |
r17963 | r17964 | |
308 | 308 | LOG(("ram0 write protected\n")); |
309 | 309 | |
310 | 310 | /* ram is enabled and write protected */ |
311 | space | |
311 | space.unmap_write(0x0000, 0x3fff); | |
312 | 312 | } |
313 | 313 | else |
314 | 314 | { |
315 | 315 | LOG(("ram0 write enabled\n")); |
316 | 316 | |
317 | 317 | /* ram is enabled and write enabled */ |
318 | space | |
318 | space.install_write_bank(0x0000, 0x3fff, "bank1"); | |
319 | 319 | } |
320 | 320 | } |
321 | 321 | else |
322 | 322 | { |
323 | 323 | LOG(("Module at 0x0000\n")); |
324 | 324 | |
325 | space->install_read_handler (0x0000, 0x3fff, 0, 0, read8_delegate(FUNC(kc_state::expansion_read), this), 0); | |
326 | space->install_write_handler(0x0000, 0x3fff, 0, 0, write8_delegate(FUNC(kc_state::expansion_write), this), 0); | |
325 | space.install_read_handler (0x0000, 0x3fff, 0, 0, read8_delegate(FUNC(kc_state::expansion_read), this), 0); | |
326 | space.install_write_handler(0x0000, 0x3fff, 0, 0, write8_delegate(FUNC(kc_state::expansion_write), this), 0); | |
327 | 327 | } |
328 | 328 | } |
329 | 329 | |
330 | 330 | /* update status of memory area 0x4000-0x07fff */ |
331 | 331 | void kc_state::update_0x04000() |
332 | 332 | { |
333 | address_space | |
333 | address_space &space = *m_maincpu->space( AS_PROGRAM ); | |
334 | 334 | |
335 | 335 | LOG(("Module at 0x4000\n")); |
336 | 336 | |
337 | space->install_read_handler (0x4000, 0x7fff, 0, 0, read8_delegate(FUNC(kc_state::expansion_4000_r), this), 0); | |
338 | space->install_write_handler(0x4000, 0x7fff, 0, 0, write8_delegate(FUNC(kc_state::expansion_4000_w), this), 0); | |
337 | space.install_read_handler (0x4000, 0x7fff, 0, 0, read8_delegate(FUNC(kc_state::expansion_4000_r), this), 0); | |
338 | space.install_write_handler(0x4000, 0x7fff, 0, 0, write8_delegate(FUNC(kc_state::expansion_4000_w), this), 0); | |
339 | 339 | |
340 | 340 | } |
341 | 341 | |
r17963 | r17964 | |
343 | 343 | /* update memory address 0x0c000-0x0e000 */ |
344 | 344 | void kc_state::update_0x0c000() |
345 | 345 | { |
346 | address_space | |
346 | address_space &space = *m_maincpu->space( AS_PROGRAM ); | |
347 | 347 | |
348 | 348 | if ((m_pio_data[0] & (1<<7)) && memregion("basic")->base() != NULL) |
349 | 349 | { |
r17963 | r17964 | |
351 | 351 | LOG(("BASIC rom 0x0c000\n")); |
352 | 352 | |
353 | 353 | membank("bank4")->set_base(memregion("basic")->base()); |
354 | space->install_read_bank(0xc000, 0xdfff, "bank4"); | |
355 | space->unmap_write(0xc000, 0xdfff); | |
354 | space.install_read_bank(0xc000, 0xdfff, "bank4"); | |
355 | space.unmap_write(0xc000, 0xdfff); | |
356 | 356 | } |
357 | 357 | else |
358 | 358 | { |
359 | 359 | LOG(("Module at 0x0c000\n")); |
360 | 360 | |
361 | space->install_read_handler (0xc000, 0xdfff, 0, 0, read8_delegate(FUNC(kc_state::expansion_c000_r), this), 0); | |
362 | space->install_write_handler(0xc000, 0xdfff, 0, 0, write8_delegate(FUNC(kc_state::expansion_c000_w), this), 0); | |
361 | space.install_read_handler (0xc000, 0xdfff, 0, 0, read8_delegate(FUNC(kc_state::expansion_c000_r), this), 0); | |
362 | space.install_write_handler(0xc000, 0xdfff, 0, 0, write8_delegate(FUNC(kc_state::expansion_c000_w), this), 0); | |
363 | 363 | } |
364 | 364 | } |
365 | 365 | |
366 | 366 | /* update memory address 0x0e000-0x0ffff */ |
367 | 367 | void kc_state::update_0x0e000() |
368 | 368 | { |
369 | address_space | |
369 | address_space &space = *m_maincpu->space( AS_PROGRAM ); | |
370 | 370 | |
371 | 371 | if (m_pio_data[0] & (1<<0)) |
372 | 372 | { |
r17963 | r17964 | |
374 | 374 | LOG(("CAOS rom 0x0e000\n")); |
375 | 375 | /* read will access the rom */ |
376 | 376 | membank("bank5")->set_base(memregion("caos")->base() + 0x2000); |
377 | space->install_read_bank(0xe000, 0xffff, "bank5"); | |
378 | space->unmap_write(0xe000, 0xffff); | |
377 | space.install_read_bank(0xe000, 0xffff, "bank5"); | |
378 | space.unmap_write(0xe000, 0xffff); | |
379 | 379 | } |
380 | 380 | else |
381 | 381 | { |
382 | 382 | LOG(("Module at 0x0e000\n")); |
383 | 383 | |
384 | space->install_read_handler (0xe000, 0xffff, 0, 0, read8_delegate(FUNC(kc_state::expansion_e000_r), this), 0); | |
385 | space->install_write_handler(0xe000, 0xffff, 0, 0, write8_delegate(FUNC(kc_state::expansion_e000_w), this), 0); | |
384 | space.install_read_handler (0xe000, 0xffff, 0, 0, read8_delegate(FUNC(kc_state::expansion_e000_r), this), 0); | |
385 | space.install_write_handler(0xe000, 0xffff, 0, 0, write8_delegate(FUNC(kc_state::expansion_e000_w), this), 0); | |
386 | 386 | } |
387 | 387 | } |
388 | 388 | |
r17963 | r17964 | |
390 | 390 | /* update status of memory area 0x08000-0x0ffff */ |
391 | 391 | void kc_state::update_0x08000() |
392 | 392 | { |
393 | address_space | |
393 | address_space &space = *m_maincpu->space( AS_PROGRAM ); | |
394 | 394 | |
395 | 395 | if (m_pio_data[0] & (1<<2)) |
396 | 396 | { |
r17963 | r17964 | |
398 | 398 | LOG(("IRM enabled\n")); |
399 | 399 | |
400 | 400 | membank("bank3")->set_base(m_video_ram); |
401 | space | |
401 | space.install_readwrite_bank(0x8000, 0xbfff, "bank3"); | |
402 | 402 | } |
403 | 403 | else |
404 | 404 | { |
405 | 405 | LOG(("Module at 0x8000!\n")); |
406 | 406 | |
407 | space->install_read_handler(0x8000, 0xbfff, 0, 0, read8_delegate(FUNC(kc_state::expansion_8000_r), this), 0); | |
408 | space->install_write_handler(0x8000, 0xbfff, 0, 0, write8_delegate(FUNC(kc_state::expansion_8000_w), this), 0); | |
407 | space.install_read_handler(0x8000, 0xbfff, 0, 0, read8_delegate(FUNC(kc_state::expansion_8000_r), this), 0); | |
408 | space.install_write_handler(0x8000, 0xbfff, 0, 0, write8_delegate(FUNC(kc_state::expansion_8000_w), this), 0); | |
409 | 409 | } |
410 | 410 | } |
411 | 411 | |
r17963 | r17964 | |
413 | 413 | /* update status of memory area 0x4000-0x07fff */ |
414 | 414 | void kc85_4_state::update_0x04000() |
415 | 415 | { |
416 | address_space | |
416 | address_space &space = *m_maincpu->space( AS_PROGRAM ); | |
417 | 417 | |
418 | 418 | /* access ram? */ |
419 | 419 | if (m_port_86_data & (1<<0)) |
r17963 | r17964 | |
421 | 421 | LOG(("RAM4 enabled\n")); |
422 | 422 | |
423 | 423 | /* yes */ |
424 | space | |
424 | space.install_read_bank(0x4000, 0x7fff, "bank2"); | |
425 | 425 | /* set address of bank */ |
426 | 426 | membank("bank2")->set_base(m_ram_base + 0x4000); |
427 | 427 | |
r17963 | r17964 | |
432 | 432 | LOG(("ram4 write protected\n")); |
433 | 433 | |
434 | 434 | /* ram is enabled and write protected */ |
435 | space | |
435 | space.nop_write(0x4000, 0x7fff); | |
436 | 436 | } |
437 | 437 | else |
438 | 438 | { |
439 | 439 | LOG(("ram4 write enabled\n")); |
440 | 440 | |
441 | 441 | /* ram is enabled and write enabled */ |
442 | space | |
442 | space.install_write_bank(0x4000, 0x7fff, "bank2"); | |
443 | 443 | } |
444 | 444 | } |
445 | 445 | else |
446 | 446 | { |
447 | 447 | LOG(("Module at 0x4000\n")); |
448 | 448 | |
449 | space->install_read_handler (0x4000, 0x7fff, 0, 0, read8_delegate(FUNC(kc_state::expansion_4000_r), this), 0); | |
450 | space->install_write_handler(0x4000, 0x7fff, 0, 0, write8_delegate(FUNC(kc_state::expansion_4000_w), this), 0); | |
449 | space.install_read_handler (0x4000, 0x7fff, 0, 0, read8_delegate(FUNC(kc_state::expansion_4000_r), this), 0); | |
450 | space.install_write_handler(0x4000, 0x7fff, 0, 0, write8_delegate(FUNC(kc_state::expansion_4000_w), this), 0); | |
451 | 451 | } |
452 | 452 | |
453 | 453 | } |
r17963 | r17964 | |
455 | 455 | /* update memory address 0x0c000-0x0e000 */ |
456 | 456 | void kc85_4_state::update_0x0c000() |
457 | 457 | { |
458 | address_space | |
458 | address_space &space = *m_maincpu->space( AS_PROGRAM ); | |
459 | 459 | |
460 | 460 | if (m_port_86_data & (1<<7)) |
461 | 461 | { |
r17963 | r17964 | |
463 | 463 | LOG(("CAOS rom 0x0c000\n")); |
464 | 464 | |
465 | 465 | membank("bank4")->set_base(memregion("caos")->base()); |
466 | space->install_read_bank(0xc000, 0xdfff, "bank4"); | |
467 | space->unmap_write(0xc000, 0xdfff); | |
466 | space.install_read_bank(0xc000, 0xdfff, "bank4"); | |
467 | space.unmap_write(0xc000, 0xdfff); | |
468 | 468 | } |
469 | 469 | else |
470 | 470 | { |
r17963 | r17964 | |
476 | 476 | int bank = memregion("basic")->bytes() == 0x8000 ? (m_port_86_data>>5) & 0x03 : 0; |
477 | 477 | |
478 | 478 | membank("bank4")->set_base(memregion("basic")->base() + (bank << 13)); |
479 | space->install_read_bank(0xc000, 0xdfff, "bank4"); | |
480 | space->unmap_write(0xc000, 0xdfff); | |
479 | space.install_read_bank(0xc000, 0xdfff, "bank4"); | |
480 | space.unmap_write(0xc000, 0xdfff); | |
481 | 481 | } |
482 | 482 | else |
483 | 483 | { |
484 | 484 | LOG(("Module at 0x0c000\n")); |
485 | 485 | |
486 | space->install_read_handler (0xc000, 0xdfff, 0, 0, read8_delegate(FUNC(kc_state::expansion_c000_r), this), 0); | |
487 | space->install_write_handler(0xc000, 0xdfff, 0, 0, write8_delegate(FUNC(kc_state::expansion_c000_w), this), 0); | |
486 | space.install_read_handler (0xc000, 0xdfff, 0, 0, read8_delegate(FUNC(kc_state::expansion_c000_r), this), 0); | |
487 | space.install_write_handler(0xc000, 0xdfff, 0, 0, write8_delegate(FUNC(kc_state::expansion_c000_w), this), 0); | |
488 | 488 | } |
489 | 489 | } |
490 | 490 | } |
491 | 491 | |
492 | 492 | void kc85_4_state::update_0x08000() |
493 | 493 | { |
494 | address_space | |
494 | address_space &space = *m_maincpu->space( AS_PROGRAM ); | |
495 | 495 | |
496 | 496 | if (m_pio_data[0] & (1<<2)) |
497 | 497 | { |
r17963 | r17964 | |
501 | 501 | UINT8* ram_page = m_video_ram + ((BIT(m_port_84_data, 2)<<15) | (BIT(m_port_84_data, 1)<<14)); |
502 | 502 | |
503 | 503 | membank("bank3")->set_base(ram_page); |
504 | space | |
504 | space.install_readwrite_bank(0x8000, 0xa7ff, "bank3"); | |
505 | 505 | |
506 | 506 | membank("bank6")->set_base(m_video_ram + 0x2800); |
507 | space | |
507 | space.install_readwrite_bank(0xa800, 0xbfff, "bank6"); | |
508 | 508 | } |
509 | 509 | else if (m_pio_data[1] & (1<<5)) |
510 | 510 | { |
r17963 | r17964 | |
530 | 530 | |
531 | 531 | membank("bank3")->set_base(mem_ptr); |
532 | 532 | membank("bank6")->set_base(mem_ptr + 0x2800); |
533 | space->install_read_bank(0x8000, 0xa7ff, "bank3"); | |
534 | space->install_read_bank(0xa800, 0xbfff, "bank6"); | |
533 | space.install_read_bank(0x8000, 0xa7ff, "bank3"); | |
534 | space.install_read_bank(0xa800, 0xbfff, "bank6"); | |
535 | 535 | |
536 | 536 | /* write protect RAM8 ? */ |
537 | 537 | if ((m_pio_data[1] & (1<<6)) == 0) |
r17963 | r17964 | |
539 | 539 | /* ram8 is enabled and write protected */ |
540 | 540 | LOG(("RAM8 write protected\n")); |
541 | 541 | |
542 | space->nop_write(0x8000, 0xa7ff); | |
543 | space->nop_write(0xa800, 0xbfff); | |
542 | space.nop_write(0x8000, 0xa7ff); | |
543 | space.nop_write(0xa800, 0xbfff); | |
544 | 544 | } |
545 | 545 | else |
546 | 546 | { |
547 | 547 | LOG(("RAM8 write enabled\n")); |
548 | 548 | |
549 | 549 | /* ram8 is enabled and write enabled */ |
550 | space->install_write_bank(0x8000, 0xa7ff, "bank3"); | |
551 | space->install_write_bank(0xa800, 0xbfff, "bank6"); | |
550 | space.install_write_bank(0x8000, 0xa7ff, "bank3"); | |
551 | space.install_write_bank(0xa800, 0xbfff, "bank6"); | |
552 | 552 | } |
553 | 553 | } |
554 | 554 | else |
555 | 555 | { |
556 | 556 | LOG(("Module at 0x8000\n")); |
557 | 557 | |
558 | space->install_read_handler(0x8000, 0xbfff, 0, 0, read8_delegate(FUNC(kc_state::expansion_8000_r), this), 0); | |
559 | space->install_write_handler(0x8000, 0xbfff, 0, 0, write8_delegate(FUNC(kc_state::expansion_8000_w), this), 0); | |
558 | space.install_read_handler(0x8000, 0xbfff, 0, 0, read8_delegate(FUNC(kc_state::expansion_8000_r), this), 0); | |
559 | space.install_write_handler(0x8000, 0xbfff, 0, 0, write8_delegate(FUNC(kc_state::expansion_8000_w), this), 0); | |
560 | 560 | } |
561 | 561 | } |
562 | 562 |
r17963 | r17964 | |
---|---|---|
92 | 92 | |
93 | 93 | /*----------- defined in machine/samcoupe.c -----------*/ |
94 | 94 | |
95 | void samcoupe_update_memory(address_space | |
95 | void samcoupe_update_memory(address_space &space); | |
96 | 96 | UINT8 samcoupe_mouse_r(running_machine &machine); |
97 | 97 | |
98 | 98 |
r17963 | r17964 | |
---|---|---|
6 | 6 | |
7 | 7 | READ16_MEMBER( intv_state::intv_stic_r ) |
8 | 8 | { |
9 | // intv_state *state = space | |
9 | // intv_state *state = space.machine().driver_data<intv_state>(); | |
10 | 10 | //logerror("%x = stic_r(%x)\n",0,offset); |
11 | 11 | if (m_bus_copy_mode || !m_stic_handshake) |
12 | 12 | { |
r17963 | r17964 | |
75 | 75 | |
76 | 76 | WRITE16_MEMBER( intv_state::intv_stic_w ) |
77 | 77 | { |
78 | //intv_state *state = space | |
78 | //intv_state *state = space.machine().driver_data<intv_state>(); | |
79 | 79 | intv_sprite_type *s; |
80 | 80 | |
81 | 81 | //logerror("stic_w(%x) = %x\n",offset,data); |
r17963 | r17964 | |
---|---|---|
298 | 298 | /* Write handler for colour, pallate ram */ |
299 | 299 | WRITE8_HANDLER(dgnbeta_colour_ram_w) |
300 | 300 | { |
301 | dgn_beta_state *state = space | |
301 | dgn_beta_state *state = space.machine().driver_data<dgn_beta_state>(); | |
302 | 302 | state->m_ColourRAM[offset]=data&0x0f; /* Colour ram 4 bit and write only to CPU */ |
303 | 303 | } |
r17963 | r17964 | |
---|---|---|
61 | 61 | //------------------------------------------------- |
62 | 62 | // device_start - device-specific startup |
63 | 63 | //------------------------------------------------- |
64 | static READ8_HANDLER( input_port_0_r ) { return 0xff; } //return space | |
64 | static READ8_HANDLER( input_port_0_r ) { return 0xff; } //return space.machine().root_device().ioport("IN0")->read(); } | |
65 | 65 | |
66 | 66 | void isa16_vga_gfxultra_device::device_start() |
67 | 67 | { |
r17963 | r17964 | |
---|---|---|
19 | 19 | |
20 | 20 | READ8_HANDLER(pc1401_lcd_read) |
21 | 21 | { |
22 | pc1401_state *state = space | |
22 | pc1401_state *state = space.machine().driver_data<pc1401_state>(); | |
23 | 23 | offset&=0xff; |
24 | 24 | return state->m_reg[offset]; |
25 | 25 | } |
26 | 26 | |
27 | 27 | WRITE8_HANDLER(pc1401_lcd_write) |
28 | 28 | { |
29 | pc1401_state *state = space | |
29 | pc1401_state *state = space.machine().driver_data<pc1401_state>(); | |
30 | 30 | offset&=0xff; |
31 | 31 | state->m_reg[offset]=data; |
32 | 32 | } |
r17963 | r17964 | |
---|---|---|
123 | 123 | data >>= 1 |
124 | 124 | |
125 | 125 | #define draw_quart \ |
126 | UINT8 data = space | |
126 | UINT8 data = space.read_byte( addr ); \ | |
127 | 127 | draw_pixel; draw_pixel; draw_pixel; draw_pixel; |
128 | 128 | |
129 | 129 | |
130 | 130 | SCREEN_UPDATE_IND16 ( hp48 ) |
131 | 131 | { |
132 | 132 | hp48_state *state = screen.machine().driver_data<hp48_state>(); |
133 | address_space | |
133 | address_space &space = *screen.machine().device("maincpu")->memory().space(AS_PROGRAM); | |
134 | 134 | int x, y, xp, i, addr; |
135 | 135 | int display = HP48_IO_4(0) >> 3; /* 1=on, 0=off */ |
136 | 136 | int left_margin = HP48_IO_4(0) & 7; /* 0..7 pixels for main bitmap */ |
r17963 | r17964 | |
---|---|---|
40 | 40 | void apple3_write_charmem(running_machine &machine) |
41 | 41 | { |
42 | 42 | apple3_state *state = machine.driver_data<apple3_state>(); |
43 | address_space | |
43 | address_space& space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
44 | 44 | static const UINT32 screen_hole_map[] = |
45 | 45 | { |
46 | 46 | 0x478, 0x4f8, 0x578, 0x5f8, 0x678, 0x6f8, 0x778, 0x7f8 |
r17963 | r17964 | |
52 | 52 | { |
53 | 53 | for (j = 0; j < 4; j++) |
54 | 54 | { |
55 | addr = 0x7f & space->read_byte(screen_hole_map[i] + 0x400 + j + 0); | |
56 | val = space->read_byte(screen_hole_map[i] + j + 0); | |
55 | addr = 0x7f & space.read_byte(screen_hole_map[i] + 0x400 + j + 0); | |
56 | val = space.read_byte(screen_hole_map[i] + j + 0); | |
57 | 57 | state->m_char_mem[((addr * 8) + ((i & 3) * 2) + 0) & 0x3ff] = val; |
58 | 58 | |
59 | addr = 0x7f & space->read_byte(screen_hole_map[i] + 0x400 + j + 4); | |
60 | val = space->read_byte(screen_hole_map[i] + j + 4); | |
59 | addr = 0x7f & space.read_byte(screen_hole_map[i] + 0x400 + j + 4); | |
60 | val = space.read_byte(screen_hole_map[i] + j + 4); | |
61 | 61 | state->m_char_mem[((addr * 8) + ((i & 3) * 2) + 1) & 0x3ff] = val; |
62 | 62 | } |
63 | 63 | } |
r17963 | r17964 | |
---|---|---|
247 | 247 | break; |
248 | 248 | |
249 | 249 | default: |
250 | // printf("cb264_w: %x to reg %x (mask %x PC %x)\n", data, offset*4, mem_mask, space | |
250 | // printf("cb264_w: %x to reg %x (mask %x PC %x)\n", data, offset*4, mem_mask, space.device().safe_pc()); | |
251 | 251 | break; |
252 | 252 | } |
253 | 253 | } |
r17963 | r17964 | |
---|---|---|
58 | 58 | SCREEN_UPDATE_IND16( dai ) |
59 | 59 | { |
60 | 60 | dai_state *state = screen.machine().driver_data<dai_state>(); |
61 | address_space | |
61 | address_space &space = *screen.machine().device("maincpu")->memory().space(AS_PROGRAM); | |
62 | 62 | int i, j, k, l; |
63 | 63 | |
64 | 64 | UINT8* char_rom = state->memregion("gfx1")->base(); |
r17963 | r17964 | |
102 | 102 | |
103 | 103 | while (current_scan_line < dai_scan_lines) |
104 | 104 | { |
105 | mode = space->read_byte(current_video_memory_address--); | |
106 | colour = space->read_byte(current_video_memory_address--); | |
105 | mode = space.read_byte(current_video_memory_address--); | |
106 | colour = space.read_byte(current_video_memory_address--); | |
107 | 107 | line_repeat_count = mode & 0x0f; |
108 | 108 | horizontal_resolution = (mode & 0x30) >> 4; |
109 | 109 | display_mode = (mode & 0xc0) >> 6; |
r17963 | r17964 | |
123 | 123 | switch (unit_mode) |
124 | 124 | { |
125 | 125 | case 0: |
126 | current_data_1 = space->read_byte(current_video_memory_address--); | |
127 | current_data_2 = space->read_byte(current_video_memory_address--); | |
126 | current_data_1 = space.read_byte(current_video_memory_address--); | |
127 | current_data_2 = space.read_byte(current_video_memory_address--); | |
128 | 128 | |
129 | 129 | for (i=0; i<11; i++) |
130 | 130 | { |
r17963 | r17964 | |
143 | 143 | case 1: |
144 | 144 | for (i=0; i<11; i++) |
145 | 145 | { |
146 | current_data_1 = space->read_byte(current_video_memory_address--); | |
147 | current_data_2 = space->read_byte(current_video_memory_address--); | |
146 | current_data_1 = space.read_byte(current_video_memory_address--); | |
147 | current_data_2 = space.read_byte(current_video_memory_address--); | |
148 | 148 | for (j=0; j<=line_repeat_count; j++) |
149 | 149 | { |
150 | 150 | for (k=0; k<8; k++) |
r17963 | r17964 | |
163 | 163 | switch (unit_mode) |
164 | 164 | { |
165 | 165 | case 0: |
166 | current_data_1 = space->read_byte(current_video_memory_address--); | |
167 | current_data_2 = space->read_byte(current_video_memory_address--); | |
166 | current_data_1 = space.read_byte(current_video_memory_address--); | |
167 | current_data_2 = space.read_byte(current_video_memory_address--); | |
168 | 168 | for (i=0; i<22; i++) |
169 | 169 | { |
170 | 170 | for (j=0; j<=line_repeat_count; j++) |
r17963 | r17964 | |
182 | 182 | case 1: |
183 | 183 | for (i=0; i<22; i++) |
184 | 184 | { |
185 | current_data_1 = space->read_byte(current_video_memory_address--); | |
186 | current_data_2 = space->read_byte(current_video_memory_address--); | |
185 | current_data_1 = space.read_byte(current_video_memory_address--); | |
186 | current_data_2 = space.read_byte(current_video_memory_address--); | |
187 | 187 | for (j=0; j<=line_repeat_count; j++) |
188 | 188 | { |
189 | 189 | for (k=0; k<8; k++) |
r17963 | r17964 | |
202 | 202 | switch (unit_mode) |
203 | 203 | { |
204 | 204 | case 0: |
205 | current_data_1 = space->read_byte(current_video_memory_address--); | |
206 | current_data_2 = space->read_byte(current_video_memory_address--); | |
205 | current_data_1 = space.read_byte(current_video_memory_address--); | |
206 | current_data_2 = space.read_byte(current_video_memory_address--); | |
207 | 207 | for (i=0; i<44; i++) |
208 | 208 | { |
209 | 209 | for (j=0; j<=line_repeat_count; j++) |
r17963 | r17964 | |
220 | 220 | case 1: |
221 | 221 | for (i=0; i<44; i++) |
222 | 222 | { |
223 | current_data_1 = space->read_byte(current_video_memory_address--); | |
224 | current_data_2 = space->read_byte(current_video_memory_address--); | |
223 | current_data_1 = space.read_byte(current_video_memory_address--); | |
224 | current_data_2 = space.read_byte(current_video_memory_address--); | |
225 | 225 | for (j=0; j<=line_repeat_count; j++) |
226 | 226 | { |
227 | 227 | for (k=0; k<8; k++) |
r17963 | r17964 | |
240 | 240 | switch (unit_mode) |
241 | 241 | { |
242 | 242 | case 0: |
243 | current_data_1 = space->read_byte(current_video_memory_address--); | |
244 | current_data_2 = space->read_byte(current_video_memory_address--); | |
243 | current_data_1 = space.read_byte(current_video_memory_address--); | |
244 | current_data_2 = space.read_byte(current_video_memory_address--); | |
245 | 245 | for (i=0; i<66; i++) |
246 | 246 | { |
247 | 247 | for (j=0; j<=line_repeat_count; j++) |
r17963 | r17964 | |
258 | 258 | case 1: |
259 | 259 | for (i=0; i<66; i++) |
260 | 260 | { |
261 | current_data_1 = space->read_byte(current_video_memory_address--); | |
262 | current_data_2 = space->read_byte(current_video_memory_address--); | |
261 | current_data_1 = space.read_byte(current_video_memory_address--); | |
262 | current_data_2 = space.read_byte(current_video_memory_address--); | |
263 | 263 | for (j=0; j<=line_repeat_count; j++) |
264 | 264 | { |
265 | 265 | for (k=0; k<8; k++) |
r17963 | r17964 | |
284 | 284 | switch (unit_mode) |
285 | 285 | { |
286 | 286 | case 0: |
287 | current_data_1 = space->read_byte(current_video_memory_address); | |
288 | current_data_2 = space->read_byte(current_video_memory_address-1); | |
287 | current_data_1 = space.read_byte(current_video_memory_address); | |
288 | current_data_2 = space.read_byte(current_video_memory_address-1); | |
289 | 289 | current_video_memory_address-=2; |
290 | 290 | for (i=0; i<11; i++) |
291 | 291 | { |
r17963 | r17964 | |
304 | 304 | case 1: |
305 | 305 | for (i=0; i<11; i++) |
306 | 306 | { |
307 | current_data_1 = space->read_byte(current_video_memory_address); | |
308 | current_data_2 = space->read_byte(current_video_memory_address-1); | |
307 | current_data_1 = space.read_byte(current_video_memory_address); | |
308 | current_data_2 = space.read_byte(current_video_memory_address-1); | |
309 | 309 | current_video_memory_address-=2; |
310 | 310 | for (j=0; j<=line_repeat_count; j++) |
311 | 311 | { |
r17963 | r17964 | |
325 | 325 | switch (unit_mode) |
326 | 326 | { |
327 | 327 | case 0: |
328 | current_data_1 = space->read_byte(current_video_memory_address); | |
329 | current_data_2 = space->read_byte(current_video_memory_address-1); | |
328 | current_data_1 = space.read_byte(current_video_memory_address); | |
329 | current_data_2 = space.read_byte(current_video_memory_address-1); | |
330 | 330 | current_video_memory_address-=2; |
331 | 331 | for (i=0; i<22; i++) |
332 | 332 | { |
r17963 | r17964 | |
345 | 345 | case 1: |
346 | 346 | for (i=0; i<22; i++) |
347 | 347 | { |
348 | current_data_1 = space->read_byte(current_video_memory_address); | |
349 | current_data_2 = space->read_byte(current_video_memory_address-1); | |
348 | current_data_1 = space.read_byte(current_video_memory_address); | |
349 | current_data_2 = space.read_byte(current_video_memory_address-1); | |
350 | 350 | current_video_memory_address-=2; |
351 | 351 | for (j=0; j<=line_repeat_count; j++) |
352 | 352 | { |
r17963 | r17964 | |
366 | 366 | switch (unit_mode) |
367 | 367 | { |
368 | 368 | case 0: |
369 | current_data_1 = space->read_byte(current_video_memory_address); | |
370 | current_data_2 = space->read_byte(current_video_memory_address-1); | |
369 | current_data_1 = space.read_byte(current_video_memory_address); | |
370 | current_data_2 = space.read_byte(current_video_memory_address-1); | |
371 | 371 | current_video_memory_address-=2; |
372 | 372 | for (i=0; i<44; i++) |
373 | 373 | { |
r17963 | r17964 | |
385 | 385 | case 1: |
386 | 386 | for (i=0; i<44; i++) |
387 | 387 | { |
388 | current_data_1 = space->read_byte(current_video_memory_address); | |
389 | current_data_2 = space->read_byte(current_video_memory_address-1); | |
388 | current_data_1 = space.read_byte(current_video_memory_address); | |
389 | current_data_2 = space.read_byte(current_video_memory_address-1); | |
390 | 390 | current_video_memory_address-=2; |
391 | 391 | for (j=0; j<=line_repeat_count; j++) |
392 | 392 | { |
r17963 | r17964 | |
405 | 405 | switch (unit_mode) |
406 | 406 | { |
407 | 407 | case 0: |
408 | current_data_1 = space->read_byte(current_video_memory_address); | |
409 | current_data_2 = space->read_byte(current_video_memory_address-1); | |
408 | current_data_1 = space.read_byte(current_video_memory_address); | |
409 | current_data_2 = space.read_byte(current_video_memory_address-1); | |
410 | 410 | current_video_memory_address-=2; |
411 | 411 | for (i=0; i<66; i++) |
412 | 412 | { |
r17963 | r17964 | |
424 | 424 | case 1: |
425 | 425 | for (i=0; i<66; i++) |
426 | 426 | { |
427 | current_data_1 = space->read_byte(current_video_memory_address); | |
428 | current_data_2 = space->read_byte(current_video_memory_address-1); | |
427 | current_data_1 = space.read_byte(current_video_memory_address); | |
428 | current_data_2 = space.read_byte(current_video_memory_address-1); | |
429 | 429 | current_video_memory_address-=2; |
430 | 430 | for (j=0; j<=line_repeat_count; j++) |
431 | 431 | { |
r17963 | r17964 | |
450 | 450 | switch (unit_mode) |
451 | 451 | { |
452 | 452 | case 0: |
453 | current_data_1 = space->read_byte(current_video_memory_address--); | |
454 | current_data_2 = space->read_byte(current_video_memory_address--); | |
453 | current_data_1 = space.read_byte(current_video_memory_address--); | |
454 | current_data_2 = space.read_byte(current_video_memory_address--); | |
455 | 455 | |
456 | 456 | for (i=0; i<11; i++) |
457 | 457 | { |
r17963 | r17964 | |
470 | 470 | case 1: |
471 | 471 | for (i=0; i<11; i++) |
472 | 472 | { |
473 | current_data_1 = space->read_byte(current_video_memory_address--); | |
474 | current_data_2 = space->read_byte(current_video_memory_address--); | |
473 | current_data_1 = space.read_byte(current_video_memory_address--); | |
474 | current_data_2 = space.read_byte(current_video_memory_address--); | |
475 | 475 | for (j=0; j<=line_repeat_count; j++) |
476 | 476 | { |
477 | 477 | for (k=0; k<8; k++) |
r17963 | r17964 | |
490 | 490 | switch (unit_mode) |
491 | 491 | { |
492 | 492 | case 0: |
493 | current_data_1 = space->read_byte(current_video_memory_address--); | |
494 | current_data_2 = space->read_byte(current_video_memory_address--); | |
493 | current_data_1 = space.read_byte(current_video_memory_address--); | |
494 | current_data_2 = space.read_byte(current_video_memory_address--); | |
495 | 495 | for (i=0; i<22; i++) |
496 | 496 | { |
497 | 497 | for (j=0; j<=line_repeat_count; j++) |
r17963 | r17964 | |
509 | 509 | case 1: |
510 | 510 | for (i=0; i<22; i++) |
511 | 511 | { |
512 | current_data_1 = space->read_byte(current_video_memory_address--); | |
513 | current_data_2 = space->read_byte(current_video_memory_address--); | |
512 | current_data_1 = space.read_byte(current_video_memory_address--); | |
513 | current_data_2 = space.read_byte(current_video_memory_address--); | |
514 | 514 | for (j=0; j<=line_repeat_count; j++) |
515 | 515 | { |
516 | 516 | for (k=0; k<8; k++) |
r17963 | r17964 | |
529 | 529 | switch (unit_mode) |
530 | 530 | { |
531 | 531 | case 0: |
532 | current_data_1 = space->read_byte(current_video_memory_address--); | |
533 | current_data_2 = space->read_byte(current_video_memory_address--); | |
532 | current_data_1 = space.read_byte(current_video_memory_address--); | |
533 | current_data_2 = space.read_byte(current_video_memory_address--); | |
534 | 534 | for (i=0; i<44; i++) |
535 | 535 | { |
536 | 536 | for (j=0; j<=line_repeat_count; j++) |
r17963 | r17964 | |
547 | 547 | case 1: |
548 | 548 | for (i=0; i<44; i++) |
549 | 549 | { |
550 | current_data_1 = space->read_byte(current_video_memory_address--); | |
551 | current_data_2 = space->read_byte(current_video_memory_address--); | |
550 | current_data_1 = space.read_byte(current_video_memory_address--); | |
551 | current_data_2 = space.read_byte(current_video_memory_address--); | |
552 | 552 | for (j=0; j<=line_repeat_count; j++) |
553 | 553 | { |
554 | 554 | for (k=0; k<8; k++) |
r17963 | r17964 | |
567 | 567 | switch (unit_mode) |
568 | 568 | { |
569 | 569 | case 0: |
570 | current_data_1 = space->read_byte(current_video_memory_address--); | |
571 | current_data_2 = space->read_byte(current_video_memory_address--); | |
570 | current_data_1 = space.read_byte(current_video_memory_address--); | |
571 | current_data_2 = space.read_byte(current_video_memory_address--); | |
572 | 572 | for (i=0; i<66; i++) |
573 | 573 | { |
574 | 574 | for (j=0; j<=line_repeat_count; j++) |
r17963 | r17964 | |
585 | 585 | case 1: |
586 | 586 | for (i=0; i<66; i++) |
587 | 587 | { |
588 | current_data_1 = space->read_byte(current_video_memory_address--); | |
589 | current_data_2 = space->read_byte(current_video_memory_address--); | |
588 | current_data_1 = space.read_byte(current_video_memory_address--); | |
589 | current_data_2 = space.read_byte(current_video_memory_address--); | |
590 | 590 | for (j=0; j<=line_repeat_count; j++) |
591 | 591 | { |
592 | 592 | for (k=0; k<8; k++) |
r17963 | r17964 | |
610 | 610 | switch (unit_mode) |
611 | 611 | { |
612 | 612 | case 0: |
613 | current_data_1 = space->read_byte(current_video_memory_address--); | |
614 | current_data_2 = space->read_byte(current_video_memory_address--); | |
613 | current_data_1 = space.read_byte(current_video_memory_address--); | |
614 | current_data_2 = space.read_byte(current_video_memory_address--); | |
615 | 615 | for (i=0; i<11; i++) |
616 | 616 | { |
617 | 617 | for (j=0; j<=line_repeat_count; j++) |
r17963 | r17964 | |
629 | 629 | case 1: |
630 | 630 | for (i=0; i<11; i++) |
631 | 631 | { |
632 | current_data_1 = space->read_byte(current_video_memory_address--); | |
633 | current_data_2 = space->read_byte(current_video_memory_address--); | |
632 | current_data_1 = space.read_byte(current_video_memory_address--); | |
633 | current_data_2 = space.read_byte(current_video_memory_address--); | |
634 | 634 | for (j=0; j<=line_repeat_count; j++) |
635 | 635 | { |
636 | 636 | for (k=0; k<8; k++) |
r17963 | r17964 | |
649 | 649 | switch (unit_mode) |
650 | 650 | { |
651 | 651 | case 0: |
652 | current_data_1 = space->read_byte(current_video_memory_address--); | |
653 | current_data_2 = space->read_byte(current_video_memory_address--); | |
652 | current_data_1 = space.read_byte(current_video_memory_address--); | |
653 | current_data_2 = space.read_byte(current_video_memory_address--); | |
654 | 654 | for (i=0; i<22; i++) |
655 | 655 | { |
656 | 656 | for (j=0; j<=line_repeat_count; j++) |
r17963 | r17964 | |
668 | 668 | case 1: |
669 | 669 | for (i=0; i<22; i++) |
670 | 670 | { |
671 | current_data_1 = space->read_byte(current_video_memory_address--); | |
672 | current_data_2 = space->read_byte(current_video_memory_address--); | |
671 | current_data_1 = space.read_byte(current_video_memory_address--); | |
672 | current_data_2 = space.read_byte(current_video_memory_address--); | |
673 | 673 | for (j=0; j<=line_repeat_count; j++) |
674 | 674 | { |
675 | 675 | for (k=0; k<8; k++) |
r17963 | r17964 | |
688 | 688 | switch (unit_mode) |
689 | 689 | { |
690 | 690 | case 0: |
691 | current_data_1 = space->read_byte(current_video_memory_address--); | |
692 | current_data_2 = space->read_byte(current_video_memory_address--); | |
691 | current_data_1 = space.read_byte(current_video_memory_address--); | |
692 | current_data_2 = space.read_byte(current_video_memory_address--); | |
693 | 693 | for (i=0; i<44; i++) |
694 | 694 | { |
695 | 695 | for (j=0; j<=line_repeat_count; j++) |
r17963 | r17964 | |
706 | 706 | case 1: |
707 | 707 | for (i=0; i<44; i++) |
708 | 708 | { |
709 | current_data_1 = space->read_byte(current_video_memory_address--); | |
710 | current_data_2 = space->read_byte(current_video_memory_address--); | |
709 | current_data_1 = space.read_byte(current_video_memory_address--); | |
710 | current_data_2 = space.read_byte(current_video_memory_address--); | |
711 | 711 | for (j=0; j<=line_repeat_count; j++) |
712 | 712 | { |
713 | 713 | for (k=0; k<8; k++) |
r17963 | r17964 | |
725 | 725 | switch (unit_mode) |
726 | 726 | { |
727 | 727 | case 0: |
728 | current_data_1 = space->read_byte(current_video_memory_address--); | |
729 | current_data_2 = space->read_byte(current_video_memory_address--); | |
728 | current_data_1 = space.read_byte(current_video_memory_address--); | |
729 | current_data_2 = space.read_byte(current_video_memory_address--); | |
730 | 730 | for (i=0; i<66; i++) |
731 | 731 | { |
732 | 732 | for (j=0; j<=line_repeat_count; j++) |
r17963 | r17964 | |
743 | 743 | case 1: |
744 | 744 | for (i=0; i<66; i++) |
745 | 745 | { |
746 | current_data_1 = space->read_byte(current_video_memory_address--); | |
747 | current_data_2 = space->read_byte(current_video_memory_address--); | |
746 | current_data_1 = space.read_byte(current_video_memory_address--); | |
747 | current_data_2 = space.read_byte(current_video_memory_address--); | |
748 | 748 | for (j=0; j<=line_repeat_count; j++) |
749 | 749 | { |
750 | 750 | for (k=0; k<8; k++) |
r17963 | r17964 | |
---|---|---|
29 | 29 | SCREEN_UPDATE_IND16( ac1 ) |
30 | 30 | { |
31 | 31 | int x,y; |
32 | address_space | |
32 | address_space &space = *screen.machine().device("maincpu")->memory().space(AS_PROGRAM); | |
33 | 33 | |
34 | 34 | for(y = 0; y < 16; y++ ) |
35 | 35 | { |
36 | 36 | for(x = 0; x < 64; x++ ) |
37 | 37 | { |
38 | int code = space | |
38 | int code = space.read_byte(AC1_VIDEO_MEMORY + x + y*64); | |
39 | 39 | drawgfx_opaque(bitmap, cliprect, screen.machine().gfx[0], code , 0, 0,0, 63*6-x*6,15*8-y*8); |
40 | 40 | } |
41 | 41 | } |
r17963 | r17964 | |
45 | 45 | SCREEN_UPDATE_IND16( ac1_32 ) |
46 | 46 | { |
47 | 47 | int x,y; |
48 | address_space | |
48 | address_space &space = *screen.machine().device("maincpu")->memory().space(AS_PROGRAM); | |
49 | 49 | |
50 | 50 | for(y = 0; y < 32; y++ ) |
51 | 51 | { |
52 | 52 | for(x = 0; x < 64; x++ ) |
53 | 53 | { |
54 | int code = space | |
54 | int code = space.read_byte(AC1_VIDEO_MEMORY + x + y*64); | |
55 | 55 | drawgfx_opaque(bitmap, cliprect, screen.machine().gfx[0], code , 0, 0,0, 63*6-x*6,31*8-y*8); |
56 | 56 | } |
57 | 57 | } |
r17963 | r17964 | |
---|---|---|
163 | 163 | void cirrus_device::device_start() |
164 | 164 | { |
165 | 165 | pc_vga_init(machine(), NULL, &cirrus_svga_interface); |
166 | pc_vga_io_init(machine(), machine().device("ppc1")->memory().space(AS_PROGRAM), 0xC00A0000, machine().device("ppc1")->memory().space(AS_PROGRAM), 0x80000000); | |
166 | pc_vga_io_init(machine(), *machine().device("ppc1")->memory().space(AS_PROGRAM), 0xC00A0000, *machine().device("ppc1")->memory().space(AS_PROGRAM), 0x80000000); | |
167 | 167 | } |
168 | 168 | |
169 | 169 | //------------------------------------------------- |
r17963 | r17964 | |
---|---|---|
97 | 97 | |
98 | 98 | READ8_HANDLER(pc1350_lcd_read) |
99 | 99 | { |
100 | pc1350_state *state = space | |
100 | pc1350_state *state = space.machine().driver_data<pc1350_state>(); | |
101 | 101 | int data; |
102 | 102 | data = state->m_reg[offset&0xfff]; |
103 | 103 | logerror("pc1350 read %.3x %.2x\n",offset,data); |
r17963 | r17964 | |
106 | 106 | |
107 | 107 | WRITE8_HANDLER(pc1350_lcd_write) |
108 | 108 | { |
109 | pc1350_state *state = space | |
109 | pc1350_state *state = space.machine().driver_data<pc1350_state>(); | |
110 | 110 | logerror("pc1350 write %.3x %.2x\n",offset,data); |
111 | 111 | state->m_reg[offset&0xfff] = data; |
112 | 112 | } |
r17963 | r17964 | |
---|---|---|
58 | 58 | //------------------------------------------------- |
59 | 59 | // device_start - device-specific startup |
60 | 60 | //------------------------------------------------- |
61 | static READ8_HANDLER( input_port_0_r ) { return 0xff; } //return space | |
61 | static READ8_HANDLER( input_port_0_r ) { return 0xff; } //return space.machine().root_device().ioport("IN0")->read(); } | |
62 | 62 | |
63 | 63 | void isa8_svga_cirrus_device::device_start() |
64 | 64 | { |
r17963 | r17964 | |
---|---|---|
2013 | 2013 | m_isa->install_device(0x3d0, 0x3df, 0, 0, read8_delegate( FUNC(isa8_cga_pc1512_device::io_read), this ), write8_delegate( FUNC(isa8_cga_pc1512_device::io_write), this ) ); |
2014 | 2014 | m_isa->install_bank(0xb8000, 0xbbfff, 0, 0, "bank1", m_vram); |
2015 | 2015 | |
2016 | address_space | |
2016 | address_space &space = *machine().firstcpu->space( AS_PROGRAM ); | |
2017 | 2017 | |
2018 | space | |
2018 | space.install_write_handler( 0xb8000, 0xbbfff, 0, 0x0C000, write8_delegate( FUNC(isa8_cga_pc1512_device::vram_w), this ) ); | |
2019 | 2019 | } |
2020 | 2020 | |
2021 | 2021 | void isa8_cga_pc1512_device::device_reset() |
r17963 | r17964 | |
---|---|---|
1222 | 1222 | gb_state *state = machine.driver_data<gb_state>(); |
1223 | 1223 | int i; |
1224 | 1224 | int vram_size = 0x2000; |
1225 | address_space | |
1225 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
1226 | 1226 | emu_timer *old_timer = state->m_lcd.lcd_timer; |
1227 | 1227 | |
1228 | 1228 | memset( &state->m_lcd, 0, sizeof(state->m_lcd) ); |
r17963 | r17964 | |
1291 | 1291 | machine.scheduler().timer_set(machine.device<cpu_device>("maincpu")->cycles_to_attotime(1), FUNC(gb_video_init_vbl)); |
1292 | 1292 | |
1293 | 1293 | /* Initialize some video registers */ |
1294 | state->gb_video_w( *space, 0x0, 0x91 ); /* LCDCONT */ | |
1295 | state->gb_video_w( *space, 0x7, 0xFC ); /* BGRDPAL */ | |
1296 | state->gb_video_w( *space, 0x8, 0xFC ); /* SPR0PAL */ | |
1297 | state->gb_video_w( *space, 0x9, 0xFC ); /* SPR1PAL */ | |
1294 | state->gb_video_w( space, 0x0, 0x91 ); /* LCDCONT */ | |
1295 | state->gb_video_w( space, 0x7, 0xFC ); /* BGRDPAL */ | |
1296 | state->gb_video_w( space, 0x8, 0xFC ); /* SPR0PAL */ | |
1297 | state->gb_video_w( space, 0x9, 0xFC ); /* SPR1PAL */ | |
1298 | 1298 | |
1299 | 1299 | CURLINE = state->m_lcd.current_line = 0; |
1300 | 1300 | LCDSTAT = ( LCDSTAT & 0xF8 ) | 0x05; |
r17963 | r17964 | |
1332 | 1332 | { |
1333 | 1333 | gb_state *state = machine.driver_data<gb_state>(); |
1334 | 1334 | UINT16 src, dst; |
1335 | address_space | |
1335 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
1336 | 1336 | |
1337 | 1337 | src = ((UINT16)HDMA1 << 8) | (HDMA2 & 0xF0); |
1338 | 1338 | dst = ((UINT16)(HDMA3 & 0x1F) << 8) | (HDMA4 & 0xF0); |
1339 | 1339 | dst |= 0x8000; |
1340 | 1340 | while( length > 0 ) |
1341 | 1341 | { |
1342 | space | |
1342 | space.write_byte( dst++, space.read_byte( src++ ) ); | |
1343 | 1343 | length--; |
1344 | 1344 | } |
1345 | 1345 | HDMA1 = src >> 8; |
r17963 | r17964 | |
---|---|---|
233 | 233 | |
234 | 234 | static WRITE32_HANDLER( newport_cmap0_w ) |
235 | 235 | { |
236 | //running_machine &machine = space | |
236 | //running_machine &machine = space.machine(); | |
237 | 237 | |
238 | 238 | switch( pNVID->REX3.nDCBRegSelect ) |
239 | 239 | { |
r17963 | r17964 | |
253 | 253 | |
254 | 254 | static READ32_HANDLER( newport_cmap0_r ) |
255 | 255 | { |
256 | //running_machine &machine = space | |
256 | //running_machine &machine = space.machine(); | |
257 | 257 | |
258 | 258 | switch( pNVID->REX3.nDCBRegSelect ) |
259 | 259 | { |
r17963 | r17964 | |
271 | 271 | |
272 | 272 | static READ32_HANDLER( newport_cmap1_r ) |
273 | 273 | { |
274 | //running_machine &machine = space | |
274 | //running_machine &machine = space.machine(); | |
275 | 275 | |
276 | 276 | switch( pNVID->REX3.nDCBRegSelect ) |
277 | 277 | { |
r17963 | r17964 | |
290 | 290 | static READ32_HANDLER( newport_xmap0_r ) |
291 | 291 | { |
292 | 292 | UINT8 nModeIdx; |
293 | //running_machine &machine = space | |
293 | //running_machine &machine = space.machine(); | |
294 | 294 | |
295 | 295 | switch( pNVID->REX3.nDCBRegSelect ) |
296 | 296 | { |
r17963 | r17964 | |
339 | 339 | static WRITE32_HANDLER( newport_xmap0_w ) |
340 | 340 | { |
341 | 341 | UINT8 n8BitVal = data & 0x000000ff; |
342 | //running_machine &machine = space | |
342 | //running_machine &machine = space.machine(); | |
343 | 343 | |
344 | 344 | switch( pNVID->REX3.nDCBRegSelect ) |
345 | 345 | { |
r17963 | r17964 | |
378 | 378 | static READ32_HANDLER( newport_xmap1_r ) |
379 | 379 | { |
380 | 380 | UINT8 nModeIdx; |
381 | //running_machine &machine = space | |
381 | //running_machine &machine = space.machine(); | |
382 | 382 | |
383 | 383 | switch( pNVID->REX3.nDCBRegSelect ) |
384 | 384 | { |
r17963 | r17964 | |
427 | 427 | static WRITE32_HANDLER( newport_xmap1_w ) |
428 | 428 | { |
429 | 429 | UINT8 n8BitVal = data & 0x000000ff; |
430 | //running_machine &machine = space | |
430 | //running_machine &machine = space.machine(); | |
431 | 431 | |
432 | 432 | switch( pNVID->REX3.nDCBRegSelect ) |
433 | 433 | { |
r17963 | r17964 | |
466 | 466 | static READ32_HANDLER( newport_vc2_r ) |
467 | 467 | { |
468 | 468 | UINT16 ret16; |
469 | //running_machine &machine = space | |
469 | //running_machine &machine = space.machine(); | |
470 | 470 | |
471 | 471 | switch( pNVID->REX3.nDCBRegSelect ) |
472 | 472 | { |
r17963 | r17964 | |
491 | 491 | |
492 | 492 | static WRITE32_HANDLER( newport_vc2_w ) |
493 | 493 | { |
494 | //running_machine &machine = space | |
494 | //running_machine &machine = space.machine(); | |
495 | 495 | |
496 | 496 | switch( pNVID->REX3.nXFerWidth ) |
497 | 497 | { |
r17963 | r17964 | |
608 | 608 | READ32_HANDLER( newport_rex3_r ) |
609 | 609 | { |
610 | 610 | // UINT32 nTemp; |
611 | //running_machine &machine = space | |
611 | //running_machine &machine = space.machine(); | |
612 | 612 | |
613 | 613 | // if( offset >= ( 0x0800 / 4 ) ) |
614 | 614 | // { |
r17963 | r17964 | |
984 | 984 | WRITE32_HANDLER( newport_rex3_w ) |
985 | 985 | { |
986 | 986 | UINT32 nTemp=0; |
987 | running_machine &machine = space | |
987 | running_machine &machine = space.machine(); | |
988 | 988 | |
989 | 989 | if( offset & 0x00000200 ) |
990 | 990 | { |
r17963 | r17964 | |
---|---|---|
968 | 968 | |
969 | 969 | WRITE8_HANDLER( epnick_reg_w ) |
970 | 970 | { |
971 | ep_state *state = space | |
971 | ep_state *state = space.machine().driver_data<ep_state>(); | |
972 | 972 | NICK_STATE *nick = state->nick; |
973 | 973 | //mame_printf_info("Nick write %02x %02x\r\n",offset, data); |
974 | 974 |
r17963 | r17964 | |
---|---|---|
58 | 58 | ***************************************************************************/ |
59 | 59 | WRITE8_HANDLER ( cgenie_register_w ) |
60 | 60 | { |
61 | cgenie_state *state = space | |
61 | cgenie_state *state = space.machine().driver_data<cgenie_state>(); | |
62 | 62 | //int addr; |
63 | 63 | |
64 | 64 | switch (state->m_crt.idx) |
r17963 | r17964 | |
160 | 160 | ***************************************************************************/ |
161 | 161 | WRITE8_HANDLER ( cgenie_index_w ) |
162 | 162 | { |
163 | cgenie_state *state = space | |
163 | cgenie_state *state = space.machine().driver_data<cgenie_state>(); | |
164 | 164 | state->m_crt.idx = data & 15; |
165 | 165 | } |
166 | 166 | |
r17963 | r17964 | |
169 | 169 | ***************************************************************************/ |
170 | 170 | READ8_HANDLER ( cgenie_register_r ) |
171 | 171 | { |
172 | cgenie_state *state = space->machine().driver_data<cgenie_state>(); | |
173 | return cgenie_get_register(space->machine(), state->m_crt.idx); | |
172 | cgenie_state *state = space.machine().driver_data<cgenie_state>(); | |
173 | return cgenie_get_register(space.machine(), state->m_crt.idx); | |
174 | 174 | } |
175 | 175 | |
176 | 176 | /*************************************************************************** |
r17963 | r17964 | |
222 | 222 | ***************************************************************************/ |
223 | 223 | READ8_HANDLER ( cgenie_index_r ) |
224 | 224 | { |
225 | cgenie_state *state = space | |
225 | cgenie_state *state = space.machine().driver_data<cgenie_state>(); | |
226 | 226 | return state->m_crt.idx; |
227 | 227 | } |
228 | 228 |
r17963 | r17964 | |
---|---|---|
57 | 57 | //------------------------------------------------- |
58 | 58 | // device_start - device-specific startup |
59 | 59 | //------------------------------------------------- |
60 | static READ8_HANDLER( input_port_0_r ) { return 0xff; } //return space | |
60 | static READ8_HANDLER( input_port_0_r ) { return 0xff; } //return space.machine().root_device().ioport("IN0")->read(); } | |
61 | 61 | |
62 | 62 | void isa8_svga_et4k_device::device_start() |
63 | 63 | { |
r17963 | r17964 | |
---|---|---|
377 | 377 | */ |
378 | 378 | WRITE16_HANDLER( x68k_crtc_w ) |
379 | 379 | { |
380 | x68k_state *state = space | |
380 | x68k_state *state = space.machine().driver_data<x68k_state>(); | |
381 | 381 | COMBINE_DATA(state->m_crtc.reg+offset); |
382 | 382 | switch(offset) |
383 | 383 | { |
r17963 | r17964 | |
390 | 390 | case 6: |
391 | 391 | case 7: |
392 | 392 | case 8: |
393 | x68k_crtc_refresh_mode(space | |
393 | x68k_crtc_refresh_mode(space.machine()); | |
394 | 394 | break; |
395 | 395 | case 9: // CRTC raster IRQ (GPIP6) |
396 | 396 | { |
397 | 397 | attotime irq_time; |
398 | irq_time = space | |
398 | irq_time = space.machine().primary_screen->time_until_pos((data) / state->m_crtc.vmultiple,2); | |
399 | 399 | |
400 | 400 | if(irq_time.as_double() > 0) |
401 | 401 | state->m_raster_irq->adjust(irq_time, (data) / state->m_crtc.vmultiple); |
r17963 | r17964 | |
442 | 442 | if(data & 0x0400) |
443 | 443 | state->m_crtc.interlace = 1; |
444 | 444 | }*/ |
445 | x68k_crtc_refresh_mode(space | |
445 | x68k_crtc_refresh_mode(space.machine()); | |
446 | 446 | break; |
447 | 447 | case 576: // operation register |
448 | 448 | state->m_crtc.operation = data; |
449 | 449 | if(data & 0x08) // text screen raster copy |
450 | 450 | { |
451 | 451 | x68k_crtc_text_copy(state, (state->m_crtc.reg[22] & 0xff00) >> 8,(state->m_crtc.reg[22] & 0x00ff)); |
452 | space | |
452 | space.machine().scheduler().timer_set(attotime::from_msec(1), FUNC(x68k_crtc_operation_end), 0x02); // time taken to do operation is a complete guess. | |
453 | 453 | } |
454 | 454 | if(data & 0x02) // high-speed graphic screen clear |
455 | 455 | { |
r17963 | r17964 | |
457 | 457 | memset(state->m_gvram32,0,0x40000); |
458 | 458 | else |
459 | 459 | memset(state->m_gvram16,0,0x40000); |
460 | space | |
460 | space.machine().scheduler().timer_set(attotime::from_msec(10), FUNC(x68k_crtc_operation_end), 0x02); // time taken to do operation is a complete guess. | |
461 | 461 | } |
462 | 462 | break; |
463 | 463 | } |
464 | // logerror("CRTC: [%08x] Wrote %04x to CRTC register %i\n",space | |
464 | // logerror("CRTC: [%08x] Wrote %04x to CRTC register %i\n",space.machine().device("maincpu")->safe_pc(),data,offset); | |
465 | 465 | } |
466 | 466 | |
467 | 467 | READ16_HANDLER( x68k_crtc_r ) |
468 | 468 | { |
469 | x68k_state *state = space | |
469 | x68k_state *state = space.machine().driver_data<x68k_state>(); | |
470 | 470 | #if 0 |
471 | 471 | switch(offset) |
472 | 472 | { |
r17963 | r17964 | |
478 | 478 | |
479 | 479 | if(offset < 24) |
480 | 480 | { |
481 | // logerror("CRTC: [%08x] Read %04x from CRTC register %i\n",space | |
481 | // logerror("CRTC: [%08x] Read %04x from CRTC register %i\n",space.machine().device("maincpu")->safe_pc(),state->m_crtc.reg[offset],offset); | |
482 | 482 | switch(offset) |
483 | 483 | { |
484 | 484 | case 9: |
r17963 | r17964 | |
507 | 507 | |
508 | 508 | WRITE16_HANDLER( x68k_gvram_w ) |
509 | 509 | { |
510 | x68k_state *state = space | |
510 | x68k_state *state = space.machine().driver_data<x68k_state>(); | |
511 | 511 | UINT16* gvram; |
512 | 512 | // int xloc,yloc,pageoffset; |
513 | 513 | /* |
r17963 | r17964 | |
580 | 580 | |
581 | 581 | WRITE16_HANDLER( x68k_tvram_w ) |
582 | 582 | { |
583 | x68k_state *state = space | |
583 | x68k_state *state = space.machine().driver_data<x68k_state>(); | |
584 | 584 | UINT16* tvram; |
585 | 585 | UINT16 text_mask; |
586 | 586 | |
r17963 | r17964 | |
617 | 617 | |
618 | 618 | READ16_HANDLER( x68k_gvram_r ) |
619 | 619 | { |
620 | x68k_state *state = space | |
620 | x68k_state *state = space.machine().driver_data<x68k_state>(); | |
621 | 621 | const UINT16* gvram; |
622 | 622 | UINT16 ret = 0; |
623 | 623 | |
r17963 | r17964 | |
665 | 665 | |
666 | 666 | READ16_HANDLER( x68k_tvram_r ) |
667 | 667 | { |
668 | x68k_state *state = space | |
668 | x68k_state *state = space.machine().driver_data<x68k_state>(); | |
669 | 669 | const UINT16* tvram; |
670 | 670 | |
671 | 671 | if(state->m_is_32bit) |
r17963 | r17964 | |
726 | 726 | |
727 | 727 | WRITE16_HANDLER( x68k_spritereg_w ) |
728 | 728 | { |
729 | x68k_state *state = space | |
729 | x68k_state *state = space.machine().driver_data<x68k_state>(); | |
730 | 730 | COMBINE_DATA(state->m_spritereg+offset); |
731 | 731 | switch(offset) |
732 | 732 | { |
r17963 | r17964 | |
775 | 775 | |
776 | 776 | READ16_HANDLER( x68k_spritereg_r ) |
777 | 777 | { |
778 | x68k_state *state = space | |
778 | x68k_state *state = space.machine().driver_data<x68k_state>(); | |
779 | 779 | if(offset >= 0x400 && offset < 0x404) |
780 | 780 | return state->m_spritereg[offset] & 0x3ff; |
781 | 781 | return state->m_spritereg[offset]; |
r17963 | r17964 | |
783 | 783 | |
784 | 784 | WRITE16_HANDLER( x68k_spriteram_w ) |
785 | 785 | { |
786 | x68k_state *state = space | |
786 | x68k_state *state = space.machine().driver_data<x68k_state>(); | |
787 | 787 | COMBINE_DATA(state->m_spriteram+offset); |
788 | 788 | state->m_video.tile8_dirty[offset / 16] = 1; |
789 | 789 | state->m_video.tile16_dirty[offset / 64] = 1; |
r17963 | r17964 | |
808 | 808 | |
809 | 809 | READ16_HANDLER( x68k_spriteram_r ) |
810 | 810 | { |
811 | x68k_state *state = space | |
811 | x68k_state *state = space.machine().driver_data<x68k_state>(); | |
812 | 812 | return state->m_spriteram[offset]; |
813 | 813 | } |
814 | 814 |
r17963 | r17964 | |
---|---|---|
30 | 30 | SCREEN_UPDATE_IND16( kramermc ) |
31 | 31 | { |
32 | 32 | int x,y; |
33 | address_space | |
33 | address_space &space = *screen.machine().device("maincpu")->memory().space(AS_PROGRAM); | |
34 | 34 | |
35 | 35 | for(y = 0; y < 16; y++ ) |
36 | 36 | { |
37 | 37 | for(x = 0; x < 64; x++ ) |
38 | 38 | { |
39 | int code = space | |
39 | int code = space.read_byte(KRAMERMC_VIDEO_MEMORY + x + y*64); | |
40 | 40 | drawgfx_opaque(bitmap, cliprect, screen.machine().gfx[0], code , 0, 0,0, x*8,y*8); |
41 | 41 | } |
42 | 42 | } |
r17963 | r17964 | |
---|---|---|
68 | 68 | oric_state *state = machine.driver_data<oric_state>(); |
69 | 69 | /* attribute */ |
70 | 70 | UINT8 attribute = c & 0x03f; |
71 | address_space | |
71 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
72 | 72 | |
73 | 73 | switch ((attribute>>3) & 0x03) |
74 | 74 | { |
r17963 | r17964 | |
115 | 115 | if (state->m_ram) |
116 | 116 | state->m_vh_state.char_base = state->m_ram + (offs_t)0x09800; |
117 | 117 | else |
118 | state->m_vh_state.char_base = (UINT8 *)space | |
118 | state->m_vh_state.char_base = (UINT8 *)space.get_read_ptr(0x09800); | |
119 | 119 | } |
120 | 120 | else |
121 | 121 | { |
r17963 | r17964 | |
124 | 124 | if (state->m_ram) |
125 | 125 | state->m_vh_state.char_base = state->m_ram + (offs_t)0x0b400; |
126 | 126 | else |
127 | state->m_vh_state.char_base = (UINT8 *)space | |
127 | state->m_vh_state.char_base = (UINT8 *)space.get_read_ptr(0x0b400); | |
128 | 128 | } |
129 | 129 | /* changing the mode also changes the position of the standard charset and alternative charset */ |
130 | 130 | oric_refresh_charset(state); |
r17963 | r17964 | |
---|---|---|
94 | 94 | } |
95 | 95 | if ((offset < (GF4500_FRAMEBUF_OFFSET / 4)) || (offset >= ((GF4500_FRAMEBUF_OFFSET + (321 * 240 * 2)) / 4))) |
96 | 96 | { |
97 | verboselog( space | |
97 | verboselog( space.machine(), 9, "(GFO) %08X -> %08X\n", 0x34000000 + (offset << 2), data); | |
98 | 98 | } |
99 | 99 | return data; |
100 | 100 | } |
r17963 | r17964 | |
104 | 104 | COMBINE_DATA(&gf4500.data[offset]); |
105 | 105 | if ((offset < (GF4500_FRAMEBUF_OFFSET / 4)) || (offset >= ((GF4500_FRAMEBUF_OFFSET + (321 * 240 * 2)) / 4))) |
106 | 106 | { |
107 | verboselog( space | |
107 | verboselog( space.machine(), 9, "(GFO) %08X <- %08X\n", 0x34000000 + (offset << 2), data); | |
108 | 108 | } |
109 | 109 | switch (offset) |
110 | 110 | { |
r17963 | r17964 | |
---|---|---|
52 | 52 | |
53 | 53 | READ8_HANDLER(pc1403_lcd_read) |
54 | 54 | { |
55 | pc1403_state *state = space | |
55 | pc1403_state *state = space.machine().driver_data<pc1403_state>(); | |
56 | 56 | return state->m_reg[offset]; |
57 | 57 | } |
58 | 58 | |
59 | 59 | WRITE8_HANDLER(pc1403_lcd_write) |
60 | 60 | { |
61 | pc1403_state *state = space | |
61 | pc1403_state *state = space.machine().driver_data<pc1403_state>(); | |
62 | 62 | state->m_reg[offset]=data; |
63 | 63 | } |
64 | 64 |
r17963 | r17964 | |
---|---|---|
20 | 20 | UINT8 code1; //, code2; |
21 | 21 | UINT8 col; |
22 | 22 | int y, x, b; |
23 | address_space | |
23 | address_space &space = *screen.machine().device("maincpu")->memory().space(AS_PROGRAM); | |
24 | 24 | |
25 | 25 | // draw image |
26 | 26 | for (y = 0; y < 200; y++) |
27 | 27 | { |
28 | 28 | for (x = 0; x < 40; x++) |
29 | 29 | { |
30 | code1 = space->read_byte(0xe000 + x + y * 40); | |
31 | // code2 = space->read_byte(0xc000 + x + y * 40); | |
30 | code1 = space.read_byte(0xe000 + x + y * 40); | |
31 | // code2 = space.read_byte(0xc000 + x + y * 40); | |
32 | 32 | for (b = 0; b < 8; b++) |
33 | 33 | { |
34 | 34 | col = ((code1 >> b) & 0x01); |
r17963 | r17964 | |
---|---|---|
771 | 771 | switch( offset ) |
772 | 772 | { |
773 | 773 | case 0: case 2: case 4: case 6: |
774 | mc6845 = space->machine().device<mc6845_device>(T1000_MC6845_NAME); | |
775 | mc6845->address_w( *space, offset, data ); | |
774 | mc6845 = space.machine().device<mc6845_device>(T1000_MC6845_NAME); | |
775 | mc6845->address_w( space, offset, data ); | |
776 | 776 | break; |
777 | 777 | case 1: case 3: case 5: case 7: |
778 | mc6845 = space->machine().device<mc6845_device>(T1000_MC6845_NAME); | |
779 | mc6845->register_w( *space, offset, data ); | |
778 | mc6845 = space.machine().device<mc6845_device>(T1000_MC6845_NAME); | |
779 | mc6845->register_w( space, offset, data ); | |
780 | 780 | break; |
781 | 781 | case 8: |
782 | 782 | pc_t1t_mode_control_w(data); |
r17963 | r17964 | |
798 | 798 | pc_t1t_vga_data_w(data); |
799 | 799 | break; |
800 | 800 | case 15: |
801 | pc_t1t_bank_w(space | |
801 | pc_t1t_bank_w(space.machine(), data); | |
802 | 802 | break; |
803 | 803 | } |
804 | 804 | } |
r17963 | r17964 | |
811 | 811 | switch( offset ) |
812 | 812 | { |
813 | 813 | case 0: case 4: |
814 | mc6845 = space->machine().device<mc6845_device>(T1000_MC6845_NAME); | |
815 | mc6845->address_w( *space, offset, data ); | |
814 | mc6845 = space.machine().device<mc6845_device>(T1000_MC6845_NAME); | |
815 | mc6845->address_w( space, offset, data ); | |
816 | 816 | break; |
817 | 817 | case 1: case 5: |
818 | mc6845 = space->machine().device<mc6845_device>(T1000_MC6845_NAME); | |
819 | mc6845->register_w( *space, offset, data ); | |
818 | mc6845 = space.machine().device<mc6845_device>(T1000_MC6845_NAME); | |
819 | mc6845->register_w( space, offset, data ); | |
820 | 820 | break; |
821 | 821 | case 10: |
822 | 822 | if ( pcjr.address_data_ff & 0x01 ) |
823 | 823 | { |
824 | pc_pcjr_vga_data_w( space | |
824 | pc_pcjr_vga_data_w( space.machine(), data ); | |
825 | 825 | } |
826 | 826 | else |
827 | 827 | { |
r17963 | r17964 | |
835 | 835 | case 12: |
836 | 836 | break; |
837 | 837 | case 15: |
838 | pc_pcjr_bank_w(space | |
838 | pc_pcjr_bank_w(space.machine(), data); | |
839 | 839 | break; |
840 | 840 | |
841 | 841 | default: |
r17963 | r17964 | |
856 | 856 | break; |
857 | 857 | |
858 | 858 | case 1: case 3: case 5: case 7: |
859 | mc6845 = space->machine().device<mc6845_device>(T1000_MC6845_NAME); | |
860 | data = mc6845->register_r( *space, offset ); | |
859 | mc6845 = space.machine().device<mc6845_device>(T1000_MC6845_NAME); | |
860 | data = mc6845->register_r( space, offset ); | |
861 | 861 | break; |
862 | 862 | |
863 | 863 | case 8: |
r17963 | r17964 | |
922 | 922 | static VIDEO_START( pc_t1t ) |
923 | 923 | { |
924 | 924 | int buswidth; |
925 | address_space | |
925 | address_space &space = *machine.firstcpu->space(AS_PROGRAM); | |
926 | 926 | address_space *spaceio = machine.firstcpu->space(AS_IO); |
927 | 927 | |
928 | 928 | pcjr.chr_gen = machine.root_device().memregion("gfx1")->base(); |
r17963 | r17964 | |
934 | 934 | switch(buswidth) |
935 | 935 | { |
936 | 936 | case 8: |
937 | space | |
937 | space.install_legacy_readwrite_handler(0xb8000, 0xbffff, FUNC(pc_t1t_videoram_r), FUNC(pc_t1t_videoram_w) ); | |
938 | 938 | spaceio->install_legacy_readwrite_handler(0x3d0, 0x3df, FUNC(pc_T1T_r),FUNC(pc_T1T_w) ); |
939 | 939 | break; |
940 | 940 | |
941 | 941 | case 16: |
942 | space | |
942 | space.install_legacy_readwrite_handler(0xb8000, 0xbffff, FUNC(pc_t1t_videoram_r), FUNC(pc_t1t_videoram_w), 0xffff ); | |
943 | 943 | spaceio->install_legacy_readwrite_handler(0x3d0, 0x3df, FUNC(pc_T1T_r),FUNC(pc_T1T_w), 0xffff ); |
944 | 944 | break; |
945 | 945 |
r17963 | r17964 | |
---|---|---|
28 | 28 | |
29 | 29 | #define TRIGGER_HSYNC 64717 |
30 | 30 | |
31 | #define READ_MEM(x) space | |
31 | #define READ_MEM(x) space.read_byte(x) | |
32 | 32 | |
33 | 33 | /********** Maria ***********/ |
34 | 34 | |
r17963 | r17964 | |
86 | 86 | static void maria_draw_scanline(running_machine &machine) |
87 | 87 | { |
88 | 88 | a7800_state *state = machine.driver_data<a7800_state>(); |
89 | address_space | |
89 | address_space& space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
90 | 90 | unsigned int graph_adr,data_addr; |
91 | 91 | int width,hpos,pal,mode,ind; |
92 | 92 | unsigned int dl; |
r17963 | r17964 | |
321 | 321 | a7800_state *state = timer.machine().driver_data<a7800_state>(); |
322 | 322 | int frame_scanline; |
323 | 323 | UINT8 *ROM = timer.machine().root_device().memregion("maincpu")->base(); |
324 | address_space | |
324 | address_space& space = *timer.machine().device("maincpu")->memory().space(AS_PROGRAM); | |
325 | 325 | |
326 | 326 | state->m_maria_scanline++; |
327 | 327 |
r17963 | r17964 | |
---|---|---|
12 | 12 | #include "video/cgapal.h" |
13 | 13 | |
14 | 14 | |
15 | #define CGA_MONITOR (space | |
15 | #define CGA_MONITOR (space.machine().root_device().ioport("VIDEO")->read() & 0x1C) | |
16 | 16 | #define CGA_MONITOR_RGB 0x00 /* Colour RGB */ |
17 | 17 | #define CGA_MONITOR_MONO 0x04 /* Greyscale RGB */ |
18 | 18 | #define CGA_MONITOR_COMPOSITE 0x08 /* Colour composite */ |
r17963 | r17964 | |
496 | 496 | UINT8 data = 0xFF; |
497 | 497 | |
498 | 498 | if ( aga.mode == AGA_MONO ) { |
499 | mc6845_device *mc6845 = space | |
499 | mc6845_device *mc6845 = space.machine().device<mc6845_device>(AGA_MC6845_NAME); | |
500 | 500 | switch( offset ) |
501 | 501 | { |
502 | 502 | case 0: case 2: case 4: case 6: |
503 | 503 | /* return last written mc6845 address value here? */ |
504 | 504 | break; |
505 | 505 | case 1: case 3: case 5: case 7: |
506 | data = mc6845->register_r( | |
506 | data = mc6845->register_r(space, offset); | |
507 | 507 | break; |
508 | 508 | case 10: |
509 | data = (space | |
509 | data = (space.machine().root_device().ioport("IN0")->read() & 0x80 ) | 0x08 | aga.mda_status; | |
510 | 510 | aga.mda_status ^= 0x01; |
511 | 511 | break; |
512 | 512 | /* 12, 13, 14 are the LPT1 ports */ |
r17963 | r17964 | |
518 | 518 | static WRITE8_HANDLER ( pc_aga_mda_w ) |
519 | 519 | { |
520 | 520 | if ( aga.mode == AGA_MONO ) { |
521 | mc6845_device *mc6845 = space | |
521 | mc6845_device *mc6845 = space.machine().device<mc6845_device>(AGA_MC6845_NAME); | |
522 | 522 | switch( offset ) |
523 | 523 | { |
524 | 524 | case 0: case 2: case 4: case 6: |
525 | mc6845->address_w( | |
525 | mc6845->address_w( space, offset, data ); | |
526 | 526 | break; |
527 | 527 | case 1: case 3: case 5: case 7: |
528 | mc6845->register_w( | |
528 | mc6845->register_w( space, offset, data ); | |
529 | 529 | break; |
530 | 530 | case 8: |
531 | 531 | aga.mda_mode_control = data; |
r17963 | r17964 | |
551 | 551 | UINT8 data = 0xFF; |
552 | 552 | |
553 | 553 | if ( aga.mode == AGA_COLOR ) { |
554 | mc6845_device *mc6845 = space | |
554 | mc6845_device *mc6845 = space.machine().device<mc6845_device>(AGA_MC6845_NAME); | |
555 | 555 | switch( offset ) { |
556 | 556 | case 0: case 2: case 4: case 6: |
557 | 557 | /* return last written mc6845 address value here? */ |
558 | 558 | break; |
559 | 559 | case 1: case 3: case 5: case 7: |
560 | data = mc6845->register_r( | |
560 | data = mc6845->register_r( space, offset); | |
561 | 561 | break; |
562 | 562 | case 10: |
563 | 563 | data = aga.vsync | ( ( data & 0x40 ) >> 4 ) | aga.hsync; |
r17963 | r17964 | |
597 | 597 | static WRITE8_HANDLER ( pc_aga_cga_w ) |
598 | 598 | { |
599 | 599 | if ( aga.mode == AGA_COLOR ) { |
600 | mc6845_device *mc6845 = space | |
600 | mc6845_device *mc6845 = space.machine().device<mc6845_device>(AGA_MC6845_NAME); | |
601 | 601 | |
602 | 602 | switch(offset) { |
603 | 603 | case 0: case 2: case 4: case 6: |
604 | mc6845->address_w( | |
604 | mc6845->address_w( space, offset, data ); | |
605 | 605 | break; |
606 | 606 | case 1: case 3: case 5: case 7: |
607 | mc6845->register_w( | |
607 | mc6845->register_w( space, offset, data ); | |
608 | 608 | break; |
609 | 609 | case 8: |
610 | 610 | aga.cga_mode_control = data; |
r17963 | r17964 | |
689 | 689 | |
690 | 690 | VIDEO_START( pc_aga ) |
691 | 691 | { |
692 | address_space | |
692 | address_space &space = *machine.firstcpu->space(AS_PROGRAM); | |
693 | 693 | address_space *spaceio = machine.firstcpu->space(AS_IO); |
694 | 694 | int buswidth = machine.firstcpu->space_config(AS_PROGRAM)->m_databus_width; |
695 | 695 | switch(buswidth) |
696 | 696 | { |
697 | 697 | case 8: |
698 | space | |
698 | space.install_legacy_readwrite_handler(0xb0000, 0xbffff, FUNC(pc200_videoram_r), FUNC(pc200_videoram_w) ); | |
699 | 699 | spaceio->install_legacy_readwrite_handler(0x3b0, 0x3bf, FUNC(pc_aga_mda_r), FUNC(pc_aga_mda_w) ); |
700 | 700 | spaceio->install_legacy_readwrite_handler(0x3d0, 0x3df, FUNC(pc_aga_cga_r), FUNC(pc_aga_cga_w) ); |
701 | 701 | break; |
702 | 702 | |
703 | 703 | case 16: |
704 | space | |
704 | space.install_legacy_readwrite_handler(0xb0000, 0xbffff, FUNC(pc200_videoram_r), FUNC(pc200_videoram_w), 0xffff ); | |
705 | 705 | spaceio->install_legacy_readwrite_handler(0x3b0, 0x3bf, FUNC(pc_aga_mda_r), FUNC(pc_aga_mda_w), 0xffff ); |
706 | 706 | spaceio->install_legacy_readwrite_handler(0x3d0, 0x3df, FUNC(pc_aga_cga_r), FUNC(pc_aga_cga_w), 0xffff ); |
707 | 707 | break; |
r17963 | r17964 | |
720 | 720 | |
721 | 721 | VIDEO_START( pc200 ) |
722 | 722 | { |
723 | address_space | |
723 | address_space &space = *machine.firstcpu->space(AS_PROGRAM); | |
724 | 724 | address_space *spaceio = machine.firstcpu->space(AS_IO); |
725 | 725 | int buswidth = machine.firstcpu->space_config(AS_PROGRAM)->m_databus_width; |
726 | 726 | switch(buswidth) |
727 | 727 | { |
728 | 728 | case 8: |
729 | space | |
729 | space.install_legacy_readwrite_handler(0xb0000, 0xbffff, FUNC(pc_aga_videoram_r), FUNC(pc_aga_videoram_w) ); | |
730 | 730 | spaceio->install_legacy_readwrite_handler(0x3b0, 0x3bf, FUNC(pc_aga_mda_r), FUNC(pc_aga_mda_w) ); |
731 | 731 | spaceio->install_legacy_readwrite_handler(0x3d0, 0x3df, FUNC(pc200_cga_r), FUNC(pc200_cga_w) ); |
732 | 732 | break; |
733 | 733 | |
734 | 734 | case 16: |
735 | space | |
735 | space.install_legacy_readwrite_handler(0xb0000, 0xbffff, FUNC(pc_aga_videoram_r), FUNC(pc_aga_videoram_w), 0xffff ); | |
736 | 736 | spaceio->install_legacy_readwrite_handler(0x3b0, 0x3bf, FUNC(pc_aga_mda_r), FUNC(pc_aga_mda_w), 0xffff ); |
737 | 737 | spaceio->install_legacy_readwrite_handler(0x3d0, 0x3df, FUNC(pc200_cga_r), FUNC(pc200_cga_w), 0xffff ); |
738 | 738 | break; |
r17963 | r17964 | |
836 | 836 | if ((pc200.porte & 7) != (data & 7)) |
837 | 837 | { |
838 | 838 | if (data & 4) |
839 | pc_aga_set_mode(space | |
839 | pc_aga_set_mode(space.machine(), AGA_OFF); | |
840 | 840 | else if (data & 2) |
841 | pc_aga_set_mode(space | |
841 | pc_aga_set_mode(space.machine(), AGA_MONO); | |
842 | 842 | else |
843 | pc_aga_set_mode(space | |
843 | pc_aga_set_mode(space.machine(), AGA_COLOR); | |
844 | 844 | } |
845 | 845 | pc200.porte = data; |
846 | 846 | break; |
r17963 | r17964 | |
868 | 868 | case 0xe: |
869 | 869 | // 0x20 low cga |
870 | 870 | // 0x10 low special |
871 | result = space | |
871 | result = space.machine().root_device().ioport("DSW0")->read() & 0x38; | |
872 | 872 | break; |
873 | 873 | |
874 | 874 | default: |
r17963 | r17964 | |
---|---|---|
729 | 729 | |
730 | 730 | READ8_MEMBER( intv_state::intvkbd_tms9927_r ) |
731 | 731 | { |
732 | //intv_state *state = space | |
732 | //intv_state *state = space.machine().driver_data<intv_state>(); | |
733 | 733 | UINT8 rv; |
734 | 734 | switch (offset) |
735 | 735 | { |
r17963 | r17964 | |
752 | 752 | |
753 | 753 | WRITE8_MEMBER( intv_state::intvkbd_tms9927_w ) |
754 | 754 | { |
755 | //intv_state *state = space | |
755 | //intv_state *state = space.machine().driver_data<intv_state>(); | |
756 | 756 | switch (offset) |
757 | 757 | { |
758 | 758 | case 3: |
r17963 | r17964 | |
---|---|---|
57 | 57 | //------------------------------------------------- |
58 | 58 | // device_start - device-specific startup |
59 | 59 | //------------------------------------------------- |
60 | static READ8_HANDLER( input_port_0_r ) { return 0xff; } //return space | |
60 | static READ8_HANDLER( input_port_0_r ) { return 0xff; } //return space.machine().root_device().ioport("IN0")->read(); } | |
61 | 61 | |
62 | 62 | void isa8_vga_device::device_start() |
63 | 63 | { |
r17963 | r17964 | |
---|---|---|
130 | 130 | { |
131 | 131 | if (offset >= 0xd0 && offset < 0xd4) |
132 | 132 | { |
133 | address_space* space = machine().device("maincpu")->memory().space(AS_IO); | |
134 | data = m_ppi8255->read(*space, offset & 3); | |
133 | address_space& space = *machine().device("maincpu")->memory().space(AS_IO); | |
134 | data = m_ppi8255->read(space, offset & 3); | |
135 | 135 | } |
136 | 136 | else if (offset == 0xd4) |
137 | 137 | { |
r17963 | r17964 | |
150 | 150 | { |
151 | 151 | if (offset >= 0xd0 && offset < 0xd4) |
152 | 152 | { |
153 | address_space* space = machine().device("maincpu")->memory().space(AS_IO); | |
154 | m_ppi8255->write(*space, offset & 3, data); | |
153 | address_space& space = *machine().device("maincpu")->memory().space(AS_IO); | |
154 | m_ppi8255->write(space, offset & 3, data); | |
155 | 155 | } |
156 | 156 | else if (offset == 0xd4) |
157 | 157 | { |
r17963 | r17964 | |
---|---|---|
150 | 150 | SCREEN_UPDATE_IND16( ti85 ) |
151 | 151 | { |
152 | 152 | ti85_state *state = screen.machine().driver_data<ti85_state>(); |
153 | address_space | |
153 | address_space &space = *state->m_maincpu->space(AS_PROGRAM); | |
154 | 154 | int x,y,b; |
155 | 155 | int brightnes; |
156 | 156 | int lcdmem; |
r17963 | r17964 | |
170 | 170 | |
171 | 171 | for (y=0; y<state->m_ti_screen_y_size; y++) |
172 | 172 | for (x=0; x<state->m_ti_screen_x_size; x++) |
173 | *(state->m_frames+(state->m_ti_number_of_frames-1)*state->m_ti_video_memory_size+y*state->m_ti_screen_x_size+x) = space | |
173 | *(state->m_frames+(state->m_ti_number_of_frames-1)*state->m_ti_video_memory_size+y*state->m_ti_screen_x_size+x) = space.read_byte(lcdmem+y*state->m_ti_screen_x_size+x); | |
174 | 174 | |
175 | 175 | for (y=0; y<state->m_ti_screen_y_size; y++) |
176 | 176 | for (x=0; x<state->m_ti_screen_x_size; x++) |
r17963 | r17964 | |
---|---|---|
58 | 58 | //------------------------------------------------- |
59 | 59 | // device_start - device-specific startup |
60 | 60 | //------------------------------------------------- |
61 | static READ8_HANDLER( input_port_0_r ) { return 0xff; } //return space | |
61 | static READ8_HANDLER( input_port_0_r ) { return 0xff; } //return space.machine().root_device().ioport("IN0")->read(); } | |
62 | 62 | |
63 | 63 | void isa16_svga_s3_device::device_start() |
64 | 64 | { |
r17963 | r17964 | |
---|---|---|
97 | 97 | |
98 | 98 | READ8_HANDLER(pc1251_lcd_read) |
99 | 99 | { |
100 | pc1251_state *state = space | |
100 | pc1251_state *state = space.machine().driver_data<pc1251_state>(); | |
101 | 101 | int data; |
102 | 102 | data = state->m_reg[offset&0xff]; |
103 | 103 | logerror("pc1251 read %.3x %.2x\n",offset,data); |
r17963 | r17964 | |
106 | 106 | |
107 | 107 | WRITE8_HANDLER(pc1251_lcd_write) |
108 | 108 | { |
109 | pc1251_state *state = space | |
109 | pc1251_state *state = space.machine().driver_data<pc1251_state>(); | |
110 | 110 | logerror("pc1251 write %.3x %.2x\n",offset,data); |
111 | 111 | state->m_reg[offset&0xff] = data; |
112 | 112 | } |
r17963 | r17964 | |
---|---|---|
16 | 16 | static TIMER_CALLBACK( gal_video ) |
17 | 17 | { |
18 | 18 | galaxy_state *state = machine.driver_data<galaxy_state>(); |
19 | address_space | |
19 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
20 | 20 | int y, x; |
21 | 21 | if (state->m_interrupts_enabled == TRUE) |
22 | 22 | { |
r17963 | r17964 | |
39 | 39 | } |
40 | 40 | else |
41 | 41 | { |
42 | state->m_code = space | |
42 | state->m_code = space.read_byte(addr) & 0xbf; | |
43 | 43 | state->m_code += (state->m_code & 0x80) >> 1; |
44 | 44 | state->m_code = gfx[(state->m_code & 0x7f) +(dat << 7 )] ^ 0xff; |
45 | 45 | state->m_first = 0; |
r17963 | r17964 | |
68 | 68 | } |
69 | 69 | else |
70 | 70 | { |
71 | state->m_code = space | |
71 | state->m_code = space.read_byte(addr) ^ 0xff; | |
72 | 72 | state->m_first = 0; |
73 | 73 | } |
74 | 74 | y = state->m_gal_cnt / 48 - 2; |
r17963 | r17964 | |
81 | 81 | } |
82 | 82 | if ((x / 8 >= 11) && (x / 8 < 44)) |
83 | 83 | { |
84 | state->m_code = space | |
84 | state->m_code = space.read_byte(state->m_start_addr + y * 32 + (state->m_gal_cnt % 48) - 11) ^ 0xff; | |
85 | 85 | } |
86 | 86 | else |
87 | 87 | { |
r17963 | r17964 | |
---|---|---|
611 | 611 | READ8_HANDLER (bbc_6845_r) |
612 | 612 | { |
613 | 613 | |
614 | mc6845_device *mc6845 = space | |
614 | mc6845_device *mc6845 = space.machine().device<mc6845_device>("mc6845"); | |
615 | 615 | |
616 | 616 | switch (offset&1) |
617 | 617 | { |
618 | case 0: return mc6845->status_r(*space,0); break; | |
619 | case 1: return mc6845->register_r(*space,0); break; | |
618 | case 0: return mc6845->status_r(space,0); break; | |
619 | case 1: return mc6845->register_r(space,0); break; | |
620 | 620 | } |
621 | 621 | return 0; |
622 | 622 |
r17963 | r17964 | |
---|---|---|
27 | 27 | { |
28 | 28 | cpu_device *cpu = image.device().machine().firstcpu; |
29 | 29 | UINT8 *RAM = image.device().machine().root_device().memregion(cpu->tag())->base(); |
30 | address_space | |
30 | address_space &space = *cpu->space(AS_PROGRAM); | |
31 | 31 | unsigned char ace_repeat, ace_byte, loop; |
32 | 32 | int done=0, ace_index=0x2000; |
33 | 33 | |
r17963 | r17964 | |
108 | 108 | |
109 | 109 | /* Copy data to the address space */ |
110 | 110 | for (ace_index = 0x2000; ace_index < 0x8000; ace_index++) |
111 | space | |
111 | space.write_byte(ace_index, RAM[ace_index]); | |
112 | 112 | |
113 | 113 | return IMAGE_INIT_PASS; |
114 | 114 | } |
r17963 | r17964 | |
---|---|---|
219 | 219 | { |
220 | 220 | microtan_state *state = machine.driver_data<microtan_state>(); |
221 | 221 | UINT8 *RAM = state->memregion("maincpu")->base(); |
222 | address_space | |
222 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
223 | 223 | via6522_device *via_0 = machine.device<via6522_device>("via6522_0"); |
224 | 224 | via6522_device *via_1 = machine.device<via6522_device>("via6522_1"); |
225 | 225 | device_t *ay8910 = machine.device("ay8910.1"); |
r17963 | r17964 | |
278 | 278 | |
279 | 279 | /* first set of VIA6522 registers */ |
280 | 280 | for (i = 0; i < 16; i++ ) |
281 | via_0->write( | |
281 | via_0->write(space, i, snapshot_buff[base++]); | |
282 | 282 | |
283 | 283 | /* second set of VIA6522 registers */ |
284 | 284 | for (i = 0; i < 16; i++ ) |
285 | via_1->write( | |
285 | via_1->write(space, i, snapshot_buff[base++]); | |
286 | 286 | |
287 | 287 | /* microtan IO bff0-bfff */ |
288 | 288 | for (i = 0; i < 16; i++ ) |
289 | 289 | { |
290 | 290 | RAM[0xbff0+i] = snapshot_buff[base++]; |
291 | 291 | if (i < 4) |
292 | state->microtan_bffx_w( | |
292 | state->microtan_bffx_w(space, i, RAM[0xbff0+i]); | |
293 | 293 | } |
294 | 294 | |
295 | state->microtan_sound_w( | |
295 | state->microtan_sound_w(space, 0, snapshot_buff[base++]); | |
296 | 296 | state->m_chunky_graphics = snapshot_buff[base++]; |
297 | 297 | |
298 | 298 | /* first set of AY8910 registers */ |
r17963 | r17964 | |
---|---|---|
122 | 122 | autorun = image.device().machine().root_device().ioport("CONFIG")->read_safe(0xFF) & 1; |
123 | 123 | |
124 | 124 | device_t *cpu = image.device().machine().device("maincpu"); |
125 | address_space | |
125 | address_space &space = *image.device().machine().device("maincpu")->memory().space(AS_PROGRAM); | |
126 | 126 | |
127 | space | |
127 | space.write_word(0xa6, execute_address); /* fix the EXEC command */ | |
128 | 128 | |
129 | 129 | if (autorun) |
130 | 130 | { |
131 | space | |
131 | space.write_word(0xa2, execute_address); /* fix warm-start vector to get around some copy-protections */ | |
132 | 132 | cpu->state().set_pc(execute_address); |
133 | 133 | } |
134 | 134 | else |
135 | 135 | { |
136 | space | |
136 | space.write_word(0xa2, 0x8517); | |
137 | 137 | } |
138 | 138 | } |
139 | 139 | |
r17963 | r17964 | |
158 | 158 | /* check to see if autorun is on (I hate how this works) */ |
159 | 159 | autorun = image.device().machine().root_device().ioport("CONFIG")->read_safe(0xFF) & 1; |
160 | 160 | |
161 | address_space | |
161 | address_space &space = *image.device().machine().device("maincpu")->memory().space(AS_PROGRAM); | |
162 | 162 | |
163 | if ((execute_address >= 0xc000) && (execute_address <= 0xdfff) && (space | |
163 | if ((execute_address >= 0xc000) && (execute_address <= 0xdfff) && (space.read_byte(0xdffa) != 0xc3)) | |
164 | 164 | return IMAGE_INIT_FAIL; /* can't run a program if the cartridge isn't in */ |
165 | 165 | |
166 | 166 | /* Since Exidy Basic is by Microsoft, it needs some preprocessing before it can be run. |
r17963 | r17964 | |
182 | 182 | }; |
183 | 183 | |
184 | 184 | for (i = 0; i < ARRAY_LENGTH(data); i++) |
185 | space | |
185 | space.write_byte(0xf01f + i, data[i]); | |
186 | 186 | |
187 | 187 | if (!autorun) |
188 | space | |
188 | space.write_word(0xf028,0xc3dd); | |
189 | 189 | |
190 | 190 | /* tell BASIC where program ends */ |
191 | space->write_byte(0x1b7, end_address & 0xff); | |
192 | space->write_byte(0x1b8, (end_address >> 8) & 0xff); | |
191 | space.write_byte(0x1b7, end_address & 0xff); | |
192 | space.write_byte(0x1b8, (end_address >> 8) & 0xff); | |
193 | 193 | |
194 | 194 | if ((execute_address != 0xc858) && autorun) |
195 | space | |
195 | space.write_word(0xf028, execute_address); | |
196 | 196 | |
197 | 197 | image.device().machine().device("maincpu")->state().set_pc(0xf01f); |
198 | 198 | } |
r17963 | r17964 | |
---|---|---|
320 | 320 | UINT16 start, size, data, status; |
321 | 321 | spectrum_state *state = machine.driver_data<spectrum_state>(); |
322 | 322 | device_t *cpu = machine.device("maincpu"); |
323 | address_space | |
323 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
324 | 324 | |
325 | 325 | if (snapsize == SP_NEW_SIZE_16K || snapsize == SP_NEW_SIZE_48K) |
326 | 326 | { |
r17963 | r17964 | |
415 | 415 | /* Memory dump */ |
416 | 416 | logerror("Loading %04X bytes of RAM at %04X\n", size, start); |
417 | 417 | for (i = 0; i < size; i++) |
418 | space | |
418 | space.write_byte(start + i, snapdata[SP_OFFSET + SP_NEW_HDR + i]); | |
419 | 419 | |
420 | 420 | /* Set border color */ |
421 | 421 | data = snapdata[SP_OFFSET + 34] & 0x07; |
r17963 | r17964 | |
520 | 520 | UINT16 data, addr; |
521 | 521 | spectrum_state *state = machine.driver_data<spectrum_state>(); |
522 | 522 | device_t *cpu = machine.device("maincpu"); |
523 | address_space | |
523 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
524 | 524 | |
525 | 525 | if ((snapsize != SNA48_SIZE) && (state->m_port_7ffd_data == -1)) |
526 | 526 | { |
r17963 | r17964 | |
606 | 606 | /* Memory dump */ |
607 | 607 | logerror("Loading %04X bytes of RAM at %04X\n", 3*SPECTRUM_BANK, BASE_RAM); |
608 | 608 | for (i = 0; i < 3*SPECTRUM_BANK; i++) |
609 | space | |
609 | space.write_byte(BASE_RAM + i, snapdata[SNA48_HDR + i]); | |
610 | 610 | |
611 | 611 | /* Get PC from stack */ |
612 | 612 | addr = cpu->state().state_int(Z80_SP); |
r17963 | r17964 | |
616 | 616 | else |
617 | 617 | logerror("Fetching PC from the stack at SP:%04X\n", addr); |
618 | 618 | |
619 | data = (space | |
619 | data = (space.read_byte(addr + 1) << 8) | space.read_byte(addr + 0); | |
620 | 620 | LOAD_REG(cpu, Z80_PC, data); |
621 | 621 | |
622 | 622 | #if 0 |
623 | space->write_byte(addr + 0, 0); // It's been reported that zeroing these locations fixes the loading | |
624 | space->write_byte(addr + 1, 0); // of a few images that were snapshot at a "wrong" instant | |
623 | space.write_byte(addr + 0, 0); // It's been reported that zeroing these locations fixes the loading | |
624 | space.write_byte(addr + 1, 0); // of a few images that were snapshot at a "wrong" instant | |
625 | 625 | #endif |
626 | 626 | |
627 | 627 | addr += 2; |
r17963 | r17964 | |
651 | 651 | logerror("Loading bank 2 from offset:0401B\n"); |
652 | 652 | logerror("Loading bank %d from offset:0801B\n", snapdata[SNA128_OFFSET + 2] & 0x07); |
653 | 653 | for (i = 0; i < 3*SPECTRUM_BANK; i++) |
654 | space | |
654 | space.write_byte(BASE_RAM + i, snapdata[SNA48_HDR + i]); | |
655 | 655 | |
656 | 656 | bank_offset = SNA48_SIZE + SNA128_HDR; |
657 | 657 | for (i = 0; i < 8; i++) |
r17963 | r17964 | |
663 | 663 | state->m_port_7ffd_data += i; |
664 | 664 | spectrum_update_paging(machine); |
665 | 665 | for (j = 0; j < SPECTRUM_BANK; j++) |
666 | space | |
666 | space.write_byte(j + 3*SPECTRUM_BANK, snapdata[bank_offset + j]); | |
667 | 667 | bank_offset += SPECTRUM_BANK; |
668 | 668 | } |
669 | 669 | } |
r17963 | r17964 | |
739 | 739 | UINT16 data; |
740 | 740 | spectrum_state *state = machine.driver_data<spectrum_state>(); |
741 | 741 | device_t *cpu = machine.device("maincpu"); |
742 | address_space | |
742 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
743 | 743 | |
744 | 744 | data = (snapdata[ACH_OFFSET + 0] << 8) | snapdata[ACH_OFFSET + 4]; |
745 | 745 | LOAD_REG(cpu, Z80_AF, data); |
r17963 | r17964 | |
804 | 804 | /* Memory dump */ |
805 | 805 | logerror("Loading %04X bytes of RAM at %04X\n", 3*SPECTRUM_BANK, BASE_RAM); |
806 | 806 | for (i = 0; i < 3*SPECTRUM_BANK; i++) |
807 | space | |
807 | space.write_byte(BASE_RAM + i, snapdata[ACH_HDR + SPECTRUM_BANK + i]); | |
808 | 808 | |
809 | 809 | /* Set border color */ |
810 | 810 | data = snapdata[ACH_OFFSET + 156] & 0x07; |
r17963 | r17964 | |
872 | 872 | UINT16 addr, data; |
873 | 873 | spectrum_state *state = machine.driver_data<spectrum_state>(); |
874 | 874 | device_t *cpu = machine.device("maincpu"); |
875 | address_space | |
875 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
876 | 876 | |
877 | 877 | data = snapdata[PRG_OFFSET + 0]; |
878 | 878 | if (data != 0x05) |
r17963 | r17964 | |
915 | 915 | /* Memory dump */ |
916 | 916 | logerror("Loading %04X bytes of RAM at %04X\n", 3*SPECTRUM_BANK, BASE_RAM); |
917 | 917 | for (i = 0; i < 3*SPECTRUM_BANK; i++) |
918 | space | |
918 | space.write_byte(BASE_RAM + i, snapdata[PRG_HDR + i]); | |
919 | 919 | |
920 | 920 | addr = (snapdata[PRG_OFFSET + 241] << 8) | snapdata[PRG_OFFSET + 240]; |
921 | 921 | if (addr < BASE_RAM || addr > 4*SPECTRUM_BANK - 6) |
r17963 | r17964 | |
923 | 923 | else |
924 | 924 | logerror("Fetching registers IFF1/2, R, AF and PC from the stack at SP:%04X\n", addr); |
925 | 925 | |
926 | data = space | |
926 | data = space.read_byte(addr + 0); // IFF1/2: (bit 2, 0=DI/1=EI) | |
927 | 927 | LOAD_REG(cpu, Z80_IFF1, BIT(data, 2)); |
928 | 928 | LOAD_REG(cpu, Z80_IFF2, BIT(data, 2)); |
929 | 929 | |
r17963 | r17964 | |
931 | 931 | machine.device("maincpu")->execute().set_input_line(INPUT_LINE_IRQ0, intr); |
932 | 932 | machine.device("maincpu")->execute().set_input_line(INPUT_LINE_HALT, CLEAR_LINE); |
933 | 933 | |
934 | data = space | |
934 | data = space.read_byte(addr + 1); | |
935 | 935 | LOAD_REG(cpu, Z80_R, data); |
936 | 936 | |
937 | data = (space | |
937 | data = (space.read_byte(addr + 3) << 8) | space.read_byte(addr + 2); | |
938 | 938 | LOAD_REG(cpu, Z80_AF, data); |
939 | 939 | |
940 | data = (space | |
940 | data = (space.read_byte(addr + 5) << 8) | space.read_byte(addr + 4); | |
941 | 941 | LOAD_REG(cpu, Z80_PC, data); |
942 | 942 | |
943 | 943 | #if 0 |
944 | space->write_byte(addr + 0, 0); // It's been reported that zeroing these locations fixes the loading | |
945 | space->write_byte(addr + 1, 0); // of a few images that were snapshot at a "wrong" instant | |
946 | space->write_byte(addr + 2, 0); | |
947 | space->write_byte(addr + 3, 0); | |
948 | space->write_byte(addr + 4, 0); | |
949 | space->write_byte(addr + 5, 0); | |
944 | space.write_byte(addr + 0, 0); // It's been reported that zeroing these locations fixes the loading | |
945 | space.write_byte(addr + 1, 0); // of a few images that were snapshot at a "wrong" instant | |
946 | space.write_byte(addr + 2, 0); | |
947 | space.write_byte(addr + 3, 0); | |
948 | space.write_byte(addr + 4, 0); | |
949 | space.write_byte(addr + 5, 0); | |
950 | 950 | #endif |
951 | 951 | |
952 | 952 | addr += 6; |
r17963 | r17964 | |
954 | 954 | cpu->state().set_state_int(Z80_SP, addr); |
955 | 955 | |
956 | 956 | /* Set border color */ |
957 | data = (space | |
957 | data = (space.read_byte(0x5c48) >> 3) & 0x07; // Get the current border color from BORDCR system variable. | |
958 | 958 | state->m_port_fe_data = (state->m_port_fe_data & 0xf8) | data; |
959 | 959 | spectrum_border_update(machine, data); |
960 | 960 | logerror("Border color:%02X\n", data); |
r17963 | r17964 | |
1042 | 1042 | UINT16 addr = 0, data; |
1043 | 1043 | spectrum_state *state = machine.driver_data<spectrum_state>(); |
1044 | 1044 | device_t *cpu = machine.device("maincpu"); |
1045 | address_space | |
1045 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
1046 | 1046 | |
1047 | 1047 | data = (snapdata[PLUSD_OFFSET + 15] << 8) | snapdata[PLUSD_OFFSET + 14]; |
1048 | 1048 | LOAD_REG(cpu, Z80_BC, data); |
r17963 | r17964 | |
1085 | 1085 | /* Memory dump */ |
1086 | 1086 | logerror("Loading %04X bytes of RAM at %04X\n", 3*SPECTRUM_BANK, BASE_RAM); |
1087 | 1087 | for (i = 0; i < 3*SPECTRUM_BANK; i++) |
1088 | space | |
1088 | space.write_byte(BASE_RAM + i, snapdata[PLUSD48_HDR + i]); | |
1089 | 1089 | } |
1090 | 1090 | else |
1091 | 1091 | { |
r17963 | r17964 | |
1111 | 1111 | }; |
1112 | 1112 | logerror("Loading bank %d from offset:%05X\n", i, PLUSD128_HDR + i*SPECTRUM_BANK); |
1113 | 1113 | for (j = 0; j < SPECTRUM_BANK; j++) |
1114 | space | |
1114 | space.write_byte(j + addr, snapdata[j + PLUSD128_HDR + i*SPECTRUM_BANK]); | |
1115 | 1115 | } |
1116 | 1116 | state->m_port_7ffd_data = snapdata[PLUSD_OFFSET + 22]; |
1117 | 1117 | logerror ("Port 7FFD:%02X\n", state->m_port_7ffd_data); |
r17963 | r17964 | |
1125 | 1125 | else |
1126 | 1126 | logerror("Fetching registers IFF1/2, R, AF and PC from the stack at SP:%04X\n", addr); |
1127 | 1127 | |
1128 | data = space | |
1128 | data = space.read_byte(addr + 0); // IFF1/2: (bit 2, 0=DI/1=EI) | |
1129 | 1129 | LOAD_REG(cpu, Z80_IFF1, BIT(data, 2)); |
1130 | 1130 | LOAD_REG(cpu, Z80_IFF2, BIT(data, 2)); |
1131 | 1131 | |
r17963 | r17964 | |
1133 | 1133 | machine.device("maincpu")->execute().set_input_line(INPUT_LINE_IRQ0, intr); |
1134 | 1134 | machine.device("maincpu")->execute().set_input_line(INPUT_LINE_HALT, CLEAR_LINE); |
1135 | 1135 | |
1136 | data = space | |
1136 | data = space.read_byte(addr + 1); | |
1137 | 1137 | LOAD_REG(cpu, Z80_R, data); |
1138 | 1138 | |
1139 | data = (space | |
1139 | data = (space.read_byte(addr + 3) << 8) | space.read_byte(addr + 2); | |
1140 | 1140 | LOAD_REG(cpu, Z80_AF, data); |
1141 | 1141 | |
1142 | data = (space | |
1142 | data = (space.read_byte(addr + 5) << 8) | space.read_byte(addr + 4); | |
1143 | 1143 | LOAD_REG(cpu, Z80_PC, data); |
1144 | 1144 | |
1145 | 1145 | #if 0 |
1146 | space->write_byte(addr + 0, 0); // It's been reported that zeroing these locations fixes the loading | |
1147 | space->write_byte(addr + 1, 0); // of a few images that were snapshot at a "wrong" instant | |
1148 | space->write_byte(addr + 2, 0); | |
1149 | space->write_byte(addr + 3, 0); | |
1150 | space->write_byte(addr + 4, 0); | |
1151 | space->write_byte(addr + 5, 0); | |
1146 | space.write_byte(addr + 0, 0); // It's been reported that zeroing these locations fixes the loading | |
1147 | space.write_byte(addr + 1, 0); // of a few images that were snapshot at a "wrong" instant | |
1148 | space.write_byte(addr + 2, 0); | |
1149 | space.write_byte(addr + 3, 0); | |
1150 | space.write_byte(addr + 4, 0); | |
1151 | space.write_byte(addr + 5, 0); | |
1152 | 1152 | #endif |
1153 | 1153 | |
1154 | 1154 | addr += 6; |
r17963 | r17964 | |
1156 | 1156 | cpu->state().set_state_int(Z80_SP, addr); |
1157 | 1157 | |
1158 | 1158 | /* Set border color */ |
1159 | data = (space | |
1159 | data = (space.read_byte(0x5c48) >> 3) & 0x07; // Get the current border color from BORDCR system variable. | |
1160 | 1160 | state->m_port_fe_data = (state->m_port_fe_data & 0xf8) | data; |
1161 | 1161 | spectrum_border_update(machine, data); |
1162 | 1162 | logerror("Border color:%02X\n", data); |
r17963 | r17964 | |
1210 | 1210 | UINT16 data; |
1211 | 1211 | spectrum_state *state = machine.driver_data<spectrum_state>(); |
1212 | 1212 | device_t *cpu = machine.device("maincpu"); |
1213 | address_space | |
1213 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
1214 | 1214 | |
1215 | 1215 | data = (snapdata[SEM_OFFSET + 1] << 8) | snapdata[SEM_OFFSET + 0]; |
1216 | 1216 | LOAD_REG(cpu, Z80_AF, data); |
r17963 | r17964 | |
1273 | 1273 | /* Memory dump */ |
1274 | 1274 | logerror("Loading %04X bytes of RAM at %04X\n", 3*SPECTRUM_BANK, BASE_RAM); |
1275 | 1275 | for (i = 0; i < 3*SPECTRUM_BANK; i++) |
1276 | space | |
1276 | space.write_byte(BASE_RAM + i, snapdata[SEM_SIGNATURE + i]); | |
1277 | 1277 | |
1278 | 1278 | /* Set border color */ |
1279 | data = (space | |
1279 | data = (space.read_byte(0x5c48) >> 3) & 0x07; // Get the current border color from BORDCR system variable. | |
1280 | 1280 | state->m_port_fe_data = (state->m_port_fe_data & 0xf8) | data; |
1281 | 1281 | spectrum_border_update(machine, data); |
1282 | 1282 | logerror("Border color:%02X\n", data); |
r17963 | r17964 | |
1329 | 1329 | UINT16 data; |
1330 | 1330 | spectrum_state *state = machine.driver_data<spectrum_state>(); |
1331 | 1331 | device_t *cpu = machine.device("maincpu"); |
1332 | address_space | |
1332 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
1333 | 1333 | |
1334 | 1334 | data = (snapdata[SIT_OFFSET + 7] << 8) | snapdata[SIT_OFFSET + 6]; |
1335 | 1335 | LOAD_REG(cpu, Z80_AF, data); |
r17963 | r17964 | |
1392 | 1392 | logerror("Skipping the 16K ROM dump at offset:%04X\n", SIT_OFFSET + 28); |
1393 | 1393 | logerror("Loading %04X bytes of RAM at %04X\n", 3*SPECTRUM_BANK, BASE_RAM); |
1394 | 1394 | for (i = 0; i < 3*SPECTRUM_BANK; i++) |
1395 | space | |
1395 | space.write_byte(BASE_RAM + i, snapdata[SIT_HDR + SPECTRUM_BANK + i]); | |
1396 | 1396 | |
1397 | 1397 | /* Set border color */ |
1398 | 1398 | data = snapdata[SIT_OFFSET + 27] & 0x07; |
r17963 | r17964 | |
1459 | 1459 | UINT16 data, mode; |
1460 | 1460 | spectrum_state *state = machine.driver_data<spectrum_state>(); |
1461 | 1461 | device_t *cpu = machine.device("maincpu"); |
1462 | address_space | |
1462 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
1463 | 1463 | |
1464 | 1464 | logerror("Skipping last 132 bytes of the 16K ROM dump at offset:0000\n"); |
1465 | 1465 | |
r17963 | r17964 | |
1536 | 1536 | /* Memory dump */ |
1537 | 1537 | logerror("Loading %04X bytes of RAM at %04X\n", 3*SPECTRUM_BANK, BASE_RAM); |
1538 | 1538 | for (i = 0; i < 3*SPECTRUM_BANK; i++) |
1539 | space | |
1539 | space.write_byte(BASE_RAM + i, snapdata[132 + i]); | |
1540 | 1540 | |
1541 | 1541 | /* Set border color */ |
1542 | data = (space | |
1542 | data = (space.read_byte(0x5c48) >> 3) & 0x07; // Get the current border color from BORDCR system variable. | |
1543 | 1543 | state->m_port_fe_data = (state->m_port_fe_data & 0xf8) | data; |
1544 | 1544 | spectrum_border_update(machine, data); |
1545 | 1545 | logerror("Border color:%02X\n", data); |
r17963 | r17964 | |
1591 | 1591 | UINT16 data; |
1592 | 1592 | spectrum_state *state = machine.driver_data<spectrum_state>(); |
1593 | 1593 | device_t *cpu = machine.device("maincpu"); |
1594 | address_space | |
1594 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
1595 | 1595 | |
1596 | 1596 | data = (snapdata[SNP_OFFSET + 1] << 8) | snapdata[SNP_OFFSET + 0]; |
1597 | 1597 | LOAD_REG(cpu, Z80_AF, data); |
r17963 | r17964 | |
1654 | 1654 | /* Memory dump */ |
1655 | 1655 | logerror("Loading %04X bytes of RAM at %04X\n", 3*SPECTRUM_BANK, BASE_RAM); |
1656 | 1656 | for (i = 0; i < 3*SPECTRUM_BANK; i++) |
1657 | space | |
1657 | space.write_byte(BASE_RAM + i, snapdata[i]); | |
1658 | 1658 | |
1659 | 1659 | /* Set border color */ |
1660 | 1660 | data = snapdata[SNP_OFFSET + 2] & 0x07; |
r17963 | r17964 | |
1768 | 1768 | { |
1769 | 1769 | UINT8 counthi, countlo, compress, fill; |
1770 | 1770 | UINT16 block = 0, count, i, j, numbytes; |
1771 | address_space | |
1771 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
1772 | 1772 | |
1773 | 1773 | i = SNX_HDR - 1; |
1774 | 1774 | numbytes = 0; |
r17963 | r17964 | |
1798 | 1798 | fill = source[++i]; |
1799 | 1799 | logerror("Dest:%04X Filler:%02X\n", BASE_RAM + numbytes, fill); |
1800 | 1800 | for(j = 0; j < count; j++) |
1801 | space | |
1801 | space.write_byte(BASE_RAM + numbytes + j, fill); | |
1802 | 1802 | numbytes += count; |
1803 | 1803 | } |
1804 | 1804 | else |
r17963 | r17964 | |
1806 | 1806 | logerror("Dest:%04X\n", BASE_RAM + numbytes); |
1807 | 1807 | j = 0; |
1808 | 1808 | while (j < count) |
1809 | space | |
1809 | space.write_byte(BASE_RAM + numbytes + j++, source[++i]); | |
1810 | 1810 | numbytes += count; |
1811 | 1811 | } |
1812 | 1812 | } |
r17963 | r17964 | |
1818 | 1818 | UINT16 data, addr; |
1819 | 1819 | spectrum_state *state = machine.driver_data<spectrum_state>(); |
1820 | 1820 | device_t *cpu = machine.device("maincpu"); |
1821 | address_space | |
1821 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
1822 | 1822 | |
1823 | 1823 | data = (snapdata[SNX_OFFSET + 4] << 8) | snapdata[SNX_OFFSET + 5]; |
1824 | 1824 | if (data != 0x25) |
r17963 | r17964 | |
1893 | 1893 | else |
1894 | 1894 | logerror("Fetching PC from the stack at SP:%04X\n", addr); |
1895 | 1895 | |
1896 | LOAD_REG(cpu, Z80_PC, (space | |
1896 | LOAD_REG(cpu, Z80_PC, (space.read_byte(addr + 1) << 8) | space.read_byte(addr + 0)); | |
1897 | 1897 | |
1898 | 1898 | #if 0 |
1899 | space->write_byte(addr + 0, 0); // It's been reported that zeroing these locations fixes the loading | |
1900 | space->write_byte(addr + 1, 0); // of a few images that were snapshot at a "wrong" instant | |
1899 | space.write_byte(addr + 0, 0); // It's been reported that zeroing these locations fixes the loading | |
1900 | space.write_byte(addr + 1, 0); // of a few images that were snapshot at a "wrong" instant | |
1901 | 1901 | #endif |
1902 | 1902 | |
1903 | 1903 | addr += 2; |
r17963 | r17964 | |
1972 | 1972 | UINT16 addr, data; |
1973 | 1973 | spectrum_state *state = machine.driver_data<spectrum_state>(); |
1974 | 1974 | device_t *cpu = machine.device("maincpu"); |
1975 | address_space | |
1975 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
1976 | 1976 | |
1977 | 1977 | if (state->m_port_7ffd_data == -1) |
1978 | 1978 | { |
r17963 | r17964 | |
2063 | 2063 | }; |
2064 | 2064 | logerror("Loading bank %d from offset:%05X\n", banks[i], FRZ_HDR + i*SPECTRUM_BANK); |
2065 | 2065 | for (j = 0; j < SPECTRUM_BANK; j++) |
2066 | space | |
2066 | space.write_byte(j + addr, snapdata[j + FRZ_HDR + i*SPECTRUM_BANK]); | |
2067 | 2067 | } |
2068 | 2068 | state->m_port_7ffd_data = snapdata[FRZ_OFFSET + 1]; |
2069 | 2069 | logerror ("Port 7FFD:%02X\n", state->m_port_7ffd_data); |
r17963 | r17964 | |
2071 | 2071 | spectrum_update_paging(machine); |
2072 | 2072 | |
2073 | 2073 | /* Set border color */ |
2074 | data = (space | |
2074 | data = (space.read_byte(0x5c48) >> 3) & 0x07; // Get the current border color from BORDCR system variable. | |
2075 | 2075 | state->m_port_fe_data = (state->m_port_fe_data & 0xf8) | data; |
2076 | 2076 | spectrum_border_update(machine, data); |
2077 | 2077 | logerror("Border color:%02X\n", data); |
r17963 | r17964 | |
2083 | 2083 | { |
2084 | 2084 | UINT8 ch; |
2085 | 2085 | int i; |
2086 | address_space | |
2086 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
2087 | 2087 | |
2088 | 2088 | do |
2089 | 2089 | { |
r17963 | r17964 | |
2115 | 2115 | |
2116 | 2116 | for (i = 0; i < count; i++) |
2117 | 2117 | { |
2118 | space | |
2118 | space.write_byte(dest, data); | |
2119 | 2119 | dest++; |
2120 | 2120 | } |
2121 | 2121 | } |
2122 | 2122 | else |
2123 | 2123 | { |
2124 | 2124 | /* single 0x0ed */ |
2125 | space | |
2125 | space.write_byte(dest, ch); | |
2126 | 2126 | dest++; |
2127 | 2127 | source++; |
2128 | 2128 | size--; |
r17963 | r17964 | |
2131 | 2131 | else |
2132 | 2132 | { |
2133 | 2133 | /* not 0x0ed */ |
2134 | space | |
2134 | space.write_byte(dest, ch); | |
2135 | 2135 | dest++; |
2136 | 2136 | source++; |
2137 | 2137 | size--; |
r17963 | r17964 | |
2194 | 2194 | int i; |
2195 | 2195 | UINT8 lo, hi, data; |
2196 | 2196 | SPECTRUM_Z80_SNAPSHOT_TYPE z80_type; |
2197 | address_space | |
2197 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
2198 | 2198 | |
2199 | 2199 | z80_type = spectrum_identify_z80(snapdata, snapsize); |
2200 | 2200 | |
r17963 | r17964 | |
2331 | 2331 | { |
2332 | 2332 | logerror("Not compressed\n"); /* not compressed */ |
2333 | 2333 | for (i = 0; i < 49152; i++) |
2334 | space | |
2334 | space.write_byte(i + 16384, snapdata[30 + i]); | |
2335 | 2335 | } |
2336 | 2336 | else |
2337 | 2337 | { |
r17963 | r17964 | |
2412 | 2412 | |
2413 | 2413 | /* not compressed */ |
2414 | 2414 | for (i = 0; i < 16384; i++) |
2415 | space | |
2415 | space.write_byte(i + Dest, pSource[i]); | |
2416 | 2416 | } |
2417 | 2417 | else |
2418 | 2418 | { |
r17963 | r17964 | |
2520 | 2520 | void spectrum_setup_scr(running_machine &machine, UINT8 *quickdata, UINT32 quicksize) |
2521 | 2521 | { |
2522 | 2522 | int i; |
2523 | address_space | |
2523 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
2524 | 2524 | |
2525 | 2525 | for (i = 0; i < quicksize; i++) |
2526 | space | |
2526 | space.write_byte(i + BASE_RAM, quickdata[i]); | |
2527 | 2527 | |
2528 | 2528 | log_quickload(quicksize == SCR_SIZE ? "SCREEN$" : "SCREEN$ (Mono)", BASE_RAM, quicksize, 0, EXEC_NA); |
2529 | 2529 | } |
r17963 | r17964 | |
2560 | 2560 | UINT8 data; |
2561 | 2561 | UINT16 start, len; |
2562 | 2562 | spectrum_state *state = machine.driver_data<spectrum_state>(); |
2563 | address_space | |
2563 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
2564 | 2564 | |
2565 | 2565 | start = (quickdata[RAW_OFFSET + 4] << 8) | quickdata[RAW_OFFSET + 3]; |
2566 | 2566 | len = (quickdata[RAW_OFFSET + 2] << 8) | quickdata[RAW_OFFSET + 1]; |
2567 | 2567 | |
2568 | 2568 | for (i = 0; i < len; i++) |
2569 | space | |
2569 | space.write_byte(i + start, quickdata[i + RAW_HDR]); | |
2570 | 2570 | |
2571 | 2571 | /* Set border color */ |
2572 | data = (space | |
2572 | data = (space.read_byte(0x5c48) >> 3) & 0x07; // Get the current border color from BORDCR system variable. | |
2573 | 2573 | state->m_port_fe_data = (state->m_port_fe_data & 0xf8) | data; |
2574 | 2574 | spectrum_border_update(machine, data); |
2575 | 2575 | logerror("Border color:%02X\n", data); |
r17963 | r17964 | |
---|---|---|
30 | 30 | UINT32 bytesread; |
31 | 31 | UINT16 address = 0; |
32 | 32 | int i; |
33 | address_space | |
33 | address_space &space = *image.device().machine().firstcpu->space(AS_PROGRAM); | |
34 | 34 | |
35 | 35 | if (!file_type) |
36 | 36 | goto error; |
r17963 | r17964 | |
79 | 79 | goto error; |
80 | 80 | |
81 | 81 | for (i = 0; i < snapshot_size; i++) |
82 | space | |
82 | space.write_byte(address + i + offset, data[i]); | |
83 | 83 | |
84 | 84 | cbm_sethiaddress(image.device().machine(), address + snapshot_size); |
85 | 85 | free(data); |
r17963 | r17964 | |
93 | 93 | |
94 | 94 | static void cbm_quick_sethiaddress( running_machine &machine, UINT16 hiaddress ) |
95 | 95 | { |
96 | address_space | |
96 | address_space &space = *machine.firstcpu->space(AS_PROGRAM); | |
97 | 97 | |
98 | space->write_byte(0x31, hiaddress & 0xff); | |
99 | space->write_byte(0x2f, hiaddress & 0xff); | |
100 | space->write_byte(0x2d, hiaddress & 0xff); | |
101 | space->write_byte(0x32, hiaddress >> 8); | |
102 | space->write_byte(0x30, hiaddress >> 8); | |
103 | space->write_byte(0x2e, hiaddress >> 8); | |
98 | space.write_byte(0x31, hiaddress & 0xff); | |
99 | space.write_byte(0x2f, hiaddress & 0xff); | |
100 | space.write_byte(0x2d, hiaddress & 0xff); | |
101 | space.write_byte(0x32, hiaddress >> 8); | |
102 | space.write_byte(0x30, hiaddress >> 8); | |
103 | space.write_byte(0x2e, hiaddress >> 8); | |
104 | 104 | } |
105 | 105 | |
106 | 106 | QUICKLOAD_LOAD( cbm_c16 ) |
r17963 | r17964 | |
120 | 120 | |
121 | 121 | static void cbm_pet_quick_sethiaddress( running_machine &machine, UINT16 hiaddress ) |
122 | 122 | { |
123 | address_space | |
123 | address_space &space = *machine.firstcpu->space(AS_PROGRAM); | |
124 | 124 | |
125 | space->write_byte(0x2e, hiaddress & 0xff); | |
126 | space->write_byte(0x2c, hiaddress & 0xff); | |
127 | space->write_byte(0x2a, hiaddress & 0xff); | |
128 | space->write_byte(0x2f, hiaddress >> 8); | |
129 | space->write_byte(0x2d, hiaddress >> 8); | |
130 | space->write_byte(0x2b, hiaddress >> 8); | |
125 | space.write_byte(0x2e, hiaddress & 0xff); | |
126 | space.write_byte(0x2c, hiaddress & 0xff); | |
127 | space.write_byte(0x2a, hiaddress & 0xff); | |
128 | space.write_byte(0x2f, hiaddress >> 8); | |
129 | space.write_byte(0x2d, hiaddress >> 8); | |
130 | space.write_byte(0x2b, hiaddress >> 8); | |
131 | 131 | } |
132 | 132 | |
133 | 133 | QUICKLOAD_LOAD( cbm_pet ) |
r17963 | r17964 | |
137 | 137 | |
138 | 138 | static void cbm_pet1_quick_sethiaddress(running_machine &machine, UINT16 hiaddress) |
139 | 139 | { |
140 | address_space | |
140 | address_space &space = *machine.firstcpu->space(AS_PROGRAM); | |
141 | 141 | |
142 | space->write_byte(0x80, hiaddress & 0xff); | |
143 | space->write_byte(0x7e, hiaddress & 0xff); | |
144 | space->write_byte(0x7c, hiaddress & 0xff); | |
145 | space->write_byte(0x81, hiaddress >> 8); | |
146 | space->write_byte(0x7f, hiaddress >> 8); | |
147 | space->write_byte(0x7d, hiaddress >> 8); | |
142 | space.write_byte(0x80, hiaddress & 0xff); | |
143 | space.write_byte(0x7e, hiaddress & 0xff); | |
144 | space.write_byte(0x7c, hiaddress & 0xff); | |
145 | space.write_byte(0x81, hiaddress >> 8); | |
146 | space.write_byte(0x7f, hiaddress >> 8); | |
147 | space.write_byte(0x7d, hiaddress >> 8); | |
148 | 148 | } |
149 | 149 | |
150 | 150 | QUICKLOAD_LOAD( cbm_pet1 ) |
r17963 | r17964 | |
154 | 154 | |
155 | 155 | static void cbmb_quick_sethiaddress(running_machine &machine, UINT16 hiaddress) |
156 | 156 | { |
157 | address_space | |
157 | address_space &space = *machine.firstcpu->space(AS_PROGRAM); | |
158 | 158 | |
159 | space->write_byte(0xf0046, hiaddress & 0xff); | |
160 | space->write_byte(0xf0047, hiaddress >> 8); | |
159 | space.write_byte(0xf0046, hiaddress & 0xff); | |
160 | space.write_byte(0xf0047, hiaddress >> 8); | |
161 | 161 | } |
162 | 162 | |
163 | 163 | QUICKLOAD_LOAD( cbmb ) |
r17963 | r17964 | |
172 | 172 | |
173 | 173 | static void cbm_c65_quick_sethiaddress( running_machine &machine, UINT16 hiaddress ) |
174 | 174 | { |
175 | address_space | |
175 | address_space &space = *machine.firstcpu->space(AS_PROGRAM); | |
176 | 176 | |
177 | space->write_byte(0x82, hiaddress & 0xff); | |
178 | space->write_byte(0x83, hiaddress >> 8); | |
177 | space.write_byte(0x82, hiaddress & 0xff); | |
178 | space.write_byte(0x83, hiaddress >> 8); | |
179 | 179 | } |
180 | 180 | |
181 | 181 | QUICKLOAD_LOAD( cbm_c65 ) |
r17963 | r17964 | |
---|---|---|
646 | 646 | |
647 | 647 | static QUICKLOAD_LOAD(homelab) |
648 | 648 | { |
649 | address_space | |
649 | address_space &space = *image.device().machine().device("maincpu")->memory().space(AS_PROGRAM); | |
650 | 650 | int i=0; |
651 | 651 | UINT8 ch; |
652 | 652 | UINT16 quick_addr; |
r17963 | r17964 | |
730 | 730 | image.message("%s: Unexpected EOF while writing byte to %04X", pgmname, (unsigned) j); |
731 | 731 | return IMAGE_INIT_FAIL; |
732 | 732 | } |
733 | space | |
733 | space.write_byte(j, ch); | |
734 | 734 | } |
735 | 735 | |
736 | 736 | return IMAGE_INIT_PASS; |
r17963 | r17964 | |
---|---|---|
52 | 52 | |
53 | 53 | void vt520_state::machine_reset() |
54 | 54 | { |
55 | address_space | |
55 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
56 | 56 | UINT8 *rom = memregion("maincpu")->base(); |
57 | space | |
57 | space.unmap_write(0x0000, 0xffff); | |
58 | 58 | membank("bank1")->set_base(rom + 0x70000); |
59 | 59 | } |
60 | 60 |
r17963 | r17964 | |
---|---|---|
2611 | 2611 | { |
2612 | 2612 | pc9801_state *state = device->machine().driver_data<pc9801_state>(); |
2613 | 2613 | #if 0 |
2614 | address_space | |
2614 | address_space &space = *device->machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2615 | 2615 | static UINT8 test; |
2616 | 2616 | |
2617 | 2617 | if(device->machine().input().code_pressed_once(JOYCODE_BUTTON1)) |
r17963 | r17964 | |
2620 | 2620 | if(test) |
2621 | 2621 | { |
2622 | 2622 | popmessage("Go hack go"); |
2623 | space | |
2623 | space.write_word(0x55e,space.machine().rand()); | |
2624 | 2624 | } |
2625 | 2625 | #endif |
2626 | 2626 |
r17963 | r17964 | |
---|---|---|
2068 | 2068 | static TIMER_DEVICE_CALLBACK(keyboard_callback) |
2069 | 2069 | { |
2070 | 2070 | pc6001_state *state = timer.machine().driver_data<pc6001_state>(); |
2071 | address_space | |
2071 | address_space &space = *timer.machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2072 | 2072 | UINT32 key1 = timer.machine().root_device().ioport("key1")->read(); |
2073 | 2073 | UINT32 key2 = timer.machine().root_device().ioport("key2")->read(); |
2074 | 2074 | UINT32 key3 = timer.machine().root_device().ioport("key3")->read(); |
r17963 | r17964 | |
2078 | 2078 | { |
2079 | 2079 | if((key1 != state->m_old_key1) || (key2 != state->m_old_key2) || (key3 != state->m_old_key3)) |
2080 | 2080 | { |
2081 | state->m_cur_keycode = check_keyboard_press(space | |
2081 | state->m_cur_keycode = check_keyboard_press(space.machine()); | |
2082 | 2082 | if(IRQ_LOG) printf("KEY IRQ 0x02\n"); |
2083 | 2083 | state->m_irq_vector = 0x02; |
2084 | 2084 | timer.machine().device("maincpu")->execute().set_input_line(0, ASSERT_LINE); |
r17963 | r17964 | |
2089 | 2089 | #if 0 |
2090 | 2090 | else /* joypad polling */ |
2091 | 2091 | { |
2092 | state->m_cur_keycode = check_joy_press(space | |
2092 | state->m_cur_keycode = check_joy_press(space.machine()); | |
2093 | 2093 | if(state->m_cur_keycode) |
2094 | 2094 | { |
2095 | 2095 | state->m_irq_vector = 0x16; |
r17963 | r17964 | |
---|---|---|
650 | 650 | |
651 | 651 | static void tsp_sprite_enable(running_machine &machine, UINT32 spr_offset, UINT8 sw_bit) |
652 | 652 | { |
653 | address_space | |
653 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
654 | 654 | |
655 | space->write_word(spr_offset, space->read_word(spr_offset) & ~0x200); | |
656 | space->write_word(spr_offset, space->read_word(spr_offset) | (sw_bit & 0x200)); | |
655 | space.write_word(spr_offset, space.read_word(spr_offset) & ~0x200); | |
656 | space.write_word(spr_offset, space.read_word(spr_offset) | (sw_bit & 0x200)); | |
657 | 657 | } |
658 | 658 | |
659 | 659 | /* TODO: very preliminary, needs something showable first */ |
r17963 | r17964 | |
---|---|---|
92 | 92 | |
93 | 93 | QUICKLOAD_LOAD( pipbug ) |
94 | 94 | { |
95 | address_space | |
95 | address_space &space = *image.device().machine().device("maincpu")->memory().space(AS_PROGRAM); | |
96 | 96 | int i; |
97 | 97 | int quick_addr = 0x0440; |
98 | 98 | int exec_addr; |
r17963 | r17964 | |
149 | 149 | |
150 | 150 | for (i = quick_addr; i < quick_length; i++) |
151 | 151 | { |
152 | space | |
152 | space.write_byte(i, quick_data[i]); | |
153 | 153 | } |
154 | 154 | |
155 | 155 | /* display a message about the loaded quickload */ |
r17963 | r17964 | |
---|---|---|
224 | 224 | |
225 | 225 | void spc1000_state::machine_reset() |
226 | 226 | { |
227 | address_space | |
227 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
228 | 228 | UINT8 *mem = memregion("maincpu")->base(); |
229 | 229 | UINT8 *ram = machine().device<ram_device>(RAM_TAG)->pointer(); |
230 | 230 | |
231 | space->install_read_bank(0x0000, 0x7fff, "bank1"); | |
232 | space->install_read_bank(0x8000, 0xffff, "bank3"); | |
231 | space.install_read_bank(0x0000, 0x7fff, "bank1"); | |
232 | space.install_read_bank(0x8000, 0xffff, "bank3"); | |
233 | 233 | |
234 | space->install_write_bank(0x0000, 0x7fff, "bank2"); | |
235 | space->install_write_bank(0x8000, 0xffff, "bank4"); | |
234 | space.install_write_bank(0x0000, 0x7fff, "bank2"); | |
235 | space.install_write_bank(0x8000, 0xffff, "bank4"); | |
236 | 236 | |
237 | 237 | membank("bank1")->set_base(mem); |
238 | 238 | membank("bank2")->set_base(ram); |
r17963 | r17964 | |
---|---|---|
215 | 215 | static void vii_blit(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT32 xoff, UINT32 yoff, UINT32 attr, UINT32 ctrl, UINT32 bitmap_addr, UINT16 tile) |
216 | 216 | { |
217 | 217 | vii_state *state = machine.driver_data<vii_state>(); |
218 | address_space | |
218 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
219 | 219 | |
220 | 220 | UINT32 h = 8 << ((attr & PAGE_TILE_HEIGHT_MASK) >> PAGE_TILE_HEIGHT_SHIFT); |
221 | 221 | UINT32 w = 8 << ((attr & PAGE_TILE_WIDTH_MASK) >> PAGE_TILE_WIDTH_SHIFT); |
r17963 | r17964 | |
247 | 247 | bits <<= nc; |
248 | 248 | if(nbits < nc) |
249 | 249 | { |
250 | UINT16 b = space | |
250 | UINT16 b = space.read_word((m++ & 0x3fffff) << 1); | |
251 | 251 | b = (b << 8) | (b >> 8); |
252 | 252 | bits |= b << (nc - nbits); |
253 | 253 | nbits += 16; |
r17963 | r17964 | |
291 | 291 | UINT32 tilemap = regs[4]; |
292 | 292 | UINT32 palette_map = regs[5]; |
293 | 293 | UINT32 h, w, hn, wn; |
294 | address_space | |
294 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
295 | 295 | |
296 | 296 | if(!(ctrl & PAGE_ENABLE_MASK)) |
297 | 297 | { |
r17963 | r17964 | |
313 | 313 | { |
314 | 314 | for(x0 = 0; x0 < wn; x0++) |
315 | 315 | { |
316 | UINT16 tile = space | |
316 | UINT16 tile = space.read_word((tilemap + x0 + wn * y0) << 1); | |
317 | 317 | UINT16 palette = 0; |
318 | 318 | UINT32 xx, yy; |
319 | 319 | |
r17963 | r17964 | |
322 | 322 | continue; |
323 | 323 | } |
324 | 324 | |
325 | palette = space | |
325 | palette = space.read_word((palette_map + (x0 + wn * y0) / 2) << 1); | |
326 | 326 | if(x0 & 1) |
327 | 327 | { |
328 | 328 | palette >>= 8; |
r17963 | r17964 | |
353 | 353 | static void vii_blit_sprite(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect, int depth, UINT32 base_addr) |
354 | 354 | { |
355 | 355 | vii_state *state = machine.driver_data<vii_state>(); |
356 | address_space | |
356 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
357 | 357 | UINT16 tile, attr; |
358 | 358 | INT16 x, y; |
359 | 359 | UINT32 h, w; |
360 | 360 | UINT32 bitmap_addr = 0x40 * state->m_video_regs[0x22]; |
361 | 361 | |
362 | tile = space->read_word((base_addr + 0) << 1); | |
363 | x = space->read_word((base_addr + 1) << 1); | |
364 | y = space->read_word((base_addr + 2) << 1); | |
365 | attr = space->read_word((base_addr + 3) << 1); | |
362 | tile = space.read_word((base_addr + 0) << 1); | |
363 | x = space.read_word((base_addr + 1) << 1); | |
364 | y = space.read_word((base_addr + 2) << 1); | |
365 | attr = space.read_word((base_addr + 3) << 1); | |
366 | 366 | |
367 | 367 | if(!tile) |
368 | 368 | { |
r17963 | r17964 | |
404 | 404 | |
405 | 405 | for(n = 0; n < 256; n++) |
406 | 406 | { |
407 | //if(space | |
407 | //if(space.read_word((0x2c00 + 4*n) << 1)) | |
408 | 408 | { |
409 | 409 | vii_blit_sprite(machine, bitmap, cliprect, depth, 0x2c00 + 4*n); |
410 | 410 | } |
r17963 | r17964 | |
---|---|---|
1631 | 1631 | else if(offset >= 0x4000 && offset <= 0xffff) { return m_gfx_bitmap_ram[offset-0x4000+(m_scrn_reg.gfx_bank*0xc000)]; } |
1632 | 1632 | else |
1633 | 1633 | { |
1634 | //logerror("(PC=%06x) Read i/o address %04x\n",space | |
1634 | //logerror("(PC=%06x) Read i/o address %04x\n",space.device().safe_pc(),offset); | |
1635 | 1635 | } |
1636 | 1636 | return 0xff; |
1637 | 1637 | } |
r17963 | r17964 | |
1674 | 1674 | else if(offset >= 0x4000 && offset <= 0xffff) { m_gfx_bitmap_ram[offset-0x4000+(m_scrn_reg.gfx_bank*0xc000)] = data; } |
1675 | 1675 | else |
1676 | 1676 | { |
1677 | //logerror("(PC=%06x) Write %02x at i/o address %04x\n",space | |
1677 | //logerror("(PC=%06x) Write %02x at i/o address %04x\n",space.device().safe_pc(),data,offset); | |
1678 | 1678 | } |
1679 | 1679 | } |
1680 | 1680 | |
r17963 | r17964 | |
1721 | 1721 | else if(offset >= 0x4000 && offset <= 0xffff) { return m_gfx_bitmap_ram[offset-0x4000+(m_scrn_reg.gfx_bank*0xc000)]; } |
1722 | 1722 | else |
1723 | 1723 | { |
1724 | //logerror("(PC=%06x) Read i/o address %04x\n",space | |
1724 | //logerror("(PC=%06x) Read i/o address %04x\n",space.device().safe_pc(),offset); | |
1725 | 1725 | } |
1726 | 1726 | return 0xff; |
1727 | 1727 | } |
r17963 | r17964 | |
1777 | 1777 | else if(offset >= 0x4000 && offset <= 0xffff) { m_gfx_bitmap_ram[offset-0x4000+(m_scrn_reg.gfx_bank*0xc000)] = data; } |
1778 | 1778 | else |
1779 | 1779 | { |
1780 | //logerror("(PC=%06x) Write %02x at i/o address %04x\n",space | |
1780 | //logerror("(PC=%06x) Write %02x at i/o address %04x\n",space.device().safe_pc(),data,offset); | |
1781 | 1781 | } |
1782 | 1782 | } |
1783 | 1783 | |
r17963 | r17964 | |
1916 | 1916 | NULL /* update address callback */ |
1917 | 1917 | }; |
1918 | 1918 | |
1919 | static UINT8 memory_read_byte(address_space *space, offs_t address) { return space->read_byte(address); } | |
1920 | static void memory_write_byte(address_space *space, offs_t address, UINT8 data) { space->write_byte(address, data); } | |
1919 | static UINT8 memory_read_byte(address_space &space, offs_t address) { return space.read_byte(address); } | |
1920 | static void memory_write_byte(address_space &space, offs_t address, UINT8 data) { space.write_byte(address, data); } | |
1921 | 1921 | |
1922 | 1922 | static Z80DMA_INTERFACE( x1_dma ) |
1923 | 1923 | { |
r17963 | r17964 | |
1938 | 1938 | |
1939 | 1939 | static INPUT_CHANGED( ipl_reset ) |
1940 | 1940 | { |
1941 | //address_space | |
1941 | //address_space &space = *field.machine().device("x1_cpu")->memory().space(AS_PROGRAM); | |
1942 | 1942 | x1_state *state = field.machine().driver_data<x1_state>(); |
1943 | 1943 | |
1944 | 1944 | state->m_x1_cpu->set_input_line(INPUT_LINE_RESET, newval ? CLEAR_LINE : ASSERT_LINE); |
r17963 | r17964 | |
2407 | 2407 | TIMER_DEVICE_CALLBACK(x1_keyboard_callback) |
2408 | 2408 | { |
2409 | 2409 | x1_state *state = timer.machine().driver_data<x1_state>(); |
2410 | address_space | |
2410 | address_space &space = *timer.machine().device("x1_cpu")->memory().space(AS_PROGRAM); | |
2411 | 2411 | UINT32 key1 = timer.machine().root_device().ioport("key1")->read(); |
2412 | 2412 | UINT32 key2 = timer.machine().root_device().ioport("key2")->read(); |
2413 | 2413 | UINT32 key3 = timer.machine().root_device().ioport("key3")->read(); |
r17963 | r17964 | |
2422 | 2422 | if((key1 != state->m_old_key1) || (key2 != state->m_old_key2) || (key3 != state->m_old_key3) || (key4 != state->m_old_key4) || (f_key != state->m_old_fkey)) |
2423 | 2423 | { |
2424 | 2424 | // generate keyboard IRQ |
2425 | state->x1_sub_io_w( | |
2425 | state->x1_sub_io_w(space,0,0xe6); | |
2426 | 2426 | state->m_irq_vector = state->m_key_irq_vector; |
2427 | 2427 | state->m_key_irq_flag = 1; |
2428 | 2428 | timer.machine().device("x1_cpu")->execute().set_input_line(0,ASSERT_LINE); |
r17963 | r17964 | |
---|---|---|
120 | 120 | |
121 | 121 | void palm_state::machine_start() |
122 | 122 | { |
123 | address_space *space = machine().device("maincpu")->memory().space(AS_PROGRAM); | |
124 | space->install_read_bank (0x000000, machine().device<ram_device>(RAM_TAG)->size() - 1, machine().device<ram_device>(RAM_TAG)->size() - 1, 0, "bank1"); | |
125 | space->install_write_bank(0x000000, machine().device<ram_device>(RAM_TAG)->size() - 1, machine().device<ram_device>(RAM_TAG)->size() - 1, 0, "bank1"); | |
123 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
124 | space.install_read_bank (0x000000, machine().device<ram_device>(RAM_TAG)->size() - 1, machine().device<ram_device>(RAM_TAG)->size() - 1, 0, "bank1"); | |
125 | space.install_write_bank(0x000000, machine().device<ram_device>(RAM_TAG)->size() - 1, machine().device<ram_device>(RAM_TAG)->size() - 1, 0, "bank1"); | |
126 | 126 | membank("bank1")->set_base(machine().device<ram_device>(RAM_TAG)->pointer()); |
127 | 127 | |
128 | 128 | save_item(NAME(m_port_f_latch)); |
r17963 | r17964 | |
---|---|---|
319 | 319 | |
320 | 320 | static QUICKLOAD_LOAD( d6800 ) |
321 | 321 | { |
322 | address_space | |
322 | address_space &space = *image.device().machine().device("maincpu")->memory().space(AS_PROGRAM); | |
323 | 323 | int i; |
324 | 324 | int quick_addr = 0x0200; |
325 | 325 | int exec_addr = 0xc000; |
r17963 | r17964 | |
346 | 346 | |
347 | 347 | for (i = 0; i < quick_length; i++) |
348 | 348 | if ((quick_addr + i) < 0x800) |
349 | space | |
349 | space.write_byte(i + quick_addr, quick_data[i]); | |
350 | 350 | |
351 | 351 | /* display a message about the loaded quickload */ |
352 | 352 | image.message(" Quickload: size=%04X : start=%04X : end=%04X : exec=%04X",quick_length,quick_addr,quick_addr+quick_length,exec_addr); |
r17963 | r17964 | |
---|---|---|
326 | 326 | { |
327 | 327 | UINT8 *messram = machine().device<ram_device>(RAM_TAG)->pointer(); |
328 | 328 | device_t *beta = machine().device(BETA_DISK_TAG); |
329 | address_space | |
329 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
330 | 330 | |
331 | 331 | m_ram_0000 = NULL; |
332 | space->install_read_bank(0x0000, 0x3fff, "bank1"); | |
333 | space->install_write_handler(0x0000, 0x3fff, write8_delegate(FUNC(scorpion_state::scorpion_0000_w),this)); | |
332 | space.install_read_bank(0x0000, 0x3fff, "bank1"); | |
333 | space.install_write_handler(0x0000, 0x3fff, write8_delegate(FUNC(scorpion_state::scorpion_0000_w),this)); | |
334 | 334 | |
335 | 335 | betadisk_disable(beta); |
336 | 336 | betadisk_clear_status(beta); |
337 | space | |
337 | space.set_direct_update_handler(direct_update_delegate(FUNC(scorpion_state::scorpion_direct), this)); | |
338 | 338 | |
339 | 339 | memset(messram,0,256*1024); |
340 | 340 |
r17963 | r17964 | |
---|---|---|
620 | 620 | |
621 | 621 | DRIVER_INIT_MEMBER(spectrum_state,spectrum) |
622 | 622 | { |
623 | address_space | |
623 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
624 | 624 | |
625 | 625 | switch (machine().device<ram_device>(RAM_TAG)->size()) |
626 | 626 | { |
627 | 627 | case 48*1024: |
628 | space | |
628 | space.install_ram(0x8000, 0xffff, NULL); // Fall through | |
629 | 629 | case 16*1024: |
630 | space | |
630 | space.install_ram(0x5b00, 0x7fff, NULL); | |
631 | 631 | } |
632 | 632 | } |
633 | 633 | |
634 | 634 | MACHINE_RESET_MEMBER(spectrum_state,spectrum) |
635 | 635 | { |
636 | address_space | |
636 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
637 | 637 | |
638 | space | |
638 | space.set_direct_update_handler(direct_update_delegate(FUNC(spectrum_state::spectrum_direct), this)); | |
639 | 639 | |
640 | 640 | m_port_7ffd_data = -1; |
641 | 641 | m_port_1ffd_data = -1; |
r17963 | r17964 | |
---|---|---|
14 | 14 | #include "machine/ram.h" |
15 | 15 | |
16 | 16 | MACHINE_RESET( astrocde ); |
17 | void get_ram_expansion_settings(address_space | |
17 | void get_ram_expansion_settings(address_space &space, int &ram_expansion_installed, int &write_protect_on, int &expansion_ram_start, int &expansion_ram_end, int &shadow_ram_end); | |
18 | 18 | |
19 | 19 | /************************************* |
20 | 20 | * |
r17963 | r17964 | |
90 | 90 | static INPUT_CHANGED( set_write_protect ) // run when RAM expansion write protect switch is changed |
91 | 91 | { |
92 | 92 | int ram_expansion_installed = 0, write_protect_on = 0, expansion_ram_start = 0, expansion_ram_end = 0, shadow_ram_end = 0; |
93 | address_space | |
93 | address_space &space = *field.machine().device("maincpu")->memory().space(AS_PROGRAM); | |
94 | 94 | UINT8 *expram = field.machine().device<ram_device>("ram_tag")->pointer(); |
95 | 95 | |
96 | 96 | get_ram_expansion_settings(space, ram_expansion_installed, write_protect_on, expansion_ram_start, expansion_ram_end, shadow_ram_end); // passing by reference |
r17963 | r17964 | |
99 | 99 | { |
100 | 100 | if (write_protect_on == 0) // write protect off, so install memory normally |
101 | 101 | { |
102 | space | |
102 | space.install_ram(expansion_ram_start, expansion_ram_end, expram); | |
103 | 103 | if (shadow_ram_end > expansion_ram_end) |
104 | space | |
104 | space.install_ram(expansion_ram_end + 1, shadow_ram_end, expram); | |
105 | 105 | } |
106 | 106 | else // write protect on, so make memory read only |
107 | 107 | { |
108 | space | |
108 | space.nop_write(expansion_ram_start, expansion_ram_end); | |
109 | 109 | } |
110 | 110 | } |
111 | 111 | } |
r17963 | r17964 | |
310 | 310 | MACHINE_RESET( astrocde ) |
311 | 311 | { |
312 | 312 | int ram_expansion_installed = 0, write_protect_on = 0, expansion_ram_start = 0, expansion_ram_end = 0, shadow_ram_end = 0; |
313 | address_space | |
313 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
314 | 314 | UINT8 *expram = machine.device<ram_device>("ram_tag")->pointer(); |
315 | space | |
315 | space.unmap_readwrite(0x5000, 0xffff); // unmap any previously installed expansion RAM | |
316 | 316 | |
317 | 317 | get_ram_expansion_settings(space, ram_expansion_installed, write_protect_on, expansion_ram_start, expansion_ram_end, shadow_ram_end); // passing by reference |
318 | 318 | |
r17963 | r17964 | |
320 | 320 | { |
321 | 321 | if (write_protect_on == 0) // write protect off, so install memory normally |
322 | 322 | { |
323 | space | |
323 | space.install_ram(expansion_ram_start, expansion_ram_end, expram); | |
324 | 324 | if (shadow_ram_end > expansion_ram_end) |
325 | space | |
325 | space.install_ram(expansion_ram_end + 1, shadow_ram_end, expram); | |
326 | 326 | } |
327 | 327 | else // write protect on, so make memory read only |
328 | 328 | { |
329 | space | |
329 | space.nop_write(expansion_ram_start, expansion_ram_end); | |
330 | 330 | } |
331 | 331 | } |
332 | 332 | } |
333 | 333 | |
334 | void get_ram_expansion_settings(address_space | |
334 | void get_ram_expansion_settings(address_space &space, int &ram_expansion_installed, int &write_protect_on, int &expansion_ram_start, int &expansion_ram_end, int &shadow_ram_end) | |
335 | 335 | { |
336 | if (space | |
336 | if (space.machine().root_device().ioport("PROTECT")->read() == 0x01) | |
337 | 337 | write_protect_on = 1; |
338 | 338 | else |
339 | 339 | write_protect_on = 0; |
340 | 340 | |
341 | 341 | ram_expansion_installed = 1; |
342 | 342 | |
343 | switch(space | |
343 | switch(space.machine().root_device().ioport("CFG")->read()) // check RAM expansion configuration and set address ranges | |
344 | 344 | { |
345 | 345 | case 0x00: // No RAM Expansion |
346 | 346 | ram_expansion_installed = 0; |
r17963 | r17964 | |
---|---|---|
270 | 270 | //verboselog(( machine, 2, "Serial 2 Command Transfer Read, 0x1fbd9838: %02x\n", 0x04 ); |
271 | 271 | return 0x00000004; |
272 | 272 | case 0x40/4: |
273 | return kbdc8042_8_r( | |
273 | return kbdc8042_8_r(space, 0); | |
274 | 274 | case 0x44/4: |
275 | return kbdc8042_8_r( | |
275 | return kbdc8042_8_r(space, 4); | |
276 | 276 | case 0x58/4: |
277 | 277 | return 0x20; // chip rev 1, board rev 0, "Guinness" (Indy) => 0x01 for "Full House" (Indigo2) |
278 | 278 | case 0x80/4: |
r17963 | r17964 | |
355 | 355 | } |
356 | 356 | break; |
357 | 357 | case 0x40/4: |
358 | kbdc8042_8_w( | |
358 | kbdc8042_8_w(space, 0, data); | |
359 | 359 | break; |
360 | 360 | case 0x44/4: |
361 | kbdc8042_8_w( | |
361 | kbdc8042_8_w(space, 4, data); | |
362 | 362 | break; |
363 | 363 | case 0x80/4: |
364 | 364 | case 0x84/4: |
r17963 | r17964 | |
895 | 895 | WRITE32_MEMBER(ip22_state::ip22_write_ram) |
896 | 896 | { |
897 | 897 | // if banks 2 or 3 are enabled, do nothing, we don't support that much memory |
898 | if (sgi_mc_r( | |
898 | if (sgi_mc_r(space, 0xc8/4, 0xffffffff) & 0x10001000) | |
899 | 899 | { |
900 | 900 | // a random perturbation so the memory test fails |
901 | 901 | data ^= 0xffffffff; |
902 | 902 | } |
903 | 903 | |
904 | 904 | // if banks 0 or 1 have 2 membanks, also kill it, we only want 128 MB |
905 | if (sgi_mc_r( | |
905 | if (sgi_mc_r(space, 0xc0/4, 0xffffffff) & 0x40004000) | |
906 | 906 | { |
907 | 907 | // a random perturbation so the memory test fails |
908 | 908 | data ^= 0xffffffff; |
r17963 | r17964 | |
1239 | 1239 | mips3drc_set_options(machine().device("maincpu"), MIPS3DRC_COMPATIBLE_OPTIONS | MIPS3DRC_CHECK_OVERFLOWS); |
1240 | 1240 | } |
1241 | 1241 | |
1242 | static void dump_chain(address_space | |
1242 | static void dump_chain(address_space &space, UINT32 ch_base) | |
1243 | 1243 | { |
1244 | 1244 | |
1245 | printf("node: %08x %08x %08x (len = %x)\n", space | |
1245 | printf("node: %08x %08x %08x (len = %x)\n", space.read_dword(ch_base), space.read_dword(ch_base+4), space.read_dword(ch_base+8), space.read_dword(ch_base+4) & 0x3fff); | |
1246 | 1246 | |
1247 | if ((space | |
1247 | if ((space.read_dword(ch_base+8) != 0) && !(space.read_dword(ch_base+4) & 0x80000000)) | |
1248 | 1248 | { |
1249 | dump_chain(space, space | |
1249 | dump_chain(space, space.read_dword(ch_base+8)); | |
1250 | 1250 | } |
1251 | 1251 | } |
1252 | 1252 | |
r17963 | r17964 | |
1260 | 1260 | static void scsi_irq(running_machine &machine, int state) |
1261 | 1261 | { |
1262 | 1262 | ip22_state *drvstate = machine.driver_data<ip22_state>(); |
1263 | address_space | |
1263 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
1264 | 1264 | |
1265 | 1265 | if (state) |
1266 | 1266 | { |
r17963 | r17964 | |
1281 | 1281 | words = drvstate->m_wd33c93->get_dma_count(); |
1282 | 1282 | words /= 4; |
1283 | 1283 | |
1284 | wptr = space | |
1284 | wptr = space.read_dword(drvstate->m_HPC3.nSCSI0Descriptor); | |
1285 | 1285 | drvstate->m_HPC3.nSCSI0Descriptor += words*4; |
1286 | 1286 | dptr = 0; |
1287 | 1287 | |
r17963 | r17964 | |
1296 | 1296 | |
1297 | 1297 | while (words) |
1298 | 1298 | { |
1299 | tmpword = space | |
1299 | tmpword = space.read_dword(wptr); | |
1300 | 1300 | |
1301 | 1301 | if (drvstate->m_HPC3.nSCSI0DMACtrl & HPC3_DMACTRL_ENDIAN) |
1302 | 1302 | { |
r17963 | r17964 | |
1332 | 1332 | |
1333 | 1333 | while (twords) |
1334 | 1334 | { |
1335 | tmpword = space | |
1335 | tmpword = space.read_dword(wptr); | |
1336 | 1336 | |
1337 | 1337 | if (drvstate->m_HPC3.nSCSI0DMACtrl & HPC3_DMACTRL_ENDIAN) |
1338 | 1338 | { |
r17963 | r17964 | |
1364 | 1364 | drvstate->m_wd33c93->clear_dma(); |
1365 | 1365 | #if 0 |
1366 | 1366 | UINT32 dptr, tmpword; |
1367 | UINT32 bc = space->read_dword(drvstate->m_HPC3.nSCSI0Descriptor + 4); | |
1368 | UINT32 rptr = space->read_dword(drvstate->m_HPC3.nSCSI0Descriptor); | |
1367 | UINT32 bc = space.read_dword(drvstate->m_HPC3.nSCSI0Descriptor + 4); | |
1368 | UINT32 rptr = space.read_dword(drvstate->m_HPC3.nSCSI0Descriptor); | |
1369 | 1369 | int length = bc & 0x3fff; |
1370 | 1370 | int xie = (bc & 0x20000000) ? 1 : 0; |
1371 | 1371 | int eox = (bc & 0x80000000) ? 1 : 0; |
r17963 | r17964 | |
1380 | 1380 | dptr = 0; |
1381 | 1381 | while (length > 0) |
1382 | 1382 | { |
1383 | tmpword = space | |
1383 | tmpword = space.read_dword(rptr); | |
1384 | 1384 | if (drvstate->m_HPC3.nSCSI0DMACtrl & HPC3_DMACTRL_ENDIAN) |
1385 | 1385 | { |
1386 | 1386 | drvstate->m_dma_buffer[dptr+3] = (tmpword>>24)&0xff; |
r17963 | r17964 | |
1401 | 1401 | length -= 4; |
1402 | 1402 | } |
1403 | 1403 | |
1404 | length = space | |
1404 | length = space.read_dword(drvstate->m_HPC3.nSCSI0Descriptor+4) & 0x3fff; | |
1405 | 1405 | drvstate->m_wd33c93->write_data(length, drvstate->m_dma_buffer); |
1406 | 1406 | |
1407 | 1407 | // clear DMA on the controller too |
r17963 | r17964 | |
1423 | 1423 | words = drvstate->m_wd33c93->get_dma_count(); |
1424 | 1424 | words /= 4; |
1425 | 1425 | |
1426 | wptr = space | |
1426 | wptr = space.read_dword(drvstate->m_HPC3.nSCSI0Descriptor); | |
1427 | 1427 | sptr = 0; |
1428 | 1428 | |
1429 | 1429 | // mame_printf_info("DMA from device: %d words @ %x\n", words, wptr); |
r17963 | r17964 | |
1446 | 1446 | tmpword = drvstate->m_dma_buffer[sptr]<<24 | drvstate->m_dma_buffer[sptr+1]<<16 | drvstate->m_dma_buffer[sptr+2]<<8 | drvstate->m_dma_buffer[sptr+3]; |
1447 | 1447 | } |
1448 | 1448 | |
1449 | space | |
1449 | space.write_dword(wptr, tmpword); | |
1450 | 1450 | wptr += 4; |
1451 | 1451 | sptr += 4; |
1452 | 1452 | words--; |
r17963 | r17964 | |
1470 | 1470 | { |
1471 | 1471 | tmpword = drvstate->m_dma_buffer[sptr]<<24 | drvstate->m_dma_buffer[sptr+1]<<16 | drvstate->m_dma_buffer[sptr+2]<<8 | drvstate->m_dma_buffer[sptr+3]; |
1472 | 1472 | } |
1473 | space | |
1473 | space.write_dword(wptr, tmpword); | |
1474 | 1474 | |
1475 | 1475 | wptr += 4; |
1476 | 1476 | sptr += 4; |
r17963 | r17964 | |
---|---|---|
969 | 969 | READ8_MEMBER( c128_state::sid_potx_r ) |
970 | 970 | { |
971 | 971 | UINT8 cia1_pa = mos6526_pa_r(m_cia1, space, 0); |
972 | ||
972 | ||
973 | 973 | int sela = BIT(cia1_pa, 6); |
974 | 974 | int selb = BIT(cia1_pa, 7); |
975 | 975 | |
r17963 | r17964 | |
984 | 984 | READ8_MEMBER( c128_state::sid_poty_r ) |
985 | 985 | { |
986 | 986 | UINT8 cia1_pa = mos6526_pa_r(m_cia1, space, 0); |
987 | ||
987 | ||
988 | 988 | int sela = BIT(cia1_pa, 6); |
989 | 989 | int selb = BIT(cia1_pa, 7); |
990 | 990 |
r17963 | r17964 | |
---|---|---|
537 | 537 | } |
538 | 538 | } |
539 | 539 | |
540 | static UINT8 memory_read_byte(address_space *space, offs_t address) { return space->read_byte(address); } | |
541 | static void memory_write_byte(address_space *space, offs_t address, UINT8 data) { space->write_byte(address, data); } | |
540 | static UINT8 memory_read_byte(address_space &space, offs_t address) { return space.read_byte(address); } | |
541 | static void memory_write_byte(address_space &space, offs_t address, UINT8 data) { space.write_byte(address, data); } | |
542 | 542 | |
543 | 543 | static I8237_INTERFACE( dmac_intf ) |
544 | 544 | { |
r17963 | r17964 | |
---|---|---|
171 | 171 | |
172 | 172 | static WRITE8_HANDLER(spectrum_128_port_7ffd_w) |
173 | 173 | { |
174 | spectrum_state *state = space | |
174 | spectrum_state *state = space.machine().driver_data<spectrum_state>(); | |
175 | 175 | |
176 | 176 | /* D0-D2: RAM page located at 0x0c000-0x0ffff */ |
177 | 177 | /* D3 - Screen select (screen 0 in ram page 5, screen 1 in ram page 7 */ |
r17963 | r17964 | |
186 | 186 | state->m_port_7ffd_data = data; |
187 | 187 | |
188 | 188 | /* update memory */ |
189 | spectrum_128_update_memory(space | |
189 | spectrum_128_update_memory(space.machine()); | |
190 | 190 | } |
191 | 191 | |
192 | 192 | void spectrum_128_update_memory(running_machine &machine) |
r17963 | r17964 | |
228 | 228 | |
229 | 229 | static READ8_HANDLER ( spectrum_128_ula_r ) |
230 | 230 | { |
231 | spectrum_state *state = space->machine().driver_data<spectrum_state>(); | |
232 | int vpos = space->machine().primary_screen->vpos(); | |
231 | spectrum_state *state = space.machine().driver_data<spectrum_state>(); | |
232 | int vpos = space.machine().primary_screen->vpos(); | |
233 | 233 | |
234 | 234 | return vpos<193 ? state->m_screen_location[0x1800|(vpos&0xf8)<<2]:0xff; |
235 | 235 | } |
r17963 | r17964 | |
---|---|---|
41 | 41 | |
42 | 42 | READ8_MEMBER( sc2_state::sc2_beep ) |
43 | 43 | { |
44 | //if (!space | |
44 | //if (!space.debugger_access()) | |
45 | 45 | { |
46 | 46 | m_beep_state = ~m_beep_state; |
47 | 47 |
r17963 | r17964 | |
---|---|---|
1142 | 1142 | static void modeFE_switch(running_machine &machine,UINT16 offset, UINT8 data) |
1143 | 1143 | { |
1144 | 1144 | a2600_state *state = machine.driver_data<a2600_state>(); |
1145 | address_space | |
1145 | address_space& space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
1146 | 1146 | /* Retrieve last byte read by the cpu (for this mapping scheme this |
1147 | 1147 | should be the last byte that was on the data bus |
1148 | 1148 | */ |
1149 | 1149 | state->m_FETimer = 1; |
1150 | state->m_FE_old_opbase_handler = space | |
1150 | state->m_FE_old_opbase_handler = space.set_direct_update_handler(direct_update_delegate(FUNC(a2600_state::modeFE_opbase_handler), state)); | |
1151 | 1151 | } |
1152 | 1152 | |
1153 | 1153 | READ8_MEMBER(a2600_state::modeFE_switch_r) |
r17963 | r17964 | |
1732 | 1732 | |
1733 | 1733 | void a2600_state::machine_reset() |
1734 | 1734 | { |
1735 | address_space | |
1735 | address_space& space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
1736 | 1736 | int chip = 0xFF; |
1737 | 1737 | static const unsigned char snowwhite[] = { 0x10, 0xd0, 0xff, 0xff }; // Snow White Proto |
1738 | 1738 | |
r17963 | r17964 | |
1911 | 1911 | |
1912 | 1912 | if (m_banking_mode == modeDC) |
1913 | 1913 | { |
1914 | space | |
1914 | space.install_read_handler(0x1fec, 0x1fec, read8_delegate(FUNC(a2600_state::current_bank_r),this)); | |
1915 | 1915 | } |
1916 | 1916 | |
1917 | 1917 | /* set up bank switch registers */ |
r17963 | r17964 | |
1919 | 1919 | switch (m_banking_mode) |
1920 | 1920 | { |
1921 | 1921 | case modeF8: |
1922 | space->install_write_handler(0x1ff8, 0x1ff9, write8_delegate(FUNC(a2600_state::modeF8_switch_w),this)); | |
1923 | space->install_read_handler(0x1ff8, 0x1ff9, read8_delegate(FUNC(a2600_state::modeF8_switch_r),this)); | |
1922 | space.install_write_handler(0x1ff8, 0x1ff9, write8_delegate(FUNC(a2600_state::modeF8_switch_w),this)); | |
1923 | space.install_read_handler(0x1ff8, 0x1ff9, read8_delegate(FUNC(a2600_state::modeF8_switch_r),this)); | |
1924 | 1924 | break; |
1925 | 1925 | |
1926 | 1926 | case modeFA: |
1927 | space->install_write_handler(0x1ff8, 0x1ffa, write8_delegate(FUNC(a2600_state::modeFA_switch_w),this)); | |
1928 | space->install_read_handler(0x1ff8, 0x1ffa, read8_delegate(FUNC(a2600_state::modeFA_switch_r),this)); | |
1927 | space.install_write_handler(0x1ff8, 0x1ffa, write8_delegate(FUNC(a2600_state::modeFA_switch_w),this)); | |
1928 | space.install_read_handler(0x1ff8, 0x1ffa, read8_delegate(FUNC(a2600_state::modeFA_switch_r),this)); | |
1929 | 1929 | break; |
1930 | 1930 | |
1931 | 1931 | case modeF6: |
1932 | space->install_write_handler(0x1ff6, 0x1ff9, write8_delegate(FUNC(a2600_state::modeF6_switch_w),this)); | |
1933 | space->install_read_handler(0x1ff6, 0x1ff9, read8_delegate(FUNC(a2600_state::modeF6_switch_r),this)); | |
1934 | space->set_direct_update_handler(direct_update_delegate(FUNC(a2600_state::modeF6_opbase), this)); | |
1932 | space.install_write_handler(0x1ff6, 0x1ff9, write8_delegate(FUNC(a2600_state::modeF6_switch_w),this)); | |
1933 | space.install_read_handler(0x1ff6, 0x1ff9, read8_delegate(FUNC(a2600_state::modeF6_switch_r),this)); | |
1934 | space.set_direct_update_handler(direct_update_delegate(FUNC(a2600_state::modeF6_opbase), this)); | |
1935 | 1935 | break; |
1936 | 1936 | |
1937 | 1937 | case modeF4: |
1938 | space->install_write_handler(0x1ff4, 0x1ffb, write8_delegate(FUNC(a2600_state::modeF4_switch_w),this)); | |
1939 | space->install_read_handler(0x1ff4, 0x1ffb, read8_delegate(FUNC(a2600_state::modeF4_switch_r),this)); | |
1938 | space.install_write_handler(0x1ff4, 0x1ffb, write8_delegate(FUNC(a2600_state::modeF4_switch_w),this)); | |
1939 | space.install_read_handler(0x1ff4, 0x1ffb, read8_delegate(FUNC(a2600_state::modeF4_switch_r),this)); | |
1940 | 1940 | break; |
1941 | 1941 | |
1942 | 1942 | case modeE0: |
1943 | space->install_write_handler(0x1fe0, 0x1ff8, write8_delegate(FUNC(a2600_state::modeE0_switch_w),this)); | |
1944 | space->install_read_handler(0x1fe0, 0x1ff8, read8_delegate(FUNC(a2600_state::modeE0_switch_r),this)); | |
1943 | space.install_write_handler(0x1fe0, 0x1ff8, write8_delegate(FUNC(a2600_state::modeE0_switch_w),this)); | |
1944 | space.install_read_handler(0x1fe0, 0x1ff8, read8_delegate(FUNC(a2600_state::modeE0_switch_r),this)); | |
1945 | 1945 | break; |
1946 | 1946 | |
1947 | 1947 | case mode3F: |
1948 | space | |
1948 | space.install_write_handler(0x00, 0x3f, write8_delegate(FUNC(a2600_state::mode3F_switch_w),this)); | |
1949 | 1949 | break; |
1950 | 1950 | |
1951 | 1951 | case modeUA: |
1952 | space->install_write_handler(0x200, 0x27f, write8_delegate(FUNC(a2600_state::modeUA_switch_w),this)); | |
1953 | space->install_read_handler(0x200, 0x27f, read8_delegate(FUNC(a2600_state::modeUA_switch_r),this)); | |
1952 | space.install_write_handler(0x200, 0x27f, write8_delegate(FUNC(a2600_state::modeUA_switch_w),this)); | |
1953 | space.install_read_handler(0x200, 0x27f, read8_delegate(FUNC(a2600_state::modeUA_switch_r),this)); | |
1954 | 1954 | break; |
1955 | 1955 | |
1956 | 1956 | case modeE7: |
1957 | space->install_write_handler(0x1fe0, 0x1fe7, write8_delegate(FUNC(a2600_state::modeE7_switch_w),this)); | |
1958 | space->install_read_handler(0x1fe0, 0x1fe7, read8_delegate(FUNC(a2600_state::modeE7_switch_r),this)); | |
1959 | space->install_write_handler(0x1fe8, 0x1feb, write8_delegate(FUNC(a2600_state::modeE7_RAM_switch_w),this)); | |
1960 | space->install_read_handler(0x1fe8, 0x1feb, read8_delegate(FUNC(a2600_state::modeE7_RAM_switch_r),this)); | |
1961 | space->install_readwrite_bank(0x1800, 0x18ff, "bank9"); | |
1957 | space.install_write_handler(0x1fe0, 0x1fe7, write8_delegate(FUNC(a2600_state::modeE7_switch_w),this)); | |
1958 | space.install_read_handler(0x1fe0, 0x1fe7, read8_delegate(FUNC(a2600_state::modeE7_switch_r),this)); | |
1959 | space.install_write_handler(0x1fe8, 0x1feb, write8_delegate(FUNC(a2600_state::modeE7_RAM_switch_w),this)); | |
1960 | space.install_read_handler(0x1fe8, 0x1feb, read8_delegate(FUNC(a2600_state::modeE7_RAM_switch_r),this)); | |
1961 | space.install_readwrite_bank(0x1800, 0x18ff, "bank9"); | |
1962 | 1962 | membank("bank9")->set_base(m_extra_RAM->base() + 4 * 256 ); |
1963 | 1963 | break; |
1964 | 1964 | |
1965 | 1965 | case modeDC: |
1966 | space->install_write_handler(0x1ff0, 0x1ff0, write8_delegate(FUNC(a2600_state::modeDC_switch_w),this)); | |
1967 | space->install_read_handler(0x1ff0, 0x1ff0, read8_delegate(FUNC(a2600_state::modeDC_switch_r),this)); | |
1966 | space.install_write_handler(0x1ff0, 0x1ff0, write8_delegate(FUNC(a2600_state::modeDC_switch_w),this)); | |
1967 | space.install_read_handler(0x1ff0, 0x1ff0, read8_delegate(FUNC(a2600_state::modeDC_switch_r),this)); | |
1968 | 1968 | break; |
1969 | 1969 | |
1970 | 1970 | case modeFE: |
1971 | space->install_write_handler(0x01fe, 0x01fe, write8_delegate(FUNC(a2600_state::modeFE_switch_w),this)); | |
1972 | space->install_read_handler(0x01fe, 0x01fe, read8_delegate(FUNC(a2600_state::modeFE_switch_r),this)); | |
1971 | space.install_write_handler(0x01fe, 0x01fe, write8_delegate(FUNC(a2600_state::modeFE_switch_w),this)); | |
1972 | space.install_read_handler(0x01fe, 0x01fe, read8_delegate(FUNC(a2600_state::modeFE_switch_r),this)); | |
1973 | 1973 | break; |
1974 | 1974 | |
1975 | 1975 | case mode3E: |
1976 | space->install_write_handler(0x3e, 0x3e, write8_delegate(FUNC(a2600_state::mode3E_RAM_switch_w),this)); | |
1977 | space->install_write_handler(0x3f, 0x3f, write8_delegate(FUNC(a2600_state::mode3E_switch_w),this)); | |
1978 | space->install_write_handler(0x1400, 0x15ff, write8_delegate(FUNC(a2600_state::mode3E_RAM_w),this)); | |
1976 | space.install_write_handler(0x3e, 0x3e, write8_delegate(FUNC(a2600_state::mode3E_RAM_switch_w),this)); | |
1977 | space.install_write_handler(0x3f, 0x3f, write8_delegate(FUNC(a2600_state::mode3E_switch_w),this)); | |
1978 | space.install_write_handler(0x1400, 0x15ff, write8_delegate(FUNC(a2600_state::mode3E_RAM_w),this)); | |
1979 | 1979 | break; |
1980 | 1980 | |
1981 | 1981 | case modeSS: |
1982 | space | |
1982 | space.install_read_handler(0x1000, 0x1fff, read8_delegate(FUNC(a2600_state::modeSS_r),this)); | |
1983 | 1983 | m_bank_base[1] = m_extra_RAM->base() + 2 * 0x800; |
1984 | 1984 | m_bank_base[2] = CART_MEMBER; |
1985 | 1985 | membank("bank1")->set_base(m_bank_base[1] ); |
1986 | 1986 | membank("bank2")->set_base(m_bank_base[2] ); |
1987 | 1987 | m_modeSS_write_enabled = 0; |
1988 | 1988 | m_modeSS_byte_started = 0; |
1989 | space | |
1989 | space.set_direct_update_handler(direct_update_delegate(FUNC(a2600_state::modeSS_opbase), this)); | |
1990 | 1990 | /* The Supercharger has no motor control so just enable it */ |
1991 | 1991 | machine().device<cassette_image_device>(CASSETTE_TAG)->change_state(CASSETTE_MOTOR_ENABLED, CASSETTE_MOTOR_DISABLED ); |
1992 | 1992 | break; |
1993 | 1993 | |
1994 | 1994 | case modeFV: |
1995 | space->install_write_handler(0x1fd0, 0x1fd0, write8_delegate(FUNC(a2600_state::modeFV_switch_w),this)); | |
1996 | space->install_read_handler(0x1fd0, 0x1fd0, read8_delegate(FUNC(a2600_state::modeFV_switch_r),this)); | |
1995 | space.install_write_handler(0x1fd0, 0x1fd0, write8_delegate(FUNC(a2600_state::modeFV_switch_w),this)); | |
1996 | space.install_read_handler(0x1fd0, 0x1fd0, read8_delegate(FUNC(a2600_state::modeFV_switch_r),this)); | |
1997 | 1997 | break; |
1998 | 1998 | |
1999 | 1999 | case modeDPC: |
2000 | space->install_read_handler(0x1000, 0x103f, read8_delegate(FUNC(a2600_state::modeDPC_r),this)); | |
2001 | space->install_write_handler(0x1040, 0x107f, write8_delegate(FUNC(a2600_state::modeDPC_w),this)); | |
2002 | space->install_write_handler(0x1ff8, 0x1ff9, write8_delegate(FUNC(a2600_state::modeF8_switch_w),this)); | |
2003 | space->install_read_handler(0x1ff8, 0x1ff9, read8_delegate(FUNC(a2600_state::modeF8_switch_r),this)); | |
2004 | space->set_direct_update_handler(direct_update_delegate(FUNC(a2600_state::modeDPC_opbase_handler), this)); | |
2000 | space.install_read_handler(0x1000, 0x103f, read8_delegate(FUNC(a2600_state::modeDPC_r),this)); | |
2001 | space.install_write_handler(0x1040, 0x107f, write8_delegate(FUNC(a2600_state::modeDPC_w),this)); | |
2002 | space.install_write_handler(0x1ff8, 0x1ff9, write8_delegate(FUNC(a2600_state::modeF8_switch_w),this)); | |
2003 | space.install_read_handler(0x1ff8, 0x1ff9, read8_delegate(FUNC(a2600_state::modeF8_switch_r),this)); | |
2004 | space.set_direct_update_handler(direct_update_delegate(FUNC(a2600_state::modeDPC_opbase_handler), this)); | |
2005 | 2005 | { |
2006 | 2006 | int data_fetcher; |
2007 | 2007 | for( data_fetcher = 0; data_fetcher < 8; data_fetcher++ ) |
r17963 | r17964 | |
2020 | 2020 | break; |
2021 | 2021 | |
2022 | 2022 | case modeJVP: |
2023 | space->install_read_handler(0x0FA0, 0x0FC0, read8_delegate(FUNC(a2600_state::modeJVP_switch_r),this)); | |
2024 | space->install_write_handler(0x0FA0, 0x0FC0, write8_delegate(FUNC(a2600_state::modeJVP_switch_w),this)); | |
2023 | space.install_read_handler(0x0FA0, 0x0FC0, read8_delegate(FUNC(a2600_state::modeJVP_switch_r),this)); | |
2024 | space.install_write_handler(0x0FA0, 0x0FC0, write8_delegate(FUNC(a2600_state::modeJVP_switch_w),this)); | |
2025 | 2025 | break; |
2026 | 2026 | } |
2027 | 2027 | |
r17963 | r17964 | |
2029 | 2029 | |
2030 | 2030 | if (m_banking_mode == modeFA) |
2031 | 2031 | { |
2032 | space->install_write_bank(0x1000, 0x10ff, "bank9"); | |
2033 | space->install_read_bank(0x1100, 0x11ff, "bank9"); | |
2032 | space.install_write_bank(0x1000, 0x10ff, "bank9"); | |
2033 | space.install_read_bank(0x1100, 0x11ff, "bank9"); | |
2034 | 2034 | |
2035 | 2035 | membank("bank9")->set_base(m_extra_RAM->base()); |
2036 | 2036 | } |
2037 | 2037 | |
2038 | 2038 | if (m_banking_mode == modeCV) |
2039 | 2039 | { |
2040 | space->install_write_bank(0x1400, 0x17ff, "bank9"); | |
2041 | space->install_read_bank(0x1000, 0x13ff, "bank9"); | |
2040 | space.install_write_bank(0x1400, 0x17ff, "bank9"); | |
2041 | space.install_read_bank(0x1000, 0x13ff, "bank9"); | |
2042 | 2042 | |
2043 | 2043 | membank("bank9")->set_base(m_extra_RAM->base()); |
2044 | 2044 | } |
2045 | 2045 | |
2046 | 2046 | if (chip) |
2047 | 2047 | { |
2048 | space->install_write_bank(0x1000, 0x107f, "bank9"); | |
2049 | space->install_read_bank(0x1080, 0x10ff, "bank9"); | |
2048 | space.install_write_bank(0x1000, 0x107f, "bank9"); | |
2049 | space.install_read_bank(0x1080, 0x10ff, "bank9"); | |
2050 | 2050 | |
2051 | 2051 | membank("bank9")->set_base(m_extra_RAM->base()); |
2052 | 2052 | } |
r17963 | r17964 | |
---|---|---|
234 | 234 | static void pcw_update_read_memory_block(running_machine &machine, int block, int bank) |
235 | 235 | { |
236 | 236 | pcw_state *state = machine.driver_data<pcw_state>(); |
237 | address_space | |
237 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
238 | 238 | char block_name[10]; |
239 | 239 | |
240 | 240 | sprintf(block_name,"bank%d",block+1); |
r17963 | r17964 | |
243 | 243 | { |
244 | 244 | /* when upper 16 bytes are accessed use keyboard read |
245 | 245 | handler */ |
246 | space | |
246 | space.install_read_handler( | |
247 | 247 | block * 0x04000 + 0x3ff0, block * 0x04000 + 0x3fff, read8_delegate(FUNC(pcw_state::pcw_keyboard_data_r),state)); |
248 | 248 | // LOG(("MEM: read block %i -> bank %i\n",block,bank)); |
249 | 249 | } |
250 | 250 | else |
251 | 251 | { |
252 | 252 | /* restore bank handler across entire block */ |
253 | space | |
253 | space.install_read_bank(block * 0x04000 + 0x0000, block * 0x04000 + 0x3fff,block_name); | |
254 | 254 | // LOG(("MEM: read block %i -> bank %i\n",block,bank)); |
255 | 255 | } |
256 | 256 | state->membank(block_name)->set_base(machine.device<ram_device>(RAM_TAG)->pointer() + ((bank * 0x4000) % machine.device<ram_device>(RAM_TAG)->size())); |
r17963 | r17964 | |
---|---|---|
27 | 27 | /* J-Cart controller port */ |
28 | 28 | WRITE16_HANDLER( jcart_ctrl_w ) |
29 | 29 | { |
30 | md_cons_state *state = space | |
30 | md_cons_state *state = space.machine().driver_data<md_cons_state>(); | |
31 | 31 | state->m_jcart_io_data[0] = (data & 1) << 6; |
32 | 32 | state->m_jcart_io_data[1] = (data & 1) << 6; |
33 | 33 | } |
34 | 34 | |
35 | 35 | READ16_HANDLER( jcart_ctrl_r ) |
36 | 36 | { |
37 | md_cons_state *state = space | |
37 | md_cons_state *state = space.machine().driver_data<md_cons_state>(); | |
38 | 38 | UINT16 retdata = 0; |
39 | 39 | UINT8 joy[2]; |
40 | 40 | |
r17963 | r17964 | |
709 | 709 | |
710 | 710 | static READ16_HANDLER( pico_68k_io_read ) |
711 | 711 | { |
712 | pico_state *state = space | |
712 | pico_state *state = space.machine().driver_data<pico_state>(); | |
713 | 713 | UINT8 retdata = 0; |
714 | 714 | |
715 | 715 | switch (offset) |
r17963 | r17964 | |
733 | 733 | 0x2f8 - 0x3f3 (storyware) |
734 | 734 | */ |
735 | 735 | case 2: |
736 | retdata = pico_read_penpos(space | |
736 | retdata = pico_read_penpos(space.machine(), PICO_PENX) >> 8; | |
737 | 737 | break; |
738 | 738 | case 3: |
739 | retdata = pico_read_penpos(space | |
739 | retdata = pico_read_penpos(space.machine(), PICO_PENX) & 0x00ff; | |
740 | 740 | break; |
741 | 741 | case 4: |
742 | retdata = pico_read_penpos(space | |
742 | retdata = pico_read_penpos(space.machine(), PICO_PENY) >> 8; | |
743 | 743 | break; |
744 | 744 | case 5: |
745 | retdata = pico_read_penpos(space | |
745 | retdata = pico_read_penpos(space.machine(), PICO_PENY) & 0x00ff; | |
746 | 746 | break; |
747 | 747 | case 6: |
748 | 748 | /* Page register : |
r17963 | r17964 | |
---|---|---|
58 | 58 | |
59 | 59 | static READ16_HANDLER( amiga_clock_r ) |
60 | 60 | { |
61 | msm6242_device *rtc = space->machine().device<msm6242_device>("rtc"); | |
62 | return rtc->read(*space,offset / 2); | |
61 | msm6242_device *rtc = space.machine().device<msm6242_device>("rtc"); | |
62 | return rtc->read(space,offset / 2); | |
63 | 63 | } |
64 | 64 | |
65 | 65 | |
66 | 66 | static WRITE16_HANDLER( amiga_clock_w ) |
67 | 67 | { |
68 | msm6242_device *rtc = space->machine().device<msm6242_device>("rtc"); | |
69 | rtc->write(*space,offset / 2, data); | |
68 | msm6242_device *rtc = space.machine().device<msm6242_device>("rtc"); | |
69 | rtc->write(space,offset / 2, data); | |
70 | 70 | } |
71 | 71 | |
72 | 72 |
r17963 | r17964 | |
---|---|---|
377 | 377 | Channel 2: GDC |
378 | 378 | Channel 3: Option slots |
379 | 379 | */ |
380 | static UINT8 memory_read_byte(address_space *space, offs_t address) { return space->read_byte(address); } | |
381 | static void memory_write_byte(address_space *space, offs_t address, UINT8 data) { space->write_byte(address, data); } | |
380 | static UINT8 memory_read_byte(address_space &space, offs_t address) { return space.read_byte(address); } | |
381 | static void memory_write_byte(address_space &space, offs_t address, UINT8 data) { space.write_byte(address, data); } | |
382 | 382 | |
383 | 383 | static I8237_INTERFACE( qx10_dma8237_1_interface ) |
384 | 384 | { |
r17963 | r17964 | |
---|---|---|
207 | 207 | /* Z80 DMA */ |
208 | 208 | |
209 | 209 | |
210 | static UINT8 memory_read_byte(address_space *space, offs_t address) { return space->read_byte(address); } | |
211 | static void memory_write_byte(address_space *space, offs_t address, UINT8 data) { space->write_byte(address, data); } | |
210 | static UINT8 memory_read_byte(address_space &space, offs_t address) { return space.read_byte(address); } | |
211 | static void memory_write_byte(address_space &space, offs_t address, UINT8 data) { space.write_byte(address, data); } | |
212 | 212 | |
213 | 213 | static Z80DMA_INTERFACE( dma_intf ) |
214 | 214 | { |
r17963 | r17964 | |
415 | 415 | |
416 | 416 | WRITE_LINE_MEMBER( bigbord2_state::frame ) |
417 | 417 | { |
418 | address_space | |
418 | address_space &space = *m_maincpu->space(AS_PROGRAM); | |
419 | 419 | static UINT8 framecnt; |
420 | 420 | framecnt++; |
421 | 421 | |
422 | if ((space | |
422 | if ((space.read_byte(0xf13d) == 0x4d) & (framecnt > 3)) | |
423 | 423 | { |
424 | 424 | framecnt = 0; |
425 | 425 | // simulate interrupt by saving current pc on |
r17963 | r17964 | |
427 | 427 | UINT16 spreg = m_maincpu->state_int(Z80_SP); |
428 | 428 | UINT16 pcreg = m_maincpu->state_int(Z80_PC); |
429 | 429 | spreg--; |
430 | space | |
430 | space.write_byte(spreg, pcreg >> 8); | |
431 | 431 | spreg--; |
432 | space | |
432 | space.write_byte(spreg, pcreg); | |
433 | 433 | m_maincpu->set_state_int(Z80_SP, spreg); |
434 | 434 | m_maincpu->set_state_int(Z80_PC, 0xF18E); |
435 | 435 | } |
r17963 | r17964 | |
---|---|---|
18 | 18 | #define TVC_INSTALL_ROM_BANK(_bank,_tag,_start,_end) \ |
19 | 19 | if (m_bank_type[_bank] != TVC_ROM_BANK) \ |
20 | 20 | { \ |
21 | space->install_read_bank(_start, _end, _tag); \ | |
22 | space->unmap_write(_start, _end); \ | |
21 | space.install_read_bank(_start, _end, _tag); \ | |
22 | space.unmap_write(_start, _end); \ | |
23 | 23 | m_bank_type[_bank] = TVC_ROM_BANK; \ |
24 | 24 | } \ |
25 | 25 | |
26 | 26 | #define TVC_INSTALL_RAM_BANK(_bank,_tag,_start,_end) \ |
27 | 27 | if (m_bank_type[_bank] != TVC_RAM_BANK) \ |
28 | 28 | { \ |
29 | space | |
29 | space.install_readwrite_bank(_start, _end, _tag); \ | |
30 | 30 | m_bank_type[_bank] = TVC_RAM_BANK; \ |
31 | 31 | } \ |
32 | 32 | |
33 | 33 | void tvc_state::tvc_set_mem_page(UINT8 data) |
34 | 34 | { |
35 | address_space | |
35 | address_space &space = *m_maincpu->space(AS_PROGRAM); | |
36 | 36 | switch(data & 0x18) |
37 | 37 | { |
38 | 38 | case 0x00 : // system ROM selected |
r17963 | r17964 | |
56 | 56 | } |
57 | 57 | else |
58 | 58 | { |
59 | space | |
59 | space.unmap_readwrite(0x0000, 0x3fff); | |
60 | 60 | m_bank_type[0] = -1; |
61 | 61 | } |
62 | 62 | break; |
r17963 | r17964 | |
76 | 76 | } |
77 | 77 | else |
78 | 78 | { |
79 | space | |
79 | space.unmap_readwrite(0x8000, 0xbfff); | |
80 | 80 | m_bank_type[2] = -1; |
81 | 81 | } |
82 | 82 | } |
r17963 | r17964 | |
99 | 99 | } |
100 | 100 | else |
101 | 101 | { |
102 | space | |
102 | space.unmap_readwrite(0xc000, 0xffff); | |
103 | 103 | m_bank_type[3] = -1; |
104 | 104 | } |
105 | 105 | break; |
106 | 106 | case 0xc0 : // External ROM selected |
107 | 107 | TVC_INSTALL_ROM_BANK(3, "bank4", 0xc000, 0xffff); |
108 | 108 | membank("bank4")->set_base(memregion("ext")->base()); |
109 | space | |
109 | space.install_readwrite_handler (0xc000, 0xdfff, 0, 0, read8_delegate(FUNC(tvc_state::tvc_expansion_r), this), write8_delegate(FUNC(tvc_state::tvc_expansion_w), this), 0); | |
110 | 110 | m_bank_type[3] = -1; |
111 | 111 | break; |
112 | 112 | } |
r17963 | r17964 | |
---|---|---|
270 | 270 | switch(offset) |
271 | 271 | { |
272 | 272 | case 0x00: // bit 7 = NMI vector protect, bit 6 = power off, bit 0 = software reset, bit 3 = A20 line? |
273 | // space | |
273 | // space.machine().device("maincpu")->execute().set_input_line(INPUT_LINE_A20,(data & 0x08) ? CLEAR_LINE : ASSERT_LINE); | |
274 | 274 | logerror("SYS: port 0x20 write %02x\n",data); |
275 | 275 | break; |
276 | 276 | case 0x02: |
r17963 | r17964 | |
---|---|---|
423 | 423 | |
424 | 424 | void fk1_state::machine_reset() |
425 | 425 | { |
426 | address_space | |
426 | address_space &space = *m_maincpu->space(AS_PROGRAM); | |
427 | 427 | UINT8 *ram = machine().device<ram_device>(RAM_TAG)->pointer(); |
428 | 428 | |
429 | space | |
429 | space.unmap_write(0x0000, 0x3fff); | |
430 | 430 | membank("bank1")->set_base(machine().root_device().memregion("maincpu")->base()); // ROM |
431 | 431 | membank("bank2")->set_base(ram + 0x10000); // VRAM |
432 | 432 | membank("bank3")->set_base(ram + 0x8000); |
r17963 | r17964 | |
---|---|---|
798 | 798 | } |
799 | 799 | } |
800 | 800 | |
801 | static UINT8 memory_read_byte(address_space *space, offs_t address) { return space->read_byte(address); } | |
802 | static void memory_write_byte(address_space *space, offs_t address, UINT8 data) { space->write_byte(address, data); } | |
801 | static UINT8 memory_read_byte(address_space &space, offs_t address) { return space.read_byte(address); } | |
802 | static void memory_write_byte(address_space &space, offs_t address, UINT8 data) { space.write_byte(address, data); } | |
803 | 803 | |
804 | 804 | static Z80DMA_INTERFACE( dma_intf ) |
805 | 805 | { |
r17963 | r17964 | |
---|---|---|
209 | 209 | static SNAPSHOT_LOAD( vtech1 ) |
210 | 210 | { |
211 | 211 | vtech1_state *vtech1 = image.device().machine().driver_data<vtech1_state>(); |
212 | address_space | |
212 | address_space &space = *image.device().machine().device("maincpu")->memory().space(AS_PROGRAM); | |
213 | 213 | UINT8 i, header[24]; |
214 | 214 | UINT16 start, end, size; |
215 | 215 | char pgmname[18]; |
r17963 | r17964 | |
241 | 241 | switch (header[21]) |
242 | 242 | { |
243 | 243 | case VZ_BASIC: /* 0xF0 */ |
244 | space->write_byte(0x78a4, start % 256); /* start of basic program */ | |
245 | space->write_byte(0x78a5, start / 256); | |
246 | space->write_byte(0x78f9, end % 256); /* end of basic program */ | |
247 | space->write_byte(0x78fa, end / 256); | |
248 | space->write_byte(0x78fb, end % 256); /* start variable table */ | |
249 | space->write_byte(0x78fc, end / 256); | |
250 | space->write_byte(0x78fd, end % 256); /* start free mem, end variable table */ | |
251 | space->write_byte(0x78fe, end / 256); | |
244 | space.write_byte(0x78a4, start % 256); /* start of basic program */ | |
245 | space.write_byte(0x78a5, start / 256); | |
246 | space.write_byte(0x78f9, end % 256); /* end of basic program */ | |
247 | space.write_byte(0x78fa, end / 256); | |
248 | space.write_byte(0x78fb, end % 256); /* start variable table */ | |
249 | space.write_byte(0x78fc, end / 256); | |
250 | space.write_byte(0x78fd, end % 256); /* start free mem, end variable table */ | |
251 | space.write_byte(0x78fe, end / 256); | |
252 | 252 | image.message(" %s (B)\nsize=%04X : start=%04X : end=%04X",pgmname,size,start,end); |
253 | 253 | break; |
254 | 254 | |
255 | 255 | case VZ_MCODE: /* 0xF1 */ |
256 | space->write_byte(0x788e, start % 256); /* usr subroutine address */ | |
257 | space->write_byte(0x788f, start / 256); | |
256 | space.write_byte(0x788e, start % 256); /* usr subroutine address */ | |
257 | space.write_byte(0x788f, start / 256); | |
258 | 258 | image.message(" %s (M)\nsize=%04X : start=%04X : end=%04X",pgmname,size,start,end); |
259 | 259 | image.device().machine().device("maincpu")->state().set_pc(start); /* start program */ |
260 | 260 | break; |
r17963 | r17964 | |
---|---|---|
603 | 603 | bank_address = 0x100000; |
604 | 604 | } |
605 | 605 | |
606 | neogeo_set_main_cpu_bank_address( | |
606 | neogeo_set_main_cpu_bank_address(space, bank_address); | |
607 | 607 | } |
608 | 608 | } |
609 | 609 | |
r17963 | r17964 | |
611 | 611 | static void main_cpu_banking_init( running_machine &machine ) |
612 | 612 | { |
613 | 613 | ng_aes_state *state = machine.driver_data<ng_aes_state>(); |
614 | address_space | |
614 | address_space &mainspace = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
615 | 615 | |
616 | 616 | /* create vector banks */ |
617 | 617 | state->membank(NEOGEO_BANK_VECTORS)->configure_entry(0, machine.root_device().memregion("mainbios")->base()); |
r17963 | r17964 | |
642 | 642 | } |
643 | 643 | |
644 | 644 | |
645 | static void audio_cpu_bank_select( address_space | |
645 | static void audio_cpu_bank_select( address_space &space, int region, UINT8 bank ) | |
646 | 646 | { |
647 | neogeo_state *state = space | |
647 | neogeo_state *state = space.machine().driver_data<neogeo_state>(); | |
648 | 648 | |
649 | if (LOG_AUDIO_CPU_BANKING) logerror("Audio CPU PC %03x: audio_cpu_bank_select: Region: %d Bank: %02x\n", space | |
649 | if (LOG_AUDIO_CPU_BANKING) logerror("Audio CPU PC %03x: audio_cpu_bank_select: Region: %d Bank: %02x\n", space.device().safe_pc(), region, bank); | |
650 | 650 | |
651 | 651 | state->m_audio_cpu_banks[region] = bank; |
652 | 652 | |
653 | set_audio_cpu_banking(space | |
653 | set_audio_cpu_banking(space.machine()); | |
654 | 654 | } |
655 | 655 | |
656 | 656 | |
657 | 657 | READ8_MEMBER(ng_aes_state::audio_cpu_bank_select_f000_f7ff_r) |
658 | 658 | { |
659 | audio_cpu_bank_select( | |
659 | audio_cpu_bank_select(space, 0, offset >> 8); | |
660 | 660 | |
661 | 661 | return 0; |
662 | 662 | } |
r17963 | r17964 | |
664 | 664 | |
665 | 665 | READ8_MEMBER(ng_aes_state::audio_cpu_bank_select_e000_efff_r) |
666 | 666 | { |
667 | audio_cpu_bank_select( | |
667 | audio_cpu_bank_select(space, 1, offset >> 8); | |
668 | 668 | |
669 | 669 | return 0; |
670 | 670 | } |
r17963 | r17964 | |
672 | 672 | |
673 | 673 | READ8_MEMBER(ng_aes_state::audio_cpu_bank_select_c000_dfff_r) |
674 | 674 | { |
675 | audio_cpu_bank_select( | |
675 | audio_cpu_bank_select(space, 2, offset >> 8); | |
676 | 676 | |
677 | 677 | return 0; |
678 | 678 | } |
r17963 | r17964 | |
680 | 680 | |
681 | 681 | READ8_MEMBER(ng_aes_state::audio_cpu_bank_select_8000_bfff_r) |
682 | 682 | { |
683 | audio_cpu_bank_select( | |
683 | audio_cpu_bank_select(space, 3, offset >> 8); | |
684 | 684 | |
685 | 685 | return 0; |
686 | 686 | } |
687 | 687 | |
688 | 688 | |
689 | static void _set_audio_cpu_rom_source( address_space | |
689 | static void _set_audio_cpu_rom_source( address_space &space ) | |
690 | 690 | { |
691 | neogeo_state *state = space | |
691 | neogeo_state *state = space.machine().driver_data<neogeo_state>(); | |
692 | 692 | |
693 | 693 | /* if (!state->memregion("audiobios")->base()) */ |
694 | 694 | state->m_audio_cpu_rom_source = 1; |
r17963 | r17964 | |
700 | 700 | { |
701 | 701 | state->m_audio_cpu_rom_source_last = state->m_audio_cpu_rom_source; |
702 | 702 | |
703 | space | |
703 | space.machine().device("audiocpu")->execute().set_input_line(INPUT_LINE_RESET, PULSE_LINE); | |
704 | 704 | |
705 | if (LOG_AUDIO_CPU_BANKING) logerror("Audio CPU PC %03x: selectign %s ROM\n", space | |
705 | if (LOG_AUDIO_CPU_BANKING) logerror("Audio CPU PC %03x: selectign %s ROM\n", space.device().safe_pc(), state->m_audio_cpu_rom_source ? "CARTRIDGE" : "BIOS"); | |
706 | 706 | } |
707 | 707 | } |
708 | 708 | |
709 | 709 | |
710 | static void set_audio_cpu_rom_source( address_space | |
710 | static void set_audio_cpu_rom_source( address_space &space, UINT8 data ) | |
711 | 711 | { |
712 | neogeo_state *state = space | |
712 | neogeo_state *state = space.machine().driver_data<neogeo_state>(); | |
713 | 713 | state->m_audio_cpu_rom_source = data; |
714 | 714 | |
715 | 715 | _set_audio_cpu_rom_source(space); |
r17963 | r17964 | |
752 | 752 | set_audio_cpu_banking(machine); |
753 | 753 | |
754 | 754 | state->m_audio_cpu_rom_source_last = 0; |
755 | set_audio_cpu_rom_source(machine.device("maincpu")->memory().space(AS_PROGRAM), 0); | |
755 | set_audio_cpu_rom_source(*machine.device("maincpu")->memory().space(AS_PROGRAM), 0); | |
756 | 756 | } |
757 | 757 | |
758 | 758 | |
r17963 | r17964 | |
774 | 774 | default: |
775 | 775 | case 0x00: neogeo_set_screen_dark(machine(), bit); break; |
776 | 776 | case 0x01: set_main_cpu_vector_table_source(machine(), bit); |
777 | set_audio_cpu_rom_source( | |
777 | set_audio_cpu_rom_source(space, bit); /* this is a guess */ | |
778 | 778 | break; |
779 | 779 | case 0x05: neogeo_set_fixed_layer_source(machine(), bit); break; |
780 | 780 | // case 0x06: set_save_ram_unlock(machine(), bit); break; |
r17963 | r17964 | |
836 | 836 | * |
837 | 837 | */ |
838 | 838 | |
839 | static void neocd_do_dma(address_space | |
839 | static void neocd_do_dma(address_space& space) | |
840 | 840 | { |
841 | ng_aes_state *state = space | |
841 | ng_aes_state *state = space.machine().driver_data<ng_aes_state>(); | |
842 | 842 | // TODO: Proper DMA timing and control |
843 | 843 | int count; |
844 | 844 | // UINT16 word; |
r17963 | r17964 | |
848 | 848 | case 0xffdd: |
849 | 849 | for(count=0;count<state->m_neocd_ctrl.word_count;count++) |
850 | 850 | { |
851 | //word = space->read_word(state->m_neocd_ctrl.addr_source); | |
852 | space->write_word(state->m_neocd_ctrl.addr_source+(count*2),state->m_neocd_ctrl.fill_word); | |
851 | //word = space.read_word(state->m_neocd_ctrl.addr_source); | |
852 | space.write_word(state->m_neocd_ctrl.addr_source+(count*2),state->m_neocd_ctrl.fill_word); | |
853 | 853 | } |
854 | 854 | logerror("CTRL: DMA word-fill transfer of %i bytes\n",count*2); |
855 | 855 | break; |
856 | 856 | case 0xfef5: |
857 | 857 | for(count=0;count<state->m_neocd_ctrl.word_count;count++) |
858 | 858 | { |
859 | //word = space->read_word(state->m_neocd_ctrl.addr_source); | |
860 | space->write_word(state->m_neocd_ctrl.addr_source+(count*4),(state->m_neocd_ctrl.addr_source+(count*4)) >> 16); | |
861 | space->write_word(state->m_neocd_ctrl.addr_source+(count*4)+2,(state->m_neocd_ctrl.addr_source+(count*4)) & 0xffff); | |
859 | //word = space.read_word(state->m_neocd_ctrl.addr_source); | |
860 | space.write_word(state->m_neocd_ctrl.addr_source+(count*4),(state->m_neocd_ctrl.addr_source+(count*4)) >> 16); | |
861 | space.write_word(state->m_neocd_ctrl.addr_source+(count*4)+2,(state->m_neocd_ctrl.addr_source+(count*4)) & 0xffff); | |
862 | 862 | } |
863 | 863 | logerror("CTRL: DMA mode 2 transfer of %i bytes\n",count*4); |
864 | 864 | break; |
865 | 865 | case 0xcffd: |
866 | 866 | for(count=0;count<state->m_neocd_ctrl.word_count;count++) |
867 | 867 | { |
868 | //word = space->read_word(state->m_neocd_ctrl.addr_source); | |
869 | space->write_word(state->m_neocd_ctrl.addr_source+(count*8),((state->m_neocd_ctrl.addr_source+(count*8)) >> 24) | 0xff00); | |
870 | space->write_word(state->m_neocd_ctrl.addr_source+(count*8)+2,((state->m_neocd_ctrl.addr_source+(count*8)) >> 16) | 0xff00); | |
871 | space->write_word(state->m_neocd_ctrl.addr_source+(count*8)+4,((state->m_neocd_ctrl.addr_source+(count*8)) >> 8) | 0xff00); | |
872 | space->write_word(state->m_neocd_ctrl.addr_source+(count*8)+6,(state->m_neocd_ctrl.addr_source+(count*8)) | 0xff00); | |
868 | //word = space.read_word(state->m_neocd_ctrl.addr_source); | |
869 | space.write_word(state->m_neocd_ctrl.addr_source+(count*8),((state->m_neocd_ctrl.addr_source+(count*8)) >> 24) | 0xff00); | |
870 | space.write_word(state->m_neocd_ctrl.addr_source+(count*8)+2,((state->m_neocd_ctrl.addr_source+(count*8)) >> 16) | 0xff00); | |
871 | space.write_word(state->m_neocd_ctrl.addr_source+(count*8)+4,((state->m_neocd_ctrl.addr_source+(count*8)) >> 8) | 0xff00); | |
872 | space.write_word(state->m_neocd_ctrl.addr_source+(count*8)+6,(state->m_neocd_ctrl.addr_source+(count*8)) | 0xff00); | |
873 | 873 | } |
874 | 874 | logerror("CTRL: DMA mode 3 transfer of %i bytes\n",count*8); |
875 | 875 | break; |
r17963 | r17964 | |
929 | 929 | { |
930 | 930 | case 0x60/2: // Start DMA transfer |
931 | 931 | if((data & 0xff) == 0x40) |
932 | neocd_do_dma( | |
932 | neocd_do_dma(space); | |
933 | 933 | break; |
934 | 934 | case 0x64/2: // source address, high word |
935 | 935 | m_neocd_ctrl.addr_source = (m_neocd_ctrl.addr_source & 0x0000ffff) | (data << 16); |
r17963 | r17964 | |
1148 | 1148 | _set_main_cpu_bank_address(state->machine()); |
1149 | 1149 | _set_main_cpu_vector_table_source(state->machine()); |
1150 | 1150 | set_audio_cpu_banking(state->machine()); |
1151 | _set_audio_cpu_rom_source(state->machine().device("maincpu")->memory().space(AS_PROGRAM)); | |
1151 | _set_audio_cpu_rom_source(*state->machine().device("maincpu")->memory().space(AS_PROGRAM)); | |
1152 | 1152 | } |
1153 | 1153 | |
1154 | 1154 | static void common_machine_start(running_machine &machine) |
r17963 | r17964 | |
1253 | 1253 | MACHINE_RESET_MEMBER(ng_aes_state,neogeo) |
1254 | 1254 | { |
1255 | 1255 | offs_t offs; |
1256 | address_space | |
1256 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
1257 | 1257 | |
1258 | 1258 | /* reset system control registers */ |
1259 | 1259 | for (offs = 0; offs < 8; offs++) |
1260 | system_control_w( | |
1260 | system_control_w(space, offs, 0, 0x00ff); | |
1261 | 1261 | |
1262 | 1262 | machine().device("maincpu")->reset(); |
1263 | 1263 |
r17963 | r17964 | |
---|---|---|
455 | 455 | static QUICKLOAD_LOAD( psx_exe_load ) |
456 | 456 | { |
457 | 457 | psx1_state *state = image.device().machine().driver_data<psx1_state>(); |
458 | address_space | |
458 | address_space &space = *image.device().machine().device( "maincpu")->memory().space( AS_PROGRAM ); | |
459 | 459 | |
460 | 460 | state->m_exe_size = 0; |
461 | 461 | state->m_exe_buffer = (UINT8*)malloc( quickload_size ); |
r17963 | r17964 | |
470 | 470 | return IMAGE_INIT_FAIL; |
471 | 471 | } |
472 | 472 | state->m_exe_size = quickload_size; |
473 | space | |
473 | space.set_direct_update_handler(direct_update_delegate(FUNC(psx1_state::psx_setopbase), state)); | |
474 | 474 | |
475 | 475 | return IMAGE_INIT_PASS; |
476 | 476 | } |
r17963 | r17964 | |
---|---|---|
167 | 167 | |
168 | 168 | WRITE8_MEMBER(samcoupe_state::samcoupe_lmpr_w) |
169 | 169 | { |
170 | address_space | |
170 | address_space &space_program = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
171 | 171 | |
172 | 172 | m_lmpr = data; |
173 | 173 | samcoupe_update_memory(space_program); |
r17963 | r17964 | |
180 | 180 | |
181 | 181 | WRITE8_MEMBER(samcoupe_state::samcoupe_hmpr_w) |
182 | 182 | { |
183 | address_space | |
183 | address_space &space_program = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
184 | 184 | |
185 | 185 | m_hmpr = data; |
186 | 186 | samcoupe_update_memory(space_program); |
r17963 | r17964 | |
193 | 193 | |
194 | 194 | WRITE8_MEMBER(samcoupe_state::samcoupe_vmpr_w) |
195 | 195 | { |
196 | address_space | |
196 | address_space &space_program = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
197 | 197 | |
198 | 198 | m_vmpr = data; |
199 | 199 | samcoupe_update_memory(space_program); |
r17963 | r17964 | |
---|---|---|
120 | 120 | MACHINE_RESET_MEMBER(atm_state,atm) |
121 | 121 | { |
122 | 122 | UINT8 *messram = machine().device<ram_device>(RAM_TAG)->pointer(); |
123 | address_space | |
123 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
124 | 124 | device_t *beta = machine().device(BETA_DISK_TAG); |
125 | 125 | |
126 | space->install_read_bank(0x0000, 0x3fff, "bank1"); | |
127 | space->unmap_write(0x0000, 0x3fff); | |
126 | space.install_read_bank(0x0000, 0x3fff, "bank1"); | |
127 | space.unmap_write(0x0000, 0x3fff); | |
128 | 128 | |
129 | 129 | if (beta->started()) { |
130 | 130 | betadisk_enable(beta); |
131 | 131 | betadisk_clear_status(beta); |
132 | 132 | } |
133 | space | |
133 | space.set_direct_update_handler(direct_update_delegate(FUNC(atm_state::atm_direct), this)); | |
134 | 134 | |
135 | 135 | memset(messram,0,128*1024); |
136 | 136 |
r17963 | r17964 | |
---|---|---|
57 | 57 | |
58 | 58 | UINT32 itt3030_state::screen_update( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect ) |
59 | 59 | { |
60 | address_space | |
60 | address_space &space = *screen.machine().device("maincpu")->memory().space(AS_PROGRAM); | |
61 | 61 | |
62 | 62 | for(int y = 0; y < 24; y++ ) |
63 | 63 | { |
64 | 64 | for(int x = 0; x < 80; x++ ) |
65 | 65 | { |
66 | UINT8 code = space | |
66 | UINT8 code = space.read_byte(0x3000 + x + y*128); | |
67 | 67 | drawgfx_opaque(bitmap, cliprect, screen.machine().gfx[0], code , 0, 0,0, x*8,y*16); |
68 | 68 | } |
69 | 69 | } |
r17963 | r17964 | |
---|---|---|
1042 | 1042 | { |
1043 | 1043 | running_machine &machine = image.device().machine(); |
1044 | 1044 | x07_state *state = machine.driver_data<x07_state>(); |
1045 | address_space | |
1045 | address_space &space = *state->m_maincpu->space( AS_PROGRAM ); | |
1046 | 1046 | UINT16 ram_size = state->m_ram->size(); |
1047 | 1047 | |
1048 | 1048 | if (image.software_entry() == NULL) |
r17963 | r17964 | |
1050 | 1050 | UINT8 *rom = machine.memory().region_alloc( "card", image.length(), 1, ENDIANNESS_LITTLE )->base(); |
1051 | 1051 | image.fread(rom, image.length()); |
1052 | 1052 | |
1053 | space->install_ram(ram_size, ram_size + 0xfff); | |
1054 | space->install_rom(0x6000, 0x7fff, rom); | |
1053 | space.install_ram(ram_size, ram_size + 0xfff); | |
1054 | space.install_rom(0x6000, 0x7fff, rom); | |
1055 | 1055 | } |
1056 | 1056 | else |
1057 | 1057 | { |
r17963 | r17964 | |
1061 | 1061 | { |
1062 | 1062 | // 0x4000 - 0x4fff 4KB RAM |
1063 | 1063 | // 0x6000 - 0x7fff 8KB ROM |
1064 | space->install_ram(ram_size, ram_size + 0xfff); | |
1065 | space->install_rom(0x6000, 0x7fff, image.get_software_region("rom")); | |
1064 | space.install_ram(ram_size, ram_size + 0xfff); | |
1065 | space.install_rom(0x6000, 0x7fff, image.get_software_region("rom")); | |
1066 | 1066 | } |
1067 | 1067 | else |
1068 | 1068 | { |
r17963 | r17964 | |
---|---|---|
439 | 439 | |
440 | 440 | void nanos_state::machine_reset() |
441 | 441 | { |
442 | address_space | |
442 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
443 | 443 | |
444 | space->install_write_bank(0x0000, 0x0fff, "bank3"); | |
445 | space->install_write_bank(0x1000, 0xffff, "bank2"); | |
444 | space.install_write_bank(0x0000, 0x0fff, "bank3"); | |
445 | space.install_write_bank(0x1000, 0xffff, "bank2"); | |
446 | 446 | |
447 | 447 | membank("bank1")->set_base(machine().root_device().memregion("maincpu")->base()); |
448 | 448 | membank("bank2")->set_base(machine().device<ram_device>(RAM_TAG)->pointer() + 0x1000); |
449 | 449 | membank("bank3")->set_base(machine().device<ram_device>(RAM_TAG)->pointer()); |
450 | 450 | |
451 | floppy_mon_w(floppy_get_device(space->machine(), 0), CLEAR_LINE); | |
452 | floppy_drive_set_ready_state(floppy_get_device(space->machine(), 0), 1,1); | |
451 | floppy_mon_w(floppy_get_device(space.machine(), 0), CLEAR_LINE); | |
452 | floppy_drive_set_ready_state(floppy_get_device(space.machine(), 0), 1,1); | |
453 | 453 | } |
454 | 454 | |
455 | 455 | static Z80PIO_INTERFACE( nanos_z80pio_intf ) |
r17963 | r17964 | |
---|---|---|
53 | 53 | #include "includes/fm7.h" |
54 | 54 | |
55 | 55 | |
56 | static void fm7_mmr_refresh(address_space | |
56 | static void fm7_mmr_refresh(address_space&); | |
57 | 57 | |
58 | 58 | |
59 | 59 | |
r17963 | r17964 | |
352 | 352 | membank("bank1")->set_base(RAM+0x38000); |
353 | 353 | } |
354 | 354 | else |
355 | fm7_mmr_refresh( | |
355 | fm7_mmr_refresh(space); | |
356 | 356 | logerror("BASIC ROM enabled\n"); |
357 | 357 | return 0x00; |
358 | 358 | } |
r17963 | r17964 | |
368 | 368 | membank("bank1")->set_base(RAM+0x8000); |
369 | 369 | } |
370 | 370 | else |
371 | fm7_mmr_refresh( | |
371 | fm7_mmr_refresh(space); | |
372 | 372 | logerror("BASIC ROM disabled\n"); |
373 | 373 | } |
374 | 374 | |
r17963 | r17964 | |
383 | 383 | if(data & 0x02) |
384 | 384 | { |
385 | 385 | m_init_rom_en = 0; |
386 | fm7_mmr_refresh( | |
386 | fm7_mmr_refresh(space); | |
387 | 387 | } |
388 | 388 | else |
389 | 389 | { |
390 | 390 | m_init_rom_en = 1; |
391 | fm7_mmr_refresh( | |
391 | fm7_mmr_refresh(space); | |
392 | 392 | } |
393 | 393 | } |
394 | 394 | |
r17963 | r17964 | |
985 | 985 | return 0xff; |
986 | 986 | } |
987 | 987 | |
988 | static void fm7_update_bank(address_space | |
988 | static void fm7_update_bank(address_space & space, int bank, UINT8 physical) | |
989 | 989 | { |
990 | fm7_state *state = space | |
990 | fm7_state *state = space.machine().driver_data<fm7_state>(); | |
991 | 991 | UINT8* RAM = state->memregion("maincpu")->base(); |
992 | 992 | UINT16 size = 0xfff; |
993 | 993 | char bank_name[10]; |
r17963 | r17964 | |
1002 | 1002 | switch(physical) |
1003 | 1003 | { |
1004 | 1004 | case 0x10: |
1005 | space | |
1005 | space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(FUNC(fm7_state::fm7_vram0_r),state),write8_delegate(FUNC(fm7_state::fm7_vram0_w),state)); | |
1006 | 1006 | break; |
1007 | 1007 | case 0x11: |
1008 | space | |
1008 | space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(FUNC(fm7_state::fm7_vram1_r),state),write8_delegate(FUNC(fm7_state::fm7_vram1_w),state)); | |
1009 | 1009 | break; |
1010 | 1010 | case 0x12: |
1011 | space | |
1011 | space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(FUNC(fm7_state::fm7_vram2_r),state),write8_delegate(FUNC(fm7_state::fm7_vram2_w),state)); | |
1012 | 1012 | break; |
1013 | 1013 | case 0x13: |
1014 | space | |
1014 | space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(FUNC(fm7_state::fm7_vram3_r),state),write8_delegate(FUNC(fm7_state::fm7_vram3_w),state)); | |
1015 | 1015 | break; |
1016 | 1016 | case 0x14: |
1017 | space | |
1017 | space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(FUNC(fm7_state::fm7_vram4_r),state),write8_delegate(FUNC(fm7_state::fm7_vram4_w),state)); | |
1018 | 1018 | break; |
1019 | 1019 | case 0x15: |
1020 | space | |
1020 | space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(FUNC(fm7_state::fm7_vram5_r),state),write8_delegate(FUNC(fm7_state::fm7_vram5_w),state)); | |
1021 | 1021 | break; |
1022 | 1022 | case 0x16: |
1023 | space | |
1023 | space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(FUNC(fm7_state::fm7_vram6_r),state),write8_delegate(FUNC(fm7_state::fm7_vram6_w),state)); | |
1024 | 1024 | break; |
1025 | 1025 | case 0x17: |
1026 | space | |
1026 | space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(FUNC(fm7_state::fm7_vram7_r),state),write8_delegate(FUNC(fm7_state::fm7_vram7_w),state)); | |
1027 | 1027 | break; |
1028 | 1028 | case 0x18: |
1029 | space | |
1029 | space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(FUNC(fm7_state::fm7_vram8_r),state),write8_delegate(FUNC(fm7_state::fm7_vram8_w),state)); | |
1030 | 1030 | break; |
1031 | 1031 | case 0x19: |
1032 | space | |
1032 | space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(FUNC(fm7_state::fm7_vram9_r),state),write8_delegate(FUNC(fm7_state::fm7_vram9_w),state)); | |
1033 | 1033 | break; |
1034 | 1034 | case 0x1a: |
1035 | space | |
1035 | space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(FUNC(fm7_state::fm7_vramA_r),state),write8_delegate(FUNC(fm7_state::fm7_vramA_w),state)); | |
1036 | 1036 | break; |
1037 | 1037 | case 0x1b: |
1038 | space | |
1038 | space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(FUNC(fm7_state::fm7_vramB_r),state),write8_delegate(FUNC(fm7_state::fm7_vramB_w),state)); | |
1039 | 1039 | break; |
1040 | 1040 | } |
1041 | 1041 | // state->membank(bank+1)->set_base(RAM+(physical<<12)-0x10000); |
r17963 | r17964 | |
1043 | 1043 | } |
1044 | 1044 | if(physical == 0x1c) |
1045 | 1045 | { |
1046 | space | |
1046 | space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(FUNC(fm7_state::fm7_console_ram_banked_r),state),write8_delegate(FUNC(fm7_state::fm7_console_ram_banked_w),state)); | |
1047 | 1047 | return; |
1048 | 1048 | } |
1049 | 1049 | if(physical == 0x1d) |
1050 | 1050 | { |
1051 | space | |
1051 | space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(FUNC(fm7_state::fm7_sub_ram_ports_banked_r),state),write8_delegate(FUNC(fm7_state::fm7_sub_ram_ports_banked_w),state)); | |
1052 | 1052 | return; |
1053 | 1053 | } |
1054 | 1054 | if(physical == 0x35) |
1055 | 1055 | { |
1056 | 1056 | if(state->m_init_rom_en && (state->m_type == SYS_FM11 || state->m_type == SYS_FM16)) |
1057 | 1057 | { |
1058 | RAM = space->machine().root_device().memregion("init")->base(); | |
1059 | space->install_read_bank(bank*0x1000,(bank*0x1000)+size,bank_name); | |
1060 | space->nop_write(bank*0x1000,(bank*0x1000)+size); | |
1058 | RAM = space.machine().root_device().memregion("init")->base(); | |
1059 | space.install_read_bank(bank*0x1000,(bank*0x1000)+size,bank_name); | |
1060 | space.nop_write(bank*0x1000,(bank*0x1000)+size); | |
1061 | 1061 | state->membank(bank_name)->set_base(RAM+(physical<<12)-0x35000); |
1062 | 1062 | return; |
1063 | 1063 | } |
r17963 | r17964 | |
1066 | 1066 | { |
1067 | 1067 | if(state->m_init_rom_en && (state->m_type != SYS_FM11 && state->m_type != SYS_FM16)) |
1068 | 1068 | { |
1069 | RAM = space->machine().root_device().memregion("init")->base(); | |
1070 | space->install_read_bank(bank*0x1000,(bank*0x1000)+size,bank_name); | |
1071 | space->nop_write(bank*0x1000,(bank*0x1000)+size); | |
1069 | RAM = space.machine().root_device().memregion("init")->base(); | |
1070 | space.install_read_bank(bank*0x1000,(bank*0x1000)+size,bank_name); | |
1071 | space.nop_write(bank*0x1000,(bank*0x1000)+size); | |
1072 | 1072 | state->membank(bank_name)->set_base(RAM+(physical<<12)-0x36000); |
1073 | 1073 | return; |
1074 | 1074 | } |
r17963 | r17964 | |
1077 | 1077 | { |
1078 | 1078 | if(state->m_basic_rom_en && (state->m_type != SYS_FM11 && state->m_type != SYS_FM16)) |
1079 | 1079 | { |
1080 | RAM = space->machine().root_device().memregion("fbasic")->base(); | |
1081 | space->install_read_bank(bank*0x1000,(bank*0x1000)+size,bank_name); | |
1082 | space->nop_write(bank*0x1000,(bank*0x1000)+size); | |
1080 | RAM = space.machine().root_device().memregion("fbasic")->base(); | |
1081 | space.install_read_bank(bank*0x1000,(bank*0x1000)+size,bank_name); | |
1082 | space.nop_write(bank*0x1000,(bank*0x1000)+size); | |
1083 | 1083 | state->membank(bank_name)->set_base(RAM+(physical<<12)-0x38000); |
1084 | 1084 | return; |
1085 | 1085 | } |
1086 | 1086 | } |
1087 | space | |
1087 | space.install_readwrite_bank(bank*0x1000,(bank*0x1000)+size,bank_name); | |
1088 | 1088 | state->membank(bank_name)->set_base(RAM+(physical<<12)); |
1089 | 1089 | } |
1090 | 1090 | |
1091 | static void fm7_mmr_refresh(address_space | |
1091 | static void fm7_mmr_refresh(address_space& space) | |
1092 | 1092 | { |
1093 | fm7_state *state = space | |
1093 | fm7_state *state = space.machine().driver_data<fm7_state>(); | |
1094 | 1094 | int x; |
1095 | 1095 | UINT16 window_addr; |
1096 | 1096 | UINT8* RAM = state->memregion("maincpu")->base(); |
r17963 | r17964 | |
1115 | 1115 | window_addr = ((state->m_mmr.window_offset << 8) + 0x7c00) & 0xffff; |
1116 | 1116 | // if(window_addr < 0xfc00) |
1117 | 1117 | { |
1118 | space | |
1118 | space.install_readwrite_bank(0x7c00,0x7fff,"bank24"); | |
1119 | 1119 | state->membank("bank24")->set_base(RAM+window_addr); |
1120 | 1120 | } |
1121 | 1121 | } |
r17963 | r17964 | |
1127 | 1127 | { |
1128 | 1128 | m_mmr.bank_addr[m_mmr.segment][offset] = data; |
1129 | 1129 | if(m_mmr.enabled) |
1130 | fm7_update_bank( | |
1130 | fm7_update_bank(space,offset,data); | |
1131 | 1131 | logerror("MMR: Segment %i, bank %i, set to 0x%02x\n",m_mmr.segment,offset,data); |
1132 | 1132 | return; |
1133 | 1133 | } |
r17963 | r17964 | |
1135 | 1135 | { |
1136 | 1136 | case 0x10: |
1137 | 1137 | m_mmr.segment = data & 0x07; |
1138 | fm7_mmr_refresh( | |
1138 | fm7_mmr_refresh(space); | |
1139 | 1139 | logerror("MMR: Active segment set to %i\n",m_mmr.segment); |
1140 | 1140 | break; |
1141 | 1141 | case 0x12: |
1142 | 1142 | m_mmr.window_offset = data; |
1143 | fm7_mmr_refresh( | |
1143 | fm7_mmr_refresh(space); | |
1144 | 1144 | logerror("MMR: Window offset set to %02x\n",data); |
1145 | 1145 | break; |
1146 | 1146 | case 0x13: |
1147 | 1147 | m_mmr.mode = data; |
1148 | 1148 | m_mmr.enabled = data & 0x80; |
1149 | fm7_mmr_refresh( | |
1149 | fm7_mmr_refresh(space); | |
1150 | 1150 | logerror("MMR: Mode register set to %02x\n",data); |
1151 | 1151 | break; |
1152 | 1152 | } |
r17963 | r17964 | |
1963 | 1963 | } |
1964 | 1964 | if(m_type == SYS_FM77AV || m_type == SYS_FM77AV40EX || m_type == SYS_FM11) |
1965 | 1965 | { |
1966 | fm7_mmr_refresh(machine().device("maincpu")->memory().space(AS_PROGRAM)); | |
1966 | fm7_mmr_refresh(*machine().device("maincpu")->memory().space(AS_PROGRAM)); | |
1967 | 1967 | } |
1968 | 1968 | if(m_type == SYS_FM11) |
1969 | 1969 | { |
r17963 | r17964 | |
---|---|---|
449 | 449 | } |
450 | 450 | } |
451 | 451 | |
452 | static UINT8 memory_read_byte(address_space | |
452 | static UINT8 memory_read_byte(address_space &space, offs_t address) { return space.read_byte(address); } | |
453 | 453 | |
454 | 454 | static UV201_INTERFACE( uv_intf ) |
455 | 455 | { |
r17963 | r17964 | |
---|---|---|
84 | 84 | DRIVER_INIT_MEMBER(indiana_state,indiana) |
85 | 85 | { |
86 | 86 | pc_vga_init(machine(), indiana_vga_setting, NULL); |
87 | pc_vga_io_init(machine(), machine().device("maincpu")->memory().space(AS_PROGRAM), 0x7f7a0000, machine().device("maincpu")->memory().space(AS_PROGRAM), 0x7f600000); | |
87 | pc_vga_io_init(machine(), *machine().device("maincpu")->memory().space(AS_PROGRAM), 0x7f7a0000, *machine().device("maincpu")->memory().space(AS_PROGRAM), 0x7f600000); | |
88 | 88 | } |
89 | 89 | |
90 | 90 | /* ROM definition */ |
r17963 | r17964 | |
---|---|---|
694 | 694 | // Z80DMA_INTERFACE( dma_intf ) |
695 | 695 | //------------------------------------------------- |
696 | 696 | |
697 | static UINT8 memory_read_byte(address_space *space, offs_t address) { return space->read_byte(address); } | |
698 | static void memory_write_byte(address_space *space, offs_t address, UINT8 data) { space->write_byte(address, data); } | |
697 | static UINT8 memory_read_byte(address_space &space, offs_t address) { return space.read_byte(address); } | |
698 | static void memory_write_byte(address_space &space, offs_t address, UINT8 data) { space.write_byte(address, data); } | |
699 | 699 | |
700 | 700 | static Z80DMA_INTERFACE( dma_intf ) |
701 | 701 | { |
r17963 | r17964 | |
---|---|---|
454 | 454 | |
455 | 455 | void a5105_state::machine_reset() |
456 | 456 | { |
457 | address_space *space = m_maincpu->space(AS_PROGRAM); | |
458 | a5105_ab_w(*space, 0, 9); // turn motor off | |
457 | address_space &space = *m_maincpu->space(AS_PROGRAM); | |
458 | a5105_ab_w(space, 0, 9); // turn motor off | |
459 | 459 | beep_set_frequency(m_beep, 500); |
460 | 460 | |
461 | 461 | m_ram_base = (UINT8*)machine().device<ram_device>(RAM_TAG)->pointer(); |
r17963 | r17964 | |
---|---|---|
321 | 321 | static void nc_refresh_memory_bank_config(running_machine &machine, int bank) |
322 | 322 | { |
323 | 323 | nc_state *state = machine.driver_data<nc_state>(); |
324 | address_space | |
324 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
325 | 325 | int mem_type; |
326 | 326 | int mem_bank; |
327 | 327 | char bank1[10]; |
r17963 | r17964 | |
332 | 332 | mem_type = (state->m_memory_config[bank]>>6) & 0x03; |
333 | 333 | mem_bank = state->m_memory_config[bank] & 0x03f; |
334 | 334 | |
335 | space | |
335 | space.install_read_bank((bank * 0x4000), (bank * 0x4000) + 0x3fff, nc_bankhandler_r[bank]); | |
336 | 336 | |
337 | 337 | switch (mem_type) |
338 | 338 | { |
r17963 | r17964 | |
348 | 348 | |
349 | 349 | state->membank(bank1)->set_base(addr); |
350 | 350 | |
351 | space | |
351 | space.nop_write((bank * 0x4000), (bank * 0x4000) + 0x3fff); | |
352 | 352 | LOG(("BANK %d: ROM %d\n",bank,mem_bank)); |
353 | 353 | } |
354 | 354 | break; |
r17963 | r17964 | |
365 | 365 | state->membank(bank1)->set_base(addr); |
366 | 366 | state->membank(bank5)->set_base(addr); |
367 | 367 | |
368 | space | |
368 | space.install_write_bank((bank * 0x4000), (bank * 0x4000) + 0x3fff, nc_bankhandler_w[bank]); | |
369 | 369 | LOG(("BANK %d: RAM\n",bank)); |
370 | 370 | } |
371 | 371 | break; |
r17963 | r17964 | |
389 | 389 | /* yes */ |
390 | 390 | state->membank(bank5)->set_base(addr); |
391 | 391 | |
392 | space | |
392 | space.install_write_bank((bank * 0x4000), (bank * 0x4000) + 0x3fff, nc_bankhandler_w[bank]); | |
393 | 393 | } |
394 | 394 | else |
395 | 395 | { |
396 | 396 | /* no */ |
397 | space | |
397 | space.nop_write((bank * 0x4000), (bank * 0x4000) + 0x3fff); | |
398 | 398 | } |
399 | 399 | |
400 | 400 | LOG(("BANK %d: CARD-RAM\n",bank)); |
r17963 | r17964 | |
402 | 402 | else |
403 | 403 | { |
404 | 404 | /* if no card connected, then writes fail */ |
405 | space | |
405 | space.nop_readwrite((bank * 0x4000), (bank * 0x4000) + 0x3fff); | |
406 | 406 | } |
407 | 407 | } |
408 | 408 | break; |
r17963 | r17964 | |
---|---|---|
219 | 219 | p8k_daisy_interrupt(device, state); |
220 | 220 | } |
221 | 221 | |
222 | static UINT8 memory_read_byte(address_space *space, offs_t address) { return space->read_byte(address); } | |
223 | static void memory_write_byte(address_space *space, offs_t address, UINT8 data) { space->write_byte(address, data); } | |
222 | static UINT8 memory_read_byte(address_space &space, offs_t address) { return space.read_byte(address); } | |
223 | static void memory_write_byte(address_space &space, offs_t address, UINT8 data) { space.write_byte(address, data); } | |
224 | 224 | |
225 | 225 | static Z80DMA_INTERFACE( p8k_dma_intf ) |
226 | 226 | { |
r17963 | r17964 | |
---|---|---|
112 | 112 | { |
113 | 113 | UINT8 *messram = machine().device<ram_device>(RAM_TAG)->pointer(); |
114 | 114 | device_t *beta = machine().device(BETA_DISK_TAG); |
115 | address_space | |
115 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
116 | 116 | |
117 | space->install_read_bank(0x0000, 0x3fff, "bank1"); | |
118 | space->unmap_write(0x0000, 0x3fff); | |
117 | space.install_read_bank(0x0000, 0x3fff, "bank1"); | |
118 | space.unmap_write(0x0000, 0x3fff); | |
119 | 119 | |
120 | 120 | if (beta->started()) { |
121 | 121 | betadisk_enable(beta); |
122 | 122 | betadisk_clear_status(beta); |
123 | 123 | } |
124 | space | |
124 | space.set_direct_update_handler(direct_update_delegate(FUNC(pentagon_state::pentagon_direct), this)); | |
125 | 125 | |
126 | 126 | memset(messram,0,128*1024); |
127 | 127 |
r17963 | r17964 | |
---|---|---|
38 | 38 | |
39 | 39 | WRITE8_MEMBER(nes_state::nes_vh_sprite_dma_w) |
40 | 40 | { |
41 | m_ppu->spriteram_dma( | |
41 | m_ppu->spriteram_dma(space, data); | |
42 | 42 | } |
43 | 43 | |
44 | 44 | static ADDRESS_MAP_START( nes_map, AS_PROGRAM, 8, nes_state ) |
r17963 | r17964 | |
---|---|---|
873 | 873 | |
874 | 874 | void pce220_state::machine_reset() |
875 | 875 | { |
876 | address_space *space = m_maincpu->space(AS_PROGRAM); | |
877 | space->unmap_write(0x0000, 0x3fff); | |
876 | address_space &space = *m_maincpu->space(AS_PROGRAM); | |
877 | space.unmap_write(0x0000, 0x3fff); | |
878 | 878 | |
879 | 879 | // install the boot code into the first bank |
880 | 880 | membank("bank1")->set_base(machine().root_device().memregion("user1")->base() + 0x0000); |
r17963 | r17964 | |
---|---|---|
209 | 209 | /* flash 0 */ |
210 | 210 | static READ8_HANDLER(pcw16_flash0_bank_handler0_r) |
211 | 211 | { |
212 | return pcw16_flash0_bank_handler_r(space | |
212 | return pcw16_flash0_bank_handler_r(space.machine(),0, offset); | |
213 | 213 | } |
214 | 214 | |
215 | 215 | static READ8_HANDLER(pcw16_flash0_bank_handler1_r) |
216 | 216 | { |
217 | return pcw16_flash0_bank_handler_r(space | |
217 | return pcw16_flash0_bank_handler_r(space.machine(),1, offset); | |
218 | 218 | } |
219 | 219 | |
220 | 220 | static READ8_HANDLER(pcw16_flash0_bank_handler2_r) |
221 | 221 | { |
222 | return pcw16_flash0_bank_handler_r(space | |
222 | return pcw16_flash0_bank_handler_r(space.machine(),2, offset); | |
223 | 223 | } |
224 | 224 | |
225 | 225 | static READ8_HANDLER(pcw16_flash0_bank_handler3_r) |
226 | 226 | { |
227 | return pcw16_flash0_bank_handler_r(space | |
227 | return pcw16_flash0_bank_handler_r(space.machine(),3, offset); | |
228 | 228 | } |
229 | 229 | |
230 | 230 | /* flash 1 */ |
231 | 231 | static READ8_HANDLER(pcw16_flash1_bank_handler0_r) |
232 | 232 | { |
233 | return pcw16_flash1_bank_handler_r(space | |
233 | return pcw16_flash1_bank_handler_r(space.machine(),0, offset); | |
234 | 234 | } |
235 | 235 | |
236 | 236 | static READ8_HANDLER(pcw16_flash1_bank_handler1_r) |
237 | 237 | { |
238 | return pcw16_flash1_bank_handler_r(space | |
238 | return pcw16_flash1_bank_handler_r(space.machine(),1, offset); | |
239 | 239 | } |
240 | 240 | |
241 | 241 | static READ8_HANDLER(pcw16_flash1_bank_handler2_r) |
242 | 242 | { |
243 | return pcw16_flash1_bank_handler_r(space | |
243 | return pcw16_flash1_bank_handler_r(space.machine(),2, offset); | |
244 | 244 | } |
245 | 245 | |
246 | 246 | static READ8_HANDLER(pcw16_flash1_bank_handler3_r) |
247 | 247 | { |
248 | return pcw16_flash1_bank_handler_r(space | |
248 | return pcw16_flash1_bank_handler_r(space.machine(),3, offset); | |
249 | 249 | } |
250 | 250 | |
251 | 251 | static const struct { read8_space_func func; const char *name; } pcw16_flash0_bank_handlers_r[4] = |
r17963 | r17964 | |
289 | 289 | /* flash 0 */ |
290 | 290 | static WRITE8_HANDLER(pcw16_flash0_bank_handler0_w) |
291 | 291 | { |
292 | pcw16_flash0_bank_handler_w(space | |
292 | pcw16_flash0_bank_handler_w(space.machine(),0, offset, data); | |
293 | 293 | } |
294 | 294 | |
295 | 295 | |
296 | 296 | static WRITE8_HANDLER(pcw16_flash0_bank_handler1_w) |
297 | 297 | { |
298 | pcw16_flash0_bank_handler_w(space | |
298 | pcw16_flash0_bank_handler_w(space.machine(),1, offset, data); | |
299 | 299 | } |
300 | 300 | |
301 | 301 | static WRITE8_HANDLER(pcw16_flash0_bank_handler2_w) |
302 | 302 | { |
303 | pcw16_flash0_bank_handler_w(space | |
303 | pcw16_flash0_bank_handler_w(space.machine(),2, offset, data); | |
304 | 304 | } |
305 | 305 | |
306 | 306 | static WRITE8_HANDLER(pcw16_flash0_bank_handler3_w) |
307 | 307 | { |
308 | pcw16_flash0_bank_handler_w(space | |
308 | pcw16_flash0_bank_handler_w(space.machine(),3, offset, data); | |
309 | 309 | } |
310 | 310 | |
311 | 311 | |
312 | 312 | /* flash 1 */ |
313 | 313 | static WRITE8_HANDLER(pcw16_flash1_bank_handler0_w) |
314 | 314 | { |
315 | pcw16_flash1_bank_handler_w(space | |
315 | pcw16_flash1_bank_handler_w(space.machine(),0, offset, data); | |
316 | 316 | } |
317 | 317 | |
318 | 318 | |
319 | 319 | static WRITE8_HANDLER(pcw16_flash1_bank_handler1_w) |
320 | 320 | { |
321 | pcw16_flash1_bank_handler_w(space | |
321 | pcw16_flash1_bank_handler_w(space.machine(),1, offset, data); | |
322 | 322 | } |
323 | 323 | |
324 | 324 | static WRITE8_HANDLER(pcw16_flash1_bank_handler2_w) |
325 | 325 | { |
326 | pcw16_flash1_bank_handler_w(space | |
326 | pcw16_flash1_bank_handler_w(space.machine(),2, offset, data); | |
327 | 327 | } |
328 | 328 | |
329 | 329 | static WRITE8_HANDLER(pcw16_flash1_bank_handler3_w) |
330 | 330 | { |
331 | pcw16_flash1_bank_handler_w(space | |
331 | pcw16_flash1_bank_handler_w(space.machine(),3, offset, data); | |
332 | 332 | } |
333 | 333 | |
334 | 334 | static const struct { write8_space_func func; const char *name; } pcw16_flash0_bank_handlers_w[4] = |
r17963 | r17964 | |
369 | 369 | /* |
370 | 370 | static void pcw16_set_bank_handlers(running_machine &machine, int bank, PCW16_RAM_TYPE type) |
371 | 371 | { |
372 | address_space | |
372 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
373 | 373 | pcw16_state *state = machine.driver_data<pcw16_state>(); |
374 | 374 | switch (type) { |
375 | 375 | case PCW16_MEM_ROM: |
376 | 376 | // rom |
377 | space->install_read_bank((bank * 0x4000), (bank * 0x4000) + 0x3fff, pcw16_read_handler_dram[bank]); | |
378 | space->nop_write((bank * 0x4000), (bank * 0x4000) + 0x3fff); | |
377 | space.install_read_bank((bank * 0x4000), (bank * 0x4000) + 0x3fff, pcw16_read_handler_dram[bank]); | |
378 | space.nop_write((bank * 0x4000), (bank * 0x4000) + 0x3fff); | |
379 | 379 | break; |
380 | 380 | |
381 | 381 | case PCW16_MEM_FLASH_1: |
382 | 382 | // sram |
383 | space->install_legacy_read_handler((bank * 0x4000), (bank * 0x4000) + 0x3fff, pcw16_flash0_bank_handlers_r[bank].func, pcw16_flash0_bank_handlers_r[bank].name); | |
384 | space->install_legacy_write_handler((bank * 0x4000), (bank * 0x4000) + 0x3fff, pcw16_flash0_bank_handlers_w[bank].func, pcw16_flash0_bank_handlers_w[bank].name); | |
383 | space.install_legacy_read_handler((bank * 0x4000), (bank * 0x4000) + 0x3fff, pcw16_flash0_bank_handlers_r[bank].func, pcw16_flash0_bank_handlers_r[bank].name); | |
384 | space.install_legacy_write_handler((bank * 0x4000), (bank * 0x4000) + 0x3fff, pcw16_flash0_bank_handlers_w[bank].func, pcw16_flash0_bank_handlers_w[bank].name); | |
385 | 385 | break; |
386 | 386 | |
387 | 387 | case PCW16_MEM_FLASH_2: |
388 | space->install_legacy_read_handler((bank * 0x4000), (bank * 0x4000) + 0x3fff, pcw16_flash1_bank_handlers_r[bank].func, pcw16_flash1_bank_handlers_r[bank].name); | |
389 | space->install_legacy_write_handler((bank * 0x4000), (bank * 0x4000) + 0x3fff, pcw16_flash1_bank_handlers_w[bank].func, pcw16_flash1_bank_handlers_w[bank].name); | |
388 | space.install_legacy_read_handler((bank * 0x4000), (bank * 0x4000) + 0x3fff, pcw16_flash1_bank_handlers_r[bank].func, pcw16_flash1_bank_handlers_r[bank].name); | |
389 | space.install_legacy_write_handler((bank * 0x4000), (bank * 0x4000) + 0x3fff, pcw16_flash1_bank_handlers_w[bank].func, pcw16_flash1_bank_handlers_w[bank].name); | |
390 | 390 | break; |
391 | 391 | |
392 | 392 | case PCW16_MEM_NONE: |
393 | space->install_read_handler((bank * 0x4000), (bank * 0x4000) + 0x3fff, read8_delegate(FUNC(pcw16_state::pcw16_no_mem_r),state)); | |
394 | space->nop_write((bank * 0x4000), (bank * 0x4000) + 0x3fff); | |
393 | space.install_read_handler((bank * 0x4000), (bank * 0x4000) + 0x3fff, read8_delegate(FUNC(pcw16_state::pcw16_no_mem_r),state)); | |
394 | space.nop_write((bank * 0x4000), (bank * 0x4000) + 0x3fff); | |
395 | 395 | break; |
396 | 396 | |
397 | 397 | default: |
398 | 398 | case PCW16_MEM_DRAM: |
399 | 399 | // dram |
400 | space->install_read_bank((bank * 0x4000), (bank * 0x4000) + 0x3fff, pcw16_read_handler_dram[bank]); | |
401 | space->install_write_bank((bank * 0x4000), (bank * 0x4000) + 0x3fff, pcw16_write_handler_dram[bank]); | |
400 | space.install_read_bank((bank * 0x4000), (bank * 0x4000) + 0x3fff, pcw16_read_handler_dram[bank]); | |
401 | space.install_write_bank((bank * 0x4000), (bank * 0x4000) + 0x3fff, pcw16_write_handler_dram[bank]); | |
402 | 402 | break; |
403 | 403 | } |
404 | 404 | |
r17963 | r17964 | |
1254 | 1254 | /* write to Super I/O chip. FDC Data Rate. */ |
1255 | 1255 | WRITE8_MEMBER(pcw16_state::pcw16_superio_fdc_datarate_w) |
1256 | 1256 | { |
1257 | pc_fdc_w( | |
1257 | pc_fdc_w(space, PC_FDC_DATA_RATE_REGISTER,data); | |
1258 | 1258 | } |
1259 | 1259 | |
1260 | 1260 | /* write to Super I/O chip. FDC Digital output register */ |
1261 | 1261 | WRITE8_MEMBER(pcw16_state::pcw16_superio_fdc_digital_output_register_w) |
1262 | 1262 | { |
1263 | pc_fdc_w( | |
1263 | pc_fdc_w(space, PC_FDC_DIGITAL_OUTPUT_REGISTER, data); | |
1264 | 1264 | } |
1265 | 1265 | |
1266 | 1266 | /* write to Super I/O chip. FDC Data Register */ |
1267 | 1267 | WRITE8_MEMBER(pcw16_state::pcw16_superio_fdc_data_w) |
1268 | 1268 | { |
1269 | pc_fdc_w( | |
1269 | pc_fdc_w(space, PC_FDC_DATA_REGISTER, data); | |
1270 | 1270 | } |
1271 | 1271 | |
1272 | 1272 | /* write to Super I/O chip. FDC Data Register */ |
1273 | 1273 | READ8_MEMBER(pcw16_state::pcw16_superio_fdc_data_r) |
1274 | 1274 | { |
1275 | return pc_fdc_r( | |
1275 | return pc_fdc_r(space, PC_FDC_DATA_REGISTER); | |
1276 | 1276 | } |
1277 | 1277 | |
1278 | 1278 | /* write to Super I/O chip. FDC Main Status Register */ |
1279 | 1279 | READ8_MEMBER(pcw16_state::pcw16_superio_fdc_main_status_register_r) |
1280 | 1280 | { |
1281 | return pc_fdc_r( | |
1281 | return pc_fdc_r(space, PC_FDC_MAIN_STATUS_REGISTER); | |
1282 | 1282 | } |
1283 | 1283 | |
1284 | 1284 | READ8_MEMBER(pcw16_state::pcw16_superio_fdc_digital_input_register_r) |
1285 | 1285 | { |
1286 | return pc_fdc_r( | |
1286 | return pc_fdc_r(space, PC_FDC_DIGITIAL_INPUT_REGISTER); | |
1287 | 1287 | } |
1288 | 1288 | |
1289 | 1289 | static void pcw16_fdc_interrupt(running_machine &machine, int state) |
r17963 | r17964 | |
---|---|---|
304 | 304 | dma_slot &ds = dma_slots[slot]; |
305 | 305 | ds.drq = state; |
306 | 306 | if(state && (ds.state & DMA_ENABLE)) { |
307 | address_space | |
307 | address_space &space = *maincpu->space(AS_PROGRAM); | |
308 | 308 | if(ds.state & DMA_READ) { |
309 | 309 | while(ds.drq) { |
310 | 310 | dma_check_update(slot); |
r17963 | r17964 | |
317 | 317 | logerror("DMA: bus error on read slot %d\n", slot); |
318 | 318 | return; |
319 | 319 | } |
320 | space | |
320 | space.write_byte(ds.current++, val); | |
321 | 321 | dma_check_end(slot, eof); |
322 | 322 | if(!(ds.state & DMA_ENABLE)) |
323 | 323 | return; |
r17963 | r17964 | |
325 | 325 | } else { |
326 | 326 | while(ds.drq) { |
327 | 327 | dma_check_update(slot); |
328 | UINT8 val = space | |
328 | UINT8 val = space.read_byte(ds.current++); | |
329 | 329 | bool eof = ds.current == (ds.limit & 0x7fffffff) && (ds.limit & 0x80000000); |
330 | 330 | bool err; |
331 | 331 | dma_write(slot, val, eof, err); |
r17963 | r17964 | |
---|---|---|
483 | 483 | // no more than 192 read/write handlers may be used |
484 | 484 | // see table_assign_handler in memory.c |
485 | 485 | if (parity_error_handler_install_counter < 40) { |
486 | //memory_install_read32_handler( | |
486 | //memory_install_read32_handler(space, ram_base_address+offset*4, ram_base_address+offset*4+3, 0xffffffff, 0, ram_with_parity_r); | |
487 | 487 | space.install_read_handler(ram_base_address+offset*4, ram_base_address+offset*4+3, 0xffffffff,0,read32_delegate(FUNC(apollo_state::ram_with_parity_r),this)); |
488 | 488 | parity_error_handler_is_installed = 1; |
489 | 489 | parity_error_handler_install_counter++; |
r17963 | r17964 | |
495 | 495 | |
496 | 496 | // uninstall not supported, reinstall previous read handler instead |
497 | 497 | |
498 | // memory_install_rom( | |
498 | // memory_install_rom(space, ram_base_address, ram_end_address, 0xffffffff, 0, messram_ptr.v); | |
499 | 499 | space.install_rom(ram_base_address,ram_end_address,0xffffffff,0,&m_messram_ptr[0]); |
500 | 500 | |
501 | 501 | parity_error_handler_is_installed = 0; |
r17963 | r17964 | |
---|---|---|
42 | 42 | |
43 | 43 | static READ64_HANDLER( dcus_idle_skip_r ) |
44 | 44 | { |
45 | if (space->device().safe_pc()==0xc0ba52a) | |
46 | space->device().execute().spin_until_time(attotime::from_usec(2500)); | |
47 | // device_spinuntil_int(&space->device()); | |
45 | if (space.device().safe_pc()==0xc0ba52a) | |
46 | space.device().execute().spin_until_time(attotime::from_usec(2500)); | |
47 | // device_spinuntil_int(&space.device()); | |
48 | 48 | |
49 | return space | |
49 | return space.machine().driver_data<dc_state>()->dc_ram[0x2303b0/8]; | |
50 | 50 | } |
51 | 51 | |
52 | 52 | static READ64_HANDLER( dcjp_idle_skip_r ) |
53 | 53 | { |
54 | if (space->device().safe_pc()==0xc0bac62) | |
55 | space->device().execute().spin_until_time(attotime::from_usec(2500)); | |
56 | // device_spinuntil_int(&space->device()); | |
54 | if (space.device().safe_pc()==0xc0bac62) | |
55 | space.device().execute().spin_until_time(attotime::from_usec(2500)); | |
56 | // device_spinuntil_int(&space.device()); | |
57 | 57 | |
58 | return space | |
58 | return space.machine().driver_data<dc_state>()->dc_ram[0x2302f8/8]; | |
59 | 59 | } |
60 | 60 | |
61 | 61 | DRIVER_INIT_MEMBER(dc_state,dc) |
r17963 | r17964 | |
110 | 110 | |
111 | 111 | static READ64_HANDLER( dc_arm_r ) |
112 | 112 | { |
113 | dc_state *state = space | |
113 | dc_state *state = space.machine().driver_data<dc_state>(); | |
114 | 114 | |
115 | 115 | return *((UINT64 *)state->dc_sound_ram.target()+offset); |
116 | 116 | } |
117 | 117 | |
118 | 118 | static WRITE64_HANDLER( dc_arm_w ) |
119 | 119 | { |
120 | dc_state *state = space | |
120 | dc_state *state = space.machine().driver_data<dc_state>(); | |
121 | 121 | |
122 | 122 | COMBINE_DATA((UINT64 *)state->dc_sound_ram.target() + offset); |
123 | 123 | } |
r17963 | r17964 | |
126 | 126 | // SB_LMMODE0 |
127 | 127 | static WRITE64_HANDLER( ta_texture_directpath0_w ) |
128 | 128 | { |
129 | dc_state *state = space | |
129 | dc_state *state = space.machine().driver_data<dc_state>(); | |
130 | 130 | |
131 | 131 | int mode = state->pvrctrl_regs[SB_LMMODE0]&1; |
132 | 132 | if (mode&1) |
r17963 | r17964 | |
143 | 143 | // SB_LMMODE1 |
144 | 144 | static WRITE64_HANDLER( ta_texture_directpath1_w ) |
145 | 145 | { |
146 | dc_state *state = space | |
146 | dc_state *state = space.machine().driver_data<dc_state>(); | |
147 | 147 | |
148 | 148 | int mode = state->pvrctrl_regs[SB_LMMODE1]&1; |
149 | 149 | if (mode&1) |
r17963 | r17964 | |
---|---|---|
80 | 80 | static void to_term(device_t *device, int data ) |
81 | 81 | { |
82 | 82 | basic52_state *state = device->machine().driver_data<basic52_state>(); |
83 | address_space *space = device->memory().space(AS_PROGRAM); | |
84 | state->m_terminal->write(*space, 0, data); | |
83 | address_space &space = *device->memory().space(AS_PROGRAM); | |
84 | state->m_terminal->write(space, 0, data); | |
85 | 85 | } |
86 | 86 | |
87 | 87 | static int from_term(device_t *device) |
r17963 | r17964 | |
---|---|---|
216 | 216 | /* install expansion memory if available */ |
217 | 217 | if (machine().device<ram_device>(RAM_TAG)->size() > 0x1000) |
218 | 218 | { |
219 | address_space | |
219 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
220 | 220 | |
221 | space | |
221 | space.install_readwrite_bank(0x4000, 0x4000 + machine().device<ram_device>(RAM_TAG)->size() - 0x1000 - 1, "bank1"); | |
222 | 222 | membank("bank1")->set_base(machine().device<ram_device>(RAM_TAG)->pointer()); |
223 | 223 | } |
224 | 224 | } |
r17963 | r17964 | |
---|---|---|
138 | 138 | static QUICKLOAD_LOAD( lynx ) |
139 | 139 | { |
140 | 140 | device_t *cpu = image.device().machine().device("maincpu"); |
141 | address_space | |
141 | address_space &space = *image.device().machine().device("maincpu")->memory().space(AS_PROGRAM); | |
142 | 142 | UINT8 *data = NULL; |
143 | 143 | UINT8 *rom = image.device().machine().root_device().memregion("maincpu")->base(); |
144 | 144 | UINT8 header[10]; // 80 08 dw Start dw Len B S 9 3 |
r17963 | r17964 | |
165 | 165 | } |
166 | 166 | |
167 | 167 | for (i = 0; i < length; i++) |
168 | space | |
168 | space.write_byte(start + i, data[i]); | |
169 | 169 | |
170 | 170 | free(data); |
171 | 171 | |
172 | 172 | rom[0x1fc] = start & 0xff; |
173 | 173 | rom[0x1fd] = start >> 8; |
174 | space->write_byte(0x1fc, start & 0xff); | |
175 | space->write_byte(0x1fd, start >> 8); | |
174 | space.write_byte(0x1fc, start & 0xff); | |
175 | space.write_byte(0x1fd, start >> 8); | |
176 | 176 | |
177 | 177 | cpu->state().set_pc(start); |
178 | 178 |
r17963 | r17964 | |
---|---|---|
107 | 107 | |
108 | 108 | static INPUT_CHANGED( ipl_reset ) |
109 | 109 | { |
110 | //address_space | |
110 | //address_space &space = *field.machine().device("x1_cpu")->memory().space(AS_PROGRAM); | |
111 | 111 | x1twin_state *state = field.machine().driver_data<x1twin_state>(); |
112 | 112 | |
113 | 113 | state->m_x1_cpu->set_input_line(INPUT_LINE_RESET, newval ? CLEAR_LINE : ASSERT_LINE); |
r17963 | r17964 | |
---|---|---|
183 | 183 | |
184 | 184 | static WRITE8_HANDLER(spectrum_plus3_port_3ffd_w) |
185 | 185 | { |
186 | spectrum_state *state = space | |
186 | spectrum_state *state = space.machine().driver_data<spectrum_state>(); | |
187 | 187 | if (state->m_floppy==1) |
188 | upd765_data_w(space | |
188 | upd765_data_w(space.machine().device("upd765"), space, 0,data); | |
189 | 189 | } |
190 | 190 | |
191 | 191 | static READ8_HANDLER(spectrum_plus3_port_3ffd_r) |
192 | 192 | { |
193 | spectrum_state *state = space | |
193 | spectrum_state *state = space.machine().driver_data<spectrum_state>(); | |
194 | 194 | if (state->m_floppy==0) |
195 | 195 | return 0xff; |
196 | 196 | else |
197 | return upd765_data_r(space | |
197 | return upd765_data_r(space.machine().device("upd765"), space, 0); | |
198 | 198 | } |
199 | 199 | |
200 | 200 | |
201 | 201 | static READ8_HANDLER(spectrum_plus3_port_2ffd_r) |
202 | 202 | { |
203 | spectrum_state *state = space | |
203 | spectrum_state *state = space.machine().driver_data<spectrum_state>(); | |
204 | 204 | if (state->m_floppy==0) |
205 | 205 | return 0xff; |
206 | 206 | else |
207 | return upd765_status_r(space | |
207 | return upd765_status_r(space.machine().device("upd765"), space, 0); | |
208 | 208 | } |
209 | 209 | |
210 | 210 | |
211 | 211 | void spectrum_plus3_update_memory(running_machine &machine) |
212 | 212 | { |
213 | 213 | spectrum_state *state = machine.driver_data<spectrum_state>(); |
214 | address_space | |
214 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
215 | 215 | UINT8 *messram = machine.device<ram_device>(RAM_TAG)->pointer(); |
216 | 216 | |
217 | 217 | if (state->m_port_7ffd_data & 8) |
r17963 | r17964 | |
258 | 258 | ChosenROM = machine.root_device().memregion("maincpu")->base() + 0x010000 + (ROMSelection << 14); |
259 | 259 | |
260 | 260 | state->membank("bank1")->set_base(ChosenROM); |
261 | space | |
261 | space.unmap_write(0x0000, 0x3fff); | |
262 | 262 | |
263 | 263 | logerror("rom switch: %02x\n", ROMSelection); |
264 | 264 | } |
r17963 | r17964 | |
277 | 277 | ram_data = messram + (memory_selection[0] << 14); |
278 | 278 | state->membank("bank1")->set_base(ram_data); |
279 | 279 | /* allow writes to 0x0000-0x03fff */ |
280 | space | |
280 | space.install_write_bank(0x0000, 0x3fff, "bank1"); | |
281 | 281 | |
282 | 282 | ram_data = messram + (memory_selection[1] << 14); |
283 | 283 | state->membank("bank2")->set_base(ram_data); |
r17963 | r17964 | |
301 | 301 | /* D4 - ROM select - which rom paged into 0x0000-0x03fff */ |
302 | 302 | /* D5 - Disable paging */ |
303 | 303 | |
304 | spectrum_state *state = space | |
304 | spectrum_state *state = space.machine().driver_data<spectrum_state>(); | |
305 | 305 | |
306 | 306 | /* disable paging? */ |
307 | 307 | if (state->m_port_7ffd_data & 0x20) |
r17963 | r17964 | |
311 | 311 | state->m_port_7ffd_data = data; |
312 | 312 | |
313 | 313 | /* update memory */ |
314 | spectrum_plus3_update_memory(space | |
314 | spectrum_plus3_update_memory(space.machine()); | |
315 | 315 | } |
316 | 316 | |
317 | 317 | static WRITE8_HANDLER(spectrum_plus3_port_1ffd_w) |
r17963 | r17964 | |
321 | 321 | /* D3 - Disk motor on/off */ |
322 | 322 | /* D4 - parallel port strobe */ |
323 | 323 | |
324 | spectrum_state *state = space | |
324 | spectrum_state *state = space.machine().driver_data<spectrum_state>(); | |
325 | 325 | |
326 | floppy_mon_w(floppy_get_device(space->machine(), 0), !BIT(data, 3)); | |
327 | floppy_mon_w(floppy_get_device(space->machine(), 1), !BIT(data, 3)); | |
328 | floppy_drive_set_ready_state(floppy_get_device(space->machine(), 0), 1, 1); | |
329 | floppy_drive_set_ready_state(floppy_get_device(space->machine(), 1), 1, 1); | |
326 | floppy_mon_w(floppy_get_device(space.machine(), 0), !BIT(data, 3)); | |
327 | floppy_mon_w(floppy_get_device(space.machine(), 1), !BIT(data, 3)); | |
328 | floppy_drive_set_ready_state(floppy_get_device(space.machine(), 0), 1, 1); | |
329 | floppy_drive_set_ready_state(floppy_get_device(space.machine(), 1), 1, 1); | |
330 | 330 | |
331 | 331 | state->m_port_1ffd_data = data; |
332 | 332 | |
r17963 | r17964 | |
334 | 334 | if ((state->m_port_7ffd_data & 0x20)==0) |
335 | 335 | { |
336 | 336 | /* no */ |
337 | spectrum_plus3_update_memory(space | |
337 | spectrum_plus3_update_memory(space.machine()); | |
338 | 338 | } |
339 | 339 | } |
340 | 340 |
r17963 | r17964 | |
---|---|---|
397 | 397 | static INTERRUPT_GEN( apexc_interrupt ) |
398 | 398 | { |
399 | 399 | apexc_state *state = device->machine().driver_data<apexc_state>(); |
400 | address_space | |
400 | address_space& space = *device->machine().device("maincpu")->memory().space(AS_PROGRAM); | |
401 | 401 | UINT32 edit_keys; |
402 | 402 | int control_keys; |
403 | 403 | |
r17963 | r17964 | |
478 | 478 | |
479 | 479 | if (control_keys & panel_write) { |
480 | 480 | /* write memory */ |
481 | space | |
481 | space.write_dword(device->state().state_int(APEXC_ML_FULL)<<2, state->m_panel_data_reg); | |
482 | 482 | } |
483 | 483 | else { |
484 | 484 | /* read memory */ |
485 | state->m_panel_data_reg = space | |
485 | state->m_panel_data_reg = space.read_dword(device->state().state_int(APEXC_ML_FULL)<<2); | |
486 | 486 | } |
487 | 487 | } |
488 | 488 |
r17963 | r17964 | |
---|---|---|
346 | 346 | // 4 channel DMA controller (Hitachi HD63450) |
347 | 347 | static WRITE16_HANDLER( x68k_dmac_w ) |
348 | 348 | { |
349 | device_t* device = space->machine().device("hd63450"); | |
350 | hd63450_w(device, *space, offset, data, mem_mask); | |
349 | device_t* device = space.machine().device("hd63450"); | |
350 | hd63450_w(device, space, offset, data, mem_mask); | |
351 | 351 | } |
352 | 352 | |
353 | 353 | static READ16_HANDLER( x68k_dmac_r ) |
354 | 354 | { |
355 | device_t* device = space->machine().device("hd63450"); | |
356 | return hd63450_r(device, *space, offset, mem_mask); | |
355 | device_t* device = space.machine().device("hd63450"); | |
356 | return hd63450_r(device, space, offset, mem_mask); | |
357 | 357 | } |
358 | 358 | |
359 | 359 | static void x68k_keyboard_ctrl_w(x68k_state *state, int data) |
r17963 | r17964 | |
583 | 583 | */ |
584 | 584 | static READ16_HANDLER( x68k_scc_r ) |
585 | 585 | { |
586 | scc8530_t *scc = space | |
586 | scc8530_t *scc = space.machine().device<scc8530_t>("scc"); | |
587 | 587 | offset %= 4; |
588 | 588 | switch(offset) |
589 | 589 | { |
590 | 590 | case 0: |
591 | return scc->reg_r( | |
591 | return scc->reg_r(space, 0); | |
592 | 592 | case 1: |
593 | return x68k_read_mouse(space | |
593 | return x68k_read_mouse(space.machine()); | |
594 | 594 | case 2: |
595 | return scc->reg_r( | |
595 | return scc->reg_r(space, 1); | |
596 | 596 | case 3: |
597 | return scc->reg_r( | |
597 | return scc->reg_r(space, 3); | |
598 | 598 | default: |
599 | 599 | return 0xff; |
600 | 600 | } |
r17963 | r17964 | |
602 | 602 | |
603 | 603 | static WRITE16_HANDLER( x68k_scc_w ) |
604 | 604 | { |
605 | x68k_state *state = space->machine().driver_data<x68k_state>(); | |
606 | scc8530_t *scc = space->machine().device<scc8530_t>("scc"); | |
605 | x68k_state *state = space.machine().driver_data<x68k_state>(); | |
606 | scc8530_t *scc = space.machine().device<scc8530_t>("scc"); | |
607 | 607 | offset %= 4; |
608 | 608 | |
609 | 609 | switch(offset) |
610 | 610 | { |
611 | 611 | case 0: |
612 | scc->reg_w( | |
612 | scc->reg_w(space, 0,(UINT8)data); | |
613 | 613 | if((scc->get_reg_b(5) & 0x02) != state->m_scc_prev) |
614 | 614 | { |
615 | 615 | if(scc->get_reg_b(5) & 0x02) // Request to Send |
r17963 | r17964 | |
622 | 622 | } |
623 | 623 | break; |
624 | 624 | case 1: |
625 | scc->reg_w( | |
625 | scc->reg_w(space, 2,(UINT8)data); | |
626 | 626 | break; |
627 | 627 | case 2: |
628 | scc->reg_w( | |
628 | scc->reg_w(space, 1,(UINT8)data); | |
629 | 629 | break; |
630 | 630 | case 3: |
631 | scc->reg_w( | |
631 | scc->reg_w(space, 3,(UINT8)data); | |
632 | 632 | break; |
633 | 633 | } |
634 | 634 | state->m_scc_prev = scc->get_reg_b(5) & 0x02; |
r17963 | r17964 | |
967 | 967 | // NEC uPD72065 at 0xe94000 |
968 | 968 | static WRITE16_HANDLER( x68k_fdc_w ) |
969 | 969 | { |
970 | x68k_state *state = space->machine().driver_data<x68k_state>(); | |
971 | device_t *fdc = space->machine().device("upd72065"); | |
970 | x68k_state *state = space.machine().driver_data<x68k_state>(); | |
971 | device_t *fdc = space.machine().device("upd72065"); | |
972 | 972 | unsigned int drive, x; |
973 | 973 | switch(offset) |
974 | 974 | { |
975 | 975 | case 0x00: |
976 | 976 | case 0x01: |
977 | upd765_data_w(fdc, | |
977 | upd765_data_w(fdc, space, 0,data); | |
978 | 978 | break; |
979 | 979 | case 0x02: // drive option signal control |
980 | 980 | x = data & 0x0f; |
r17963 | r17964 | |
989 | 989 | output_set_indexed_value("eject_drv",drive,(data & 0x40) ? 1 : 0); |
990 | 990 | if(data & 0x20) // ejects disk |
991 | 991 | { |
992 | (dynamic_cast<device_image_interface *>(floppy_get_device(space->machine(), drive)))->unload(); | |
993 | floppy_mon_w(floppy_get_device(space->machine(), drive), ASSERT_LINE); | |
992 | (dynamic_cast<device_image_interface *>(floppy_get_device(space.machine(), drive)))->unload(); | |
993 | floppy_mon_w(floppy_get_device(space.machine(), drive), ASSERT_LINE); | |
994 | 994 | } |
995 | 995 | } |
996 | 996 | } |
r17963 | r17964 | |
1001 | 1001 | case 0x03: |
1002 | 1002 | state->m_fdc.media_density[data & 0x03] = data & 0x10; |
1003 | 1003 | state->m_fdc.motor[data & 0x03] = data & 0x80; |
1004 | floppy_mon_w(floppy_get_device(space | |
1004 | floppy_mon_w(floppy_get_device(space.machine(), data & 0x03), !BIT(data, 7)); | |
1005 | 1005 | if(data & 0x80) |
1006 | 1006 | { |
1007 | 1007 | for(drive=0;drive<4;drive++) // enable motor for this drive |
1008 | 1008 | { |
1009 | 1009 | if(drive == (data & 0x03)) |
1010 | 1010 | { |
1011 | floppy_mon_w(floppy_get_device(space | |
1011 | floppy_mon_w(floppy_get_device(space.machine(), drive), CLEAR_LINE); | |
1012 | 1012 | output_set_indexed_value("access_drv",drive,0); |
1013 | 1013 | } |
1014 | 1014 | else |
r17963 | r17964 | |
1019 | 1019 | { |
1020 | 1020 | for(drive=0;drive<4;drive++) |
1021 | 1021 | { |
1022 | floppy_mon_w(floppy_get_device(space | |
1022 | floppy_mon_w(floppy_get_device(space.machine(), drive), ASSERT_LINE); | |
1023 | 1023 | output_set_indexed_value("access_drv",drive,1); |
1024 | 1024 | } |
1025 | 1025 | } |
1026 | floppy_drive_set_ready_state(floppy_get_device(space->machine(), 0),1,1); | |
1027 | floppy_drive_set_ready_state(floppy_get_device(space->machine(), 1),1,1); | |
1028 | floppy_drive_set_ready_state(floppy_get_device(space->machine(), 2),1,1); | |
1029 | floppy_drive_set_ready_state(floppy_get_device(space->machine(), 3),1,1); | |
1026 | floppy_drive_set_ready_state(floppy_get_device(space.machine(), 0),1,1); | |
1027 | floppy_drive_set_ready_state(floppy_get_device(space.machine(), 1),1,1); | |
1028 | floppy_drive_set_ready_state(floppy_get_device(space.machine(), 2),1,1); | |
1029 | floppy_drive_set_ready_state(floppy_get_device(space.machine(), 3),1,1); | |
1030 | 1030 | #if 0 |
1031 | 1031 | for(drive=0;drive<4;drive++) |
1032 | 1032 | { |
r17963 | r17964 | |
1039 | 1039 | logerror("FDC: Drive #%i: Drive selection set to %02x\n",data & 0x03,data); |
1040 | 1040 | break; |
1041 | 1041 | default: |
1042 | // logerror("FDC: [%08x] Wrote %04x to invalid FDC port %04x\n",space | |
1042 | // logerror("FDC: [%08x] Wrote %04x to invalid FDC port %04x\n",space.device().safe_pc(),data,offset); | |
1043 | 1043 | break; |
1044 | 1044 | } |
1045 | 1045 | } |
1046 | 1046 | |
1047 | 1047 | static READ16_HANDLER( x68k_fdc_r ) |
1048 | 1048 | { |
1049 | x68k_state *state = space | |
1049 | x68k_state *state = space.machine().driver_data<x68k_state>(); | |
1050 | 1050 | unsigned int ret; |
1051 | 1051 | int x; |
1052 | device_t *fdc = space | |
1052 | device_t *fdc = space.machine().device("upd72065"); | |
1053 | 1053 | |
1054 | 1054 | switch(offset) |
1055 | 1055 | { |
1056 | 1056 | case 0x00: |
1057 | return upd765_status_r(fdc, | |
1057 | return upd765_status_r(fdc, space, 0); | |
1058 | 1058 | case 0x01: |
1059 | return upd765_data_r(fdc, | |
1059 | return upd765_data_r(fdc, space, 0); | |
1060 | 1060 | case 0x02: |
1061 | 1061 | ret = 0x00; |
1062 | 1062 | for(x=0;x<4;x++) |
r17963 | r17964 | |
1126 | 1126 | { |
1127 | 1127 | case 0x00: |
1128 | 1128 | case 0x01: |
1129 | ym2151_w(space | |
1129 | ym2151_w(space.machine().device("ym2151"), space, offset, data); | |
1130 | 1130 | break; |
1131 | 1131 | } |
1132 | 1132 | } |
r17963 | r17964 | |
1134 | 1134 | static READ16_HANDLER( x68k_fm_r ) |
1135 | 1135 | { |
1136 | 1136 | if(offset == 0x01) |
1137 | return ym2151_r(space | |
1137 | return ym2151_r(space.machine().device("ym2151"), space, 1); | |
1138 | 1138 | |
1139 | 1139 | return 0xffff; |
1140 | 1140 | } |
r17963 | r17964 | |
1172 | 1172 | */ |
1173 | 1173 | static WRITE16_HANDLER( x68k_ioc_w ) |
1174 | 1174 | { |
1175 | x68k_state *state = space | |
1175 | x68k_state *state = space.machine().driver_data<x68k_state>(); | |
1176 | 1176 | switch(offset) |
1177 | 1177 | { |
1178 | 1178 | case 0x00: |
r17963 | r17964 | |
1205 | 1205 | |
1206 | 1206 | static READ16_HANDLER( x68k_ioc_r ) |
1207 | 1207 | { |
1208 | x68k_state *state = space | |
1208 | x68k_state *state = space.machine().driver_data<x68k_state>(); | |
1209 | 1209 | switch(offset) |
1210 | 1210 | { |
1211 | 1211 | case 0x00: |
r17963 | r17964 | |
1238 | 1238 | */ |
1239 | 1239 | static WRITE16_HANDLER( x68k_sysport_w ) |
1240 | 1240 | { |
1241 | x68k_state *state = space | |
1241 | x68k_state *state = space.machine().driver_data<x68k_state>(); | |
1242 | 1242 | switch(offset) |
1243 | 1243 | { |
1244 | 1244 | case 0x00: |
r17963 | r17964 | |
1255 | 1255 | state->m_sysport.sram_writeprotect = data; |
1256 | 1256 | break; |
1257 | 1257 | default: |
1258 | // logerror("SYS: [%08x] Wrote %04x to invalid or unimplemented system port %04x\n",space | |
1258 | // logerror("SYS: [%08x] Wrote %04x to invalid or unimplemented system port %04x\n",space.device().safe_pc(),data,offset); | |
1259 | 1259 | break; |
1260 | 1260 | } |
1261 | 1261 | } |
1262 | 1262 | |
1263 | 1263 | static READ16_HANDLER( x68k_sysport_r ) |
1264 | 1264 | { |
1265 | x68k_state *state = space | |
1265 | x68k_state *state = space.machine().driver_data<x68k_state>(); | |
1266 | 1266 | int ret = 0; |
1267 | 1267 | switch(offset) |
1268 | 1268 | { |
r17963 | r17964 | |
1284 | 1284 | #ifdef UNUSED_FUNCTION |
1285 | 1285 | static READ16_HANDLER( x68k_mfp_r ) |
1286 | 1286 | { |
1287 | device_t *x68k_mfp = space | |
1287 | device_t *x68k_mfp = space.machine().device(MC68901_TAG); | |
1288 | 1288 | |
1289 | 1289 | return mc68901_register_r(x68k_mfp, offset); |
1290 | 1290 | } |
r17963 | r17964 | |
1292 | 1292 | |
1293 | 1293 | static READ16_HANDLER( x68k_mfp_r ) |
1294 | 1294 | { |
1295 | x68k_state *state = space | |
1295 | x68k_state *state = space.machine().driver_data<x68k_state>(); | |
1296 | 1296 | |
1297 | 1297 | // Initial settings indicate that IRQs are generated for FM (YM2151), Receive buffer error or full, |
1298 | 1298 | // MFP Timer C, and the power switch |
1299 | // logerror("MFP: [%08x] Reading offset %i\n",space | |
1299 | // logerror("MFP: [%08x] Reading offset %i\n",space.device().safe_pc(),offset); | |
1300 | 1300 | switch(offset) |
1301 | 1301 | { |
1302 | 1302 | #if 0 |
r17963 | r17964 | |
1310 | 1310 | // ret |= 0x08; // FM IRQ signal |
1311 | 1311 | if(machine.primary_screen->hpos() > state->m_crtc.width - 32) |
1312 | 1312 | ret |= 0x80; // Hsync signal |
1313 | // logerror("MFP: [%08x] Reading offset %i (ret=%02x)\n",space | |
1313 | // logerror("MFP: [%08x] Reading offset %i (ret=%02x)\n",space.device().safe_pc(),offset,ret); | |
1314 | 1314 | return ret; // bit 5 is always 1 |
1315 | 1315 | case 3: |
1316 | 1316 | return state->m_mfp.iera; |
r17963 | r17964 | |
1350 | 1350 | case 23: |
1351 | 1351 | return x68k_keyboard_pop_scancode(state); |
1352 | 1352 | default: |
1353 | if (ACCESSING_BITS_0_7) return state->m_mfpdev->read( | |
1353 | if (ACCESSING_BITS_0_7) return state->m_mfpdev->read(space, offset); | |
1354 | 1354 | } |
1355 | 1355 | return 0xffff; |
1356 | 1356 | } |
1357 | 1357 | |
1358 | 1358 | static WRITE16_HANDLER( x68k_mfp_w ) |
1359 | 1359 | { |
1360 | x68k_state *state = space | |
1360 | x68k_state *state = space.machine().driver_data<x68k_state>(); | |
1361 | 1361 | |
1362 | 1362 | /* For the Interrupt registers, the bits are set out as such: |
1363 | 1363 | Reg A - bit 7: GPIP7 (HSync) |
r17963 | r17964 | |
1477 | 1477 | // Keyboard control command. |
1478 | 1478 | state->m_mfp.usart.send_buffer = data; |
1479 | 1479 | x68k_keyboard_ctrl_w(state, data); |
1480 | // logerror("MFP: [%08x] USART Sent data %04x\n",space | |
1480 | // logerror("MFP: [%08x] USART Sent data %04x\n",space.device().safe_pc(),data); | |
1481 | 1481 | } |
1482 | 1482 | break; |
1483 | 1483 | default: |
1484 | if (ACCESSING_BITS_0_7) state->m_mfpdev->write( | |
1484 | if (ACCESSING_BITS_0_7) state->m_mfpdev->write(space, offset, data & 0xff); | |
1485 | 1485 | return; |
1486 | 1486 | } |
1487 | 1487 | } |
r17963 | r17964 | |
1489 | 1489 | |
1490 | 1490 | static WRITE16_HANDLER( x68k_ppi_w ) |
1491 | 1491 | { |
1492 | i8255_device *ppi = space->machine().device<i8255_device>("ppi8255"); | |
1493 | ppi->write(*space,offset & 0x03,data); | |
1492 | i8255_device *ppi = space.machine().device<i8255_device>("ppi8255"); | |
1493 | ppi->write(space,offset & 0x03,data); | |
1494 | 1494 | } |
1495 | 1495 | |
1496 | 1496 | static READ16_HANDLER( x68k_ppi_r ) |
1497 | 1497 | { |
1498 | i8255_device *ppi = space->machine().device<i8255_device>("ppi8255"); | |
1499 | return ppi->read(*space,offset & 0x03); | |
1498 | i8255_device *ppi = space.machine().device<i8255_device>("ppi8255"); | |
1499 | return ppi->read(space,offset & 0x03); | |
1500 | 1500 | } |
1501 | 1501 | |
1502 | 1502 | static READ16_HANDLER( x68k_rtc_r ) |
1503 | 1503 | { |
1504 | x68k_state *state = space | |
1504 | x68k_state *state = space.machine().driver_data<x68k_state>(); | |
1505 | 1505 | |
1506 | return state->m_rtc->read( | |
1506 | return state->m_rtc->read(space, offset); | |
1507 | 1507 | } |
1508 | 1508 | |
1509 | 1509 | static WRITE16_HANDLER( x68k_rtc_w ) |
1510 | 1510 | { |
1511 | x68k_state *state = space | |
1511 | x68k_state *state = space.machine().driver_data<x68k_state>(); | |
1512 | 1512 | |
1513 | state->m_rtc->write( | |
1513 | state->m_rtc->write(space, offset, data); | |
1514 | 1514 | } |
1515 | 1515 | |
1516 | 1516 | static WRITE_LINE_DEVICE_HANDLER( x68k_rtc_alarm_irq ) |
r17963 | r17964 | |
1540 | 1540 | |
1541 | 1541 | static WRITE16_HANDLER( x68k_sram_w ) |
1542 | 1542 | { |
1543 | x68k_state *state = space | |
1543 | x68k_state *state = space.machine().driver_data<x68k_state>(); | |
1544 | 1544 | |
1545 | 1545 | if(state->m_sysport.sram_writeprotect == 0x31) |
1546 | 1546 | { |
r17963 | r17964 | |
1550 | 1550 | |
1551 | 1551 | static READ16_HANDLER( x68k_sram_r ) |
1552 | 1552 | { |
1553 | x68k_state *state = space | |
1553 | x68k_state *state = space.machine().driver_data<x68k_state>(); | |
1554 | 1554 | // HACKS! |
1555 | 1555 | // if(offset == 0x5a/2) // 0x5a should be 0 if no SASI HDs are present. |
1556 | 1556 | // return 0x0000; |
1557 | 1557 | if(offset == 0x08/2) |
1558 | return space | |
1558 | return space.machine().device<ram_device>(RAM_TAG)->size() >> 16; // RAM size | |
1559 | 1559 | #if 0 |
1560 | 1560 | if(offset == 0x46/2) |
1561 | 1561 | return 0x0024; |
r17963 | r17964 | |
1569 | 1569 | |
1570 | 1570 | static READ32_HANDLER( x68k_sram32_r ) |
1571 | 1571 | { |
1572 | x68k_state *state = space | |
1572 | x68k_state *state = space.machine().driver_data<x68k_state>(); | |
1573 | 1573 | if(offset == 0x08/4) |
1574 | return (space | |
1574 | return (space.machine().device<ram_device>(RAM_TAG)->size() & 0xffff0000); // RAM size | |
1575 | 1575 | #if 0 |
1576 | 1576 | if(offset == 0x46/2) |
1577 | 1577 | return 0x0024; |
r17963 | r17964 | |
1585 | 1585 | |
1586 | 1586 | static WRITE32_HANDLER( x68k_sram32_w ) |
1587 | 1587 | { |
1588 | x68k_state *state = space | |
1588 | x68k_state *state = space.machine().driver_data<x68k_state>(); | |
1589 | 1589 | if(state->m_sysport.sram_writeprotect == 0x31) |
1590 | 1590 | { |
1591 | 1591 | COMBINE_DATA(state->m_nvram32 + offset); |
r17963 | r17964 | |
1594 | 1594 | |
1595 | 1595 | static WRITE16_HANDLER( x68k_vid_w ) |
1596 | 1596 | { |
1597 | x68k_state *state = space | |
1597 | x68k_state *state = space.machine().driver_data<x68k_state>(); | |
1598 | 1598 | int val; |
1599 | 1599 | if(offset < 0x100) // Graphic layer palette |
1600 | 1600 | { |
1601 | 1601 | COMBINE_DATA(state->m_video.gfx_pal+offset); |
1602 | 1602 | val = state->m_video.gfx_pal[offset]; |
1603 | palette_set_color_rgb(space | |
1603 | palette_set_color_rgb(space.machine(),offset,(val & 0x07c0) >> 3,(val & 0xf800) >> 8,(val & 0x003e) << 2); | |
1604 | 1604 | return; |
1605 | 1605 | } |
1606 | 1606 | |
r17963 | r17964 | |
1608 | 1608 | { |
1609 | 1609 | COMBINE_DATA(state->m_video.text_pal+(offset-0x100)); |
1610 | 1610 | val = state->m_video.text_pal[offset-0x100]; |
1611 | palette_set_color_rgb(space | |
1611 | palette_set_color_rgb(space.machine(),offset,(val & 0x07c0) >> 3,(val & 0xf800) >> 8,(val & 0x003e) << 2); | |
1612 | 1612 | return; |
1613 | 1613 | } |
1614 | 1614 | |
r17963 | r17964 | |
1649 | 1649 | |
1650 | 1650 | static READ16_HANDLER( x68k_vid_r ) |
1651 | 1651 | { |
1652 | x68k_state *state = space | |
1652 | x68k_state *state = space.machine().driver_data<x68k_state>(); | |
1653 | 1653 | if(offset < 0x100) |
1654 | 1654 | return state->m_video.gfx_pal[offset]; |
1655 | 1655 | |
r17963 | r17964 | |
1709 | 1709 | |
1710 | 1710 | static READ16_HANDLER( x68k_rom0_r ) |
1711 | 1711 | { |
1712 | x68k_state *state = space | |
1712 | x68k_state *state = space.machine().driver_data<x68k_state>(); | |
1713 | 1713 | /* this location contains the address of some expansion device ROM, if no ROM exists, |
1714 | 1714 | then access causes a bus error */ |
1715 | 1715 | state->m_current_vector[2] = 0x02; // bus error |
1716 | 1716 | state->m_current_irq_line = 2; |
1717 | // space | |
1717 | // space.machine().device("maincpu")->execute().set_input_line_and_vector(2,ASSERT_LINE,state->m_current_vector[2]); | |
1718 | 1718 | if(state->ioport("options")->read() & 0x02) |
1719 | 1719 | { |
1720 | 1720 | offset *= 2; |
1721 | 1721 | if(ACCESSING_BITS_0_7) |
1722 | 1722 | offset++; |
1723 | space | |
1723 | space.machine().scheduler().timer_set(space.machine().device<cpu_device>("maincpu")->cycles_to_attotime(4), FUNC(x68k_bus_error), 0xbffffc+offset); | |
1724 | 1724 | } |
1725 | 1725 | return 0xff; |
1726 | 1726 | } |
1727 | 1727 | |
1728 | 1728 | static WRITE16_HANDLER( x68k_rom0_w ) |
1729 | 1729 | { |
1730 | x68k_state *state = space | |
1730 | x68k_state *state = space.machine().driver_data<x68k_state>(); | |
1731 | 1731 | /* this location contains the address of some expansion device ROM, if no ROM exists, |
1732 | 1732 | then access causes a bus error */ |
1733 | 1733 | state->m_current_vector[2] = 0x02; // bus error |
1734 | 1734 | state->m_current_irq_line = 2; |
1735 | // space | |
1735 | // space.machine().device("maincpu")->execute().set_input_line_and_vector(2,ASSERT_LINE,state->m_current_vector[2]); | |
1736 | 1736 | if(state->ioport("options")->read() & 0x02) |
1737 | 1737 | { |
1738 | 1738 | offset *= 2; |
1739 | 1739 | if(ACCESSING_BITS_0_7) |
1740 | 1740 | offset++; |
1741 | space | |
1741 | space.machine().scheduler().timer_set(space.machine().device<cpu_device>("maincpu")->cycles_to_attotime(4), FUNC(x68k_bus_error), 0xbffffc+offset); | |
1742 | 1742 | } |
1743 | 1743 | } |
1744 | 1744 | |
1745 | 1745 | static READ16_HANDLER( x68k_emptyram_r ) |
1746 | 1746 | { |
1747 | x68k_state *state = space | |
1747 | x68k_state *state = space.machine().driver_data<x68k_state>(); | |
1748 | 1748 | /* this location is unused RAM, access here causes a bus error |
1749 | 1749 | Often a method for detecting amount of installed RAM, is to read or write at 1MB intervals, until a bus error occurs */ |
1750 | 1750 | state->m_current_vector[2] = 0x02; // bus error |
1751 | 1751 | state->m_current_irq_line = 2; |
1752 | // space | |
1752 | // space.machine().device("maincpu")->execute().set_input_line_and_vector(2,ASSERT_LINE,state->m_current_vector[2]); | |
1753 | 1753 | if(state->ioport("options")->read() & 0x02) |
1754 | 1754 | { |
1755 | 1755 | offset *= 2; |
1756 | 1756 | if(ACCESSING_BITS_0_7) |
1757 | 1757 | offset++; |
1758 | space | |
1758 | space.machine().scheduler().timer_set(space.machine().device<cpu_device>("maincpu")->cycles_to_attotime(4), FUNC(x68k_bus_error), offset); | |
1759 | 1759 | } |
1760 | 1760 | return 0xff; |
1761 | 1761 | } |
1762 | 1762 | |
1763 | 1763 | static WRITE16_HANDLER( x68k_emptyram_w ) |
1764 | 1764 | { |
1765 | x68k_state *state = space | |
1765 | x68k_state *state = space.machine().driver_data<x68k_state>(); | |
1766 | 1766 | /* this location is unused RAM, access here causes a bus error |
1767 | 1767 | Often a method for detecting amount of installed RAM, is to read or write at 1MB intervals, until a bus error occurs */ |
1768 | 1768 | state->m_current_vector[2] = 0x02; // bus error |
1769 | 1769 | state->m_current_irq_line = 2; |
1770 | // space | |
1770 | // space.machine().device("maincpu")->execute().set_input_line_and_vector(2,ASSERT_LINE,state->m_current_vector[2]); | |
1771 | 1771 | if(state->ioport("options")->read() & 0x02) |
1772 | 1772 | { |
1773 | 1773 | offset *= 2; |
1774 | 1774 | if(ACCESSING_BITS_0_7) |
1775 | 1775 | offset++; |
1776 | space | |
1776 | space.machine().scheduler().timer_set(space.machine().device<cpu_device>("maincpu")->cycles_to_attotime(4), FUNC(x68k_bus_error), offset); | |
1777 | 1777 | } |
1778 | 1778 | } |
1779 | 1779 | |
1780 | 1780 | static READ16_HANDLER( x68k_exp_r ) |
1781 | 1781 | { |
1782 | x68k_state *state = space | |
1782 | x68k_state *state = space.machine().driver_data<x68k_state>(); | |
1783 | 1783 | /* These are expansion devices, if not present, they cause a bus error */ |
1784 | 1784 | if(state->ioport("options")->read() & 0x02) |
1785 | 1785 | { |
r17963 | r17964 | |
1788 | 1788 | offset *= 2; |
1789 | 1789 | if(ACCESSING_BITS_0_7) |
1790 | 1790 | offset++; |
1791 | space | |
1791 | space.machine().scheduler().timer_set(space.machine().device<cpu_device>("maincpu")->cycles_to_attotime(16), FUNC(x68k_bus_error), 0xeafa00+offset); | |
1792 | 1792 | // machine.device("maincpu")->execute().set_input_line_and_vector(2,ASSERT_LINE,state->m_current_vector[2]); |
1793 | 1793 | } |
1794 | 1794 | return 0xffff; |
r17963 | r17964 | |
1796 | 1796 | |
1797 | 1797 | static WRITE16_HANDLER( x68k_exp_w ) |
1798 | 1798 | { |
1799 | x68k_state *state = space | |
1799 | x68k_state *state = space.machine().driver_data<x68k_state>(); | |
1800 | 1800 | /* These are expansion devices, if not present, they cause a bus error */ |
1801 | 1801 | if(state->ioport("options")->read() & 0x02) |
1802 | 1802 | { |
r17963 | r17964 | |
1805 | 1805 | offset *= 2; |
1806 | 1806 | if(ACCESSING_BITS_0_7) |
1807 | 1807 | offset++; |
1808 | space | |
1808 | space.machine().scheduler().timer_set(space.machine().device<cpu_device>("maincpu")->cycles_to_attotime(16), FUNC(x68k_bus_error), 0xeafa00+offset); | |
1809 | 1809 | // machine.device("maincpu")->execute().set_input_line_and_vector(2,ASSERT_LINE,state->m_current_vector[2]); |
1810 | 1810 | } |
1811 | 1811 | } |
r17963 | r17964 | |
2622 | 2622 | |
2623 | 2623 | MACHINE_START_MEMBER(x68k_state,x68000) |
2624 | 2624 | { |
2625 | address_space | |
2625 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2626 | 2626 | /* Install RAM handlers */ |
2627 | 2627 | m_spriteram = (UINT16*)(*memregion("user1")); |
2628 | space->install_legacy_read_handler(0x000000,0xbffffb,0xffffffff,0,FUNC(x68k_emptyram_r)); | |
2629 | space->install_legacy_write_handler(0x000000,0xbffffb,0xffffffff,0,FUNC(x68k_emptyram_w)); | |
2630 | space->install_readwrite_bank(0x000000,machine().device<ram_device>(RAM_TAG)->size()-1,0xffffffff,0,"bank1"); | |
2628 | space.install_legacy_read_handler(0x000000,0xbffffb,0xffffffff,0,FUNC(x68k_emptyram_r)); | |
2629 | space.install_legacy_write_handler(0x000000,0xbffffb,0xffffffff,0,FUNC(x68k_emptyram_w)); | |
2630 | space.install_readwrite_bank(0x000000,machine().device<ram_device>(RAM_TAG)->size()-1,0xffffffff,0,"bank1"); | |
2631 | 2631 | membank("bank1")->set_base(machine().device<ram_device>(RAM_TAG)->pointer()); |
2632 | space->install_legacy_read_handler(0xc00000,0xdfffff,0xffffffff,0,FUNC(x68k_gvram_r)); | |
2633 | space->install_legacy_write_handler(0xc00000,0xdfffff,0xffffffff,0,FUNC(x68k_gvram_w)); | |
2632 | space.install_legacy_read_handler(0xc00000,0xdfffff,0xffffffff,0,FUNC(x68k_gvram_r)); | |
2633 | space.install_legacy_write_handler(0xc00000,0xdfffff,0xffffffff,0,FUNC(x68k_gvram_w)); | |
2634 | 2634 | membank("bank2")->set_base(m_gvram16); // so that code in VRAM is executable - needed for Terra Cresta |
2635 | space->install_legacy_read_handler(0xe00000,0xe7ffff,0xffffffff,0,FUNC(x68k_tvram_r)); | |
2636 | space->install_legacy_write_handler(0xe00000,0xe7ffff,0xffffffff,0,FUNC(x68k_tvram_w)); | |
2635 | space.install_legacy_read_handler(0xe00000,0xe7ffff,0xffffffff,0,FUNC(x68k_tvram_r)); | |
2636 | space.install_legacy_write_handler(0xe00000,0xe7ffff,0xffffffff,0,FUNC(x68k_tvram_w)); | |
2637 | 2637 | membank("bank3")->set_base(m_tvram16); // so that code in VRAM is executable - needed for Terra Cresta |
2638 | space->install_legacy_read_handler(0xed0000,0xed3fff,0xffffffff,0,FUNC(x68k_sram_r)); | |
2639 | space->install_legacy_write_handler(0xed0000,0xed3fff,0xffffffff,0,FUNC(x68k_sram_w)); | |
2638 | space.install_legacy_read_handler(0xed0000,0xed3fff,0xffffffff,0,FUNC(x68k_sram_r)); | |
2639 | space.install_legacy_write_handler(0xed0000,0xed3fff,0xffffffff,0,FUNC(x68k_sram_w)); | |
2640 | 2640 | membank("bank4")->set_base(m_nvram16); // so that code in SRAM is executable, there is an option for booting from SRAM |
2641 | 2641 | |
2642 | 2642 | // start keyboard timer |
r17963 | r17964 | |
2652 | 2652 | |
2653 | 2653 | MACHINE_START_MEMBER(x68k_state,x68030) |
2654 | 2654 | { |
2655 | address_space | |
2655 | address_space &space = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
2656 | 2656 | /* Install RAM handlers */ |
2657 | 2657 | m_spriteram = (UINT16*)(*memregion("user1")); |
2658 | space->install_legacy_read_handler(0x000000,0xbffffb,0xffffffff,0,FUNC(x68k_rom0_r),0xffffffff); | |
2659 | space->install_legacy_write_handler(0x000000,0xbffffb,0xffffffff,0,FUNC(x68k_rom0_w),0xffffffff); | |
2660 | space->install_readwrite_bank(0x000000,machine().device<ram_device>(RAM_TAG)->size()-1,0xffffffff,0,"bank1"); | |
2658 | space.install_legacy_read_handler(0x000000,0xbffffb,0xffffffff,0,FUNC(x68k_rom0_r),0xffffffff); | |
2659 | space.install_legacy_write_handler(0x000000,0xbffffb,0xffffffff,0,FUNC(x68k_rom0_w),0xffffffff); | |
2660 | space.install_readwrite_bank(0x000000,machine().device<ram_device>(RAM_TAG)->size()-1,0xffffffff,0,"bank1"); | |
2661 | 2661 | membank("bank1")->set_base(machine().device<ram_device>(RAM_TAG)->pointer()); |
2662 | space->install_legacy_read_handler(0xc00000,0xdfffff,0xffffffff,0,FUNC(x68k_gvram32_r)); | |
2663 | space->install_legacy_write_handler(0xc00000,0xdfffff,0xffffffff,0,FUNC(x68k_gvram32_w)); | |
2662 | space.install_legacy_read_handler(0xc00000,0xdfffff,0xffffffff,0,FUNC(x68k_gvram32_r)); | |
2663 | space.install_legacy_write_handler(0xc00000,0xdfffff,0xffffffff,0,FUNC(x68k_gvram32_w)); | |
2664 | 2664 | membank("bank2")->set_base(m_gvram32); // so that code in VRAM is executable - needed for Terra Cresta |
2665 | space->install_legacy_read_handler(0xe00000,0xe7ffff,0xffffffff,0,FUNC(x68k_tvram32_r)); | |
2666 | space->install_legacy_write_handler(0xe00000,0xe7ffff,0xffffffff,0,FUNC(x68k_tvram32_w)); | |
2665 | space.install_legacy_read_handler(0xe00000,0xe7ffff,0xffffffff,0,FUNC(x68k_tvram32_r)); | |
2666 | space.install_legacy_write_handler(0xe00000,0xe7ffff,0xffffffff,0,FUNC(x68k_tvram32_w)); | |
2667 | 2667 | membank("bank3")->set_base(m_tvram32); // so that code in VRAM is executable - needed for Terra Cresta |
2668 | space->install_legacy_read_handler(0xed0000,0xed3fff,0xffffffff,0,FUNC(x68k_sram32_r)); | |
2669 | space->install_legacy_write_handler(0xed0000,0xed3fff,0xffffffff,0,FUNC(x68k_sram32_w)); | |
2668 | space.install_legacy_read_handler(0xed0000,0xed3fff,0xffffffff,0,FUNC(x68k_sram32_r)); | |
2669 | space.install_legacy_write_handler(0xed0000,0xed3fff,0xffffffff,0,FUNC(x68k_sram32_w)); | |
2670 | 2670 | membank("bank4")->set_base(m_nvram32); // so that code in SRAM is executable, there is an option for booting from SRAM |
2671 | 2671 | |
2672 | 2672 | // start keyboard timer |
r17963 | r17964 | |
---|---|---|
497 | 497 | } |
498 | 498 | |
499 | 499 | /* helper function to map rom capsules */ |
500 | static void install_rom_capsule(address_space | |
500 | static void install_rom_capsule(address_space &space, int size, const char *region) | |
501 | 501 | { |
502 | px4_state *state = space | |
502 | px4_state *state = space.machine().driver_data<px4_state>(); | |
503 | 503 | |
504 | 504 | /* ram, part 1 */ |
505 | space | |
505 | space.install_readwrite_bank(0x0000, 0xdfff - size, "bank1"); | |
506 | 506 | state->membank("bank1")->set_base(state->m_ram->pointer()); |
507 | 507 | |
508 | 508 | /* actual rom data, part 1 */ |
509 | space->install_read_bank(0xe000 - size, 0xffff - size, "bank2"); | |
510 | space->nop_write(0xe000 - size, 0xffff - size); | |
511 | state->membank("bank2")->set_base(space->machine().root_device().memregion(region)->base() + (size - 0x2000)); | |
509 | space.install_read_bank(0xe000 - size, 0xffff - size, "bank2"); | |
510 | space.nop_write(0xe000 - size, 0xffff - size); | |
511 | state->membank("bank2")->set_base(space.machine().root_device().memregion(region)->base() + (size - 0x2000)); | |
512 | 512 | |
513 | 513 | /* rom data, part 2 */ |
514 | 514 | if (size != 0x2000) |
515 | 515 | { |
516 | space->install_read_bank(0x10000 - size, 0xdfff, "bank3"); | |
517 | space->nop_write(0x10000 - size, 0xdfff); | |
516 | space.install_read_bank(0x10000 - size, 0xdfff, "bank3"); | |
517 | space.nop_write(0x10000 - size, 0xdfff); | |
518 | 518 | state->membank("bank3")->set_base(state->memregion(region)->base()); |
519 | 519 | } |
520 | 520 | |
521 | 521 | /* ram, continued */ |
522 | space | |
522 | space.install_readwrite_bank(0xe000, 0xffff, "bank4"); | |
523 | 523 | state->membank("bank4")->set_base(state->m_ram->pointer() + 0xe000); |
524 | 524 | } |
525 | 525 | |
526 | 526 | /* bank register */ |
527 | 527 | WRITE8_MEMBER(px4_state::px4_bankr_w) |
528 | 528 | { |
529 | address_space | |
529 | address_space &space_program = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
530 | 530 | |
531 | 531 | if (VERBOSE) |
532 | 532 | logerror("%s: px4_bankr_w (0x%02x)\n", machine().describe_context(), data); |
r17963 | r17964 | |
538 | 538 | { |
539 | 539 | case 0x00: |
540 | 540 | /* system bank */ |
541 | space_program->install_read_bank(0x0000, 0x7fff, "bank1"); | |
542 | space_program->nop_write(0x0000, 0x7fff); | |
541 | space_program.install_read_bank(0x0000, 0x7fff, "bank1"); | |
542 | space_program.nop_write(0x0000, 0x7fff); | |
543 | 543 | membank("bank1")->set_base(machine().root_device().memregion("os")->base()); |
544 | space_program | |
544 | space_program.install_readwrite_bank(0x8000, 0xffff, "bank2"); | |
545 | 545 | membank("bank2")->set_base(m_ram->pointer() + 0x8000); |
546 | 546 | break; |
547 | 547 | |
548 | 548 | case 0x04: |
549 | 549 | /* memory */ |
550 | space_program | |
550 | space_program.install_readwrite_bank(0x0000, 0xffff, "bank1"); | |
551 | 551 | membank("bank1")->set_base(m_ram->pointer()); |
552 | 552 | break; |
553 | 553 |
r17963 | r17964 | |
---|---|---|
218 | 218 | |
219 | 219 | QUICKLOAD_LOAD( instruct ) |
220 | 220 | { |
221 | address_space | |
221 | address_space &space = *image.device().machine().device("maincpu")->memory().space(AS_PROGRAM); | |
222 | 222 | int i; |
223 | 223 | int quick_addr = 0x0100; |
224 | 224 | int exec_addr; |
r17963 | r17964 | |
275 | 275 | |
276 | 276 | for (i = quick_addr; i < quick_length; i++) |
277 | 277 | { |
278 | space | |
278 | space.write_byte(i, quick_data[i]); | |
279 | 279 | } |
280 | 280 | |
281 | 281 | /* display a message about the loaded quickload */ |
r17963 | r17964 | |
---|---|---|
644 | 644 | |
645 | 645 | latch_data = data; |
646 | 646 | // logerror("acad_write_latch %02x\n",data); |
647 | if (data != 0xff) mboard_write_board_8( | |
647 | if (data != 0xff) mboard_write_board_8(space,0, data); | |
648 | 648 | } |
649 | 649 | |
650 | 650 | WRITE8_MEMBER(polgar_state::milano_write_board) |
r17963 | r17964 | |
754 | 754 | UINT8 data = 0; |
755 | 755 | |
756 | 756 | if (monteciv_select[0] == 0xff && monteciv_select[1] == 0xff) { |
757 | data = mboard_read_board_8( | |
757 | data = mboard_read_board_8(space,0); | |
758 | 758 | } else { |
759 | 759 | if (monteciv_select[0] == 0x0) { |
760 | 760 | data = ioport("BUTTONS_MONTE2")->read(); |
r17963 | r17964 | |
792 | 792 | data = ioport("BUTTONS_ACAD")->read(); |
793 | 793 | } else { |
794 | 794 | // if (latch_data & 0x7f) { |
795 | data = mboard_read_board_8( | |
795 | data = mboard_read_board_8(space,0); | |
796 | 796 | // data = milano_read_board(space,0); |
797 | 797 | |
798 | 798 | // logerror("ReadingBoard %02x\n",latch_data); |
799 | 799 | // line = get_first_cleared_bit(latch_data); |
800 | 800 | // tmp = machine.root_device().ioport(board_lines[line])->read(); |
801 | // mboard_write_board_8(&space,0, latch_data); | |
802 | // data = mboard_read_board_8(&space,0); | |
801 | // mboard_write_board_8(space,0, latch_data); | |
802 | // data = mboard_read_board_8(space,0); | |
803 | 803 | // logerror("BoardRead Port Offset = %d data %02x Latch %02x\n", offset,data,latch_data); |
804 | 804 | // printf ("BoardRead Port Offset = %d data %02x Latch %02x\n", offset,data,latch_data); |
805 | 805 | // } else { |
r17963 | r17964 | |
885 | 885 | |
886 | 886 | } |
887 | 887 | |
888 | static void write_IOenable(unsigned char data,address_space | |
888 | static void write_IOenable(unsigned char data,address_space &space) { | |
889 | 889 | |
890 | hd44780_device * hd44780 = space->machine().device<hd44780_device>("hd44780"); | |
891 | device_t *speaker = space->machine().device("beep"); | |
890 | hd44780_device * hd44780 = space.machine().device<hd44780_device>("hd44780"); | |
891 | device_t *speaker = space.machine().device("beep"); | |
892 | 892 | |
893 | 893 | if (BIT(data,5) && BIT(data,4)) { |
894 | 894 | if (BIT(data,1)) { |
r17963 | r17964 | |
899 | 899 | // MAME core does not appear to have this opcode timed right. |
900 | 900 | // This also allows 'fake' clocks to test ELO at impossibly high speeds on real hardware |
901 | 901 | // The original programmer says RAM is 2x as fast as the ROM on the 030 machines, maybe waitstates can be put in MAME core someday |
902 | // cpu_spinuntil_time(space | |
902 | // cpu_spinuntil_time(space.cpu, ATTOTIME_IN_USEC(50)); | |
903 | 903 | if (BIT(data,0)) { |
904 | 904 | logerror("Write LCD_DATA [%02x] [%c]\n",lcd32_char,lcd32_char); |
905 | 905 | // printf("Write LCD_DATA [%02x] [%c]\n",lcd32_char,lcd32_char); |
906 | hd44780->data_write( | |
906 | hd44780->data_write(space, 128, lcd32_char); | |
907 | 907 | } else { |
908 | 908 | logerror("Write LCD_CTRL [%02x] [%c]\n",lcd32_char,lcd32_char); |
909 | 909 | // printf("Write LCD_CTRL [%02x] [%c]\n",lcd32_char,lcd32_char); |
910 | hd44780->control_write( | |
910 | hd44780->control_write(space, 128, lcd32_char); | |
911 | 911 | } |
912 | 912 | } |
913 | 913 | |
r17963 | r17964 | |
920 | 920 | |
921 | 921 | WRITE32_MEMBER(polgar_state::write_IOenables_32){ |
922 | 922 | |
923 | write_IOenable(data>>24, | |
923 | write_IOenable(data>>24,space); | |
924 | 924 | } |
925 | 925 | |
926 | 926 | WRITE16_MEMBER(polgar_state::write_IOenables) |
927 | 927 | { |
928 | write_IOenable(data>>8, | |
928 | write_IOenable(data>>8,space); | |
929 | 929 | } |
930 | 930 | |
931 | 931 | /* Unknown read/write */ |
r17963 | r17964 | |
---|---|---|
171 | 171 | |
172 | 172 | static READ8_HANDLER(ts2068_port_f4_r) |
173 | 173 | { |
174 | spectrum_state *state = space | |
174 | spectrum_state *state = space.machine().driver_data<spectrum_state>(); | |
175 | 175 | |
176 | 176 | return state->m_port_f4_data; |
177 | 177 | } |
178 | 178 | |
179 | 179 | static WRITE8_HANDLER(ts2068_port_f4_w) |
180 | 180 | { |
181 | spectrum_state *state = space | |
181 | spectrum_state *state = space.machine().driver_data<spectrum_state>(); | |
182 | 182 | |
183 | 183 | state->m_port_f4_data = data; |
184 | ts2068_update_memory(space | |
184 | ts2068_update_memory(space.machine()); | |
185 | 185 | } |
186 | 186 | |
187 | 187 | static READ8_HANDLER(ts2068_port_ff_r) |
188 | 188 | { |
189 | spectrum_state *state = space | |
189 | spectrum_state *state = space.machine().driver_data<spectrum_state>(); | |
190 | 190 | |
191 | 191 | return state->m_port_ff_data; |
192 | 192 | } |
r17963 | r17964 | |
199 | 199 | Bit 6 17ms Interrupt Inhibit |
200 | 200 | Bit 7 Cartridge (0) / EXROM (1) select |
201 | 201 | */ |
202 | spectrum_state *state = space | |
202 | spectrum_state *state = space.machine().driver_data<spectrum_state>(); | |
203 | 203 | |
204 | 204 | state->m_port_ff_data = data; |
205 | ts2068_update_memory(space | |
205 | ts2068_update_memory(space.machine()); | |
206 | 206 | logerror("Port %04x write %02x\n", offset, data); |
207 | 207 | } |
208 | 208 | |
r17963 | r17964 | |
228 | 228 | { |
229 | 229 | spectrum_state *state = machine.driver_data<spectrum_state>(); |
230 | 230 | UINT8 *messram = machine.device<ram_device>(RAM_TAG)->pointer(); |
231 | address_space | |
231 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
232 | 232 | unsigned char *ChosenROM, *ExROM; |
233 | 233 | const timex_cart_t *timex_cart = timex_cart_data(); |
234 | 234 | int timex_cart_type = timex_cart->type; |
r17963 | r17964 | |
241 | 241 | { |
242 | 242 | if (state->m_port_ff_data & 0x80) |
243 | 243 | { |
244 | space->install_read_bank(0x0000, 0x1fff, "bank1"); | |
245 | space->unmap_write(0x0000, 0x1fff); | |
244 | space.install_read_bank(0x0000, 0x1fff, "bank1"); | |
245 | space.unmap_write(0x0000, 0x1fff); | |
246 | 246 | state->membank("bank1")->set_base(ExROM); |
247 | 247 | logerror("0000-1fff EXROM\n"); |
248 | 248 | } |
r17963 | r17964 | |
251 | 251 | if (timex_cart_type == TIMEX_CART_DOCK) |
252 | 252 | { |
253 | 253 | state->membank("bank1")->set_base(DOCK); |
254 | space | |
254 | space.install_read_bank(0x0000, 0x1fff, "bank1"); | |
255 | 255 | if (timex_cart_chunks&0x01) |
256 | space | |
256 | space.install_write_bank(0x0000, 0x1fff, "bank9"); | |
257 | 257 | else |
258 | space | |
258 | space.unmap_write(0x0000, 0x1fff); | |
259 | 259 | |
260 | 260 | |
261 | 261 | } |
262 | 262 | else |
263 | 263 | { |
264 | space->nop_read(0x0000, 0x1fff); | |
265 | space->unmap_write(0x0000, 0x1fff); | |
264 | space.nop_read(0x0000, 0x1fff); | |
265 | space.unmap_write(0x0000, 0x1fff); | |
266 | 266 | } |
267 | 267 | logerror("0000-1fff Cartridge\n"); |
268 | 268 | } |
r17963 | r17964 | |
271 | 271 | { |
272 | 272 | ChosenROM = machine.root_device().memregion("maincpu")->base() + 0x010000; |
273 | 273 | state->membank("bank1")->set_base(ChosenROM); |
274 | space->install_read_bank(0x0000, 0x1fff, "bank1"); | |
275 | space->unmap_write(0x0000, 0x1fff); | |
274 | space.install_read_bank(0x0000, 0x1fff, "bank1"); | |
275 | space.unmap_write(0x0000, 0x1fff); | |
276 | 276 | logerror("0000-1fff HOME\n"); |
277 | 277 | } |
278 | 278 | |
r17963 | r17964 | |
281 | 281 | if (state->m_port_ff_data & 0x80) |
282 | 282 | { |
283 | 283 | state->membank("bank2")->set_base(ExROM); |
284 | space->install_read_bank(0x2000, 0x3fff, "bank2"); | |
285 | space->unmap_write(0x2000, 0x3fff); | |
284 | space.install_read_bank(0x2000, 0x3fff, "bank2"); | |
285 | space.unmap_write(0x2000, 0x3fff); | |
286 | 286 | logerror("2000-3fff EXROM\n"); |
287 | 287 | } |
288 | 288 | else |
r17963 | r17964 | |
290 | 290 | if (timex_cart_type == TIMEX_CART_DOCK) |
291 | 291 | { |
292 | 292 | state->membank("bank2")->set_base(DOCK+0x2000); |
293 | space | |
293 | space.install_read_bank(0x2000, 0x3fff, "bank2"); | |
294 | 294 | if (timex_cart_chunks&0x02) |
295 | space | |
295 | space.install_write_bank(0x2000, 0x3fff, "bank10"); | |
296 | 296 | else |
297 | space | |
297 | space.unmap_write(0x2000, 0x3fff); | |
298 | 298 | |
299 | 299 | } |
300 | 300 | else |
301 | 301 | { |
302 | space->nop_read(0x2000, 0x3fff); | |
303 | space->unmap_write(0x2000, 0x3fff); | |
302 | space.nop_read(0x2000, 0x3fff); | |
303 | space.unmap_write(0x2000, 0x3fff); | |
304 | 304 | } |
305 | 305 | logerror("2000-3fff Cartridge\n"); |
306 | 306 | } |
r17963 | r17964 | |
309 | 309 | { |
310 | 310 | ChosenROM = machine.root_device().memregion("maincpu")->base() + 0x012000; |
311 | 311 | state->membank("bank2")->set_base(ChosenROM); |
312 | space->install_read_bank(0x2000, 0x3fff, "bank2"); | |
313 | space->unmap_write(0x2000, 0x3fff); | |
312 | space.install_read_bank(0x2000, 0x3fff, "bank2"); | |
313 | space.unmap_write(0x2000, 0x3fff); | |
314 | 314 | logerror("2000-3fff HOME\n"); |
315 | 315 | } |
316 | 316 | |
r17963 | r17964 | |
319 | 319 | if (state->m_port_ff_data & 0x80) |
320 | 320 | { |
321 | 321 | state->membank("bank3")->set_base(ExROM); |
322 | space->install_read_bank(0x4000, 0x5fff, "bank3"); | |
323 | space->unmap_write(0x4000, 0x5fff); | |
322 | space.install_read_bank(0x4000, 0x5fff, "bank3"); | |
323 | space.unmap_write(0x4000, 0x5fff); | |
324 | 324 | logerror("4000-5fff EXROM\n"); |
325 | 325 | } |
326 | 326 | else |
r17963 | r17964 | |
328 | 328 | if (timex_cart_type == TIMEX_CART_DOCK) |
329 | 329 | { |
330 | 330 | state->membank("bank3")->set_base(DOCK+0x4000); |
331 | space | |
331 | space.install_read_bank(0x4000, 0x5fff, "bank3"); | |
332 | 332 | if (timex_cart_chunks&0x04) |
333 | space | |
333 | space.install_write_bank(0x4000, 0x5fff, "bank11"); | |
334 | 334 | else |
335 | space | |
335 | space.unmap_write(0x4000, 0x5fff); | |
336 | 336 | } |
337 | 337 | else |
338 | 338 | { |
339 | space->nop_read(0x4000, 0x5fff); | |
340 | space->unmap_write(0x4000, 0x5fff); | |
339 | space.nop_read(0x4000, 0x5fff); | |
340 | space.unmap_write(0x4000, 0x5fff); | |
341 | 341 | } |
342 | 342 | logerror("4000-5fff Cartridge\n"); |
343 | 343 | } |
r17963 | r17964 | |
346 | 346 | { |
347 | 347 | state->membank("bank3")->set_base(messram); |
348 | 348 | state->membank("bank11")->set_base(messram); |
349 | space->install_read_bank(0x4000, 0x5fff, "bank3"); | |
350 | space->install_write_bank(0x4000, 0x5fff, "bank11"); | |
349 | space.install_read_bank(0x4000, 0x5fff, "bank3"); | |
350 | space.install_write_bank(0x4000, 0x5fff, "bank11"); | |
351 | 351 | logerror("4000-5fff RAM\n"); |
352 | 352 | } |
353 | 353 | |
r17963 | r17964 | |
356 | 356 | if (state->m_port_ff_data & 0x80) |
357 | 357 | { |
358 | 358 | state->membank("bank4")->set_base(ExROM); |
359 | space->install_read_bank(0x6000, 0x7fff, "bank4"); | |
360 | space->unmap_write(0x6000, 0x7fff); | |
359 | space.install_read_bank(0x6000, 0x7fff, "bank4"); | |
360 | space.unmap_write(0x6000, 0x7fff); | |
361 | 361 | logerror("6000-7fff EXROM\n"); |
362 | 362 | } |
363 | 363 | else |
r17963 | r17964 | |
365 | 365 | if (timex_cart_type == TIMEX_CART_DOCK) |
366 | 366 | { |
367 | 367 | state->membank("bank4")->set_base(DOCK+0x6000); |
368 | space | |
368 | space.install_read_bank(0x6000, 0x7fff, "bank4"); | |
369 | 369 | if (timex_cart_chunks&0x08) |
370 | space | |
370 | space.install_write_bank(0x6000, 0x7fff, "bank12"); | |
371 | 371 | else |
372 | space | |
372 | space.unmap_write(0x6000, 0x7fff); | |
373 | 373 | } |
374 | 374 | else |
375 | 375 | { |
376 | space->nop_read(0x6000, 0x7fff); | |
377 | space->unmap_write(0x6000, 0x7fff); | |
376 | space.nop_read(0x6000, 0x7fff); | |
377 | space.unmap_write(0x6000, 0x7fff); | |
378 | 378 | } |
379 | 379 | logerror("6000-7fff Cartridge\n"); |
380 | 380 | } |
r17963 | r17964 | |
383 | 383 | { |
384 | 384 | state->membank("bank4")->set_base(messram + 0x2000); |
385 | 385 | state->membank("bank12")->set_base(messram + 0x2000); |
386 | space->install_read_bank(0x6000, 0x7fff, "bank4"); | |
387 | space->install_write_bank(0x6000, 0x7fff, "bank12"); | |
386 | space.install_read_bank(0x6000, 0x7fff, "bank4"); | |
387 | space.install_write_bank(0x6000, 0x7fff, "bank12"); | |
388 | 388 | logerror("6000-7fff RAM\n"); |
389 | 389 | } |
390 | 390 | |
r17963 | r17964 | |
393 | 393 | if (state->m_port_ff_data & 0x80) |
394 | 394 | { |
395 | 395 | state->membank("bank5")->set_base(ExROM); |
396 | space->install_read_bank(0x8000, 0x9fff, "bank5"); | |
397 | space->unmap_write(0x8000, 0x9fff); | |
396 | space.install_read_bank(0x8000, 0x9fff, "bank5"); | |
397 | space.unmap_write(0x8000, 0x9fff); | |
398 | 398 | logerror("8000-9fff EXROM\n"); |
399 | 399 | } |
400 | 400 | else |
r17963 | r17964 | |
402 | 402 | if (timex_cart_type == TIMEX_CART_DOCK) |
403 | 403 | { |
404 | 404 | state->membank("bank5")->set_base(DOCK+0x8000); |
405 | space | |
405 | space.install_read_bank(0x8000, 0x9fff,"bank5"); | |
406 | 406 | if (timex_cart_chunks&0x10) |
407 | space | |
407 | space.install_write_bank(0x8000, 0x9fff,"bank13"); | |
408 | 408 | else |
409 | space | |
409 | space.unmap_write(0x8000, 0x9fff); | |
410 | 410 | } |
411 | 411 | else |
412 | 412 | { |
413 | space->nop_read(0x8000, 0x9fff); | |
414 | space->unmap_write(0x8000, 0x9fff); | |
413 | space.nop_read(0x8000, 0x9fff); | |
414 | space.unmap_write(0x8000, 0x9fff); | |
415 | 415 | } |
416 | 416 | logerror("8000-9fff Cartridge\n"); |
417 | 417 | } |
r17963 | r17964 | |
420 | 420 | { |
421 | 421 | state->membank("bank5")->set_base(messram + 0x4000); |
422 | 422 | state->membank("bank13")->set_base(messram + 0x4000); |
423 | space->install_read_bank(0x8000, 0x9fff,"bank5"); | |
424 | space->install_write_bank(0x8000, 0x9fff,"bank13"); | |
423 | space.install_read_bank(0x8000, 0x9fff,"bank5"); | |
424 | space.install_write_bank(0x8000, 0x9fff,"bank13"); | |
425 | 425 | logerror("8000-9fff RAM\n"); |
426 | 426 | } |
427 | 427 | |
r17963 | r17964 | |
430 | 430 | if (state->m_port_ff_data & 0x80) |
431 | 431 | { |
432 | 432 | state->membank("bank6")->set_base(ExROM); |
433 | space->install_read_bank(0xa000, 0xbfff, "bank6"); | |
434 | space->unmap_write(0xa000, 0xbfff); | |
433 | space.install_read_bank(0xa000, 0xbfff, "bank6"); | |
434 | space.unmap_write(0xa000, 0xbfff); | |
435 | 435 | logerror("a000-bfff EXROM\n"); |
436 | 436 | } |
437 | 437 | else |
r17963 | r17964 | |
439 | 439 | if (timex_cart_type == TIMEX_CART_DOCK) |
440 | 440 | { |
441 | 441 | state->membank("bank6")->set_base(DOCK+0xa000); |
442 | space | |
442 | space.install_read_bank(0xa000, 0xbfff, "bank6"); | |
443 | 443 | if (timex_cart_chunks&0x20) |
444 | space | |
444 | space.install_write_bank(0xa000, 0xbfff, "bank14"); | |
445 | 445 | else |
446 | space | |
446 | space.unmap_write(0xa000, 0xbfff); | |
447 | 447 | |
448 | 448 | } |
449 | 449 | else |
450 | 450 | { |
451 | space->nop_read(0xa000, 0xbfff); | |
452 | space->unmap_write(0xa000, 0xbfff); | |
451 | space.nop_read(0xa000, 0xbfff); | |
452 | space.unmap_write(0xa000, 0xbfff); | |
453 | 453 | } |
454 | 454 | logerror("a000-bfff Cartridge\n"); |
455 | 455 | } |
r17963 | r17964 | |
458 | 458 | { |
459 | 459 | state->membank("bank6")->set_base(messram + 0x6000); |
460 | 460 | state->membank("bank14")->set_base(messram + 0x6000); |
461 | space->install_read_bank(0xa000, 0xbfff, "bank6"); | |
462 | space->install_write_bank(0xa000, 0xbfff, "bank14"); | |
461 | space.install_read_bank(0xa000, 0xbfff, "bank6"); | |
462 | space.install_write_bank(0xa000, 0xbfff, "bank14"); | |
463 | 463 | logerror("a000-bfff RAM\n"); |
464 | 464 | } |
465 | 465 | |
r17963 | r17964 | |
468 | 468 | if (state->m_port_ff_data & 0x80) |
469 | 469 | { |
470 | 470 | state->membank("bank7")->set_base(ExROM); |
471 | space->install_read_bank(0xc000, 0xdfff, "bank7"); | |
472 | space->unmap_write(0xc000, 0xdfff); | |
471 | space.install_read_bank(0xc000, 0xdfff, "bank7"); | |
472 | space.unmap_write(0xc000, 0xdfff); | |
473 | 473 | logerror("c000-dfff EXROM\n"); |
474 | 474 | } |
475 | 475 | else |
r17963 | r17964 | |
477 | 477 | if (timex_cart_type == TIMEX_CART_DOCK) |
478 | 478 | { |
479 | 479 | state->membank("bank7")->set_base(DOCK+0xc000); |
480 | space | |
480 | space.install_read_bank(0xc000, 0xdfff, "bank7"); | |
481 | 481 | if (timex_cart_chunks&0x40) |
482 | space | |
482 | space.install_write_bank(0xc000, 0xdfff, "bank15"); | |
483 | 483 | else |
484 | space | |
484 | space.unmap_write(0xc000, 0xdfff); | |
485 | 485 | } |
486 | 486 | else |
487 | 487 | { |
488 | space->nop_read(0xc000, 0xdfff); | |
489 | space->unmap_write(0xc000, 0xdfff); | |
488 | space.nop_read(0xc000, 0xdfff); | |
489 | space.unmap_write(0xc000, 0xdfff); | |
490 | 490 | } |
491 | 491 | logerror("c000-dfff Cartridge\n"); |
492 | 492 | } |
r17963 | r17964 | |
495 | 495 | { |
496 | 496 | state->membank("bank7")->set_base(messram + 0x8000); |
497 | 497 | state->membank("bank15")->set_base(messram + 0x8000); |
498 | space->install_read_bank(0xc000, 0xdfff, "bank7"); | |
499 | space->install_write_bank(0xc000, 0xdfff, "bank15"); | |
498 | space.install_read_bank(0xc000, 0xdfff, "bank7"); | |
499 | space.install_write_bank(0xc000, 0xdfff, "bank15"); | |
500 | 500 | logerror("c000-dfff RAM\n"); |
501 | 501 | } |
502 | 502 | |
r17963 | r17964 | |
505 | 505 | if (state->m_port_ff_data & 0x80) |
506 | 506 | { |
507 | 507 | state->membank("bank8")->set_base(ExROM); |
508 | space->install_read_bank(0xe000, 0xffff, "bank8"); | |
509 | space->unmap_write(0xe000, 0xffff); | |
508 | space.install_read_bank(0xe000, 0xffff, "bank8"); | |
509 | space.unmap_write(0xe000, 0xffff); | |
510 | 510 | logerror("e000-ffff EXROM\n"); |
511 | 511 | } |
512 | 512 | else |
r17963 | r17964 | |
514 | 514 | if (timex_cart_type == TIMEX_CART_DOCK) |
515 | 515 | { |
516 | 516 | state->membank("bank8")->set_base(DOCK+0xe000); |
517 | space | |
517 | space.install_read_bank(0xe000, 0xffff, "bank8"); | |
518 | 518 | if (timex_cart_chunks&0x80) |
519 | space | |
519 | space.install_write_bank(0xe000, 0xffff, "bank16"); | |
520 | 520 | else |
521 | space | |
521 | space.unmap_write(0xe000, 0xffff); | |
522 | 522 | } |
523 | 523 | else |
524 | 524 | { |
525 | space->nop_read(0xe000, 0xffff); | |
526 | space->unmap_write(0xe000, 0xffff); | |
525 | space.nop_read(0xe000, 0xffff); | |
526 | space.unmap_write(0xe000, 0xffff); | |
527 | 527 | } |
528 | 528 | logerror("e000-ffff Cartridge\n"); |
529 | 529 | } |
r17963 | r17964 | |
532 | 532 | { |
533 | 533 | state->membank("bank8")->set_base(messram + 0xa000); |
534 | 534 | state->membank("bank16")->set_base(messram + 0xa000); |
535 | space->install_read_bank(0xe000, 0xffff, "bank8"); | |
536 | space->install_write_bank(0xe000, 0xffff, "bank16"); | |
535 | space.install_read_bank(0xe000, 0xffff, "bank8"); | |
536 | space.install_write_bank(0xe000, 0xffff, "bank16"); | |
537 | 537 | logerror("e000-ffff RAM\n"); |
538 | 538 | } |
539 | 539 | } |
r17963 | r17964 | |
578 | 578 | |
579 | 579 | static WRITE8_HANDLER( tc2048_port_ff_w ) |
580 | 580 | { |
581 | spectrum_state *state = space | |
581 | spectrum_state *state = space.machine().driver_data<spectrum_state>(); | |
582 | 582 | |
583 | 583 | state->m_port_ff_data = data; |
584 | 584 | logerror("Port %04x write %02x\n", offset, data); |
r17963 | r17964 | |
---|---|---|
31 | 31 | MEMORY / I/O |
32 | 32 | ***************************************************************************/ |
33 | 33 | |
34 | static void enterprise_update_memory_page(address_space | |
34 | static void enterprise_update_memory_page(address_space &space, offs_t page, int index) | |
35 | 35 | { |
36 | ep_state *state = space | |
36 | ep_state *state = space.machine().driver_data<ep_state>(); | |
37 | 37 | int start = (page - 1) * 0x4000; |
38 | 38 | int end = (page - 1) * 0x4000 + 0x3fff; |
39 | 39 | char page_num[10]; |
r17963 | r17964 | |
45 | 45 | case 0x01: |
46 | 46 | case 0x02: |
47 | 47 | case 0x03: |
48 | space->install_read_bank(start, end, page_num); | |
49 | space->nop_write(start, end); | |
50 | state->membank(page_num)->set_base(space->machine().root_device().memregion("exos")->base() + (index * 0x4000)); | |
48 | space.install_read_bank(start, end, page_num); | |
49 | space.nop_write(start, end); | |
50 | state->membank(page_num)->set_base(space.machine().root_device().memregion("exos")->base() + (index * 0x4000)); | |
51 | 51 | break; |
52 | 52 | |
53 | 53 | case 0x04: |
54 | 54 | case 0x05: |
55 | 55 | case 0x06: |
56 | 56 | case 0x07: |
57 | space->install_read_bank(start, end, page_num); | |
58 | space->nop_write(start, end); | |
59 | state->membank(page_num)->set_base(space->machine().root_device().memregion("cartridges")->base() + ((index - 0x04) * 0x4000)); | |
57 | space.install_read_bank(start, end, page_num); | |
58 | space.nop_write(start, end); | |
59 | state->membank(page_num)->set_base(space.machine().root_device().memregion("cartridges")->base() + ((index - 0x04) * 0x4000)); | |
60 | 60 | break; |
61 | 61 | |
62 | 62 | case 0x20: |
63 | 63 | case 0x21: |
64 | space->install_read_bank(start, end, page_num); | |
65 | space->nop_write(start, end); | |
64 | space.install_read_bank(start, end, page_num); | |
65 | space.nop_write(start, end); | |
66 | 66 | state->membank(page_num)->set_base(state->memregion("exdos")->base() + ((index - 0x20) * 0x4000)); |
67 | 67 | break; |
68 | 68 | |
r17963 | r17964 | |
71 | 71 | case 0xfa: |
72 | 72 | case 0xfb: |
73 | 73 | /* additional 64k ram */ |
74 | if (space | |
74 | if (space.machine().device<ram_device>(RAM_TAG)->size() == 128*1024) | |
75 | 75 | { |
76 | space->install_readwrite_bank(start, end, page_num); | |
77 | state->membank(page_num)->set_base(space->machine().device<ram_device>(RAM_TAG)->pointer() + (index - 0xf4) * 0x4000); | |
76 | space.install_readwrite_bank(start, end, page_num); | |
77 | state->membank(page_num)->set_base(space.machine().device<ram_device>(RAM_TAG)->pointer() + (index - 0xf4) * 0x4000); | |
78 | 78 | } |
79 | 79 | else |
80 | 80 | { |
81 | space | |
81 | space.unmap_readwrite(start, end); | |
82 | 82 | } |
83 | 83 | break; |
84 | 84 | |
r17963 | r17964 | |
87 | 87 | case 0xfe: |
88 | 88 | case 0xff: |
89 | 89 | /* basic 64k ram */ |
90 | space->install_readwrite_bank(start, end, page_num); | |
91 | state->membank(page_num)->set_base(space->machine().device<ram_device>(RAM_TAG)->pointer() + (index - 0xfc) * 0x4000); | |
90 | space.install_readwrite_bank(start, end, page_num); | |
91 | state->membank(page_num)->set_base(space.machine().device<ram_device>(RAM_TAG)->pointer() + (index - 0xfc) * 0x4000); | |
92 | 92 | break; |
93 | 93 | |
94 | 94 | default: |
95 | space | |
95 | space.unmap_readwrite(start, end); | |
96 | 96 | } |
97 | 97 | } |
98 | 98 | |
r17963 | r17964 | |
108 | 108 | case 0x11: |
109 | 109 | case 0x12: |
110 | 110 | case 0x13: |
111 | enterprise_update_memory_page(device->machine().device("maincpu")->memory().space(AS_PROGRAM), offset - 0x0f, data); | |
111 | enterprise_update_memory_page(*device->machine().device("maincpu")->memory().space(AS_PROGRAM), offset - 0x0f, data); | |
112 | 112 | break; |
113 | 113 | |
114 | 114 | case 0x15: |
r17963 | r17964 | |
---|---|---|
236 | 236 | |
237 | 237 | DRIVER_INIT_MEMBER(mc10_state,mc10) |
238 | 238 | { |
239 | address_space | |
239 | address_space &prg = *machine().device("maincpu")->memory().space(AS_PROGRAM); | |
240 | 240 | |
241 | 241 | /* initialize keyboard strobe */ |
242 | 242 | m_keyboard_strobe = 0x00; |
r17963 | r17964 | |
254 | 254 | else if (m_ram_size == 24*1024) |
255 | 255 | membank("bank2")->set_base(m_ram_base + 0x2000); |
256 | 256 | else if (m_ram_size != 32*1024) //ensure that is not alice90 |
257 | prg | |
257 | prg.nop_readwrite(0x5000, 0x8fff); | |
258 | 258 | |
259 | 259 | /* register for state saving */ |
260 | 260 | state_save_register_global(machine(), m_keyboard_strobe); |
r17963 | r17964 | |
---|---|---|
708 | 708 | gp32_state *state = machine.driver_data<gp32_state>(); |
709 | 709 | UINT32 *regs = &state->m_s3c240x_dma_regs[dma<<3]; |
710 | 710 | UINT32 curr_tc, curr_src, curr_dst; |
711 | address_space | |
711 | address_space &space = *machine.device( "maincpu")->memory().space( AS_PROGRAM); | |
712 | 712 | int dsz, inc_src, inc_dst, servmode; |
713 | 713 | static const UINT32 ch_int[] = { INT_DMA0, INT_DMA1, INT_DMA2, INT_DMA3 }; |
714 | 714 | verboselog( machine, 5, "DMA %d trigger\n", dma); |
r17963 | r17964 | |
725 | 725 | curr_tc--; |
726 | 726 | switch (dsz) |
727 | 727 | { |
728 | case 0 : space->write_byte( curr_dst, space->read_byte( curr_src)); break; | |
729 | case 1 : space->write_word( curr_dst, space->read_word( curr_src)); break; | |
730 | case 2 : space->write_dword( curr_dst, space->read_dword( curr_src)); break; | |
728 | case 0 : space.write_byte( curr_dst, space.read_byte( curr_src)); break; | |
729 | case 1 : space.write_word( curr_dst, space.read_word( curr_src)); break; | |
730 | case 2 : space.write_dword( curr_dst, space.read_dword( curr_src)); break; | |
731 | 731 | } |
732 | 732 | if (inc_src == 0) curr_src += (1 << dsz); |
733 | 733 | if (inc_dst == 0) curr_dst += (1 << dsz); |
r17963 | r17964 | |
---|---|---|
37 | 37 | #include "formats/pc_dsk.h" |
38 | 38 | #include "machine/ram.h" |
39 | 39 | |
40 | static READ8_HANDLER(at_dma8237_1_r) { return i8237_r(space->machine().device("dma8237_2"), *space, offset / 2); } | |
41 | static WRITE8_HANDLER(at_dma8237_1_w) { i8237_w(space->machine().device("dma8237_2"), *space, offset / 2, data); } | |
40 | static READ8_HANDLER(at_dma8237_1_r) { return i8237_r(space.machine().device("dma8237_2"), space, offset / 2); } | |
41 | static WRITE8_HANDLER(at_dma8237_1_w) { i8237_w(space.machine().device("dma8237_2"), space, offset / 2, data); } | |
42 | 42 | |
43 | 43 | static ADDRESS_MAP_START( bebox_mem, AS_PROGRAM, 64, bebox_state ) |
44 | 44 | AM_RANGE(0x7FFFF0F0, 0x7FFFF0F7) AM_READWRITE_LEGACY(bebox_cpu0_imask_r, bebox_cpu0_imask_w ) |
r17963 | r17964 | |
76 | 76 | |
77 | 77 | static READ64_HANDLER(bb_slave_64be_r) |
78 | 78 | { |
79 | pci_bus_device *device = space | |
79 | pci_bus_device *device = space.machine().device<pci_bus_device>("pcibus"); | |
80 | 80 | |
81 | 81 | // 2e94 is the real address, 2e84 is where the PC appears to be under full DRC |
82 | if ((space | |
82 | if ((space.device().safe_pc() == 0xfff02e94) || (space.device().safe_pc() == 0xfff02e84)) | |
83 | 83 | { |
84 | 84 | return 0x108000ff; // indicate slave CPU |
85 | 85 | } |
86 | 86 | |
87 | return device->read_64be( | |
87 | return device->read_64be(space, offset, mem_mask); | |
88 | 88 | } |
89 | 89 | |
90 | 90 | static ADDRESS_MAP_START( bebox_slave_mem, AS_PROGRAM, 64, bebox_state ) |
r17963 | r17964 | |
---|---|---|
166 | 166 | |
167 | 167 | QUICKLOAD_LOAD( cd2650 ) |
168 | 168 | { |
169 | address_space | |
169 | address_space &space = *image.device().machine().device("maincpu")->memory().space(AS_PROGRAM); | |
170 | 170 | int i; |
171 | 171 | int quick_addr = 0x440; |
172 | 172 | int exec_addr; |
r17963 | r17964 | |
226 | 226 | read_ = quick_length; |
227 | 227 | |
228 | 228 | for (i = quick_addr; i < read_; i++) |
229 | space | |
229 | space.write_byte(i, quick_data[i]); | |
230 | 230 | |
231 | 231 | read_ = 0x1780; |
232 | 232 | if (quick_length < 0x1780) |
r17963 | r17964 | |
234 | 234 | |
235 | 235 | if (quick_length > 0x157f) |
236 | 236 | for (i = 0x1580; i < read_; i++) |
237 | space | |
237 | space.write_byte(i, quick_data[i]); | |
238 | 238 | |
239 | 239 | if (quick_length > 0x17ff) |
240 | 240 | for (i = 0x1800; i < quick_length; i++) |
241 | space | |
241 | space.write_byte(i, quick_data[i]); | |
242 | 242 | |
243 | 243 | /* display a message about the loaded quickload */ |
244 | 244 | image.message(" Quickload: size=%04X : exec=%04X",quick_length,exec_addr); |
r17963 | r17964 | |
---|---|---|
136 | 136 | |
137 | 137 | READ16_MEMBER(esq5505_state::es5510_dsp_r) |
138 | 138 | { |
139 | // logerror("%06x: DSP read offset %04x (data is %04x)\n",space | |
139 | // logerror("%06x: DSP read offset %04x (data is %04x)\n",space.device().safe_pc(),offset,es5510_dsp_ram[offset]); | |
140 | 140 | |
141 | 141 | switch(offset) |
142 | 142 | { |
r17963 | r17964 | |
---|---|---|
158 | 158 | |
159 | 159 | void avigo_state::refresh_memory(UINT8 bank, UINT8 chip_select) |
160 | 160 | { |
161 | address_space | |
161 | address_space& space = *m_maincpu->space(AS_PROGRAM); | |
162 | 162 | int &active_flash = (bank == 1 ? m_flash_at_0x4000 : m_flash_at_0x8000); |
163 | 163 | char bank_tag[6]; |
164 | 164 | |
r17963 | r17964 | |
167 | 167 | switch (chip_select) |
168 | 168 | { |
169 | 169 | case 0x06: // videoram |
170 | space | |
170 | space.install_readwrite_handler(bank * 0x4000, bank * 0x4000 + 0x3fff, read8_delegate(FUNC(avigo_state::vid_memory_r), this), write8_delegate(FUNC(avigo_state::vid_memory_w), this)); | |
171 | 171 | active_flash = -1; |
172 | 172 | break; |
173 | 173 | |
174 | 174 | case 0x01: // banked RAM |
175 | 175 | sprintf(bank_tag,"bank%d", bank); |
176 | 176 | membank(bank_tag)->set_base(m_ram_base + (((bank == 1 ? m_bank1_l : m_bank2_l) & 0x07)<<14)); |
177 | space | |
177 | space.install_readwrite_bank (bank * 0x4000, bank * 0x4000 + 0x3fff, bank_tag); | |
178 | 178 | active_flash = -1; |
179 | 179 | break; |
180 | 180 | |
r17963 | r17964 | |
185 | 185 | if (active_flash < 0) // to avoid useless calls to install_readwrite_handler that cause slowdowns |
186 | 186 | { |
187 | 187 | if (bank == 1) |
188 | space | |
188 | space.install_readwrite_handler(0x4000, 0x7fff, read8_delegate(FUNC(avigo_state::flash_0x4000_read_handler), this), write8_delegate(FUNC(avigo_state::flash_0x4000_write_handler), this)); | |
189 | 189 | else |
190 | space | |
190 | space.install_readwrite_handler(0x8000, 0xbfff, read8_delegate(FUNC(avigo_state::flash_0x8000_read_handler), this), write8_delegate(FUNC(avigo_state::flash_0x8000_write_handler), this)); | |
191 | 191 | } |
192 | 192 | |
193 | 193 | switch (chip_select) |
r17963 | r17964 | |
201 | 201 | |
202 | 202 | default: |
203 | 203 | logerror("Unknown chip %02x mapped at %04x - %04x\n", chip_select, bank * 0x4000, bank * 0x4000 + 0x3fff); |
204 | space | |
204 | space.unmap_readwrite(bank * 0x4000, bank * 0x4000 + 0x3fff); | |
205 | 205 | active_flash = -1; |
206 | 206 | break; |
207 | 207 | } |
r17963 | r17964 | |
---|---|---|
396 | 396 | // Z80DMA_INTERFACE( dma_intf ) |
397 | 397 | //------------------------------------------------- |
398 | 398 | |
399 | static UINT8 memory_read_byte(address_space *space, offs_t address) { return space->read_byte(address); } | |
400 | static void memory_write_byte(address_space *space, offs_t address, UINT8 data) { space->write_byte(address, data); } | |
399 | static UINT8 memory_read_byte(address_space &space, offs_t address) { return space.read_byte(address); } | |
400 | static void memory_write_byte(address_space &space, offs_t address, UINT8 data) { space.write_byte(address, data); } | |
401 | 401 | |
402 | 402 | static Z80DMA_INTERFACE( dma_intf ) |
403 | 403 | { |
r17963 | r17964 | |
---|---|---|
428 | 428 | READ8_MEMBER( c64_state::sid_potx_r ) |
429 | 429 | { |
430 | 430 | UINT8 cia1_pa = mos6526_pa_r(m_cia1, space, 0); |
431 | ||
431 | ||
432 | 432 | int sela = BIT(cia1_pa, 6); |
433 | 433 | int selb = BIT(cia1_pa, 7); |
434 | 434 | |
r17963 | r17964 | |
443 | 443 | READ8_MEMBER( c64_state::sid_poty_r ) |
444 | 444 | { |
445 | 445 | UINT8 cia1_pa = mos6526_pa_r(m_cia1, space, 0); |
446 | ||
446 | ||
447 | 447 | int sela = BIT(cia1_pa, 6); |
448 | 448 | int selb = BIT(cia1_pa, 7); |
449 | 449 |
r17963 | r17964 | |
---|---|---|
530 | 530 | |
531 | 531 | QUICKLOAD_LOAD(vc4000) |
532 | 532 | { |
533 | address_space | |
533 | address_space &space = *image.device().machine().device("maincpu")->memory().space(AS_PROGRAM); | |
534 | 534 | int i; |
535 | 535 | int quick_addr = 0x08c0; |
536 | 536 | int exec_addr; |
r17963 | r17964 | |
567 | 567 | quick_addr = quick_data[1] * 256 + quick_data[2]; |
568 | 568 | exec_addr = quick_data[3] * 256 + quick_data[4]; |
569 | 569 | |
570 | space->write_byte(0x08be, quick_data[3]); | |
571 | space->write_byte(0x08bf, quick_data[4]); | |
570 | space.write_byte(0x08be, quick_data[3]); | |
571 | space.write_byte(0x08bf, quick_data[4]); | |
572 | 572 | |
573 | 573 | for (i = 0; i < quick_length - 5; i++) |
574 | 574 | if ((quick_addr + i) < 0x1600) |
575 | space | |
575 | space.write_byte(i + quick_addr, quick_data[i+5]); | |
576 | 576 | |
577 | 577 | /* display a message about the loaded quickload */ |
578 | 578 | image.message(" Quickload: size=%04X : start=%04X : end=%04X : exec=%04X",quick_length-5,quick_addr,quick_addr+quick_length-5,exec_addr); |
r17963 | r17964 | |
617 | 617 | |
618 | 618 | for (i = quick_addr; i < quick_length; i++) |
619 | 619 | if (i < 0x1600) |
620 | space | |
620 | space.write_byte(i, quick_data[i]); | |
621 | 621 | |
622 | 622 | /* display a message about the loaded quickload */ |
623 | 623 | image.message(" Quickload: size=%04X : exec=%04X",quick_length,exec_addr); |
r17963 | r17964 | |
---|---|---|
277 | 277 | i8237_hlda_w(m_dmac, state); |
278 | 278 | } |
279 | 279 | |
280 | static UINT8 memory_read_byte(address_space *space, offs_t address) { return space->read_byte(address); } | |
281 | static void memory_write_byte(address_space *space, offs_t address, UINT8 data) { space->write_byte(address, data); } | |
280 | static UINT8 memory_read_byte(address_space &space, offs_t address) { return space.read_byte(address); } | |
281 | static void memory_write_byte(address_space &space, offs_t address, UINT8 data) { space.write_byte(address, data); } | |
282 | 282 | |
283 | 283 | static I8237_INTERFACE( dmv_dma8237_config ) |
284 | 284 | { |
r17963 | r17964 | |
---|---|---|
262 | 262 | NULL /* update address callback */ |
263 | 263 | }; |
264 | 264 | |
265 | static UINT8 memory_read_byte(address_space *space, offs_t address) { return space->read_byte(address); } | |
266 | static void memory_write_byte(address_space *space, offs_t address, UINT8 data) { space->write_byte(address, data); } | |
265 | static UINT8 memory_read_byte(address_space &space, offs_t address) { return space.read_byte(address); } | |
266 | static void memory_write_byte(address_space &space, offs_t address, UINT8 data) { space.write_byte(address, data); } | |
267 | 267 | |
268 | 268 | static I8237_INTERFACE( b16_dma8237_interface ) |
269 | 269 | { |
r17963 | r17964 | |
---|---|---|
101 | 101 | break; |
102 | 102 | } |
103 | 103 | |
104 | m6801_io_w( | |
104 | m6801_io_w(space, offset, data); | |
105 | 105 | } |
106 | 106 | |
107 | 107 | READ8_MEMBER( psion_state::hd63701_int_reg_r ) |
r17963 | r17964 | |
112 | 112 | /* datapack i/o data bus */ |
113 | 113 | return (m_pack1->data_r() | m_pack2->data_r()) & (~m_port2_ddr); |
114 | 114 | case 0x14: |
115 | return (m6801_io_r( | |
115 | return (m6801_io_r(space, offset)&0x7f) | (m_stby_pwr<<7); | |
116 | 116 | case 0x15: |
117 | 117 | /* |
118 | 118 | x--- ---- ON key active high |
r17963 | r17964 | |
125 | 125 | /* datapack control lines */ |
126 | 126 | return (m_pack1->control_r() | (m_pack2->control_r() & 0x8f)) | ((m_pack2->control_r() & 0x10)<<1); |
127 | 127 | case 0x08: |
128 | m6801_io_w( | |
128 | m6801_io_w(space, offset, m_tcsr_value); | |
129 | 129 | default: |
130 | return m6801_io_r( | |
130 | return m6801_io_r(space, offset); | |
131 | 131 | } |
132 | 132 | } |
133 | 133 |
r17963 | r17964 | |
---|---|---|
154 | 154 | int ctrl; |
155 | 155 | int srcadd, dstadd; |
156 | 156 | UINT32 src, dst; |
157 | address_space | |
157 | address_space &space = *machine.device("maincpu")->memory().space(AS_PROGRAM); | |
158 | 158 | gba_state *state = machine.driver_data<gba_state>(); |
159 | 159 | |
160 | 160 | src = state->m_dma_src[ch]; |
r17963 | r17964 | |
207 | 207 | dst &= 0xfffffffc; |
208 | 208 | |
209 | 209 | // 32-bit |
210 | space | |
210 | space.write_dword(dst, space.read_dword(src)); | |
211 | 211 | switch (dstadd) |
212 | 212 | { |
213 | 213 | case 0: // increment |
r17963 | r17964 | |
242 | 242 | dst &= 0xfffffffe; |
243 | 243 | |
244 | 244 | // 16-bit |
245 | space | |
245 | space.write_word(dst, space.read_word(src)); | |
246 | 246 | switch (dstadd) |
247 | 247 | { |
248 | 248 | case 0: // increment |
Previous | 199869 Revisions | Next |