| 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 |